Нам удалось поработать с заказчиком, который решил выпустить на рынок сервис по определению птиц вкупе с камерами. Нам предстояло обучить камеры определять птиц в своем объективе, а затем, научить сервис определять вид и пол птиц.
Мы уже рассказывали, как обучали нейронную сеть в камерах распознавать птиц. В этой статье речь пойдет про видовое определение снятых птиц. История оказалась еще более сложной, чем первая.
Бизнес-логика проекта
Наш клиент предполагает продавать своим потребителям предложение – сервис по распознаванию птиц и камеры, на которые будут фиксироваться птицы.
ИИ для наблюдения за птицами состоит из двух частей:
обнаружение объекта - нейронная сеть, отвечающая за обнаружение присутствия птицы или млекопитающего в кадре
классификация объектов - нейронная сеть, отвечающая за определение того, какой вид птиц или млекопитающих был пойман
Когда объект обнаружен, система записывает короткое видео, к которому затем пользователь получает доступ, и делает снимок для отправки на сервер, где модель классификации определяет, какой тип птицы или животного попал в камеру.
Сегодня мы расскажем вам про вторую нейронную сеть, отвечающую за распознавание видов птиц и их пола.
Поскольку некоторые виды птиц обитают исключительно на определенных континентах, мы решили создать две модели — одну для тех, кто живет в Северной Америке, и одну для тех, кто живет в Европе. Такова целевая аудитория у нашего клиента.
Немного о legacy code
Мы начинали работу над этим проектом не с нуля. Ранее наш клиент работал с другой командой разработчиков, которые начали работу над моделью классификации, но не смогли завершить задачу.
Из-за нехватки времени нам пришлось продолжить с того места, на котором остановилась другая команда, вместо того, чтобы начинать с нуля. Это уже довольно “классическая ситуация” в среде разработки.
Работать с чужим кодом в сжатые сроки — значит идти на компромиссы. Для нас это была работа с YOLO v4 для классификации объектов. YOLO отлично справляется с задачами обнаружения объектов, но не является оптимальным выбором для задачи классификации объектов. Мы должны были выжать максимум из того, что у нас было.
Мы работаем над созданием системы классификации объектов с нуля с использованием фреймворка Torch, на данный момент система основана на YOLO v4 и неплохо определяет виды птиц.
Шаг за шагом
Изначально задача классификации объектов решалась «в лоб»: датасет состоял из фотографий птиц различных видов, а также у этих птиц была еще и половая дифференциация. На основе этих данных нейросеть пыталась узнать, как выглядят и чем они все отличаются друг от друга. Это привело к очень низким показателям точности — сеть делала много ошибок при идентификации видов птиц и млекопитающих.
Нейросеть пыталась изучить слишком много параметров одновременно. Многие виды птиц внешне очень похожи друг на друга и могут отличаться лишь одним пятном на перьях или клювом разной формы, поэтому обобщающая способность в таком случае оставляла желать лучшего.
Запоминание всей этой информации нейросетью, вкупе с половыми различиями каждого вида было слишком сложной задачей. Сеть часто путала виды птиц, при этом правильно определяя их семейство.
Сеть определяла белогорлого воробья чернозобым, что было ошибкой с точки зрения метрики, хотя в целом было правильным, потому что - оба воробья являются воробьями и относятся к семейству воробьиных. Ради экономии времени клиент решил, что важнее определить более широкий тип птицы, а не ее конкретный вид. С этого мы и начали.
После оценки модели мы решили реализовать многоэтапный подход:
все виды птиц были сгруппированы в более общие категории — орлы, воробьи, вороны, голуби и т. д.;
нейросеть должна научится определять общий тип птицы;
вторым шагом - определить, какой это вид;
и в итоге нейросеть должна уметь определить, является ли птица самцом или самкой
Сгруппировав виды птиц, нам удалось уменьшить количество классов с 98 до 49, что значительно улучшило показатель точности, поскольку у нейросети просто сократилось число классов, из которых надо было выбирать.
Когда человек сталкивается с чем-то новым, в ход идут книги, статьи и обучающие видео, позволяющие это новое понять. Также можно обратиться к знакомым и друзьям, экспертам и преподавателям, которые помогут объяснить новое знание. Другими словами, человек пытается накопить больше информации, чтобы понять.
То же самое и с нейронными сетями — чем точнее нейросеть должна определить воробья, тем больше изображений воробьев нужно загрузить в датасет, чтобы она научилась его различать. Чем больше данных нейросеть получила, тем лучше будут показатели точности.
Выбранный нами многоэтапный подход не только повысил точность модели классификации объектов, но и позволил проанализировать набор данных и определить, где нейросети не хватает данных для обучения.
Например, нейросеть часто путала американскую ворону и краснокрылого дрозда, которые отличаются только пятном ярко-красных перьев на крыльях и немного формой головы. Нам нужно было собрать больше фотографий этих видов птиц, чтобы научить нейросеть их различать.
Проблема гадкого утенка
После того, как модель классификации объектов была запущена, мы получили странные результаты. Они были намного хуже, чем мы предполагали — модель не могла правильно определить вид или тип птицы. Более того, даже наш CV разработчик, отвечающий за весь проект, самостоятельно изучивший многие виды птиц во время работы над проектом, также не смог определить, что это были за птицы, когда он получил изображения, неправильно помеченные сетью.
Выяснилось, что июль, а именно тогда мы и работали над нейросетью по классификации, — не лучшее время для запуска, так как в это время птицы-подростки учатся летать и покидают свои гнезда.
Помните сказку о гадком утенке? Что ж, это казалось верным для большинства видов птиц — птенцы-подростки совсем не похожи на взрослых птиц. Если даже человеку трудно понять, что за птица перед глазами. Поэтому мы собрали изображения птиц-подростков за лето и обучили классифицирующую нейросеть определять различные виды птиц в разном возрасте.
Командная работа: нейросеть и эксперты
Наблюдатели за птицами — люди страстные, они знают, как определить птицу по форме единственного пера. Они обладают знаниями, о которых мечтает наша классификационная нейросеть, так почему бы не объединить их вместе и не сформировать союз любителей птиц, которого мир еще не видел?
В настоящее время классификационная сеть не просто сообщает пользователю вид птицы, она показывает степень достоверности наряду с другими предположениями:
Пользователь может подтвердить догадку сети или исправить ее, тем самым помогая нам ее дообучить. За 3 месяца работы системы обратной связи с пользователями мы собрали более 20 тысяч живых изображений с камер. Эти данные бесценны для нас, так как фотографии сделаны в реальных условиях (разные погодные условия погода, различное время суток, разные локации и т.д.) и размечены экспертами.
Планы на будущее
Как упоминалось ранее, использование архитектуры YOLO v4 — не лучший выбор, когда речь идет о классификации объектов. Пока мы собираем больше данных для набора данных, а пользователи помогают нам обучать сеть, мы планируем переделать систему классификации объектов с нуля. Для этого есть несколько причин:
мы хотим повысить точность классификации птиц;
мы хотим улучшить скорость (хотя скорость классификации не является для нас проблемой, поскольку мы не работаем с данными в режиме реального времени, все же приятно добиться более быстрого времени обработки);
мы хотим реализовать более точное распознавание видов птиц;
мы хотим реализовать распознавание птиц мужского и женского пола.
В настоящее время мы находимся на стадии исследования и тестирования, изучаем различные сети и подходы к реализации:
модель «оркестр» - основная классификационная модель определяет тип птицы, после чего передает изображение на меньшую модель, которая определяет вид птицы и ее пол;
векторные представления объектов - альтернативный подход к классификации птиц (метрическое обучение или metric learinng), этот подход позволяет работать с большим количеством классов при небольшом количестве данных по многим из классов. Мы убрали объединение птиц в группы и начали обучение и тесты данного подхода. Специфика данного решения в том, что при обучении нейросети для метрического обучения мы преследуем цель, отличную от классического подхода (в классическом подходе мы хотим построить оптимальную разделяющую гиперплоскость), а при данном подходе хотим, чтобы нейронная сеть построила структуру в векторном пространстве признаков. Эта структура будет отвечать требованиям: объекты одного класса находятся близко, а объекты различных классов - далеко. Как мы видим на визуализации результата, нам это удалось.
Если долго смотреть в бездну, бездна чирикнет тебе в ответ
В ходе этого проекта мы сами стали экспертами по птицам. А если серьезно, просматривая тысячи изображений птиц, мы углубились в этот проект и вышли из него не только с множеством знаний о птицах, но и с лучшим пониманием того, как работают сложные системы распознавания и классификации изображений.
Мы поняли, как их лучше спроектировать, как анализировать большой набор данных и находить его слабые места. Этот проект был бесценен для нас как возможность исследовать и работать с новейшими технологиями компьютерного зрения (на момент старта проекта, конечно же), работать с отзывами клиентов в режиме реального времени и отшлифовывать наши навыки решения проблем при работе с устаревшим кодом.
Мы продолжаем работать над ИИ-проектом по наблюдению за птицами и очень скоро поделимся обновлениями!
Этапы разработки
Анализ требований и ознакомление с данными заказчика.
Обучение нейронной сети, отвечающей за детектирование присутствия птицы или млекопитающего в кадре.
Доработка датасета заказчика.
Тестирование нейронной сети, отвечающей за детектирование присутствия птицы или млекопитающего в кадре.
Корректировка нейронной сети, отвечающей за детектирование птиц.
Обучение нейронной сети, отвечающей за классификацию птиц или млекопитающих.
Тестирование нейронной сети, отвечающей за классификацию птиц или млекопитающих.
Корректировка нейронной сети, отвечающей за классификацию птиц или млекопитающих.
Запуск проекта в продакшн: клиент начал продажи камер и сервиса.
Доработки и корректировки нейронной сети, отвечающей за классификацию птиц или млекопитающих.
Поддержка проекта.
На момент написания статьи проект прошел стадию №9 - проект запущен в продакшн, заказчик начал продажу сервиса и камер для наблюдения за птицами, а мы приступили к стадии 10.
Стек технологий
Нейронная сеть, детектирующая объект в кадре камеры: Darknet yolo v.4, caffe.
Нейронная сеть, классифицирующая объекты в кадре: Pytorch + Lightning, EfficientNet.
Команда разработки
2 ai-developer;
1 project manager.
Спасибо за внимание! Оставайтесь на связи, впереди еще много интересных ML-кейсов.