Кошки Против Нейронной Сети. Или Выберите И Запустите Нейросеть Для Распознавания Объектов На Raspberry Zero

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

Крошечный компьютер Raspberry — замечательная вещь.

За последние шесть месяцев я использовал Raspberry Zero W в нескольких проектах.

Меня покорила простота создания прототипов и реализации различных идей.

И теперь меня интересует вопрос, сможет ли это устройство справиться с полноценной сверточной сеткой? [Спойлер: сработает, но есть забавные нюансы].

Если вам интересна тема, добро пожаловать под кат. Будьте осторожны, кошек будет много!

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



Почему нейронная сеть Raspberry?

Однажды я собрал на Raspbery Zero W простую видеоловушку для наблюдения за ночной жизнью животных (в основном кошек) на даче.

Код был прост и работал хорошо.

Для видео-фотодетектирования использовалась камера с ИК-подсветкой типа эта «камера ночной версии Raspberry Pi» .



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

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

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

Основная хитрость — удержать прием двух сравниваемых кадров в пределах 0,2 секунды, хотя бы для того, чтобы поймать быстрые события.

Ну и быстренько сравните эти кадры, конечно.

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

Это потенциально позволяет избавиться от ложных срабатываний видеоловушки.

Такие случаются от движущихся объектов (например, травы или веток) или от резкого освещения сцены с камерой (например, включился свет в окне или погас фонарь).



Какую сетку поставить на Raspberry?

К счастью, с предустановленным Python (в моем случае 3.5.3) и широко доступным OpenCV (я использую 3.4.3) можно установить практически любую сетку.

К сожалению, из-за ограниченных вычислительных возможностей устройства список опций невелик.

По сути, выбирать можно только из «легких» вариантов: 1. SqueezeNet (пример кода Здесь ).

2. ЙОЛО Крошечный ( Здесь ).

3. MobileNet-SSD ( здесь ).

4. MobileNet_v1_224 (есть фантастический видео детектора объектов, работающего по этой сетке ).

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

Претендент №1 был вдохновлен заявленная высокая точность распознавания со скромными весовыми коэффициентами.

Кроме того, недолгий поиск в Интернете привел меня к отличному блогу.

Адриан Роузброк , в котором подробно комментируется код и описаны несколько вариантов реализации глубокого обучения на Raspberry. Код, используемый для проверки возможностей SqueezeNet отсюда .

Автор кода отправляет веса и текстовое представление модели по электронной почте после заполнения формы на сайте.

Кстати, если у вас не установлен OpenCV, алгоритм действий вы можете найти в его блоге.

Плюс есть примеры «разгонного» кода для ускорения работы моделей и многое другое.

Респект Адриану, действительно крутой ресурс.

Ну да ладно, запускаем код и на первой картинке получаем потрясающий результат!

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

Кот на картинке идентифицирован как перс с вероятностью 99%.

На самом деле он не перс, а британский длинношерстный или хайлендер.

Но для модели с диапазоном в 1000 классов это, можно сказать, попадает в яблочко.

Для удобства основные результаты работы нейросети я поместил прямо на фото.

Это 5 наиболее вероятных классов: первый — наиболее вероятный, второй — следующий по важности и так далее.

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

Я охотно верю, что у полноценной версии Raspberry всё-таки 4 ядра в процессоре.

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

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



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

Кот изменил положение тела и потерял целых 7% своей прежней «персидскости»).

Но это шутка, конечно, в целом работа модели очень хорошая.

Можно было закончить и на этом самом месте, но хотелось немного усложнить задачу модели.

Давайте продолжим тренироваться на.

кошках.

Но возьмем, к примеру, кадры, где кот не сидит в классической позе, а спит. Итак, начнем.



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

На этом фото кот идентифицирован как ангорский, но это не точно.

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

Ну, нейросеть ошиблась, а кто нет?

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

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

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

Ух ты.

Теперь она сибирский хаски.

Что-то мне подсказывает, что кот пока ведет счет)

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

Похоже, один из этих двоих явно сбит с ног и это явно не кот. Сейчас нейросеть ее идентифицирует как веретено (правда, всего 8,5%), также есть варианты, что она бигль, косатка, каменный питон или скунс.

Не кошка, а женщина-загадка!

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

Ну давай же! Это все-таки косатка! Да-да, морское млекопитающее отряда китообразных.

Почему-то мне вспомнились строки из далекого детства: «В этой сказке нет порядка, Здесь ошибка, опечатка! Кто-нибудь, Против всех правил Я в сказке буквы переставила, Переадресовано «КОМПЛЕКТ» на «КОШКА» «КОТ» на «КОМПЛЕКТ», и наоборот!» Звучит гонг, рефери останавливает бой)

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

Во втором туре кот, хитро надев очки, с вероятностью 34% сошёл за бостонского бульдога.

Или для французского.

Похоже, нейросеть не до конца оправилась от поражения в первом раунде)

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

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

Лежали в основном собаки)

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

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

Погружение в коробку снизило точность распознавания на целых 40%.



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

Ну-ну.

А это, похоже, вообще запрещённый приём.

Компьютерная мышь, лежащая рядом с кошкой, полностью сбивает с толку нейросеть.

Теперь наш кот - мышка! ) Итак, всего нейросети было представлено 11 фотографий кошек, из которых правильно идентифицированы только 5. Причём с вероятностью более 50% только в трёх случаях.

Я никоим образом не принижаю работу авторов SqueezeNet. Это качественная сеть с очень широким классом объектов и относительно небольшими требованиями к ресурсам.

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

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

Что касается выбора оптимальной нейросети для Raspberry, то вопрос остается открытым.

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

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

Спасибо, что дочитали до конца.

Удачи и хорошей рабочей недели) UPD: Рабочий код для запуска нейросети на Raspberry Pi Zero W см.

вторая часть эта почта.

Теги: #python #Сделай сам или сделай сам #Гаджеты #Интернет вещей #Raspberry Pi #Разработка на Raspberry Pi #raspberry #нейронная сеть #raspberry pi Zero #squeezenet

Вместе с данным постом часто просматривают: