Обнаружение объектов в режиме реального времени Tensorflow - нужен совет по оптимизации - PullRequest
0 голосов
/ 31 мая 2018

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

В настоящее время я использую Opencv для захвата кадров с IP-камеры и тензорного потока для анализа и поиска объектов на них (код очень похож на тот, который можно найти в API обнаружения объектов Tf).Я также пробовал разные замороженные графы логических выводов из api обнаружения объекта тензорного потока по этой ссылке:

https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md

У меня настольный ПК с процессором Intel Core i7-6700 CPU @ 3.40GHz × 8 и мой графический процессор NVidia Geforce gtx960ti.

Программное обеспечение работает, как и предполагалось, но медленнее, чем ожидалось (3-5 кадров в секунду), а загрузка ЦП довольно высока (80-90%) дляодин скрипт Python, который работает только на 1 устройстве камеры.

Я что-то не так делаю?Каковы наилучшие способы оптимизации производительности и достижения лучшего FPS и более низкой загрузки ЦП для одновременного анализа большего количества видеопотоков?До сих пор я изучал многопоточность, но не знаю, как реализовать ее в своем коде.

Фрагмент кода:

with detection_graph.as_default(): with tf.Session(graph=detection_graph) as sess: while True: frame = cap.read() frame_expanded = np.expand_dims(frame, axis = 0) image_tensor = detection_graph.get_tensor_by_name("image_tensor:0") boxes = detection_graph.get_tensor_by_name("detection_boxes:0") 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") (boxes, scores, classes, num_detections) = sess.run( [boxes, scores, classes, num_detections], feed_dict = {image_tensor: frame_expanded}) vis_util.visualize_boxes_and_labels_on_image_array(frame,...) cv2.imshow("video", frame) if cv2.waitKey(25) & 0xFF == ord("q"): cv2.destroyAllWindows() cap.stop() break

1 Ответ

0 голосов
/ 04 июня 2018

Несколько вещей, которые я попробовал для своего проекта, могут помочь:

  1. Использовать nvidia-smi -l 5 и отслеживать использование графического процессора и памяти.
  2. Создайте небольшой бафф между OpenCV и TF, чтобы он не конкурировал с теми же ресурсами GPU,

    BATCH_SIZE = 200
    frameCount = 1
    images = []
    
    while (cap.isOpened() and frameCount <= 10000):
    
        ret, image_np = cap.read()
    
        if ret == True:
                frameCount = frameCount + 1
    
                images.append(image_np)
    
                if frameCount % BATCH_SIZE == 0:
    
                    start = timer()
                    output_dict_array = run_inference_for_images(images,detection_graph)
                    end = timer()
                    avg = (end - start) / len(images)
    
                    print("TF inference took: "+str(end - start) +" for ["+str(len(images))+"] images, average["+str(avg)+"]")
    
                    print("output array has:" + str(len(output_dict_array)))
    
                    for idx in range(len(output_dict_array)):
                        output_dict = output_dict_array[idx]
                        image_np_org = images[idx]
                        vis_util.visualize_boxes_and_labels_on_image_array(
                            image_np_org,
                            output_dict['detection_boxes'],
                            output_dict['detection_classes'],
                            output_dict['detection_scores'],
                            category_index,
                            instance_masks=output_dict.get('detection_masks'),
                            use_normalized_coordinates=True,
                            line_thickness=6)
    
                        out.write(image_np_org)
                        ##cv2.imshow('object image', image_np_org)
    
                    del output_dict_array[:]
                    del images[:]
    
    
    
        else:
            break
    
  3. Используйте модели мобильной сети.

  4. Измените размер захвата до 1280 * 720, сохраните захват как файл и выполните вывод файла.

Я сделал все выше и заархивировал 12~ 16 FPS на ноутбуке GTX1060 (6 ГБ).

    2018-06-04 13:27:03.381783: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1435] Adding visible gpu devices: 0
    2018-06-04 13:27:03.381854: I tensorflow/core/common_runtime/gpu/gpu_device.cc:923] Device interconnect StreamExecutor with strength 1 edge matrix:
    2018-06-04 13:27:03.381895: I tensorflow/core/common_runtime/gpu/gpu_device.cc:929]      0 
    2018-06-04 13:27:03.381933: I tensorflow/core/common_runtime/gpu/gpu_device.cc:942] 0:   N 
    2018-06-04 13:27:03.382069: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1053] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5211 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 with Max-Q Design, pci bus id: 0000:01:00.0, compute capability: 6.1)
    ===TF inference took: 8.62651109695 for [100] images, average[0.0862651109695]===
...