Крохотный компьютер Raspberry — замечательная вещь. Я использовал Raspberry Zero W в паре проектов в течение последнего полугода. Подкупила простота протипирования и откатки различных идей. А теперь вот факультативно заинтересовал вопрос, потянет ли сей девайс полноценную сверточную сетку? [Спойлер — потянет, но есть забавые нюансы]. Кому интересна тема — добро пожаловать под кат. Осторожно, будет много котиков!
Зачем Raspberry нейросеть?
Как-то собрал на Raspbery Zero W простенькую видео-ловушку для наблюдения за ночной жизнью животных (в основном котов) на даче. Код отличался простотой и работал неплохо. Для видео-фото детекции использовалась камера с ИК-подсветкой вроде этой «Raspberry Pi Night Version Camera».
Суть кода в том, чтобы забирать два последовательных кадра, сравнивать попиксельно и если число изменившихся пикселей больше некого порогового значения, запускать запись 10-секундного видео. Текст кода в этом посте приводить не буду, если кого-то заинтересует, пишите в комментариях, могу выложить в следующем. Основная фишка, уложить получение двух сравниваемых кадров в 0,2 секунды хотя бы, чтобы отловить быстрые события. Ну и быстро сравнить эти кадры, конечно.
Далее возникла идея прикрутить к алгоритму простую нейросеть, чтобы можно было в пойманном кадре определять объект и запускать видеозапись, только если достоверно определился класс объекта. Это потенциально позволяет избавиться от ложных срабатываний видеоловушки. Таковые случаются от движущихся объектов (например, трава или ветки) или от резкой засветки сцены камеры (свет в окне включился или фонарь погас, например).
Какую сетку поставить на Raspberry?
К счастью, под предустановленный Питон (в моем случае это 3.5.3) и широко доступной OpenCV (я использую 3.4.3) можно поставить практически любую сетку. К несчастью, из-за ограниченных вычислительных возможностей девайса список вариантов невелик. По сути можно выбирать только из «лайтовых» вариантов:
1. SqueezeNet (пример кода здесь).
2. YOLO Tiny (здесь).
3. MobileNet-SSD (тут).
4. MobileNet_v1_224 (есть фантастическое видео работы детектора объектов на этой сетке).
Во всех перечисленных случаях подкупает возможность использовать предобученную на солидных датасетах модель, тем самым избавив себя от всех мук и треволнений самостоятельного набора данных и последующего обучения на них нейросети.
У претендента №1 вдохновили заявленная высокая точность распознавания при скромных размерах весовых коэффициентов. Кроме того, недолгий поиск в Интернет вывел на великолепный блог Adrian Rosebrock, в котором подробнейшим образом прокомментирован код и расписаны несколько вариантов реализации deep learning на Raspberry.
Для тестирования возможностей SqueezeNet использовался код отсюда. Веса и текстовое представление модели автор кода присылает на емейл после заполнения формы на сайте. Кстати, если у Вас не установлен OpenCV, можете найти алгоритм действий в его же блоге. Плюс там же примеры «разгона» кода для ускорения времени работы моделей да и много чего еще. Респект Адриану, реально крутой ресурс.
Ну хорошо, запускаем код и на первой же картинке получаем сногсшибательный результат!
Кот на снимке определен как персидский с вероятностью 99%. На самом деле он не персидский, а британский длинношерстный или хайлендер. Но для модели с диапазоном в 1000 классов попадание, можно сказать, в яблочко. Для удобства я поместил основные результаты работы нейросети прямо на фото. Это 5 наиболее вероятных классов, первый — самый вероятный, второй — следующий по значимости, и так далее.
Кстати, модель считает классы объекта на моей Zero 6,5 секунд. Если верить данным Адриана, расчет на Raspberry Pi B+ на приведенных в его посте картинках (фото помещения парикмахерской, кобры и медузы) займет около 0,92 сек. Охотно верю, у полноценной версии Raspberry 4 ядра в процессоре как-никак. Полагаю, всем известно, что у Zero оно всего одно (((
Похоже, об определении класса объекта в реальном времени на Zero придётся забыть. Кстати, надо признаться, что и секунда времени на работу модели на «полноценной» Pi — тоже далеко не предел мечтаний.
Но продолжим тестирование модели.
Кот поменял положение тела и потерял целых 7% от своей былой «персидскости» ). Но это шутка, конечно, в целом работа модели очень даже на высоте. Вот на этом самом месте можно было и закончить, но захотелось слегка усложнить задачу модели. Продолжим упражняться на… кошках. Но наберем кадров, где кошка не сидит в классической позе, а спит, например. Итак, поехали.
На данном снимке кошка определена как ангорская, но это не точно. Видимо от того, что она раздражена навязчивой просьбой покинуть раковину. Ну ошиблась нейросеть, ну с кем не бывает в конце концов?
Оказывается, у меня дома живет пушистый футбольный мяч ) Да, бывает, что и люди совсем не те, кем кажутся на первый взгляд. Схватка кошки и нейросети принимает нешуточный оборот.
Ого. Теперь она — сибирская хаски. Что-то мне подсказывает, что кошка пока ведет в счёте )
Похоже, кто-то из этих двоих явно в нокдауне и это явно не кошка. Теперь она определена нейросетью как веретено (правда, всего на 8,5%), есть еще варианты, что она бигль, косатка, каменистый питон или скунс. Не кошка, а женщина загадка!
Да ладно! Это всё таки косатка! Да, да, морское млекопитающее отряда китообразных. Мне почему-то вспомнились строки из далёкого детства:
«В этой сказке нет порядка,
Здесь ошибка, опечатка! Кто-то,
Против всяких правил,
В сказке буквы переставил,
Переправил
«КИТ» на «КОТ»,
«КОТ» на «КИТ», наоборот!».
Звон гонга, рефери останавливает бой )
Во втором раунде кошка, коварно надев очки, сошла за бостонского бульдога с вероятностью в 34%. Или за французского. Похоже, нейросеть не вполне оправилась от разгрома в первом раунде )
Ну вот наконец то! Кошка определена как сиамская с вероятностью аж 66%! Браво, SqueezeNet! Если серьезно, похоже, что в исходном датасете преобладали фото не лежащих, а сидящих кошек. Лежащие были в основном собаки )
Способность кошек принимать форму коробки сбивает с толку даже людей, чего уж говорить про нейросети. Погружение к коробку снизило точность распознавания аж на 40%.
Так, так… А это, похоже, вообще запрещенный приём. Лежащая рядом с кошкой компьютерная мышь окончательно сбивает нейросеть с толку. Теперь наша кошка — мышь! )
Итак, всего нейросети было предъявлено 11 фото котов, из которых правильно определены всего 5. При этом с вероятностью более 50% всего в трёх случаях. Ни в коей мере не умаляю работу авторов SqueezeNet. Это добротная сеть с очень широким классом объектов и относительно низкой требовательностью к ресурсам.
Статья, конечно, носит шуточный характер, но из полученных данных можно извлечь вполне прагматичные выводы. Применять предобученные нейросети нужно с большой осторожностью, проверяя их на реальных изображениях той задачи, для которой планируется использовать нейросеть.
Что касается выбора оптимальной нейросети для Raspberry — вопрос пока остаётся открытым. Я продолжаю эксперименты, при наличии интереса аудитории к данной теме, буду делиться результатами дальнейших изысканий. Просто результаты первого шага оказались настолько забавными, что очень захотелось ими поделиться.
Спасибо, что дочитали до конца. Удачи и хорошей рабочей недели )
Комментарии (38)
Krapivnik
29.10.2018 12:22+1Про котов и китов (без политики):
— Сволочь он, — с ненавистью продолжал Турбин, — ведь он же сам не говорит на этом языке! А? Я позавчера спрашиваю этого каналью, доктора Курицького, он, извольте ли видеть, разучился говорить по-русски с ноября прошлого года. Был Курицкий, а стал Курицький… Так вот спрашиваю: как по-украински «кот»? Он отвечает «кит». Спрашиваю: «А как кит?» А он остановился, вытаращил глаза и молчит. И теперь не кланяется.
Николка с треском захохотал и сказал:
— Слова «кит» у них не может быть, потому что на Украине не водятся киты, а в России всего много. В Белом море киты есть…
(с) Булгаков М.А
отрывок из «Белой Гвардии»sirius23
29.10.2018 21:51Когда он сказал что съел лук, я долго думал из чего он теперь будет стрелять…
Омонимы (от греч. homos — одинаковый и onyma — имя) — разные по значению, но одинаково звучащие и/или пишущиеся единицы языка (слова, морфемы и др.). омонимы — одно и то же слово может иметь разные значения.vchslv13
30.10.2018 02:48Помилуйте, при чём же здесь омонимы? Рус. «кот» — укр. «кіт», рус. «кит» — укр. «кит». Ни разу не омонимы ни в русском, ни в украинском.
UPD: Упс, был не прав. Не знал, что ложные друзья переводчика также называются межъязыковыми омонимами.
sav13
29.10.2018 13:05А можно провести обучение нейросети на ваших кошках и как в этом случае плднимится достоверность?
Хотя в ИК свете скорее всего она еще упадетWalker2000 Автор
29.10.2018 13:18Если обучить нейросеть на фото кошек, которые использованы в посте, то она их отлично определит с вероятностью, близкой к 100%. Но если эти же весовые коэффициенты использовать для распознавания кошек в ИК свете, то оно будет близким к нулю. Вы совершенно правильно заметили, что сети, обученные по полноцветным фотографиям, крайне плохо определяют объекты по фото с ИК подстветкой.
Alhiimik
29.10.2018 14:32Не могу лайк поставить, но вы напишите по теме еще, интересно, особенно если проблему с ИК-распознованием решите. Я бы себе на дачу собрал такую штуковину, если решение не сложное будет
DROiD_4
29.10.2018 16:02Проблема с распознаванием в ИК решается довольно просто: при обучении сетки необходимо «простимулировать» ее привязываться к топологии снимка подкидывая изображения с проведенным любым нелинейным преобразованием. Таким образом в характеристике снимка меняются все параметры кроме топологии. Итог: корректное распознавание в ик спектре.
Walker2000 Автор
29.10.2018 16:05Да, правильно. Если подвергнуть преобразованию все снимки из обучающей выборки, это должно сработать. Единственное, считаться на обычном стационарном компе будет очень долго. Поэтому я начал экспериментировать с готовыми моделями.
natan555
29.10.2018 16:04Walker2000 Автор
29.10.2018 16:22По первому фото:
1. label: Siamese cat, probability: 0.81215
2. label: tabby, probability: 0.13405
3. label: tiger cat, probability: 0.024787
4. label: Egyptian cat, probability: 0.015808
5. label: Persian cat, probability: 0.0094098
По второму:
1. label: Siamese cat, probability: 0.49292
2. label: tabby, probability: 0.29549
3. label: Boston bull, probability: 0.098386
4. label: Egyptian cat, probability: 0.036759
5. label: tiger cat, probability: 0.024712natan555
29.10.2018 16:30спасибо большое. хотя я ожидал что-то типа: Mainecoon cat, probability: from 0.4 to 0.6
Walker2000 Автор
29.10.2018 16:37Тут не стоит ожидать многого от этой конкретной реализации SqueezeNet. Она оптимизирована на слишком широкий набор классов. Я считал бы хорошим результатом, если бы эта нейросеть определяла кошку как кошку любой породы. Скорее всего есть сетки специально под корректное определение пород кошек по фото хорошего качества. Я, правда, пока на такие не натыкался. Но с другой стороны, специально и не искал )
plastilinko
29.10.2018 20:27Но ведь изначально задача то была на распознавание котеек. А при использовании не специализированной кошконейросети выходит что реализация так себе )
Walker2000 Автор
29.10.2018 21:09Да, я тоже думал, что кошек она определяет с большей точностью. Тут подвело, похоже, именно большое количество классов. Собственно на кошек пришлось не особо большое число обучающих фотографий. Потому кошек в различных позах эта нейросеть распознает не особо хорошо.
ProstoUser
29.10.2018 17:19На КДПВ ошибка! Это не кот, а кошка! :-)
Walker2000 Автор
29.10.2018 17:34Да, верно. Это кошка. Но в данном контексте (Кот=Кит) речь идет о видах )
AlexeiZavjalov
30.10.2018 01:46Можно использовать акселератор для нейросетей от Intel — Movidius и получить realtime. Он должен работать с RPi, однако цена немного негуманной может показаться — $70.
andrew_atreides
30.10.2018 08:10Спасибо за позитивную статью! Думаю проблема распознавания кошки в её окрасе. Контрастный окрас в купе с недостаточным количеством в обучающей выборке вылился в подобные результаты. Надо завести себе тоже «футбольный мяч»)
DelphiCowboy
30.10.2018 09:33А где распознавание китов, тоже заявленное в статье?
Нужно научит нейросеть распознавать китов, а затем подкинуть это:
Walker2000 Автор
30.10.2018 09:47Добрый день!
В статье тестировались только коты и в одном случае кот определился как кит (точнее, killer whale). Рассматриваемая нейросеть умеет распознавать китов. Но картинку с котом, сидящем в рыбьем хвосте, она пределила как ковбойский сапог )
1. label: cowboy boot, probability: 0.43052
2. label: triceratops, probability: 0.16665
3. label: running shoe, probability: 0.14077
4. label: jigsaw puzzle, probability: 0.037335
5. label: Egyptian cat, probability: 0.0277DelphiCowboy
30.10.2018 12:40Всё это потому что нейросети тренируют на статичных фото, а нужно тренировать на динамических видео. Потому что кот — это не набор неподвижных цветных пятен на плоскости, а динамический 3D-объект.
Walker2000 Автор
30.10.2018 12:46Насколько я знаю, пока все популярные сетки обучаются именно на статичных картинках. Они сильно разного качества и аннотируются добровольцами. И при достаточных вычислительных ресурсах довольно неплохо работают на видео (видеоряд при этом анализируется покадрово). В принципе, возможна и обратная операция — разложить видео на кадры и по ним тренировать нейросеть. Наверное, такой подход будет полезен если стоит задача определить стиль бега кота или положение его тела )
DelphiCowboy
30.10.2018 13:40В идеале для обучения хорошо бы видео, где кот постоянно меняет свои свои позы, а так же видео, где кота облетает вокруг камера — как в Матрице.
Walker2000 Автор
30.10.2018 13:44Ну и это все при меняющемся внешнем освещении ). Оно тоже сильно влияет.
8street
30.10.2018 10:35На последней фото, с мышкой, нейросеть решила немного потролить. Вариант space heater, да и всё остальное — прекрасно.
Walker2000 Автор
30.10.2018 10:57Да, поскольку логика такого выбора непонятна, остается только списать на троллинг )
max8m
30.10.2018 15:21Спасибо за веселую статью!
Очень прошу не делать никаких «прагматичных выводов».
Если говорить о вариантах решений, то это различные FPGA, нейрочипы вроде movidius или более мощные SOC (желательно с более производительным мобильным GPU). Также есть серия nvidia jetson — но вероятно, он не впишется в ваш бюджет.
Мы пробовали запускать различные сети на смартфонах — у них часто неплохой GPU, особенно у флагманов. Есть различных модели, например у TF есть открытое решение с APK и предобученной моделью, которое на телефонах со snapdragon 6xx и 8xx серии выдает 5-20 fpsWalker2000 Автор
30.10.2018 16:03Спасибо за комментарий, полностью согласен с ним. Для работы нейросети для классификации изображений нужен нейропроцессор. На raspberry можно достичь 1...2 fps.
wertex15
01.11.2018 11:32А как технически выглядит обучение нейронки? Показали фото и сказали тут кит, а тут кот?
Tyiler
Спасибо.
Хочу вам предложить попробовать собрать мою сетку (сам ее на Raspberry не собирал). Только предобученной модели нет, поэтому… ну так ради интереса хоть.
Walker2000 Автор
Добрый день! Спасибо за предложение, попробую в ближайшее время.