Проблемы, связанные с обнаружением человека в режиме реального времени из видеопотока
ЦЕЛЬ: обнаружение людей в режиме реального времени с минимальной задержкой / задержкой от данного удаленного видеопотока.
Настроить:
- Raspberry Pi (2) с веб-камерой USB, обеспечивающей передачу изображений / видеопотока с помощью Flask.
- Локальный компьютер (MacBook Pro) получает видеопоток, обрабатывает изображения через OpenCV, Darknet/DarkFlow/Yolo и Tensorflow.
- Показать полученный обработанный поток с обнаруженными людьми. Обнаруженные люди будут иметь прямоугольник вокруг них.
- Python 3
В настоящее время у меня работает базовый функционал, НО, похоже, он довольно медленный. Изображение обрабатывается примерно каждые несколько секунд, когда мне нужно, чтобы оно было обработано менее чем за секунду. Таким образом, результатом является видео, которое показывает обновления позади потока и изменчиво. От поиска вокруг, это, кажется, общая проблема, но я, казалось, не нашел прямого ответа.
Как я уже говорил на некоторых форумах, я реализовал потоковый захват как отдельную ветку, но я считаю, что сейчас проблема заключается в том, сколько времени потребуется для обработки этого захваченного изображения.
Можно ли улучшить производительность? Нужно ли выполнять эту обработку в облаке на системе с хорошим графическим процессором, чтобы я мог воспользоваться этим повышением производительности? Я использую неправильные веса йоло и CFG? Я знаю, что yolov3 отсутствует, но я думаю, что у меня были проблемы с работой с моим env.
incoming_frames = queue.Queue()
class Stream(threading.Thread):
def __init__(self, ID):
threading.Thread.__init__(self)
self.cam=cv2.VideoCapture('http://raspberrypi.local:5000/')
def run(self):
frame_id = 0
while True:
ret,frame=self.cam.read()
if ret:
frame_id = frame_id + 1
frame_dict = {}
frame_dict['frame'] = frame
frame_dict['id'] = frame_id
incoming_frames.put(frame_dict)
print("ACQUIRED FRAME " + str(frame_id))
time.sleep(0.1)
def stop(self):
self._stop_event.set()
print("[INFO] Starting Process......")
print("[INFO] Load Model / Weights")
options = {"model": "cfg/yolo.cfg", "load": "bin/yolo.weights", "threshold": 0.1}
tfnet = TFNet(options)
print("[INFO] Start Video Grab Thread")
stream = Stream(0)
stream.start()
while True:
if(not incoming_frames.empty()):
frame = incoming_frames.get()
result = tfnet.return_predict(frame['frame'])
print("Processing Frame " + str(frame['id']))
coordinates = []
for detection in result:
if detection['label'] == 'person' and detection['confidence'] >= 0.4:
cv2.rectangle(frame['frame'], (detection['topleft']['x'], detection['topleft']['y']),
(detection['bottomright']['x'], detection['bottomright']['y']),
(0, 255, 0), 2)
body = {'x': detection['topleft']['x'], 'y': detection['topleft']['y'],
'width': (detection['bottomright']['x'] - detection['topleft']['x']),
'height': (detection['bottomright']['y'] - detection['topleft']['y'])}
coordinates.append(body)
cv2.rectangle(frame['frame'], frame['x1'], frame['y1'], frame['x2'], frame['y2'], (0, 255, 0), 2)
cv2.imshow('Video', frame['frame'])
cv2.waitKey(1)
stream.stop()
cv2.destroyAllWindows()