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

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

    Крохотный компьютер 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 — вопрос пока остаётся открытым. Я продолжаю эксперименты, при наличии интереса аудитории к данной теме, буду делиться результатами дальнейших изысканий. Просто результаты первого шага оказались настолько забавными, что очень захотелось ими поделиться.

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

    UPD: Работающий код для запуска нейросети на Raspberry Pi Zero W смотрите во второй части этого поста.
    Поделиться публикацией

    Комментарии 39

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

        (с) Булгаков М.А
        отрывок из «Белой Гвардии»
          +1
          Кстати, да ) Спасибо за цитату в тему ))))
            0
            Когда он сказал что съел лук, я долго думал из чего он теперь будет стрелять…

            Омонимы (от греч. homos — одинаковый и onyma — имя) — разные по значению, но одинаково звучащие и/или пишущиеся единицы языка (слова, морфемы и др.). омонимы — одно и то же слово может иметь разные значения.
              0
              Помилуйте, при чём же здесь омонимы? Рус. «кот» — укр. «кіт», рус. «кит» — укр. «кит». Ни разу не омонимы ни в русском, ни в украинском.
              UPD: Упс, был не прав. Не знал, что ложные друзья переводчика также называются межъязыковыми омонимами.
                0

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

                  0
                  Вообще то кит по украински будет «кыт».
              0
              А можно провести обучение нейросети на ваших кошках и как в этом случае плднимится достоверность?
              Хотя в ИК свете скорее всего она еще упадет
                +1
                Если обучить нейросеть на фото кошек, которые использованы в посте, то она их отлично определит с вероятностью, близкой к 100%. Но если эти же весовые коэффициенты использовать для распознавания кошек в ИК свете, то оно будет близким к нулю. Вы совершенно правильно заметили, что сети, обученные по полноцветным фотографиям, крайне плохо определяют объекты по фото с ИК подстветкой.
                0
                Здесь был ответ на комментарий выше.
                  0
                  Не могу лайк поставить, но вы напишите по теме еще, интересно, особенно если проблему с ИК-распознованием решите. Я бы себе на дачу собрал такую штуковину, если решение не сложное будет
                    0
                    Хорошо, напишу. Есть одна идея…
                    +1
                    Проблема с распознаванием в ИК решается довольно просто: при обучении сетки необходимо «простимулировать» ее привязываться к топологии снимка подкидывая изображения с проведенным любым нелинейным преобразованием. Таким образом в характеристике снимка меняются все параметры кроме топологии. Итог: корректное распознавание в ик спектре.
                      0
                      Да, правильно. Если подвергнуть преобразованию все снимки из обучающей выборки, это должно сработать. Единственное, считаться на обычном стационарном компе будет очень долго. Поэтому я начал экспериментировать с готовыми моделями.
                      0
                      Спасибо за статью
                      А можно вас попросить протестировать две фотографии?
                      Фото раз, Фото два
                        0
                        По первому фото:

                        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
                          0
                          спасибо большое. хотя я ожидал что-то типа: Mainecoon cat, probability: from 0.4 to 0.6
                            0
                            Тут не стоит ожидать многого от этой конкретной реализации SqueezeNet. Она оптимизирована на слишком широкий набор классов. Я считал бы хорошим результатом, если бы эта нейросеть определяла кошку как кошку любой породы. Скорее всего есть сетки специально под корректное определение пород кошек по фото хорошего качества. Я, правда, пока на такие не натыкался. Но с другой стороны, специально и не искал )
                              0
                              Но ведь изначально задача то была на распознавание котеек. А при использовании не специализированной кошконейросети выходит что реализация так себе )
                                0
                                Да, я тоже думал, что кошек она определяет с большей точностью. Тут подвело, похоже, именно большое количество классов. Собственно на кошек пришлось не особо большое число обучающих фотографий. Потому кошек в различных позах эта нейросеть распознает не особо хорошо.
                        0
                        На КДПВ ошибка! Это не кот, а кошка! :-)
                          0
                          Да, верно. Это кошка. Но в данном контексте (Кот=Кит) речь идет о видах )
                          0
                          Можно использовать акселератор для нейросетей от Intel — Movidius и получить realtime. Он должен работать с RPi, однако цена немного негуманной может показаться — $70.
                            0

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

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

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

                              +1
                              А где распознавание китов, тоже заявленное в статье?
                              Нужно научит нейросеть распознавать китов, а затем подкинуть это:
                              image
                                0
                                Добрый день!
                                В статье тестировались только коты и в одном случае кот определился как кит (точнее, 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
                                  0
                                  Всё это потому что нейросети тренируют на статичных фото, а нужно тренировать на динамических видео. Потому что кот — это не набор неподвижных цветных пятен на плоскости, а динамический 3D-объект.
                                  image
                                    0
                                    Насколько я знаю, пока все популярные сетки обучаются именно на статичных картинках. Они сильно разного качества и аннотируются добровольцами. И при достаточных вычислительных ресурсах довольно неплохо работают на видео (видеоряд при этом анализируется покадрово). В принципе, возможна и обратная операция — разложить видео на кадры и по ним тренировать нейросеть. Наверное, такой подход будет полезен если стоит задача определить стиль бега кота или положение его тела )
                                      0
                                      В идеале для обучения хорошо бы видео, где кот постоянно меняет свои свои позы, а так же видео, где кота облетает вокруг камера — как в Матрице.
                                        0
                                        Ну и это все при меняющемся внешнем освещении ). Оно тоже сильно влияет.
                                0

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

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

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

                                    0

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

                                      0

                                      Примерно так и есть. Для обучения нейросети используется набор аннотированных фотографий. В статье описана нейросеть, обученная на наборе изображений ImageNet. Это 1000 классов изображений, аннотированных добровольцами. Примерно по 1000 изображений на один класс. Этот набор широко используется для обучения разных типов сверхточных сетей, чтобы сравнить их эффективность.

                                    Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                    Самое читаемое