├── model.h5 ├── Dockerfile ├── config.py ├── requirements.txt ├── app.yaml └── app.py /model.h5: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/department-for-transport/ValidatRKerasService/master/model.h5 -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.6-jessie 2 | RUN apt update 3 | WORKDIR /app 4 | ADD requirements.txt /app/requirements.txt 5 | RUN pip install -r /app/requirements.txt 6 | ADD . /app 7 | ENV PORT 8080 8 | CMD ["gunicorn", "app:app", "--config=config.py"] -------------------------------------------------------------------------------- /config.py: -------------------------------------------------------------------------------- 1 | from os import environ as env 2 | import multiprocessing 3 | 4 | PORT = int(env.get("PORT", 8080)) 5 | DEBUG_MODE = int(env.get("DEBUG_MODE", 1)) 6 | 7 | # Gunicorn config 8 | bind = ":" + str(PORT) 9 | workers = multiprocessing.cpu_count() * 2 + 1 10 | threads = 2 * multiprocessing.cpu_count() -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | absl-py==0.7.1 2 | astor==0.8.0 3 | Click==7.0 4 | Flask==1.0.3 5 | gast==0.2.2 6 | google-pasta==0.1.7 7 | grpcio==1.21.1 8 | gunicorn==19.9.0 9 | h5py==2.9.0 10 | itsdangerous==1.1.0 11 | Jinja2==2.10.1 12 | joblib==0.13.2 13 | jsonify==0.5 14 | Keras==2.2.4 15 | Keras-Applications==1.0.8 16 | Keras-Preprocessing==1.1.0 17 | Markdown==3.1.1 18 | MarkupSafe==1.1.1 19 | numpy==1.16.4 20 | pandas==0.24.2 21 | protobuf==3.8.0 22 | python-dateutil==2.8.0 23 | pytz==2019.1 24 | PyYAML==5.1.1 25 | scikit-learn==0.21.2 26 | scipy==1.3.0 27 | six==1.12.0 28 | sklearn==0.0 29 | tensorboard==1.14.0 30 | tensorflow==1.14.0 31 | tensorflow-estimator==1.14.0 32 | termcolor==1.1.0 33 | Werkzeug==0.15.4 34 | wrapt==1.11.2 35 | -------------------------------------------------------------------------------- /app.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: validatr-keras-web-service 5 | labels: 6 | name: validatr-keras-web-service 7 | spec: 8 | replicas: 1 9 | selector: 10 | matchLabels: 11 | name: validatr-keras-web-service 12 | template: 13 | metadata: 14 | name: validatr-keras-web-service 15 | labels: 16 | name: validatr-keras-web-service 17 | spec: 18 | containers: 19 | - name: validatr-keras-web-service 20 | image: gcr.io/dft-da-sb-lab/flask_keras 21 | ports: 22 | - containerPort: 8080 23 | resources: 24 | requests: 25 | memory: 256Mi 26 | limits: 27 | memory: 512Mi 28 | env: 29 | - name: DEBUG_MODE 30 | value: "1" -------------------------------------------------------------------------------- /app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | from flask import request 3 | from flask import jsonify 4 | import json 5 | import keras 6 | import numpy 7 | import pandas 8 | import tensorflow as tf 9 | import config 10 | 11 | #load model 12 | model = keras.models.load_model('model.h5') 13 | graph = tf.get_default_graph() 14 | classes = ['Cycle', 'HGV','LGV','car', 'largecar'] 15 | 16 | app = Flask(__name__) 17 | 18 | @app.route("/predict", methods=['POST']) 19 | def predict(): 20 | parameters = request.json 21 | 22 | X = pandas.DataFrame.from_dict(parameters,orient='index').values 23 | X = tf.keras.utils.normalize(X) 24 | with graph.as_default(): 25 | predictions = model.predict(X) 26 | predictions = numpy.argmax(predictions, axis=1) 27 | 28 | 29 | 30 | class_list = [classes[prediction] for prediction in predictions] 31 | 32 | 33 | class_json = json.dumps({ i : class_list[i] for i in range(0, len(class_list) ) }) 34 | 35 | return jsonify(class_json) 36 | 37 | if __name__ == "__main__": 38 | app.run(host="0.0.0.0", port=config.PORT, debug=config.DEBUG_MODE) --------------------------------------------------------------------------------