Как использовать flask для ответа на поток изображения и некоторую другую информацию одновременно - PullRequest
0 голосов
/ 28 мая 2020

Я хочу развернуть модель машинного обучения, которая обнаруживает некоторые объекты в реальном времени. Я попытался имитировать некоторые демонстрации, в которых я использую cv2 для захвата камеры и размещения текста на изображении.
Вот как я обнаруживаю и помещаю текст на изображение.

class VideoCamera(object):
    def __init__(self):
        self.video = cv2.VideoCapture(0)
    def __del__(self):
        self.video.release()

    def detect_au(self,img):
        img = np.array(img)
        img = img_to_array(img.astype('float')/255.0)
        img = np.expand_dims(img, axis=0)
        prob=list(model.predict(img)[0])
        AUs = []
        for i in range(len(prob)):
            if prob[i] > 0.5:
                AUs.append(AU_LIST[i])
        AUs.sort(key = lambda x : int(x[2:])) 
        return AUs


    def draw_result(self):
        success, img = self.video.read()
        img = cv2.flip(img, 1)
        faces = face_engine.detectMultiScale(img,scaleFactor=1.1,minNeighbors=10) 
        i = 1  
        for (x,y,w,h) in faces:
            img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
            img = cv2.putText(img,'Face #'+str(i),(x,y-20), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)
            face = cv2.resize(img[y:y+h, x:x+w],(96,96))
            AUs = self.detect_au(face)
            img = cv2.putText(img,'Face #'+str(i),(img.shape[0]+40*i,img.shape[1]-20), 
                              cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)
            j = 0
            for AU in AUs:
                img = cv2.putText(img,AU,(x-100, y+40*j),
                                  cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)
                j += 1
            i += 1
        ret, jpeg = cv2.imencode('.jpg', img)
        return jpeg.tobytes()

затем я отвечаю кадру на / video_feed, все работает нормально

def gen(camera):
    while True:
        labels, frame = camera.draw_result()
        yield labels, frame

@app.route('/')
def video_feed():
    labels, frame = next(gen(VideoCamera()))
    myresponse = {'labels':labels, 'frame':frame}
    return jsonify(myresponse)

@app.route('/cur_camera')
def cur_camera():
    return render_template('cur_camer.html')

где в шаблоне есть

<img id="bg" src="{{ url_for('video_feed') }}" width="800" height="540" >

Однако я не хочу отображать все метки в потоке изображения, я хочу отображать надписи на странице в виде текста, как это сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...