Как запустить TensorFlow параллельно с другой обработкой на Raspberry Pi3 - PullRequest
0 голосов
/ 08 июля 2019

Я хотел бы запустить непрерывный поток с PiCamera на Raspberry Pi 3, а также выполнять другие вычисления параллельно с этим потоком.

Мне нужно только взять из этого потока (процесса) объект, который он обнаружил. Я опубликую здесь код, который у меня есть. Он не входит в функцию computation(). Он просто запускает камеру, обнаруживает объекты и остается в этом процессе.

Я пытался использовать модуль multiprocessing из Python, но, похоже, он не работает.

def startRecord():
    frame_rate_calc = 1
    freq = cv2.getTickFrequency()
    font = cv2.FONT_HERSHEY_SIMPLEX
    camera = PiCamera()
    camera.resolution = (IM_WIDTH, IM_HEIGHT)
    camera.framerate = 10
    camera.vflip = True
    rawCapture = PiRGBArray(camera, size=(IM_WIDTH, IM_HEIGHT))
    rawCapture.truncate(0)

    for frame1 in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
        object_detected = "none"
        t1 = cv2.getTickCount()

        # Acquire frame and expand frame dimensions to have shape: [1, None, None, 3]
        # i.e. a single-column array, where each item in the column has the pixel RGB value
        frame = np.copy(frame1.array)
        frame.setflags(write=1)
        frame_expanded = np.expand_dims(frame, axis=0)

        # Perform the actual detection by running the model with the image as input
        (boxes, scores, classes, num) = sess.run(
            [detection_boxes, detection_scores, detection_classes, num_detections],
            feed_dict={image_tensor: frame_expanded})

        # Draw the results of the detection (aka 'visualize the results')
        vis_util.visualize_boxes_and_labels_on_image_array(
            frame,
            np.squeeze(boxes),
            np.squeeze(classes).astype(np.int32),
            np.squeeze(scores),
            category_index,
            use_normalized_coordinates=True,
            line_thickness=8,
            min_score_thresh=0.40)

        if classes[0][0] == 1 and scores[0][0] > 0.98:
            object_detected = "circle"
        elif classes[0][0] == 2 and scores[0][0] > 0.98:
            object_detected = "donnut"
        elif classes[0][0] == 3 and scores[0][0] > 0.98:
            object_detected = "square"
        elif classes[0][0] == 4 and scores[0][0] > 0.98:
            object_detected = "alphabot"

        cv2.putText(frame, "FPS: {0:.2f}".format(frame_rate_calc), (30, 50), font, 1, (255, 255, 0), 2, cv2.LINE_AA)

        # All the results have been drawn on the frame, so it's time to display it.
        cv2.imshow('Object detector', frame)

        t2 = cv2.getTickCount()
        time1 = (t2 - t1) / freq
        frame_rate_calc = 1 / time1

        # Press 'q' to quit
        if cv2.waitKey(1) == ord('q'):
            break

        rawCapture.truncate(0)
    camera.close()


def computation():
    print("OUTSIDE OF CAPTURE")
    print(object_detected)
### Picamera ###
if camera_type == 'picamera':
    # Initialize Picamera and grab reference to the raw capture
    p1 = Process(target=startRecord())
    p2 = Process(target=computation())
    p1.start()
    p2.start()


    p1.join()
    p2.join()

1 Ответ

0 голосов
/ 08 июля 2019

Добро пожаловать в StackOverflow!

Ваши намерения ясны, но вашему опубликованному коду потребуется некоторая полировка, и RPi3 будет самой сложной частью путешествия:

  • Модуль multiprocessing действительно способен порождать пул подпроцессов, но при огромных затратах - и в [PSPACE] он заполняет ПОЛНУЮ КОПИЮ интерпретатора Pythonсеанс (с сохранением состояния и захватом огромных объемов оперативной памяти для каждой реплицированной копии) и в [PTIME], так как это занимает больше времени, чем больше подпроцессов порождает (единовременная стоимость, но очень важная для накладных расходов-строгий закон Амдала переформулированная максимальная параллель ускорение оценки выгод )

  • На RPi3 ОЗУ не более 1 МБIIRC, так что либо ваша модель TF должна быть действительно миниатюрной, либо вы должны осторожно порождать подпроцесс, выделенный для TF, таким образом, чтобы он не реплицировал одни и те же TF-BLOB в основной сессии (и не оставлял ихBLOB там) -довольно сложная часть.

  • Тем не менее, вам нужна координация между обоими сторонами предполагаемой распределенной обработки.Один процесс не может положить руку в карман другого процесса и принять какое-либо значение вне явной воли соседа (и контроля).На данный момент: - одна сторона, вызываемая как p1 = Process( target = startRecord() ), никогда не вызывает computation(), которая когда-либо будет сделана - другая сторона, вызываемая как p2 = Process( target = computation() ) никогда не получает (и по своей конструкции даже не требует этого) ни одного фрагмента данных откуда-либо еще (единственная ссылка на некоторую переменную / объект - object_detected - уже был предварительно скопирован из основного сеанса, в таком состоянии (если он вообще имелся) во время создания подпроцесса и стал полностью отделенной копией (намеренно не подключенной и не-координированные с любыми, теперь уже "внешними", изменениями - так как этот набор функций освобождает подпроцесс служебных издержек координации GIL-блокировки любого центрального основного сеанса, а подпроцессы могут работать независимо, получая повышенные уровни [CONCURRENT]выполнение процесса (ов)

Решение:

a) проверить, соответствует ли размер областям ограничений RAM RPi3

b) right-размер основнойПеред созданием любых специализированных подпроцессов

c) разработайте межпроцессное взаимодействие (очередь по умолчанию / очередь может стать непригодной для быстрой и эффективной обработки - может использовать более интеллектуальную и более управляемую структуру сигнализации / обмена сообщениями, какZeroMQ ipc:// для перемещения необработанных байтовых блоков почти в режиме нулевого копирования - да, и здесь, снова и снова, потолок памяти RPi3 повредит вам обоим [PSPACE] (так, чтобы вписаться внутрь в обе очереди /издержки сторон de-Queue), а также [PTIME] (по мере увеличения задержек надстройки может превышать допустимые пороги управления процессом))

...