Pull to refresh
24
0
Дмитрий Куртаев @dkurt

Нейросетевой хирург

Send message
И получить неплохой буст для своего резюме. Многие задачи — целиком open source.
Не устанавливать TensorFlow на Raspberry Pi и, возможно, получить больше кадров в секунду с OpenCV?
Не пробовали запускать сеть через OpenCV?

Позвольте предложить ещё такой вариант: сеть single-image-super-resolution-1011 из Intel OpenVINO:


Исходная картинка (1920x1080): https://habrastorage.org/webt/z-/wn/yy/z-wnyyf2a33hbporlp-cmsz4t5w.jpeg
Результат (3840x2160): https://habrastorage.org/webt/kx/3t/ng/kx3tngnwfxav7_rjps4tbzn95nc.jpeg


Запуск сети ровно 1 секунда (980ms — 990ms). Ubuntu пишет, CPU: Intel® Core™ i5-4460 CPU @ 3.20GHz × 4, 16GB RAM.


Пример обрабатывает только первый кадр. Если кому понравился результат — можно допилить до записи видео файла с помощью cv::VideoWriter.


import numpy as np
import cv2 as cv
from openvino.inference_engine import IENetwork, IEPlugin

model = 'single-image-super-resolution-1011'
prefix = '/opt/intel/computer_vision_sdk_2018.5.445/deployment_tools/intel_models/' + model + '/FP32/' + model

# Load a plugin.
plugin = IEPlugin('CPU')

# Copy single-image-super-resolution-1011.xml and do global replacement of numbers:
# 1920 -> 3840
# 1080 -> 2160
# 960 -> 1920
# 540 -> 1080
# 480 -> 960
# 270 -> 540

w = 960
h = 540
print(h*4, w*4)

# Load network.
net = IENetwork(model + '.xml', prefix + '.bin')
exec_net = plugin.load(net)

cap = cv.VideoCapture('1080_sample.mp4')
while cv.waitKey(1) != 27:
    hasFrame, frame = cap.read()
    if not hasFrame:
        break
    cv.imwrite('img.jpg', frame)

    frameResized = cv.resize(frame, dsize=(w*4, h*4), interpolation=cv.INTER_CUBIC)
    frame = cv.resize(frame, dsize=(w, h))

    blob = frame.reshape(1, h, w, 3).transpose([0, 3, 1, 2]).astype(np.float32)
    blobResized = frameResized.reshape(1, 4*h, 4*w, 3).transpose([0, 3, 1, 2]).astype(np.float32)

    outputs = exec_net.infer({'0': blob, '1': blobResized})

    out = outputs['129'].reshape(3, 4*h, 4*w).transpose(1, 2, 0)

    cv.imwrite('out.jpg', (np.clip(out, 0, 1) * 255).astype(np.uint8))
    break
Как вариант hackaday.com/2019/01/25/robot-cant-take-its-eyes-off-the-bottle :)

А если серьёзно, то вопрос несколько непонятен. Это акселератор, стик ускоряет вычисления нейронных сетей. Нужно скорее спросить, какое применение сетей в компьютерном зрении. Но с этим проблем быть не должно — примеры есть.

Но если ответить по теме статьи, то есть пример использования именно в связке Стик + Raspberry в виде камеры наблюдения: www.cortexica.com/the-worlds-first-ai-edge-camera-powered-by-raspberry-pi-and-two-intel-myriad-x-vpus.

zazar, Промахнулся по кнопке Ответить, поэтому сообщение пошло не в ту ветку.

Конфиденциальная информация из закрытых источников от сотрудников Интел — вот что по-моему выглядит куда более странно. В чём проблема сделать запрос на публикацию на заданную тему? Совсем недавно как раз обсуждалась идея биржи с подобными запросами на хабре. Найдем нужного сотрудника — узнаем все детали. Опять же детали, доступные извне, но структурированные и изложенные в виде статьи.


Вот простите конечно, но возможность напрямую спросить интересующие вопросы всегда есть.

Не могу утверждать что все, поэтому указал, что большинство) Нам нужны ещё мнения, чтобы подтвердить или опровергнуть.


Спасибо Андрею за творчество))

Самый больной вопрос, если честно. С одной стороны, где ни запусти — будет медленнее, чем нативно собранная библиотека. С другой — это, пожалуй, самый переносимый вариант. Всё же, deep learning модуль в OpenCV.js — это пока слишком тяжело. Но если рассматривать алгоритмы попроще, то можно что-то перекладывать на клиентскую часть.

Рекомендую попробовать собрать OpenCV.js самому, с самой последней версией Emscripten с включенным WebAssembly. Так и файлик получается меньше, и производительность получше, засчет того, что часть библиотеки компилируется непосредственно на устройстве (тот, что можно скачать с docs.opencv.org — без WASM).

Дмитрий, спасибо за статью! Позвольте придраться к мелочам:


Есть еще одна тонкость, касающаяся взаимодействия Raspberry Pi и Neural Compute Stick: если в случае ноутбука достаточно просто ткнуть NCS в ближайший USB 3.0 порт, то для Raspberry придется найти USB кабель, иначе NSC своим корпусом заблокирует оставшиеся три USB разъема.

Если подключать в верхний ряд, то заблокирует всего один соседний разъём. Хотя согласен, всё равно звучит забавно.


В таблице так же указано, что face-detection-retail-0004 работает 9.3FPS, хотя у меня получалось замерять порядка 14 FPS (в синхронном режиме), что уже сравнимо с другими представленными в таблице конфигурациями. Использовал так же NCS и RPI 2 model B. Из кода репозитория заметил, что замеры включают не только запуск сети, но и такие функции, как imshow с отрисовками. Думаю, было бы честно, если производительность детектора осталась производительностью детектора, без влияния стороннего кода.

Спасибо! Да, действительно находит. Как вариант — можно попробовать скомбинировать с детекторами людей. То есть если мы нашли лицо, но не нашли человека — значит что-то пошло не так.


masai, Позвольте поправить — у OpenCV своя реализация нейронных сетей. Зависимостей от обучающих фреймворков — нет.

Если остался пример с false positive детектированием колёс и кустов — хотелось бы взглянуть.

CopterSpace, В данном случае у нас алгоритм состоит из двух частей: нахождение лиц и затем, по лицу, определить положение головы. Все найденные лица вырезаются из кадра и приводятся к единому размеру (60x60). То есть если говорить про качество — важно отдельно оценивать детектор и предсказатель углов.


Про сравнение с Мовидиусом и без. Две эти сети сохранены в формате, который можно запускать только через OpenVINO — а это значит, что только на железе Intel (CPU, GPU, FPGA, VPU (Movidius)). Для Raspberry Pi доступен только режим запуска на Movidius (или через OpenCV, но уже не Intel сетей, а других публичных). Альтернатива — попробовать взять публичную сеть и запустить как на CPU, так и на Movidius (через тот же OpenCV).


Конкретно для этих двух сетей, этого скрипта, и того, что у меня лежит дома (Movidius Neural Compute Stick первой версии и Raspberry Pi 2 model B) — детектор отрабатывает за 72-75 миллисекунд (около 14 FPS), предсказание углов — 10-11 миллисекунд (около 100 FPS). Детектор можно разогнать, подавая ему на вход изображение размера не 300x300, а меньше. Мы (OpenCV) так сделали для JavaScript примера с похожей сетью (там 128x96 вход). Какой размер брать — зависит от потребностей в балансе качества против скорости.


Хочу обратить внимание, что эти числа можно воспроизвести только указывая ddepth=cv.CV_8U, что значит, что на стик по USB отправляются не FP32, а U8, которые конвертируются уже на девайсе. Такой трюк необходим потому, что на RPI USB 2.0 и чем меньше отсылаем данных — тем быстрее общий FPS.

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


То есть ещё раз — Ваше решение правильное, но хочется иметь воспроизводимый набор инструкций. Например, взять публичный чистый Raspbian образ, докачать в него зависимостей и использовать в качестве rootfs донора. Тогда если по шагам:


  1. Качаем Raspbian Lite


    wget http://downloads.raspberrypi.org/raspbian_lite/archive/2018-11-15-21:03/root.tar.xz

  2. Распаковываем и внедряемся:


    mkdir sysroot
    sudo tar -xf root.tar.xz -C sysroot
    sudo chroot sysroot


Только на chroot получим ошибку


chroot: failed to run command ‘/bin/bash’: Exec format error

Потому что OS то для ARM, да ещё и 32 битная, а мы (я в данном случае) работаем на 64-битном Intel® Core™ i5.


Тогда то и можно попробовать qemu:


sudo apt-get install -y qemu-user-static
sudo cp /usr/bin/qemu-arm-static sysroot/usr/bin/
sudo chroot sysroot 

Готово, я внутри и могу доустанавливать пакеты.

Да, можно и действительно проще. Нужно ещё будет использовать qemu, чтобы докачивать пакеты в rootfs.

Проблема в переносимости — такой подход не заинтегрировать гладко в CI, если нужно, посколько трюк с qemu сработает только тогда, когда на самой хостовой машине, выделенной под CI поставлен qemu-user-static. Поправьте меня, если не прав.

Вопрос насколько долго это будет актуально и гибко. Выложить может любой пользователь, но поддерживать будет не каждый. Чего далеко ходить, python-opencv: Maintainer Kubuntu Developers, не OpenCV team.

А что тут от OCV, встречный вопрос?) deep learning модуль выдаёт предсказания, которые совпадают с оригинальным фреймворком (авторский Caffe в данном случае). Всё зависит от качества тренировки исходной нейросети.

Я то вообще удивился, что нашлось хоть что-то, с учётом качества картинки. Да ещё и матрёшку признали антропоморфной (хотя по правде сказать, сеть была крайне неуверена и чаще предсказывала, что это «bottle»).

Спасибо за замечание, поправил! Сам привык называть их бордами.


Компиляция непосредственно на микроконтроллере плате, принято названная нативной, действительно трудоёмка
Говорят, за упоминание опыта работы с OpenCV дают наклейку и жмут руку ;)

Information

Rating
Does not participate
Location
Нижний Новгород, Нижегородская обл., Россия
Date of birth
Registered
Activity