В настоящее время я занимаюсь разработкой веб-приложения, которое позволяет пользователю загружать изображения и отображать обнаруженные ограничивающие прямоугольные грани лица вместе с его ориентирами. Flask помогает мне с кодом бэкэнда. Я использую предварительно обученную модель RetinaFace для обнаружения лиц на изображениях и использую ее с установленным процессором m xnet. Вот фрагмент моего python кода:
from flask import Flask, render_template, request
import numpy as np
import cv2
import insightface
import urllib
import urllib.request
model=insightface.model_zoo.get_model('retinaface_r50_v1')
model.prepare(ctx_id=-1, nms=0.4)
app=Flask(__name__)
def filestrorage_to_cv2_image(InBlob): # Function to convert blob images to cv2 images
npimg=np.fromstring(InBlob, np.uint8)
img=cv2.imdecode(npimg, cv2.IMREAD_UNCHANGED)
return img
@app.route('/')
def home():
return render_template('home.html')
@app.route('/image_upload', methods=['GET','POST'])
def image_page():
if request.method=='POST':
Original_files=request.files.getlist('FilesUpload')
print(len(Original_files))
if len(Original_files)>=3:
User_cv_images={}
for i in range(len(Original_files)):
User_cv_images[Original_files[i].filename]=filestrorage_to_cv2_image(Original_files[i].read())
Detected_faces={}
for i in range(len(User_cv_images)):
every_image={}
every_image['bounding_box'],every_image['landmarks']=model.detect(User_cv_images[Original_files[i].filename], threshold=0.5,scale=1.0)
Detected_faces[Original_files[i].filename]=every_image
return render_template("points.html", Faces=Detected_faces)
if __name__ == "__main__":
app.run(debug=True)
Вот код для home. html
<html>
<head>
<title>
Home Page
</title>
</head>
<body>
<form action="/image_upload" method="POST" enctype = "multipart/form-data">
<input type="file" name="FilesUpload" id = "FilesUpload" multiple/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>
Вот код для баллов. html
<html>
<body>
{% for name,content in Faces.items() %}
<p> FileName: {{ name }}</p>
<p> bounding box: {{ content['bounding_box'] }}</p>
<p> landmakrs: {{ content['landmarks'] }}</p>
{% endfor %}
<form action="{{ url_for('home') }}">
<input type="submit" value="NEW"/>
</form>
</body>
</html>
Вот моя проблема. Как видите, мне нужно, чтобы пользователь ввел минимум три изображения. Поэтому при вводе трех изображений при первом запуске для обнаружения лиц требуется более 15 секунд (в зависимости от количества лиц в каждом изображении). Затем отображаются точки в точках. html. Но когда я go загружаю новые изображения, требуется время для обнаружения следующего набора. Честно говоря, я не знаю, был ли он когда-либо успешен в этом. Я должен был закрыть сервер, потому что я думал, что он завис или что-то. Это происходит до тех пор, пока я не выключу локальный сервер и не перезапущу его снова. Первоначально я думал, что это может быть проблема с новыми изображениями, возможно, не публикуется во втором запуске. Но затем я запустил код с помощью pdb.set_trace () в нескольких точках по всей программе и пришел к выводу, что именно RetinaFace вызывает проблему. Следующее, что я попробовал, это загружать модель каждый раз, когда вызывается маршрут / image_upload , поскольку именно здесь происходит обнаружение RetinaFace. Это, как оказалось, избавило мою проблему от того, что это заняло целую вечность. Но не должен ли это быть худший способ справиться с проблемой? Можно ли выполнить обнаружение с загрузкой модели только один раз при запуске сервера? я не хочу перезапускать сервер каждый раз или загружать модель каждый раз, когда мне нужно выполнить обнаружение. Спасибо! :)