File size: 2,968 Bytes
391711f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import streamlit as st
import requests
import base64
import json
import numpy as np
from PIL import Image

def get_prediction_img(image_data):
  url = 'https://askai.aiclub.world/39a4f3a3-e637-4981-a88c-b2597ab12be0'
  r = requests.post(url, data=image_data)
  response = r.json()['predicted_label']
  print("Image AI predicts:",response)
  return response

def get_prediction_data(data,url):
#  url = 'https://d3yowc8vr7.execute-api.us-east-1.amazonaws.com/Predict/13d5ab46-b369-4c84-966e-41a0c3ed83d1'
#  url = 'https://askai.aiclub.world/bc1fe184-efe3-4683-81f4-ededffb6c287'
  r = requests.post(url, data=json.dumps(data))
  response = getattr(r,'_content').decode("utf-8")
  print("Data AI predicts:",response)
  return response

def processFile(f,url):
  print("Got file upload")
  bytesData=f.getvalue()
  st.image(f)
  image=Image.open(f)
  img_array=np.array(image)
  grayscale_image=convert_grayscale(img_array)
  final_image=flatten_784(grayscale_image)
  print("Final image",final_image)
  prediction=get_prediction_data(final_image,url)
  print("\n\nData prediction",prediction)
  predicted_label = json.loads(json.loads(prediction)['body'])['predicted_label']
  print("\n\nPredicted label", predicted_label)
  st.title("Data AI says:"+str(predicted_label))

  payload = base64.b64encode(bytesData)
  response = get_prediction_img(payload)
  print("\n\nResponse is:",response)
  st.title("IMAGE AI says:"+response)

def convert_grayscale(im):
  # Convert to grayscale if its a color image
  if len(im.shape) > 2 and im.shape[2]>2:
    red = im[:,:,0]
    green = im[:,:,1]
    blue = im[:,:,2]
    # Convert color to grayscale
    grayscale_image = (red * 0.299) + (green * 0.587) + (blue * 0.114)
  elif len(im.shape) == 2:
    grayscale_image = im
  return grayscale_image

# This is a helper function to flatten image into a single row after downsampling the image to 28x28
def flatten_784(grayscale_image):
  # Find the width and length of the image
  num_rows_image = grayscale_image.shape[0]
  num_cols_image = grayscale_image.shape[1]
  # Figure out the downsampling value for each dimension
  downsample_rows = int(np.floor(num_rows_image/28))
  downsample_cols = int(np.floor(num_cols_image/28))

  # Downsample it
  downsampled_image = grayscale_image[::downsample_rows,::downsample_cols]
  # Somtimes, the dimensions after downsampling are not accurate, pick the first 28 pixels in each direction
  downsampled_image = downsampled_image[0:28,0:28]
  # Convert the vector to a list
  list_image = list(downsampled_image.reshape(784,))
  #From the list, create a dictionary
  e=0
  d={}
  for i in range(1,29):
    for j in range(1,29):
      l=f"{i}x{j}"
      d[l]=e
      e=e+1
  return d

urlDefault = 'https://askai.aiclub.world/bc1fe184-efe3-4683-81f4-ededffb6c286'
st.title("Image AI for Gateway")
url=st.text_input("URL",urlDefault)
uploadedFile=st.file_uploader("Choose file")
if uploadedFile is not None:
  processFile(uploadedFile,url)