Добрый день всем.

Крохотный компьютер Raspberry — замечательная вещь. Я использовал Raspberry Zero W в паре проектов в течение последнего полугода. Подкупила простота протипирования и откатки различных идей. А теперь вот факультативно заинтересовал вопрос, потянет ли сей девайс полноценную сверточную сетку? [Спойлер — потянет, но есть забавые нюансы]. Кому интересна тема — добро пожаловать под кат. Осторожно, будет много котиков!

image


Зачем Raspberry нейросеть?


Как-то собрал на Raspbery Zero W простенькую видео-ловушку для наблюдения за ночной жизнью животных (в основном котов) на даче. Код отличался простотой и работал неплохо. Для видео-фото детекции использовалась камера с ИК-подсветкой вроде этой «Raspberry Pi Night Version Camera».

image

Суть кода в том, чтобы забирать два последовательных кадра, сравнивать попиксельно и если число изменившихся пикселей больше некого порогового значения, запускать запись 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, можете найти алгоритм действий в его же блоге. Плюс там же примеры «разгона» кода для ускорения времени работы моделей да и много чего еще. Респект Адриану, реально крутой ресурс.

Ну хорошо, запускаем код и на первой же картинке получаем сногсшибательный результат!

image

Кот на снимке определен как персидский с вероятностью 99%. На самом деле он не персидский, а британский длинношерстный или хайлендер. Но для модели с диапазоном в 1000 классов попадание, можно сказать, в яблочко. Для удобства я поместил основные результаты работы нейросети прямо на фото. Это 5 наиболее вероятных классов, первый — самый вероятный, второй — следующий по значимости, и так далее.

Кстати, модель считает классы объекта на моей Zero 6,5 секунд. Если верить данным Адриана, расчет на Raspberry Pi B+ на приведенных в его посте картинках (фото помещения парикмахерской, кобры и медузы) займет около 0,92 сек. Охотно верю, у полноценной версии Raspberry 4 ядра в процессоре как-никак. Полагаю, всем известно, что у Zero оно всего одно (((

Похоже, об определении класса объекта в реальном времени на Zero придётся забыть. Кстати, надо признаться, что и секунда времени на работу модели на «полноценной» Pi — тоже далеко не предел мечтаний.

Но продолжим тестирование модели.

image

Кот поменял положение тела и потерял целых 7% от своей былой «персидскости» ). Но это шутка, конечно, в целом работа модели очень даже на высоте. Вот на этом самом месте можно было и закончить, но захотелось слегка усложнить задачу модели. Продолжим упражняться на… кошках. Но наберем кадров, где кошка не сидит в классической позе, а спит, например. Итак, поехали.

image

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

image

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

image

Ого. Теперь она — сибирская хаски. Что-то мне подсказывает, что кошка пока ведет в счёте )

image

Похоже, кто-то из этих двоих явно в нокдауне и это явно не кошка. Теперь она определена нейросетью как веретено (правда, всего на 8,5%), есть еще варианты, что она бигль, косатка, каменистый питон или скунс. Не кошка, а женщина загадка!

image

Да ладно! Это всё таки косатка! Да, да, морское млекопитающее отряда китообразных. Мне почему-то вспомнились строки из далёкого детства:
«В этой сказке нет порядка,
Здесь ошибка, опечатка! Кто-то,
Против всяких правил,
В сказке буквы переставил,
Переправил
«КИТ» на «КОТ»,
«КОТ» на «КИТ», наоборот!».
Звон гонга, рефери останавливает бой )

image

Во втором раунде кошка, коварно надев очки, сошла за бостонского бульдога с вероятностью в 34%. Или за французского. Похоже, нейросеть не вполне оправилась от разгрома в первом раунде )

image

Ну вот наконец то! Кошка определена как сиамская с вероятностью аж 66%! Браво, SqueezeNet! Если серьезно, похоже, что в исходном датасете преобладали фото не лежащих, а сидящих кошек. Лежащие были в основном собаки )

image

Способность кошек принимать форму коробки сбивает с толку даже людей, чего уж говорить про нейросети. Погружение к коробку снизило точность распознавания аж на 40%.

image

Так, так… А это, похоже, вообще запрещенный приём. Лежащая рядом с кошкой компьютерная мышь окончательно сбивает нейросеть с толку. Теперь наша кошка — мышь! )

Итак, всего нейросети было предъявлено 11 фото котов, из которых правильно определены всего 5. При этом с вероятностью более 50% всего в трёх случаях. Ни в коей мере не умаляю работу авторов SqueezeNet. Это добротная сеть с очень широким классом объектов и относительно низкой требовательностью к ресурсам.

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

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

Спасибо, что дочитали до конца. Удачи и хорошей рабочей недели )

Комментарии (38)


  1. Tyiler
    29.10.2018 12:14

    Спасибо.
    Хочу вам предложить попробовать собрать мою сетку (сам ее на Raspberry не собирал). Только предобученной модели нет, поэтому… ну так ради интереса хоть.


    1. Walker2000 Автор
      29.10.2018 12:20

      Добрый день! Спасибо за предложение, попробую в ближайшее время.


  1. Krapivnik
    29.10.2018 12:22
    +1

    Про котов и китов (без политики):

    — Сволочь он, — с ненавистью продолжал Турбин, — ведь он же сам не говорит на этом языке! А? Я позавчера спрашиваю этого каналью, доктора Курицького, он, извольте ли видеть, разучился говорить по-русски с ноября прошлого года. Был Курицкий, а стал Курицький… Так вот спрашиваю: как по-украински «кот»? Он отвечает «кит». Спрашиваю: «А как кит?» А он остановился, вытаращил глаза и молчит. И теперь не кланяется.
    Николка с треском захохотал и сказал:
    — Слова «кит» у них не может быть, потому что на Украине не водятся киты, а в России всего много. В Белом море киты есть…

    (с) Булгаков М.А
    отрывок из «Белой Гвардии»


    1. Walker2000 Автор
      29.10.2018 12:23

      Кстати, да ) Спасибо за цитату в тему ))))


    1. sirius23
      29.10.2018 21:51

      Когда он сказал что съел лук, я долго думал из чего он теперь будет стрелять…

      Омонимы (от греч. homos — одинаковый и onyma — имя) — разные по значению, но одинаково звучащие и/или пишущиеся единицы языка (слова, морфемы и др.). омонимы — одно и то же слово может иметь разные значения.


      1. vchslv13
        30.10.2018 02:48

        Помилуйте, при чём же здесь омонимы? Рус. «кот» — укр. «кіт», рус. «кит» — укр. «кит». Ни разу не омонимы ни в русском, ни в украинском.
        UPD: Упс, был не прав. Не знал, что ложные друзья переводчика также называются межъязыковыми омонимами.


        1. Walker2000 Автор
          30.10.2018 08:38

          Я тоже не знал, кстати. Любопытно.


        1. Dragonair
          30.10.2018 13:42

          Вообще то кит по украински будет «кыт».


  1. sav13
    29.10.2018 13:05

    А можно провести обучение нейросети на ваших кошках и как в этом случае плднимится достоверность?
    Хотя в ИК свете скорее всего она еще упадет


    1. Walker2000 Автор
      29.10.2018 13:18

      Если обучить нейросеть на фото кошек, которые использованы в посте, то она их отлично определит с вероятностью, близкой к 100%. Но если эти же весовые коэффициенты использовать для распознавания кошек в ИК свете, то оно будет близким к нулю. Вы совершенно правильно заметили, что сети, обученные по полноцветным фотографиям, крайне плохо определяют объекты по фото с ИК подстветкой.


  1. Walker2000 Автор
    29.10.2018 13:16

    Здесь был ответ на комментарий выше.


  1. Alhiimik
    29.10.2018 14:32

    Не могу лайк поставить, но вы напишите по теме еще, интересно, особенно если проблему с ИК-распознованием решите. Я бы себе на дачу собрал такую штуковину, если решение не сложное будет


    1. Walker2000 Автор
      29.10.2018 14:38

      Хорошо, напишу. Есть одна идея…


  1. DROiD_4
    29.10.2018 16:02

    Проблема с распознаванием в ИК решается довольно просто: при обучении сетки необходимо «простимулировать» ее привязываться к топологии снимка подкидывая изображения с проведенным любым нелинейным преобразованием. Таким образом в характеристике снимка меняются все параметры кроме топологии. Итог: корректное распознавание в ик спектре.


    1. Walker2000 Автор
      29.10.2018 16:05

      Да, правильно. Если подвергнуть преобразованию все снимки из обучающей выборки, это должно сработать. Единственное, считаться на обычном стационарном компе будет очень долго. Поэтому я начал экспериментировать с готовыми моделями.


  1. natan555
    29.10.2018 16:04

    Спасибо за статью
    А можно вас попросить протестировать две фотографии?
    Фото раз, Фото два


    1. Walker2000 Автор
      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.024712


      1. natan555
        29.10.2018 16:30

        спасибо большое. хотя я ожидал что-то типа: Mainecoon cat, probability: from 0.4 to 0.6


        1. Walker2000 Автор
          29.10.2018 16:37

          Тут не стоит ожидать многого от этой конкретной реализации SqueezeNet. Она оптимизирована на слишком широкий набор классов. Я считал бы хорошим результатом, если бы эта нейросеть определяла кошку как кошку любой породы. Скорее всего есть сетки специально под корректное определение пород кошек по фото хорошего качества. Я, правда, пока на такие не натыкался. Но с другой стороны, специально и не искал )


          1. plastilinko
            29.10.2018 20:27

            Но ведь изначально задача то была на распознавание котеек. А при использовании не специализированной кошконейросети выходит что реализация так себе )


            1. Walker2000 Автор
              29.10.2018 21:09

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


  1. ProstoUser
    29.10.2018 17:19

    На КДПВ ошибка! Это не кот, а кошка! :-)


    1. Walker2000 Автор
      29.10.2018 17:34

      Да, верно. Это кошка. Но в данном контексте (Кот=Кит) речь идет о видах )


  1. AlexeiZavjalov
    30.10.2018 01:46

    Можно использовать акселератор для нейросетей от Intel — Movidius и получить realtime. Он должен работать с RPi, однако цена немного негуманной может показаться — $70.


    1. Walker2000 Автор
      30.10.2018 08:39

      Да, посматриваю на него. На jd что-то в районе 6 тыс. руб.


  1. andrew_atreides
    30.10.2018 08:10

    Спасибо за позитивную статью! Думаю проблема распознавания кошки в её окрасе. Контрастный окрас в купе с недостаточным количеством в обучающей выборке вылился в подобные результаты. Надо завести себе тоже «футбольный мяч»)


    1. Walker2000 Автор
      30.10.2018 08:40

      Да, окрас, безусловно, тоже сыграл свою роль )


  1. DelphiCowboy
    30.10.2018 09:33

    А где распознавание китов, тоже заявленное в статье?
    Нужно научит нейросеть распознавать китов, а затем подкинуть это:
    image


    1. 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.0277


      1. DelphiCowboy
        30.10.2018 12:40

        Всё это потому что нейросети тренируют на статичных фото, а нужно тренировать на динамических видео. Потому что кот — это не набор неподвижных цветных пятен на плоскости, а динамический 3D-объект.
        image


        1. Walker2000 Автор
          30.10.2018 12:46

          Насколько я знаю, пока все популярные сетки обучаются именно на статичных картинках. Они сильно разного качества и аннотируются добровольцами. И при достаточных вычислительных ресурсах довольно неплохо работают на видео (видеоряд при этом анализируется покадрово). В принципе, возможна и обратная операция — разложить видео на кадры и по ним тренировать нейросеть. Наверное, такой подход будет полезен если стоит задача определить стиль бега кота или положение его тела )


          1. DelphiCowboy
            30.10.2018 13:40

            В идеале для обучения хорошо бы видео, где кот постоянно меняет свои свои позы, а так же видео, где кота облетает вокруг камера — как в Матрице.


            1. Walker2000 Автор
              30.10.2018 13:44

              Ну и это все при меняющемся внешнем освещении ). Оно тоже сильно влияет.


  1. 8street
    30.10.2018 10:35

    На последней фото, с мышкой, нейросеть решила немного потролить. Вариант space heater, да и всё остальное — прекрасно.


    1. Walker2000 Автор
      30.10.2018 10:57

      Да, поскольку логика такого выбора непонятна, остается только списать на троллинг )


  1. max8m
    30.10.2018 15:21

    Спасибо за веселую статью!
    Очень прошу не делать никаких «прагматичных выводов».
    Если говорить о вариантах решений, то это различные FPGA, нейрочипы вроде movidius или более мощные SOC (желательно с более производительным мобильным GPU). Также есть серия nvidia jetson — но вероятно, он не впишется в ваш бюджет.
    Мы пробовали запускать различные сети на смартфонах — у них часто неплохой GPU, особенно у флагманов. Есть различных модели, например у TF есть открытое решение с APK и предобученной моделью, которое на телефонах со snapdragon 6xx и 8xx серии выдает 5-20 fps


    1. Walker2000 Автор
      30.10.2018 16:03

      Спасибо за комментарий, полностью согласен с ним. Для работы нейросети для классификации изображений нужен нейропроцессор. На raspberry можно достичь 1...2 fps.


  1. wertex15
    01.11.2018 11:32

    А как технически выглядит обучение нейронки? Показали фото и сказали тут кит, а тут кот?