Обнаружение объекта Tensorflow Медленное использование потока rtsp
Я привел пример здесь: https://www.youtube.com/watch?v=MoMjIwGSFVQ и обнаружил, что обнаружение объекта работает с веб-камерой.
Но я переключил свою веб-камеру, чтобы использовать поток rtsp с IP-камеры, которая, по моему мнению, транслирует H264, и теперь я замечаю, что в видеоролике есть около 30 секундного запаса, плюс видео очень часто останавливается.
Вот код python, который выполняет основную обработку:
import cv2
cap = cv2.VideoCapture("rtsp://192.168.200.1:5544/stream1")
# Running the tensorflow session
with detection_graph.as_default():
with tf.Session(graph=detection_graph) as sess:
ret = True
while (ret):
ret,image_np = cap.read()
# Expand dimensions since the model expects images to have shape: [1, None, None, 3]
image_np_expanded = np.expand_dims(image_np, axis=0)
image_tensor = detection_graph.get_tensor_by_name('image_tensor:0')
# Each box represents a part of the image where a particular object was detected.
boxes = detection_graph.get_tensor_by_name('detection_boxes:0')
# Each score represent how level of confidence for each of the objects.
# Score is shown on the result image, together with the class label.
scores = detection_graph.get_tensor_by_name('detection_scores:0')
classes = detection_graph.get_tensor_by_name('detection_classes:0')
num_detections = detection_graph.get_tensor_by_name('num_detections:0')
# Actual detection.
(boxes, scores, classes, num_detections) = sess.run(
[boxes, scores, classes, num_detections],
feed_dict={image_tensor: image_np_expanded})
# Visualization of the results of a detection.
vis_util.visualize_boxes_and_labels_on_image_array(
image_np,
np.squeeze(boxes),
np.squeeze(classes).astype(np.int32),
np.squeeze(scores),
category_index,
use_normalized_coordinates=True,
line_thickness=8)
# plt.figure(figsize=IMAGE_SIZE)
# plt.imshow(image_np)
cv2.imshow('image',cv2.resize(image_np,(1280,960)))
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
cap.release()
break
Я новичок в python и tensorflow. Должен ли этот код каким-либо образом модифицировать поток rtsp? На моем ПК нет платы графического процессора.
Ответы
Ответ 1
Без GPU Tensorflow не может обрабатывать высококачественные кадры с большими скоростями. Для обработки кадра 640 * 480 на моей машине потребовалось почти 0,2 секунды. Таким образом, он может обрабатывать около 5 кадров в секунду.
Существует два способа сделать код в реальном времени.
- Уменьшить разрешение кадра
- Уменьшить fps
Код
cap = cv2.VideoCapture("rtsp://192.168.200.1:5544/stream1")
cap.set(3,640) #set frame width
cap.set(4,480) #set frame height
cap.set(cv2.cv.CV_CAP_PROP_FPS, 5) #adjusting fps to 5
Примечание. Обнаружение объекта Tensorflow выполняется достаточно хорошо даже при низких разрешениях.
Чтобы испытать производительность графического процессора, floydhub предоставляет бесплатный графический процессор (ограниченное количество часов). Вы можете загрузить код и запустить в floydhub и измерить производительность. Я обнаружил, что GPU был примерно в 35 раз быстрее, чем процессор.
Ответ 2
Если 1080p @30fps отлично работает с вашей веб-камерой, но не поверх RTSP, вероятно, дополнительные накладные расходы на декодирование потока RTSP запрашивают слишком много вашего процессора. У него проблемы с выполнением обеих задач, которые вы задаете одновременно. Также возможно, что память является узким местом, хотя это кажется менее вероятным.
Многие процессоры Intel имеют встроенные графические процессоры, способные декодировать видео изначально. Тем не менее, я заметил, что при определенных условиях, и с определенным программным обеспечением, встроенные декодирующие процессоры имеют тенденцию значительно отставать (до ~ 30 секунд). Это также может быть проблемой, с которой вы сталкиваетесь здесь. Возможно, стоит попробовать это программное обеспечение на другом компьютере с аналогичным качеством, но не идентичным аппаратным обеспечением. Вы также можете проверить его на более новом оборудовании того же ценового диапазона, поскольку я не видел эту проблему в процессорах Intel последнего поколения.