Browse Source

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	backend_refactor/service/photo/StandingPhotoAnalyzer.py
lyc8503 4 years ago
parent
commit
6b69cdbe8e

+ 6 - 1
backend_refactor/Dockerfile

@@ -7,16 +7,21 @@ WORKDIR /pose
 RUN sed -i 's/archive.ubuntu.com/mirrors.nju.edu.cn/g' /etc/apt/sources.list && \ 
     sed -i 's/security.ubuntu.com/mirrors.nju.edu.cn/g' /etc/apt/sources.list && \
     apt update && \
-    apt install -y libgl1-mesa-glx libglib2.0-dev python3-mysqldb && \
+    apt install -y libgl1-mesa-glx libglib2.0-dev libmysqlclient-dev && \
     rm -rf /var/lib/apt/lists/*
 
+
 COPY requirements.txt .
 RUN pip3 install --no-cache-dir -i https://mirror.nju.edu.cn/pypi/web/simple -r requirements.txt
 # RUN python -m pip install detectron2 --no-cache-dir -i https://mirror.nju.edu.cn/pypi/web/simple -f https://dl.fbaipublicfiles.com/detectron2/wheels/cpu/torch1.10/index.html
 
+
+
+
 VOLUME /data
 
 COPY . .
 
 CMD ["gunicorn", "app:app"]
 
+

+ 6 - 4
backend_refactor/app.py

@@ -1,5 +1,4 @@
 import logging
-from nturl2path import url2pathname
 from flask import Flask
 import route.upload, route.analyze, route.result
 from config import VERSION_PREFIX, MAX_CONTENT_LENGTH, MYSQL_URI
@@ -12,6 +11,11 @@ app.config['MAX_CONTENT_LENGTH'] = MAX_CONTENT_LENGTH
 
 app.config['SQLALCHEMY_DATABASE_URI'] = MYSQL_URI
 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
+
+app.register_blueprint(route.upload.bp, url_prefix=VERSION_PREFIX)
+app.register_blueprint(route.analyze.bp, url_prefix=VERSION_PREFIX)
+app.register_blueprint(route.result.bp, url_prefix=VERSION_PREFIX)
+
 db.init_app(app)
 with app.app_context():
     # db.drop_all()
@@ -23,9 +27,7 @@ def hello_world():
     return "<p>Hello, World!</p>"
 
 
-app.register_blueprint(route.upload.bp, url_prefix=VERSION_PREFIX)
-app.register_blueprint(route.analyze.bp, url_prefix=VERSION_PREFIX)
-app.register_blueprint(route.result.bp, url_prefix=VERSION_PREFIX)
+
 
 
 @app.errorhandler(413)

+ 10 - 5
backend_refactor/db/task.py

@@ -1,11 +1,16 @@
 from db import db
+import time
 
-class Task:
+class Task(db.Model):
 	uuid = db.Column(db.String(64), primary_key=True)
+	type = db.Column(db.Enum('PHOTO_STANDINGPOSE'))
+	create_time = db.Column(db.BigInteger)
 	status = db.Column(db.Enum('QUEUEING','RUNNING','FINISHED','ERROR'))
 	result = db.Column(db.String(8192))
 
-	def __init__(self, uuid, status='QUEUEING', result='{}'):
-		self.uuid = uuid;
-		self.status = status;
-		self.result = result;
+	def __init__(self, uuid, type, create_time = time.time() * 1000, status='QUEUEING', result='{}'):
+		self.uuid = uuid
+		self.type = type
+		self.create_time = create_time
+		self.status = status
+		self.result = result

+ 2 - 1
backend_refactor/requirements.txt

@@ -5,4 +5,5 @@ numpy==1.21.6
 opencv-python==4.6.0.66
 matplotlib==3.5.3
 scipy==1.7.3
-flask_sqlalchemy==2.5.1
+flask_sqlalchemy==2.5.1
+mysqlclient==1.4.6

+ 41 - 7
backend_refactor/route/analyze.py

@@ -1,21 +1,55 @@
+import uuid, json
+# from service.video.Video3DAnalyzer import Video3DAnalyzer
+from db import db
 from flask import request
-
+from db.task import Task
 from worker.thread_pool import pool
 from route.util import make_response
 from flask import Blueprint
-from service.photo import StandingPhotoAnalyzer
+from service.photo.StandingPhotoAnalyzer import StandingPhotoAnalyzer
 
 
 bp = Blueprint("analyze", __name__, url_prefix='/')
 
+def callback_generator(task_uuid):
+    def callback(status, **args):
+        print("caling back")
+        task = Task.query.get(task_uuid)
+        task.status = status
+        if status == 'FINISHED':
+            task.result = json.dumps(args['result'])
+        
+        db.session.add(task)
+        db.session.commit()
+
+    return callback
 
-@bp.route("analysis", methods={"POST"})
-def start_analysis():
 
+
+@bp.route("photos/analysis", methods=['POST'])
+def photo_analysis():
     req = request.get_json()
+    
+    ana = StandingPhotoAnalyzer(req['front'], req['right'])
+
+    task_uuid = str(uuid.uuid4())
+    new_task = Task(task_uuid, 'PHOTO_STANDINGPOSE')
+    db.session.add(new_task)
+    db.session.commit()
 
-    ana = StandingPhotoAnalyzer()
+    ana.analyze(callback_generator(task_uuid))
 
-    pool.submit(ana.analyze, (req['front'], req['right']))
+    # pool.submit(ana.analyze, (callback_generator(task_uuid), ))
+
+    return make_response(201, "success", {'task_uuid' : task_uuid})
+
+@bp.route("videos/analysis", methods=['POST'])
+def video_analysis():
+    req = request.get_json()
+    
+    # ana_3d = Video3DAnalyzer()
 
-    return make_response(201, "success", {})
+    task_uuid = str(uuid.uuid4())
+    new_task = Task(task_uuid, req['type'])
+    db.session.add(new_task)
+    db.session.commit()

+ 17 - 3
backend_refactor/route/result.py

@@ -1,10 +1,24 @@
+from operator import imod
 from flask import Blueprint
+from route.util import make_response
+from db.task import Task
 
-bp = Blueprint("result", __name__, url_prefix='/result')
+bp = Blueprint("result", __name__, url_prefix='/')
 
 
-@bp.route("/{task_uuid}", methods=["GET"])
+@bp.route("/result/<task_uuid>", methods=["GET"])
 def get_result(task_uuid):
 
-    pass
+    task = Task.query.get(task_uuid)
+    status = task.status
 
+    if status == 'FINISHED':
+        return make_response(200, "success", {"task_uuid": task.uuid, "type" : task.type, "result" : task.result})
+    elif status == 'QUEUEING':
+        return make_response(200, "queueing", {"task_uuid": task.uuid, "type" : task.type})
+    elif status == 'RUNNING':
+        return make_response(200, "running", {"task_uuid" : task.uuid, "type" : task.type})
+    elif status == 'ERROR':
+        return make_response(200, "error", {"task_uuid" : task.uuid, "type" : task.type, "result" : task.result})
+    else:
+        assert 0.1 + 0.2 == 0.3,  "what do u mean?"