diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 768ba89abe6c87a8ef75d3e8ad010eab5594d5f6..88087323073e3be32eeabeb414b1077f12854fac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -28,7 +28,7 @@ image: python:3.9 stages: - - build + - install - test - deploy @@ -52,7 +52,7 @@ cache: ####################################################################################################################################### install-virtualenv: - stage: build + stage: install script: - python3 -m venv venv/ - source venv/bin/activate @@ -66,7 +66,7 @@ install-virtualenv: install-npm-packages: image: node:14.6.0 - stage: build + stage: install script: - cd ./frontend - npm ci diff --git a/backend/Dockerfile b/backend/Dockerfile-app similarity index 100% rename from backend/Dockerfile rename to backend/Dockerfile-app diff --git a/backend/Dockerfile-model b/backend/Dockerfile-model new file mode 100644 index 0000000000000000000000000000000000000000..c7fd5a8cd4b8b33b19644b1546326ebde5150ec8 --- /dev/null +++ b/backend/Dockerfile-model @@ -0,0 +1,5 @@ +FROM tensorflow/serving:latest as runtime + +EXPOSE 8501 + +COPY ./model ./models/model/1/ \ No newline at end of file diff --git a/backend/docker-compose.yml b/backend/docker-compose.yml index 72494bd9d8628ccbe572d903be41568ff37a7c80..1586f7782289457a8512593613ec9714aeadde19 100644 --- a/backend/docker-compose.yml +++ b/backend/docker-compose.yml @@ -13,12 +13,14 @@ services: timeout: 1s retries: 3 ports: - - "3306:3306" + - 3306:3306 volumes: - mysql-db:/var/lib/mysql app: - build: . + build: + context: . + dockerfile: Dockerfile-app container_name: "app" depends_on: db: @@ -29,8 +31,21 @@ services: env_file: .env environment: DB_HOST: db + MODEL_HOST: model links: + - model - db + model: + build: + context: . + dockerfile: Dockerfile-model + container_name: "model" + restart: always + ports: + - 8501:8501 + environment: + MODEL_NAME: "model" + volumes: mysql-db: \ No newline at end of file diff --git a/backend/assets/keras_metadata.pb b/backend/model/keras_metadata.pb similarity index 100% rename from backend/assets/keras_metadata.pb rename to backend/model/keras_metadata.pb diff --git a/backend/assets/saved_model.pb b/backend/model/saved_model.pb similarity index 100% rename from backend/assets/saved_model.pb rename to backend/model/saved_model.pb diff --git a/backend/assets/variables/variables.data-00000-of-00001 b/backend/model/variables/variables.data-00000-of-00001 similarity index 100% rename from backend/assets/variables/variables.data-00000-of-00001 rename to backend/model/variables/variables.data-00000-of-00001 diff --git a/backend/assets/variables/variables.index b/backend/model/variables/variables.index similarity index 100% rename from backend/assets/variables/variables.index rename to backend/model/variables/variables.index diff --git a/backend/requirements.txt b/backend/requirements.txt index 035fe7337313c207f6398081f48c0735aa730ecb..8b39d9a9c42f8341d06d24d63702902c92d87029 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,20 +1,10 @@ -anyio==3.6.1 -asgiref==3.5.2 -click==8.1.3 fastapi==0.78.0 -h11==0.13.0 -idna==2.8 -keras==2.9.0 numpy==1.23.0 opencv-python==4.6.0.66 pydantic==1.9.1 -sniffio==1.2.0 -starlette==0.19.1 -typing-extensions==4.2.0 uvicorn==0.17.6 SQLAlchemy==1.4.19 python-dotenv==0.18.0 PyMySQL==1.0.2 pytz==2022.1 requests==2.25.1 -tensorflow==2.9.1 diff --git a/backend/video_capture.py b/backend/video_capture.py index 08cf8533470937c824551fdf2c7e28441e7858e8..234575f310fe111415d92fc086f0af3546535387 100644 --- a/backend/video_capture.py +++ b/backend/video_capture.py @@ -1,19 +1,36 @@ import cv2 from datetime import datetime, timedelta -import numpy as np -import keras from utils.preprocessing import fix_singular_shape, norm_by_imagenet +from dotenv import load_dotenv +import numpy as np +import requests import json import time +import os from cameras import restaurants from db import models from db.database import SessionLocal from routers.websocket import manager +load_dotenv() +host = os.getenv('MODEL_HOST') +port = os.getenv('MODEL_PORT') +model = os.getenv('MODEL_NAME') + +def make_prediction(instances): + url = f"http://{host}:{port}/v1/models/{model}:predict" + data = json.dumps({"signature_name": "serving_default", "instances": instances.tolist()}) + headers = {"content-type": "application/json"} + json_response = requests.post(url, data=data, headers=headers) + try: + predictions = json.loads(json_response.text)['predictions'] + except: + print("prediction failed") + return predictions async def handle_cameras(): - model = keras.models.load_model('assets', compile=False) + db = SessionLocal() for restaurant in restaurants: for camera in restaurant["cameras"]: @@ -53,7 +70,7 @@ async def handle_cameras(): np.array( [treated_img]))), axis=0) - pred_map = np.squeeze(model.predict(input_image, verbose=0)) + pred_map = np.squeeze(make_prediction(input_image)) count_prediction += np.sum(pred_map) for caisse in camera["caisses"]: if np.sum(pred_map[caisse["x1"] // 2:caisse["x2"] // 2, caisse["y1"] // 2:caisse["y2"] // 2]) > 0.5: