Я использую OpenCV и Dlib для выполнения распознавания лица ж/ориентиров, живу от потока веба. Язык Python. Он отлично работает на моем ноутбуке macbook, но мне нужно, чтобы он запускался с настольного компьютера 24 часа в сутки. Компьютер представляет собой компьютер Intel® Core ™ 2 Quad CPU Q6600 @ 2.40GHz 32bit, работающий с Debian Jessie. Резкое падение производительности: есть задержка в 10 секунд из-за обработки!OpenCV/Python: многопоточность для живого распознавания лица
поэтому я посмотрел в многопоточной, чтобы получить производительность:
- Я первый попробовал образец кода с помощью 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()
Большое спасибо за то, что нашли время, чтобы написать весь этот код :) Это не работает по какой-то причине, я собираюсь погрузиться в него на этой неделе. Я просто сменил компьютер на i7-2600K @ @ 3.40Ghz, и у меня все еще проблемы с производительностью! Наверное, узкое место где-то еще. ** Где-то в архитектуре OSX и Debian возможно? ** потому что все отлично работает в OSX! Еще раз спасибо, я буду информировать вас о моих результатах на этой неделе :) – Simon
Что не совсем работает, код или производительность? Является ли код запущенным, но все еще недостаточно быстрым или код не работает вообще? Если вы дадите мне ошибку, я могу сказать вам, что это такое. Спасибо –
Код работает, но не так, как ожидалось. Я поместил журнал в этот файл: https://docs.google.com/document/d/1cs9Jpf03EjTPHommMLmJ_84PxoAT3ATtmFlvBEg6l6I/edit?usp=sharing Опять же, у меня не было времени еще докопаться до него, я сделаю так что завтра. Еще раз спасибо :) – Simon