OpenCV/Python: многопоточность для живого распознавания лицPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 OpenCV/Python: многопоточность для живого распознавания лиц

Сообщение Anonymous »

Я использую OpenCv и Dlib для выполнения распознавания лиц по ориентирам в прямом эфире из потока с веб-камеры. Язык — Python. Он отлично работает на моем ноутбуке MacBook, но мне нужно, чтобы он работал с настольного компьютера круглосуточно и без выходных. Компьютер представляет собой ПК с четырехъядерным процессором Intel® Core™2 Q6600, 32-разрядная частота 2,40 ГГц, работающий под управлением Debian Jessie. Производительность резко упала: из-за обработки происходит задержка в 10 секунд!

Поэтому я рассмотрел многопоточность< /strong> для повышения производительности:
  • Сначала я попробовал пример кода OpenCv, и результат отличный! Все четыре ядра загрузились на 100%, а производительность стала намного лучше.
  • Затем я заменил код обработки кадров своим кодом, и это совсем не улучшило производительность! Только одно ядро ​​достигает 100%, остальные остаются на очень низком уровне. Я думаю, что с многопоточностью дела обстоят хуже.
Я получил код ориентира лица из dlib пример кода. Я знаю, что его, вероятно, можно оптимизировать, но я хочу понять, почему я не могу использовать всю мощность моего (старого) компьютера с многопоточностью?

Я оставлю свой код ниже, большое спасибо за внимание :)

Код: Выделить всё

from __future__ import print_function

import numpy as np
import cv2
import dlib

from multiprocessing.pool import ThreadPool
from collections import deque

from common import clock, draw_str, StatValue
import video

class DummyTask:
def __init__(self, data):
self.data = data
def ready(self):
return True
def get(self):
return self.data

if __name__ == '__main__':
import sys

print(__doc__)

try:
fn = sys.argv[1]
except:
fn = 0
cap = video.create_capture(fn)

#Face detector
detector = dlib.get_frontal_face_detector()

#Landmarks shape predictor
predictor = dlib.shape_predictor("landmarks/shape_predictor_68_face_landmarks.dat")

# This is where the facial detection takes place
def process_frame(frame, t0, detector, predictor):
# some intensive computation...
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
clahe_image = clahe.apply(gray)
detections = detector(clahe_image, 1)
for k,d in enumerate(detections):
shape = predictor(clahe_image, d)
for i in range(1,68): #There are 68 landmark points on each face
cv2.circle(frame, (shape.part(i).x, shape.part(i).y), 1, (0,0,255), thickness=2)
return frame, t0

threadn = cv2.getNumberOfCPUs()
pool = ThreadPool(processes = threadn)
pending = deque()

threaded_mode = True

latency = StatValue()
frame_interval = StatValue()
last_frame_time = clock()
while True:
while len(pending) > 0 and pending[0].ready():
res, t0 = pending.popleft().get()
latency.update(clock() - t0)
draw_str(res, (20, 20), "threaded      :  " + str(threaded_mode))
draw_str(res, (20, 40), "latency        :  %.1f ms" % (latency.value*1000))
draw_str(res, (20, 60), "frame interval :  %.1f ms" % (frame_interval.value*1000))
cv2.imshow('threaded video', res)
if len(pending) < threadn:
ret, frame = cap.read()
t = clock()
frame_interval.update(t - last_frame_time)
last_frame_time = t
if threaded_mode:
task = pool.apply_async(process_frame, (frame.copy(), t, detector, predictor))
else:
task = DummyTask(process_frame(frame, t, detector, predictor))
pending.append(task)
ch = cv2.waitKey(1)
if ch == ord(' '):
threaded_mode = not threaded_mode
if ch == 27:
break
cv2.destroyAllWindows()



Подробнее здесь: https://stackoverflow.com/questions/422 ... ecognition
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • OpenCV/Python: многопоточность для живого распознавания лиц
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Интеграция библиотеки Dlib для распознавания лиц с использованием OpenCV и Python
    Anonymous » » в форуме Python
    0 Ответы
    78 Просмотры
    Последнее сообщение Anonymous
  • Методы защиты от спуфинга для распознавания лиц в Python
    Anonymous » » в форуме Python
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как запустить скрипт распознавания лиц Python из php-файла?
    Anonymous » » в форуме Php
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Cv2.error: OpenCV(4.8.1) D:\a\opencv-python\opencv-python\opencv\modules\src\.cpp:660: ошибка: (-215: утверждение не вып
    Anonymous » » в форуме Python
    0 Ответы
    131 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»