Pull to refresh
0

Intel OpenVINO на Raspberry Pi: урожай 2018 года

Reading time 3 min
Views 11K


Писать про программирование можно не только прозой, но и стихами. Последнее, конечно, случается не часто — скажем, в блоге Intel такое бывало чуть менее, чем никогда. Однако в порядке эксперимента сегодня мы решили позволить себе; как это получилось — решать вам. Итак...


В последнем квартале уходящего года,
А если быть точным, на прошлой неделе,
Разработчики Intel представили новый
Релиз OpenVINO toolkit на software.


Что нового сделано — обратитесь к changelog'ам,
Мне точным в деталях быть не дано,
Я в этом посте расскажу лишь немного:
Про зрение, Intel и малиновое вино.


***


OpenVINO по сути — набор инструментов,
Библиотек и примеров решения
С особым ускорением на железе Интела
Популярных задач компьютерного зрения.


Кто не слышал про computer vision -
Это область компьютерных наук,
Заставляющая понимать машину,
Подобно человеку, мир вокруг.


Источник информации, в основном, изображения,
А проблема — создать алгоритм
Для извлечения полезных признаков
И принятию решений по ним.


***


Первая в нашем мини-обзоре — библиотека OpenCV,
Как часто зовётся, традиционного
Машинного зрения и обучения,
Читающей с камеры и на экране рисующей,
Кросс-платформенной и на GitHub’е живущей,
Набравшая на момент написания 30502 звезды.


В пакете для Raspberry мы так же найдём
Публичную OpenCV, а с ней
NEON оптимизации, обёртки в Python,
GStreamer для камер и для окон GTK.



***


Вот уже лет семь на свете
Для решения наших задач
Применяют глубокие нейронные сети,
Те, что с учителем нужно обучать.


Caffe, PyTorch — всё это про тренинг,
Порой занимающим пару недель.
OpenVINO решает вторую проблему:
Запуск обученных сеток, как можно быстрей.


Из лучших решений для многих платформ,
Для известных сценариев, нужд и ресурсов,
В OpenVINO deep learning — отдельным движком,
С одним интерфейсом на разных устройствах.


***


Для работы у вас инструментария
Установите Raspbian 9 на Raspberry Pi,
Подключите Movidius стик, блок питания,
Проверьте что версия CPU не ниже семи.


Подробнее читайте в соответствующем гайде,
А в качестве демо предлагаю код,
Работающий с камерой и выключающий
По направлению взгляда светодиод.


Скачайте две сети: для лиц нахождения
И предсказаний головы положения,
Используйте USB камеру и обратите внимание,
Что в коде пин номер 2 по умолчанию.


***


Всем тем посвящается, кто увлеченно
Над нашим проектом работал весь год.
Пусть только ускоряется всё в наступающем,
OpenVINO на Raspberry — тот самый IoT!


import cv2 as cv
from gpiozero import LED
from math import cos, sin, pi

winName = 'OpenVINO on Raspberry Pi'

cv.namedWindow(winName, cv.WINDOW_NORMAL)

faceDetectionNet = cv.dnn.readNet('face-detection-retail-0004.xml',
                                  'face-detection-retail-0004.bin')
headPoseNet = cv.dnn.readNet('head-pose-estimation-adas-0001.xml',
                             'head-pose-estimation-adas-0001.bin')
faceDetectionNet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)
headPoseNet.setPreferableTarget(cv.dnn.DNN_TARGET_MYRIAD)

cap = cv.VideoCapture(0)
led = LED(2)
led.on()

while cv.waitKey(1) != 27:
    hasFrame, frame = cap.read()
    if not hasFrame:
        break

    frameHeight, frameWidth = frame.shape[0], frame.shape[1]

    # Detect faces on the image.
    blob = cv.dnn.blobFromImage(frame, size=(300, 300), ddepth=cv.CV_8U)
    faceDetectionNet.setInput(blob)
    detections = faceDetectionNet.forward()

    for detection in detections.reshape(-1, 7):
        confidence = float(detection[2])
        if confidence > 0.5:
            xmin = int(detection[3] * frameWidth)
            ymin = int(detection[4] * frameHeight)
            xmax = int(detection[5] * frameWidth)
            ymax = int(detection[6] * frameHeight)

            xmax = max(1, min(xmax, frameWidth - 1))
            ymax = max(1, min(ymax, frameHeight - 1))
            xmin = max(0, min(xmin, xmax - 1))
            ymin = max(0, min(ymin, ymax - 1))

            # Run head pose estimation network.
            face = frame[ymin:ymax+1, xmin:xmax+1]
            blob = cv.dnn.blobFromImage(face, size=(60, 60), ddepth=cv.CV_8U)

            headPoseNet.setInput(blob)
            headPose = headPoseNet.forward(['angle_p_fc', 'angle_r_fc', 'angle_y_fc'])

            p, r, y = headPose[0][0], headPose[1][0], headPose[2][0]
            cos_r = cos(r * pi / 180)
            sin_r = sin(r * pi / 180)
            sin_y = sin(y * pi / 180)
            cos_y = cos(y * pi / 180)
            sin_p = sin(p * pi / 180)
            cos_p = cos(p * pi / 180)

            x = int((xmin + xmax) / 2)
            y = int((ymin + ymax) / 2)
            # center to right
            cv.line(frame, (x,y), (x+int(50*(cos_r*cos_y+sin_y*sin_p*sin_r)), y+int(50*cos_p*sin_r)), (0, 0, 255), thickness=3)
            # center to top
            cv.line(frame, (x, y), (x+int(50*(cos_r*sin_y*sin_p+cos_y*sin_r)), y-int(50*cos_p*cos_r)), (0, 255, 0), thickness=3)
            # center to forward
            cv.line(frame, (x, y), (x + int(50*sin_y*cos_p), y + int(50*sin_p)), (255, 0, 0), thickness=3)

            cv.rectangle(frame, (xmin, ymin), (xmax, ymax), (0, 255, 255))

            if abs(cos_y * cos_p) > 0.9:
                cv.putText(frame, 'FORWARD', (0, 30), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), thickness=2)
                led.off()
            else:
                led.on()

    cv.imshow(winName, frame)


Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+13
Comments 8
Comments Comments 8

Articles

Information

Website
www.intel.ru
Registered
Founded
Employees
5,001–10,000 employees
Location
США
Representative
Анастасия Казантаева