Files
CNN/Models/model_host.py
2024-04-08 12:58:18 -04:00

143 lines
5.0 KiB
Python

#import sys
#import os
#import glob
#import socket
#from keras.backend import GraphExecutionFunction
#sys.path.append('c:/git/keras')
#sys.path.append('c:/git/absl')
# This upgrades all modules
#py -mpip freeze | %{$_.split('==')[0]} | %{py -mpip install --upgrade $_}
# The following worked to install CUDA for using tensorflow with GPU
# 1) Install CUDA 11.8 Toolkit from here
# https://developer.nvidia.com/cuda-11-8-0-download-archive?target_os=Windows&target_arch=x86_64&target_version=11&target_type=exe_local
# 2) The binaries should wind up in C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin
# 3) Put the above path in the PATH environment variable
# 4) Also download cuDNN from here https://developer.nvidia.com/cudnn because tensorflow will look for cudnn64_8.dll which is in that package
# This download is just a bunch of DLLs with no install program. I left it in downloads folder.
# 5) put C:\download\cuDNN\cudnn-windows-x86_64-8.9.7.29_cuda11-archive\bin in the PATH
# 6) Run the check_gpu.py program and ensure no errors loading DLLs
# installed version
# py -m pip install keras==2.6.0
# py -mpip install flask==2.0.1
# py -mpip install numpy==1.19.5
# py -mpip show numpy
# py -mpip install tensorflow==2.6.0
# py -mpip show tensorflow
# py -mpip install matplotlib==3.4.3
# c:\users\skess\appdata\local\programs\python\python39\lib\site-packages
import keras
from keras.preprocessing.image import ImageDataGenerator
from flask import Flask, render_template, request
import numpy as np
import tensorflow
import sys
import os
import io
import PIL.Image
#init flaskapp
app = Flask(__name__)
# def save_image(imgData):
# with open('output.jpg','wb') as output:
# output.write(imgData)
def render_index():
return """<!doctype html>
<html>
<head>
<title>Convolutional Neural Network Hosting Platform</title>
</head>
<body>
<p>You have reached the main page of the Convolutional Neural Network Hosting Platform. This platform hosts the following models:<strong>resnet50</strong>,<strong>vgg16</strong>, and <strong>inception</strong></p>
<p>The models can be invoked by submitting a POST request with 128,128 grayscale image in jpg format</p>
<p>The following are some examples</p>
<p>http://127.0.0.1/predict_incpetion</p>
<p>http://127.0.0.1/predict_vgg16</p>
<p>http://127.0.0.1/predict_resnet50</p>
</body>
</html>
"""
@app.route('/')
def index():
return render_index()
@app.route('/ping', methods=['GET','POST'])
def ping():
return "Alive"
# @app.route('/predict_vgg16', methods=['GET','POST'])
# def predict_vgg16():
# test_image=request.get_data()
# test_image = PIL.Image.open(io.BytesIO(test_image))
# test_image = test_image.convert('L')
# test_array=keras.preprocessing.image.img_to_array(test_image)
# batch_test_array=np.array([test_array])
# predictions=vgg16_model.predict(batch_test_array)
# if type(predictions) == list:
# average_prediction = sum(predictions)/len(predictions)
# threshold_output = np.where(average_prediction > 0.5, 1, 0)
# else :
# threshold_output = np.where(predictions > 0.5, 1, 0)
# response=str(predictions)+'-->'+str(threshold_output)
# return response
@app.route('/predict_resnet50', methods=['GET','POST'])
def predict_resnet50():
print('/predict_resnet50')
test_image=request.get_data()
test_image = PIL.Image.open(io.BytesIO(test_image))
test_image = test_image.convert('L')
test_array=keras.preprocessing.image.img_to_array(test_image)
batch_test_array=np.array([test_array])
predictions=resnet50_model.predict(batch_test_array)
if type(predictions) == list:
average_prediction = sum(predictions)/len(predictions)
threshold_output = np.where(average_prediction > 0.5, 1, 0)
else :
threshold_output = np.where(predictions > 0.5, 1, 0)
response=str(predictions)+'-->'+str(threshold_output)
return response
@app.route('/predict_lenet5', methods=['GET','POST'])
def predict_lenet5():
print('/predict_lenet5')
test_image=request.get_data()
test_image = PIL.Image.open(io.BytesIO(test_image))
test_image = test_image.convert('L')
test_array=keras.preprocessing.image.img_to_array(test_image)
batch_test_array=np.array([test_array])
predictions=lenet_model.predict(batch_test_array)
if type(predictions) == list:
average_prediction = sum(predictions)/len(predictions)
threshold_output = np.where(average_prediction > 0.5, 1, 0)
else :
threshold_output = np.where(predictions > 0.5, 1, 0)
response=str(predictions)+'-->'+str(threshold_output)
return response
if __name__ == '__main__':
resnet50_model_name='../Weights/resnet50.h5'
resnet50_model = keras.models.load_model(resnet50_model_name)
# vgg16_model_name='../Weights/model_vgg16.h5'
# vgg16_model=keras.models.load_model(vgg16_model_name)
lenet_model_name='../Weights/lenet5.h5'
lenet_model=keras.models.load_model(lenet_model_name)
port = int(os.environ.get('PORT',5000))
app.run(host='0.0.0.0',port=port)