Котики против нейросети. Или выбираем и запускаем нейросеть для распознавания объектов на Raspberry Zero +32



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

Крохотный компьютер 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
    /#19296655

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

    • Walker2000
      /#19296683

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

  2. Krapivnik
    /#19296689 / +1

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

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

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

    • Walker2000
      /#19296699

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

    • sirius23
      /#19298925

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

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

      • vchslv13
        /#19299623

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

        • Walker2000
          /#19299903

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

        • Dragonair
          /#19301439

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

  3. sav13
    /#19296893

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

    • Walker2000
      /#19296977

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

  4. Walker2000
    /#19296961

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

  5. Alhiimik
    /#19297341

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

    • Walker2000
      /#19297389

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

  6. DROiD_4
    /#19297769

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

    • Walker2000
      /#19297787

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

  7. natan555
    /#19297783

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

    • Walker2000
      /#19297879

      По первому фото:

      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

      • natan555
        /#19297913

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

        • Walker2000
          /#19297953

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

          • plastilinko
            /#19298723

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

            • Walker2000
              /#19298837

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

  8. ProstoUser
    /#19298129

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

    • Walker2000
      /#19298189

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

  9. AlexeiZavjalov
    /#19299545

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

    • Walker2000
      /#19299905

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

  10. andrew_atreides
    /#19299851

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

    • Walker2000
      /#19299907

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

  11. DelphiCowboy
    /#19300087

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

    • Walker2000
      /#19300133

      Добрый день!
      В статье тестировались только коты и в одном случае кот определился как кит (точнее, 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

      • DelphiCowboy
        /#19301089

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

        • Walker2000
          /#19301103

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

          • DelphiCowboy
            /#19301429

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

            • Walker2000
              /#19301451

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

  12. 8street
    /#19300363

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

    • Walker2000
      /#19300489

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

  13. max8m
    /#19302063

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

    • Walker2000
      /#19302367

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

  14. wertex15
    /#19311081

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