Запуск Caffe на RPi + SqueezeNet

Продолжение идеи про кормушку для синичек.

1

Фабула прошлой части: за окном стоит прозрачная кормушка. На неё смотрит камера, подключённая к Raspberri Pi. Хочу автоматическую съёмку птичек с распознаванием + с анализом того сколько. Плюс хочу чтобы кадры сохраняло, а лучшие –  мне выкладывало куда-нибудь.

Установка Caffe и разметка базы птичек внезапно прошла ударными темпами. Плюс начитал много интересной инфы. Так что решил разбить пост на две части. В текущем посте – установка Caffe на RPi + рассказы про забавную сеточку SqueezeNet. В следующем посте (будет завтра-послезавтра) – разметка базы, обучение, оптимизация архитектуры сети/сетей.

Вот очень полезный репозиторий с Caffe. Но почти без инструкций. Сказано:

if I missed any setup steps here or if you run into any issue, please let me know.

Реальность несколько посложнее. У меня был старый Raspberry Pi B+. Под ним caffe не соберётся, приходится делать апдейт GCC. Вариантов в инете масса, но 95% из них не работает. Caffe это нестандартный Debian. Правильный вариант вот:

Update /etc/apt/sources.list to have jessie wherever you’ve currently got wheezy

По времени у меня этот апдейт занял 2-3 часа.
Главное – не забыть поменять “jessie” на “wheezy”. Это критично.
Дальше установка идёт по пути Ubuntu:

По времени где-то пол часа-час.
Теперь нужно установить OpenCV. Он ставиться тоже только с бубнами. К сожалению, я это делал года 2 назад, так что подробной инструкции проверенной сейчас дать не смогу. Но похоже было что-то на это.
Заканчиваем установкой BLAS, минут за 10-20:

Дальше есть два пути.

Первый путь – запускаем “make all”.
Автор Rpi Caffe как бы намекает нам, что тут и нужно остановиться, а дальнейшие работы делать следующим образом:

On one terminal, type — sh cont_classifiy_squeezenet.sh
On another terminal, type — python python/cont_record.py

По сути, запустить один c++ процесс, который будет мониторить в папочке “/var/tmp/” появление файла, который обрабатывать и выкладывать в папочку ответ “/var/tmp/topics.csv”.
Класть файл и обрабатывать ответ – питоном.
Понятно, что это оптимальный по времени процесс. Но есть пара существенных минусов:
1) Сложнее код который придётся модифицироватьи  поддерживать, постоянно нужно рекомпилить на pi
2) Нагрузка на ssd-карточку выше из за постоянных процессов чтения-удаления

Для продакшн решения, если нужно получить прирост скорости на 20-30% – надо приводить этот вариант в порядок. А для побаловаться хочется питон. Так что нужно пройти не предусмотренное автором: поставить в pip весь комплект библиотек.

Второй путь.
Понятно, что часть библиотек из requirements.txt не нужна. А часть у меня даже не установилась. Вот список тех, которые я оставил (сильно не уверен, что все нужны):

 

В первую очередь вынес всё связанное с matplotlib. Теперь можно запустить установку:

Pip под арм начинает всё собирать сам с нуля. Так что это на долго. У меня ушло где-то пол дня. На моём Pi нужно запустить их с нуля.
Теперь “make all”, “make pycaffe”.
Всё, поздравляю! Ваш Caffe сбилжен:
1
Чтобы его использовать нужно прописать в терминале перед вызовом:

В принципе, всё стандарт, ничего нового.
Сходу удалось запустить скрипт:

Всё заработало как часы. Но.. Отъело 500 метров памяти. Учитывая, что на RPI только 350 свободных метров оперативки, остальная память ушла в swap. Распознавание длилось по 20-25 секунд. Как это лечить – расскажу завтра-послезавтра в части про настройку сетки.
А сейчас – небольшое отступление про SqueezeNet.
Авторы уверяют, что сетка, при сохранении точности AlexNet, имеет в 50 раз более хорошую производительность. Конечно,
AlexNet это не бог весть что по современным временам. Но производительность x50 внушает уважение. Что сделано:

  1. Свёртки 3*3 заменены на свёртки 1*1. Каждая такая замена в 9 раз уменьшает число параметров
  2. На вход оставшихся свёрток 3*3 пробуют подавать только маленькое число каналов
  3. Уменьшение размера делается как можно позднее, чтобы свёрточные слои имели большую площадь активации.

Эти три стратегии привели к тому, что авторы создали “fire module”:

diagramme2_fire

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

  1. Отказ от FC слоя на последнем уровне. В принципе, это достаточно модно и неплохо влияет на производительность. Для того чтобы это достичь авторы берут выход последнего свёрточного слоя, разделяют его на N частей, и усредняют каждую часть через avg-pooling по числу каналов. Эти выходы пулинга подаются на обучающие нейроны.
  2. В некоторых из версий сети авторы пробую различные пробросы боковые. Почти residual. Это увеличивает точность:
    1-QJGepE_JorGO1LlI0Qy1yA

Идеи хорошие. На RPi3 судя по всему даёт реальное время (чую, что 10-15 fps должно быть).
А что это дало на моём RPi-B+ расскажу завтра-послезавтра.

1 thought on “Запуск Caffe на RPi + SqueezeNet”

Leave a Reply

Your email address will not be published. Required fields are marked *