Răsfoiți Sursa

add Dockerfile, refactor

kevin 2 ani în urmă
părinte
comite
0c091d5e6b
5 a modificat fișierele cu 108 adăugiri și 8 ștergeri
  1. 53 0
      Dockerfile
  2. 1 0
      configure.sh
  3. 37 6
      fr_flask_0.py
  4. 13 2
      run.sh
  5. 4 0
      wsgi_0.py

+ 53 - 0
Dockerfile

@@ -0,0 +1,53 @@
+FROM python:3.11.3
+
+RUN apt-get -y update
+RUN apt-get install --no-install-recommends -y --fix-missing \
+    build-essential \
+    cmake \
+    gfortran \
+    git \
+    wget \
+    curl \
+    graphicsmagick \
+    libgraphicsmagick1-dev \
+    libatlas-base-dev \
+    libavcodec-dev \
+    libavformat-dev \
+    libgtk2.0-dev \
+    libjpeg-dev \
+    liblapack-dev \
+    libswscale-dev \
+    pkg-config \
+    python3-dev \
+    python3-numpy \
+    software-properties-common \
+    zip \
+    && apt-get clean && rm -rf /tmp/* /var/tmp/*
+
+WORKDIR /usr/src/app
+
+COPY requirements.txt .
+
+RUN pip install --no-cache-dir -r requirements.txt
+
+COPY fr_flask*.py ./
+COPY wsgi*.py ./
+COPY face_recognition_svm.py ./
+COPY application_data ./
+COPY data ./
+COPY application_data/verification_images ./application_data/
+COPY application_data/input_image ./application_data/
+COPY data/train ./data/
+COPY *.sh ./
+
+WORKDIR /usr/src/app
+
+RUN ls -la
+RUN ls -R application_data
+RUN ls -R data
+RUN chmod +x *.sh
+RUN python face_recognition_svm.py
+
+EXPOSE 8349
+
+CMD ["/usr/src/app/run.sh", "--no-venv"]

+ 1 - 0
configure.sh

@@ -1,5 +1,6 @@
 #! /bin/bash
 
+# Non-Docker only
 ABSPATH=$(cd "$(dirname "$0")"; pwd -P)
 if ! python -m venv "$ABSPATH"/venv;
 then

+ 37 - 6
fr_flask_0.py

@@ -8,6 +8,9 @@ import numpy as np
 import re
 import os
 import time
+import shlex
+import subprocess
+from face_recognition_svm import train_svm
 
 ImageFile.SAFEBLOCK = 2048 * 2048
 
@@ -46,11 +49,16 @@ dummy_data = [
         "address": "909 South St Paul Street Hopewell, VA 23860",
         "nik": "1000075656784734"
     },
+    {
+        "name": "Abi",
+        "address": "47 Rockville Road Leland, NC 28451",
+        "nik": "1000084937284959"
+    },
 ]
 ssl = None
 known_people = "application_data/verification_images"
 known_faces = []
-total_threshold = 0.2
+total_threshold = 0.1
 face_model = "large"
 if face_model == "large":
     model_file_name = "saved_model_2_large.pkl"
@@ -64,10 +72,8 @@ def scan_known_people(known_people_folder):
     for file in image_files_in_folder(known_people_folder):
         img = face_recognition.load_image_file(file)
         encodings = face_recognition.face_encodings(img, model=face_model)
-
         if len(encodings) > 1:
             print("WARNING: More than one face found in {}. Only considering the first face.".format(file))
-
         if len(encodings) == 0:
             print("WARNING: No faces found in {}. Ignoring file.".format(file))
         else:
@@ -82,12 +88,15 @@ def image_files_in_folder(folder):
     img_list.sort()
     return img_list
 
+
 def load_db():
     pass
 
-def save_db(name, address, nik):
+
+def save_db(nik, name, address):
     pass
 
+
 @app.route('/upload', methods=['POST'])
 def upload():
     profile = request.files["profile"]
@@ -95,7 +104,29 @@ def upload():
     name = request.form["name"]
     address = request.form["address"]
 
-
+@app.route('/train', methods=['GET', 'POST'])
+def train():
+    try:
+        train_svm(model_file_name)
+        return jsonify({"status": "0", "message": "Train successful"})
+    except Exception as exc:
+        return jsonify({"status": "1", "message": f"Error training model: {exc}"})
+
+@app.route('/reload', methods=['GET', 'POST'])
+def face_reload():
+    pid = None
+    try:
+        with open("app.pid", "r") as f:
+            pid = f.readline()
+        if pid:
+            cmd = f"kill -s HUP {pid}"
+            cmd_array = shlex.split(cmd)
+            print(cmd_array)
+            subprocess.Popen(cmd_array, start_new_session=True)
+        else:
+            return jsonify({"status": "1", "message": f"Reload unsucessful"})
+    except Exception as exc:
+        return jsonify({"status": "2", "message": f"Reload unsucessful: {exc}"})
 
 
 @app.route('/predict', methods=['POST'])
@@ -154,6 +185,7 @@ def predict():
     print(result)
     return jsonify(result)
 
+
 try:
     clf = joblib.load(model_file_name)
     classes = clf.classes_
@@ -165,6 +197,5 @@ except FileNotFoundError as e:
     print('No model here')
     exit(1)
 
-
 if __name__ == '__main__':
     app.run(host='0.0.0.0', port=8349, debug=True, ssl_context=ssl)

+ 13 - 2
run.sh

@@ -1,5 +1,16 @@
 #!/bin/bash
 
+VENV=1
+HAS_DB=0
+if [ "$1" == "--no-venv" ]; then
+  VENV=0
+fi
 ABSPATH=$(cd "$(dirname "$0")"; pwd -P)
-source "$ABSPATH"/venv/bin/activate
-gunicorn -w 8 -b 0.0.0.0:8349 wsgi:app
+if [ $VENV -eq 1 ]; then
+  source "$ABSPATH"/venv/bin/activate
+fi
+if [ "$2" == "--has-db" ]; then
+  gunicorn -w 8 -t 30 -b 0.0.0.0:8349 wsgi:app
+else
+  gunicorn -w 8 -t 30 -b 0.0.0.0:8349 wsgi_0:app
+fi

+ 4 - 0
wsgi_0.py

@@ -0,0 +1,4 @@
+from fr_flask_0 import app
+
+if __name__ == "__main__":
+    app.run()