Подсчёт пчёл нейросетью на Raspberry Pi

http://matpalm.com/blog/counting_bees/
  • Перевод
Опубликовано 17 мая 2018 года

Сразу после установки улья я подумал: «Интересно, как подсчитать количество прилетающих и улетающих пчёл?»

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

Во-первых, нужно собрать образцы данных. Raspberry Pi, стандартная камера Pi и солнечная панель: этого простого оборудования достаточно, чтобы записывать один кадр каждые 10 секунд и сохранять 5000+ изображений в день (с 6 утра до 9 вечера).



Ниже пример изображения… Сколько пчёл вы можете сосчитать?



В чём конкретно вопрос?


Во-вторых, нужно сформулировать проблему, что конкретно делать нейронной сети. Если задача «подсчёт пчёл в изображении», то можно попробовать получить конкретные числа, но это не кажется самым простым вариантом, да и отслеживание отдельных пчёл между кадрами не доставляет никакого удовольствия. Вместо этого я решил сосредоточиться на локализации каждой пчелы в изображении.

Быстрая проверка стандартного покадрового детектора не дала особых результатов. Это как бы не удивительно, особенно учитывая плотность пчёл вокруг входа в улей (подсказка: перенос обучения не всегда работает), но это нормально. Итак, у меня очень маленькое изображение, только один класс для распознавания объектов и нет особых проблем с ограничивающим прямоугольником как таковым. Просто решить, есть пчела или нет. Какое решение будет попроще?

v1: полностью свёрточная сеть «пчела есть/нет» на фрагменте


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

v2: изображение RGB → чёрно-белое растровое изображение


Я быстро понял, что задачу можно свести к проблеме трансформации изображения. На входе сигнал камеры RGB, а на выходе — изображение одиночного канала где «белый» пиксель обозначает центр пчёлы.


RGB-вход (фрагмент) и одноканальный выход (фрагмент)

Маркировка


Третий шаг — маркировка, то есть присвоение обозначений. Не слишком сложно развернуть небольшое приложение TkInter для выбора/отмены выбора пчёл на изображении и сохранения результатов в базе данных SQLite. Я потратил довольно много времени, чтобы правильно настроить этот инструмент: любой, кто выполнял вручную существенный объём маркировки, меня поймёт :/

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

Модель


Архитектура сети — вполне стандартная u-net.

  • полностью свёрточная сеть обучена на фрагментах с половинным разрешением, но работает на изображениях с полным разрешением;
  • кодирование представляет собой последовательность из четырёх свёртываний 3×3 с шагом 2
  • декодирование — последовательность изменений размера по ближайшим соседям + свёртывание 3×3 с шагом 1 + пропуск соединения от кодеров;
  • окончательный слой свёртывания 1×1 с шагом 1 с активацией сигмоидной функции (то есть двоичный выбор «пчела есть/нет» для каждого пикселя).

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

Я сделал декодирование через изменение размера по ближайшим соседям вместо деконволюции скорее по привычке.

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



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

Тут есть некоторый нюанс в постобработке предсказаний на выходе. С вероятностной выдачей мы получаем размытое облако там, где могут быть пчёлы. Чтобы преобразовать его в чёткую картинку по одному пикселю на пчелу, я добавил пороговое значение, учёт связанных компонентов и обнаружение центроидов с помощью модуля skimage measure. Всё это пришлось устанавливать вручную и настраивать чисто на глаз, хотя теоретически его можно добавить в конец стека как элемент обучения. Может, есть смысл сделать это в будущем… :)


Вход, необработанная выдача и центроиды кластеров

Обобщение за нескольких дней


За один день


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


Три образца, полученные в первый день

За много дней


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

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


Образцы, полученные за три дня

Пример прогнозирования


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



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


Слева направо: высокая плотность вокруг входа; пчёлы разного размера; пчёлы на высокой скорости!

Хитрости маркировки


Полуконтролируемое обучение


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

Очень простой подход:

  1. Съёмка 10 000 изображений.
  2. Маркировка 100 изображений и обучение model_1.
  3. Использование model_1 для маркировки остальных 9900 изображений.
  4. Обучение model_2 на «размеченных» 10 000 изображений.

В результате model_2 показывает лучший результат, чем model_1.

Вот пример. Обратите внимание, что model_1 демонстрирует некоторые ложноположительные (слева посередине и травинка) и ложноотрицательные срабатывания (пчёлы вокруг входа в улей).


Слева model_1, справа model_2

Маркировка путём исправления плохой модели


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

  1. Помечаем 10 изображений и обучаем модель.
  2. Используем модель для разметки следующих 100 изображений.
  3. Применяем инструмент маркировки для исправления меток на этих 100 изображениях.
  4. Переобучаем модель на 110 картинках.
  5. Повторяем...

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

Подсчёт


Возможность обнаружения пчёл означает, что мы можем их посчитать! И нарисовать ради удовольствия прикольные графики, которые показывают количество пчёл в течение дня. Мне нравится, как они трудятся весь день и возвращаются домой около 4 вечера. :)



Вывод на Raspberry Pi


Запуск модели на Pi был важной частью этого проекта.

Непосредственно на железе Pi


Изначально планировалось заморозить граф TensorFlow и просто напрямую запустить его на Pi. Это работает без проблем, но вот только Pi снимает лишь 1 изображение в секунду. :/

Запуск на вычислительном модуле Movidius


Меня очень заинтересовала возможность запустить модель на Pi с помощью Movidus Neural Compute Stick. Это удивительный гаджет.

К сожалению, ничего не получилось :/. API для преобразования графа TensorFlow в их внутренний формат модели не поддерживает мой способ декодирования. Поэтому пришлось увеличивать размер (upsizing), используя деконволюцию вместо изменений размера по ближайшим соседям. Здесь нет проблем кроме той, что ничего не получилось. Возникает куча маленьких сложностей, из-за которых множились баги. Когда их исправят, можно вернуться к этой теме…

Модель v3: изображение RGB → подсчёт пчёл
Это привело меня к третьей версии модели: можем ли мы перейти непосредственно со входа RGB на подсчёт пчёл? Так мы избежим любых проблем с неподдерживаемыми операциями на Movidus Neural Compute Stick, хотя маловероятно, что результат получится таким же хорошим, как в модели центроидов v2.

Сначала я опасался пробовать этот метод: я думал, что для него потребуется гораздо больше маркировки (это больше не система на основе фрагментов). Но! Имея модель, которая довольно хорошо справляется с поиском пчёл, и много немаркированных данных, можно сгенерировать неплохой набор синтетических данных, применив модель v2 и просто подсчитывая количество обнаружений.

Такая модель довольно проста в обучении и даёт осмысленные результаты… (хотя она всё-таки не так хороша, как простой подсчёт центроидов, обнаруженных моделью v2).

Реальное и прогнозное количество пчёл в некоторых тестовых образцах
Реальное 40 19 16 15 13 12 11 10 8 7 6 4
v2 (центроиды) прогнозное 39 19 16 13 13 14 11 8 8 7 6 4
v3 (простой подсчёт) прогнозное 33,1 15,3 12,3 12,5 13,3 10,4 9,3 8,7 6,3 7,1 5,9 4,2

… к сожалению, модель по-прежнему не работает на Neural Compute Stick (то есть работает, но выдаёт только случайные результаты). Я составил ещё несколько баг-репортов и опять отложил гаджет, чтобы вернуться потом… когда-нибудь…

Что дальше?


Как всегда, осталась куча мелочей…

  • Запуск на Neural Compute Stick (NCS); сейчас ждём некоторой работы с их стороны...
  • Портировать всё на встроенную камеру JeVois. Я немного повозился с ней, но в первую очередь хотел запустить модель на NCS. Я хочу отслеживать пчёл на 120 FPS!!!
  • Отслеживать пчёл между несколькими кадрами/камерами для визуализации оптического потока.
  • Более детально изучить преимущества полуконтролируемого подхода и обучить более крупную модель маркировать данные для меньшей модели.
  • Исследовать возможности NCS; что делать с настройкой гиперпарамеров?
  • Перейти к разработке маленькой версии FarmBot для выполнения некоторых генетических экспериментов с рассадой под управлением ЧПУ (то есть нечто совершенно другое).

Код


Весь код опубликован на Github.
Поделиться публикацией
Похожие публикации
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 47
    +3
    Как техническая реализация это все отлично. Хороший подход, а главное реализовали то, что хотели. Но с практической точки зрения, это лишнее и не даст вам никакой информации о здоровье улья. Хотя бы тот факт, что у слабой семьи начинают воровать мед пчелы из соседних сильных семей, вы своим подсчётом никак не увидите. Количество пчел летающих туда и обратно увеличится, а вы будете считать, что улей хорошо работает. И подобных нюансов много. Я в свое время сам пытался автоматизировать подобный процесс, в итоге остановился на том, что нет лучше показателя, чем ежедневный привес улья. Несколько ульев у меня стоят на весах, и по ним я ориентируюсь, как работают пчелы.
      +1
      Это перевод.
        0
        решение с весами гениальное)
          0
          да, контрольный улей никто не отменял
          0
          Отслеживать пчёл между несколькими кадрами/камерами для визуализации оптического потока.

          То, есть Вы хотите определять летит ли пчела из улья или в улей в данный момент?
            +3
            «Все фигня, кроме пчел»(с)

            А серьезнее — пчеловоды здесь есть?
              +1
              А не проще было весь фон кадра закрыть листом фанеры? Стоимость по сравнению с камерой копеечная, точность резко возрастет.
                +3
                Знаете, я проиграл подобный спор. Проиграл по-крупному.
                Тоже была, кстати, подобная сельскохозяйственная задача с картинками.
                Там, правда, пчелы были коровами.

                За все мои высказанные предложения подобные листу фанеры выше «нахватал минусов» в темную и был объявлен противником прогресса и ретроградом от машинного обучения.

                В результате все мои предложения были учтены в последующих версиях прототипа.
                Они его и сейчас продолжают разрабатывать.
                А я ищу работу :)
                  0
                  Ну, в данном случае лист фанеры реально улучшает свойства улика(просто не сильно, обычно нет смысла его ставит в целях экономии). А также упрощает гараздо более дорогую систему наблюдения.
                  Машинное обучение это классно, но в такой задаче чем его меньше тем лучше.
                +3

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

                  0
                  Возможно, у него не хватало количества кадров. Все же пчелы мелкие и летают прилично(до 6мс на подлете к улью), а там 0.5м кадр
                  +5
                  Человек развлекается — я имею ввиду автора оригинала статьи.
                  Улей у него, в частности, «кенийский» и желание проследить за каждой пчелой техническими средствами. Я этим переболел в начале своего практического пчеловодства 25 лет назад.
                  Продолжаю и сейчас возиться с весами, температурой и прочим контролем. Но у меня есть вполне сформулированные цели (как мне кажется).
                  Может есть тут еще «сдвинутые» на теме пчел?
                    +11

                    Надцать лет назад, будучи студентом и проживая в общежитии, метили тараканов корректором. Весело было увидеть "своих" на другой стороне здания :-)

                      +7
                      Вы, батенька, определенно знаете толк в развлечениях!
                        +2
                        Вполне себе рабочий способ.

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

                        Дцать лет назад тараканам для бегов мы клеили колечки из проволоки капелькой быстрой эпоксидки (суперклея тогда еще в свободном доступе не было) и они бегали по леске.
                        Обычная дистанция была 2 или 3 фута… Эх…
                          +1
                          Королев пчелиных метить очень рекомендуется… Лак даже специальный есть, и цветовая кодировка…
                            0
                            Продаются даже наклейки с номерами тоже цветные, 5 цветов на 5 лет.
                        +9
                        Микрофон дешевле камеры, надо обучить сеть на жужжание. А еще можно по жужжанию определять настроение и полезную загрузку пчел и не пускать домой ленивых. А фотографировать только ударников на доску почета, вывешенную дома.
                          0
                          Обожаю Хабр за такие посты :)

                          Возможно, я не прав, но разве нельзя сделать так:
                          1)Усреднить последние 3=2-10 фотографий (возможно, с какими-то весами, типа затухающей экспоненты, должно довольно шустро исполняться при нормальной реализации)
                          2)Посчитать изображение разницу текущей фотографии с усреднённым из п. 1
                          3)Искать пчёл уже на этой разнице. Думаю, в этом случае искать пчёл можно значительно быстрее (если считать, что кроме пчёл иных насекомых нет в кадре, то даже без нейросетки можно попробовать реализовать).
                          Всё-таки Raspberry Pi не особо расторопная штука, не хочется её лишний раз нагружать
                            +1
                            Есть такая поговорка «If all you have is a hammer, everything looks like a nail», что примерно означает «Если из инструмента у тебя есть только молоток — все начинает выглядеть как гвозди».
                            Очень характерный случай для настоящих гиков.
                            В том, что автор исходной статьи вполне себе гик (в хорошем смысле) и машинное обучение есть его «молоток» у меня сомнений никаких нет по прочтении его блога.
                            +2
                            Мне одному кажется, что чисто техническая реализация данной задачи реализована несколько с оверкиллом (пусть и модным)? Не проще ли было установить два ряда сенсоров в летке, чтобы просто детектировать вход и выход пчел? Я чрезвычайно далек от пчеловодства, и, если честно, видел пасеку и ульи всего раз в жизни. Но почему-то мне кажется, что «свёрточные сети» — далеко не лучший способ решить данную задачу (если ее вообще можно решать таким путем — общего подсчета пчел).
                              0
                              про два ряда сенсоров — это неоднократно было проделано в прошлом, а может и позапрошлом веке. Очень стандартная приблуда в научных изысканиях. В практическом пчеловодстве почти неприменимо, хотя информация была бы достаточно интересна.
                              С точки зрения практики — Pi с камерой выглядит очень заманчиво.

                              На самом деле — определение интенсивности и направления лета пчел с камерой и ANN я видел в пчеловодной «серьезной» литературе лет 20 назад.

                              Новизна здесь только в том, что это сделал гик с малинкой.
                                0
                                Есть мысль считывать данные по активности полёта пчёл с камеры и вес с тензодатчиков весов, на которых стоит улей, и передавать их дальше для обработки. «Хозяин, тут по улью №4 движение есть, а прогресса нет — надои падают!». И пасечник проверяет, не воруют ли у семьи взяток.
                              +1

                              Реализация интересная, но сама постановка задачи странная. Ведь пчелы туда-сюда летают — общего количества не подсчитать. Вот если бы он каждую пчелу идентифицировал (типа "распознование по лицам"), тогда совсем другое дело.

                                0
                                Вот если бы он каждую пчелу идентифицировал
                                Если они различаются, достаточно для идентификации — понадобится камера с очень хорошим разрешением. Что-то мне подсказывает — PI не справится. Но сама постановка вопроса интересна.
                                  0
                                  На каждую пчелу наносить QR уникальный код?
                                    0
                                    Он уже от природы имеется. Считаем количество и ширину полосок, идентифицируем.
                                      0
                                      Интересно, во сколько бы обошлась камера, способная делать снимки с таким разрешением, чтобы по картинке в статье посчитать? И, боюсь, малинка не потянет потом такое разрешение процессить
                                        0
                                        С полосками не прокатит, это я вам как пчеловод говорю.
                                        Дело в том, что все рабочие пчелы в улье очень близкие родственницы — дочери одной матери.
                                        Сестры, другими словами.
                                        Родные или сводные — все от одной матери, но отцов может быть до 8-10.

                                        Цвет и размеры полосок — это, скорее, породные признаки и у приличного пчеловода на пасеке особого разброса и в этом признаке не будет.

                                        Просто попробуйте представить себе автоматизацию фэйсконтроля для толпы из 30-50-100к близнецов, пусть и не однояйцевых.
                                        Да-да, это столько рабочих пчел в среднем улье летом.

                                        Еще не забудьте обучающую выборку с «ручной» разметкой.

                                        Вот для определения нападения на улей ос или шершней — вот тут, пожалуй, у технологии больше перспектив.
                                          0
                                          Вот для определения нападения на улей ос или шершней — вот тут, пожалуй, у технологии больше перспектив.
                                          Тоже вполне интересная идея. Улей с электронной защитой от хищников.
                                            0
                                            Лазером чужих пчел жарить?
                                  +1
                                  Надеялся в этой статье прочитать о действенном методе применения компьютерного зрения на ограниченном железе Raspberry Pi, но увы, автор всего лишь описал проблемы, которые не решил. Кто-нибудь справлялся с этой задачей?
                                    0
                                    Есть хороший блог на эту тему — www.pyimagesearch.com
                                    На Малинке, сможешь только использовать уже обученную сеть, мощности маловато для более серъезных задач — т.е. обучение нейросетей.
                                      0
                                      idein.jp
                                      тут справились, на несколько сотен выходов вида «мышка» «машина» «гвоздь» «женщина», при 15-20фпс на распебри зеро. на зарнее обученной сети. Вчера у них на собеседовании был, на удивление шустрое и качественное решение при этом миниатюрное и маложрущее и автономное. Сделано на QPU ускорителей на чистом асме всё ядро полностью основателем стартапа — он же 社長。
                                      0
                                      Очень позитивная статья. Можно критиковать, но авторы по-любому молодцы.
                                        +1
                                        Если это перевод, то понятно, почему такая странная конструкция улья — леток без прилетного порожка. У нас ни одного улья без порожка не видел. И корпусной леток (не магазинный) обычно делается широким, на пару десятков пчел, обычно с задвижкой.

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

                                          Улей на картинке т.н. «кенийский» — K.T.B.H. — особо популярен у любителей-гиков.
                                          Им я тоже переболел :)
                                            0
                                            «Ваша местность» — это все СНГ. А кенийский популярен у тех, кому не важен высокий взяток, и у кого, собственно, нет опыта и условий содержания (типа омшаника).
                                            А также в местах, где отсутствует сезонность (всякие там южные америки), где взяток 2-3кг — это много.
                                            Конструкций много, а без прилетного порога — так, игрушки, поэкспериментировать. На пасеку такие не вывозят.
                                              0
                                              В Вашей местности У СНГ-вских гиков от пчеловодства кенийский улей «не взлетел».

                                              Сейчас там царствует Ее-Величество КОЛОДА

                                              Говорю это со знанием дела, поскольку в рядах этих гиков я в свое время побывал с удовольствием.
                                              Впрочем, и сейчас не до конца остыл
                                              <img src="" alt=«image»/>


                                              0
                                              Некоторые умудряются на уликах миллионы заработать.
                                              www.indiegogo.com/projects/flow-hive-2--2#
                                            0
                                            отличный материал, спасибо.
                                              +1
                                              Так и не понял зачем здесь нужна была нейросеть. Зачем вешать камеру сбоку и снимать одуванчики? Почему нельзя нацелить камеру строго на вход улья и просто вычитать из полученных изображений изображение входа без пчел, ведь камера не двигается и кроме пчел там ничего нет.
                                                +1
                                                Тогда бы статьи не было… какому гику интересно интересно читать о том, как
                                                просто вычитать из полученных изображений изображение входа без пчел
                                                  –1
                                                  Система требовалась неинвазивной, что бьі к любому вульіку прилепить и считать.
                                                  0
                                                  Редкий пост, когда комментарии интереснее статьи
                                                    0
                                                    Я извиняюсь, а где собственно сама реализация задачи на нейросети?
                                                      0
                                                      Дальше, можно отслеживать пчел-бездельников, типа все за медом, а они по пивасику. :)

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

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