Котики проти нейромережі. Або вибираємо і запускаємо нейромережа для розпізнавання об’єктів на Raspberry Zero

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

Навіщо Raspberry нейромережа?

Як-то зібрав на Raspbery Zero W простеньку відео-пастку для спостереження за нічним життям тварин (в основному котів) на дачі. Код відрізнявся простотою і працював непогано. Для відео-фото детекції використовувалася камера з ІЧ-підсвічуванням кшталт цієї «Raspberry Pi Night Version Camera».

Суть коду в тому, щоб забирати два послідовних кадри, порівнювати попіксельно і якщо число змінених пікселів більше якогось порогового значення, запускати запис 10-секундного відео. Текст коду в цьому пості приводити не буду, якщо когось зацікавить, пишіть в коментарях, можу викласти в наступному. Основна фішка, укласти отримання двох порівнюваних кадрів в 0,2 секунди хоча б, щоб відловити швидкі події. Ну і швидко порівняти ці кадри, звичайно.

Далі виникла ідея прикрутити до алгоритму просту нейромережа, щоб можна було в спійманого кадрі визначати об’єкт і запускати відеозапис, тільки якщо достовірно визначився клас об’єкта. Це потенційно дозволяє позбутися від помилкових спрацьовувань видеоловушки. Такі трапляються від рухомих об’єктів (наприклад, трава або гілки) або від різкої засвічення сцени камери (світло у вікні включився або ліхтар погас, наприклад).

Яку сітку поставити на Raspberry?

На щастя, під встановлений Пітон (в моєму випадку це 3.5.3) і широко доступною OpenCV (я використовую 3.4.3) можна поставити практично будь-яку сітку. До нещастя, з-за обмежених обчислювальних можливостей девайса список варіантів невеликий. По суті можна вибирати тільки з «лайтовых» варіантів:

Читайте також  Julia. Скрипти і розбір аргументів командного рядка

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 воно все одне (((

Читайте також  Як зробити пошук користувачів з Github використовуючи VanillaJS

Схоже, про визначення класу об’єкта в реальному часі на Zero доведеться забути. До речі, треба визнати, що і секунда часу на роботу моделі «повноцінного» Pi — теж далеко не межа мрій.

Але продовжимо тестування моделі.

Кіт змінив положення тіла і втратив цілих 7% від своєї колишньої «персидскости» ). Але це жарт, звичайно, в цілому робота моделі дуже навіть на висоті. Ось на цьому самому місці можна було б і закінчити, але захотілося трохи ускладнити завдання моделі. Продовжимо вправлятися на… кішках. Але наберемо кадрів, де кішка не сидить в класичній позі, а спить, наприклад. Отже, поїхали.

На даному знімку кішка визначена як ангорська, але це не точно. Мабуть від того, що вона роздратована нав’язливою проханням залишити раковину. Ну помилилася нейромережа, ну з ким не буває в кінці кінців?

Виявляється, у мене вдома живе пухнастий футбольний м’яч ) Так, буває, що і люди зовсім не ті, ким здаються на перший погляд. Сутичка кішки і нейромережі приймає неабиякий оборот.

Ого. Тепер вона — сибірська хаскі. Щось мені підказує, що кішка поки веде в рахунку )

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

Да ладно! Це все таки касатка! Так, так, морський ссавець загону китоподібних. Мені чомусь згадалися рядки з далекого дитинства:
«У цій казці немає порядку,
Тут помилка, помилка! Хтось,
Проти всяких правил,
У казці переставив букви,
Переправив
«КІТ» на «КІТ»,
«КІТ» на «КИТ», навпаки!».
Дзвін гонгу, рефері зупиняє бій )

Читайте також  Спеціально для СНД: інтерв'ю з Аланом Кеєм

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

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

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

Так, так… А це, схоже, взагалі заборонений прийом. Що лежить поруч з кішкою комп’ютерна миша остаточно збиває нейромережа з пантелику. Тепер наша кішка — миша! )

Отже, всього нейромережі було пред’явлено 11 фото котів, з яких правильно визначено всього 5. При цьому з імовірністю більше 50% всього в трьох випадках. Жодною мірою не применшую роботу авторів SqueezeNet. Це добротна мережу з дуже широким класом об’єктів і відносно низькою вимогливістю до ресурсів.

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

Що стосується вибору оптимальної нейромережі для Raspbery — питання поки залишається відкритим. Я продовжую експерименти, при наявності інтересу аудиторії до даної теми, буду ділитися результатами подальших досліджень. Просто результати першого кроку виявилися настільки цікавими, що дуже захотілося поділитися ними.

Спасибі, що дочитали до кінця. Удачі і гарної робочого тижня )

Степан Лютий

Обожнюю технології в сучасному світі. Хоча частенько і замислююся над тим, як далеко вони нас заведуть. Не те, щоб я прям і знаюся на ядрах, пікселях, коллайдерах і інших парсеках. Просто приходжу в захват від того, що може в творчому пориві вигадати людський розум.

You may also like...

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *