[Из песочницы] Умные сети для рыбаков: как мы учили смартфоны распознавать рыбу
На развитие компьютерного зрения в последние 10 лет не обращал внимание лишь отстраненный от мира человек. Технология распознавания образов своим процветанием обязана глубокому обучению. Достижения машин поражают воображение.
- В 2012 году происходит соревнование по классификации картинок, где выигрывает глубокая нейронная сеть с грандиозным отрывом от второго места;
- Три года спустя машина классифицирует 1000 классов картинок с точностью, превосходящей человеческую;
- Распознавание рукописных символов и дорожных знаков превзошли людей по точности.
- Глаза самоуправляемых машин — лидары, радары и камеры способны распознавать окружение, дорожную разметку, транспорт, автомобили, а также пол и возраст пешеходов.
- Точность чтения по губам сетью, обученной специалистами Google DeepMind и Оксфордского университета, превышает человеческую;
- Распознавание возраста и пола — точность превысила человеческую;
- Одним из самых развивающихся направлений технологий машинного зрения выступает распознавание лиц с акцентом на биометрию в связи с растущим спросом на данную технологию для обеспечения безопасности. Несколько стран используют технологии распознавания лиц в своих системах наружного видеонаблюдения. Благодаря ним даже был пойман преступник.
Это лишь вершина айсберга достижений алгоритмов компьютерного зрения. Остались без упоминания достижения в искусстве, медицине, играх и впечатляющие генеративные модели, такие как генератор кошечек. Некоторые источники утверждают, что именно благодаря кошечкам удалось позаимствовать идею сверточных нейросетей у природы, создавшей зрительную кору мозга.
Компьютерное зрение, как часть мира будущего
Технологии для автоматизации задачи, требующие распознавание образов, пользуются спросом на службе правительств и в высокотехнологичных компаниях. Они помогают решать задачи людей, нуждающихся в помощи — фермеров и защитников окружающей среды. Приложение Seeing AI от Microsoft описывает окружающий мир для слепых людей. А молодой разработчик создал для родителей фермеров сортировку овощей, облегчив труд.
Мы давно следим за развитием технологий. Потенциал машинного обучения вдохновляет нас искать приложения перспективных технологий в наших продуктах для решения повседневных задач простых людей. В 2016 году, работая над социальной сетью для рыбаков, мы решили сделать лучшее, что в наших силах, чтобы любимое многими хобби, стало не просто удобнее, но и интереснее.
Цель и постановка задачи
Современные рыбацкие сообщества до сих пор живут на форумах, построенных в начале 2000-х. Темы с рассказами о лучших местах для рыбалки, снаряжении и фотографиями улова — наиболее активны. Люди делятся запечатленной на смартфон рыбой, выкладывая пост на форум. Братья по оружию (в этом случае, удочке) обсуждают добычу, соревнуясь друг с другом кто поймал щуку побольше. Такую теплую соревновательную атмосферу нарушать нам не хотелось. Как раз напротив, сделать рыбалку активнее, удобнее и чуточку современнее, по крайней мере, в этом аспекте.
Порядка 500 млн человек во всем мире увлекаются сегодня рыбалкой. Представители одного из самых больших комьюнити, давно берут с собой смартфоны на рыбалку, однако, все также сидят на устаревших форумах или группах в Facebook. Удивительно, но современных ресурсов и приложений для рыбаков почти нет. Мы хотели исправить это досадное упущение посредством технологий.
Созданное нами приложение поможет рыбакам не только определить вид и длину рыбы, но и оставить трофей на доске почета. Каждый рыбак хочет видеть добычу в своей коллекции. Сканируя поимку, приложение добавляет ее в профиль, так, чтобы пользователь смог похвастаться уловом со своими друзьями. Наверное, у большинства рыбаков, которые считают это занятие больше чем хобби, есть чувство соревновательного азарта. Специально для них, мы также решили добавить рейтинги. Пользователи с большим уловом будут на вершине рейтинга, становясь стимулом для остальных. Рассказы типа «я поймал ВОТ такую рыбу» не будут восприниматься всерьез. Приложение будет знать, кого поймал рыбак и какой длины.
Человека больше не будет отвлекать загрузка фотографий на форум, определение вида и размера рыбы — все сделает машинное обучение. Останется только наслаждаться любимым занятием — ловить рыбку.
Учим сеть улавливать рыбу
Чтобы научить сеть распознавать длину и вид рыбы, помимо мощных видокарт нам было необходимо:
- собрать данные;
- обработать до чистого набора размеченных красивых картинок с рыбой;
- выбрать подходящие архитектуры;
- учить и валидировать;
- исправлять ошибки и пробовать снова.
Сбор данных
Открытые датасеты с разметкой вида рыбы или бокса с ее положением практически отсутствуют. Данные можно найти у ImageNet и отдельных лабораторий, но объём, качество снимков и разметки оставляют желать лучшего.
Первого взгляда на первую сотню фотографий улова будет достаточно, чтобы понять, что рыбакам со всего мира нравится делать селфи с рыбой, а не качественные фотографии.
Фотографии и видео с рыбалки содержат нужные данные, но они имеют ряд существенных недостатков:
- Низкое качество ~40% датасета:
- Рыба занимает небольшую часть фотографии, или ужасно смазана, сфотографирована издалека;
- Руки рыбака закрывают собой значительную часть рыбы;
- Рыба видна частично и не помещается в кадр, обрезана или перекрыта на снимке.
- Кадр не поддается классификации:
На фотографии несколько видов, а мы хотим для каждого изображения определять один класс.
Рыбаки очень часто путают похожие виды, «загрязняя» данные.
Глубокие сети требовательны к объему и менее требовательны к качеству. Но рыболовные снимки в сыром виде непригодны.
Наша методика позволила нам решить сразу несколько проблем — сбора данных и их очистки. Она заключается в последовательном увеличении качества, моделей и данных:
Мы размечаем вручную границы рыбы для нескольких непохожих видов для избежания переучивания на один вид. Например, камбала, щука и карп. Несколько дней работы — это пара тысяч картинок.
Выбираем архитектуру для детекции. Быструю и точную для работы с большим количеством данных. R-FCN показалась подходящей.
Обучаем сеть различать рыбу и не-рыбу (фон), детектить первое. Делаем веб-интерфейс для инференса медийных материалов наших рыбаков. Он может вставить в веб интерфейс ссылку на своё видео, которое будет покадрово прогнанно через модель детекции. Все кадры, содержащие рыбу, будут выведены на экран для удаления дубликатов и ошибок…
Такая админка позволяет собирать данные для целевого вида, а обработанные сетью и проверенные человеком использовать для:
- Дообучения нашей модели детекции. Отбирая примеры удачной работы на новых видах мы делаем transfer на большее количество видов и повышаем точность и качество модели;
- Вырезания фрагмента с рыбой из фотографии — на выходе, установив высокий порог уверенности для фильтра хороших кадров, получаем крупные качественные кадры с одной рыбой. То что нужно для обучения модели классификации! Обработанных таким способом качественных изображений ~60%.
Обучение классификации
Мы намерены расширять количество распознаваемых видов, поэтому выбирали архитектуру классификатора среди сетей, которые предсказывали 1000 классов на ImageNet. Выбор пал на Inception-ResNet-2, как оптимальное соотношение размера и точности.
Для обучения использовались TensorFlow, EVGA GeForce GTX 1080 Ti и EVGA GeForce GTX 1080.
Полное обучение модели дало большую точность, чем обучение полносвязных слоев модели ImageNet. Скорее всего потому, что сеть научилась низкоуровневым паттернам, таким как рисунок чешуи. Обучение заняло более 80 часов на двух видеокартах.
Первые результаты были поразительны!
Пока все восхищались тем фактом, что доучили нейронку до уровня мультипликационной абстракции, некоторых терзало сомнение, что сеть переучилась.
Но зря, камера запечатлела типичного керри на миде, значит всё впорядке.
Полученное решение страдало от больших ошибок на похожих видах. На изображениях представлены легендарный язь и голавль, отличить которых, способны лишь заядлыми рыбаками.
Ситуация обстоит еще хуже с форелью.
Более десятка популярных видов форелей и лососей не просто могут запутать неспециалиста, но и невероятно изменчивы в течении жизни. От стадии личинки до нереста они меняют свой окрас и форму кардинально в зависимости от возраста, времени года и даже состава воды. Далеко не каждый человек распознает один и тот же вид одной форели с интервалом в несколько лет. Такие виды, как кижуч и чавыча отличить человеку сложно даже по описанию. Из-за человеческой ошибки данные перепутаны, для каждого класса модель требует не менее 1000 фотографий для точности более 80%, при нескольких десятках видах вручную компетентно просматривать такие объёмы ресурсозатратно.
Наше решение заключалось в итерационном очищении датасета от ошибок разметки посредством самой модели. Модель прогоняем на своём же датасете, находим все картинки с несовпадением предсказания модели и разметки. Большинство таких картинок оказываются ошибками последнего. Отсеиваем их, переучиваем модель и получаем высокие метрики на валидационном датасете. В результате, удалось получить точность модели более 90+% даже для похожих видов. Сеть умеет практически безошибочно различать 8 схожих видов форелей и лососей, и более десятка окуней. Однако, в редких случаях сеть все же ошибается. Причину лучше показать наглядно:
Измеряем улов
Переоценка своего улова — очень важная фича белковых нейросеток. Для точного измерения, нужно знать границы рыбы на фотографии и иметь дальномер, как на новых смартфонах со сдвоенными камерами.
Наша цель — обеспечить рыбакам точное измерение улова автоматически, простым наведением телефона. Приложение должно уметь определять, когда рыба в кадре классифицирована и локализована. Необходимо измерять длину рыб по нескольким различным стандартам. Архитектура Faster RCNN с Inception-ResNet-2 демонстрирует себя лучше аналогов, переводим классификаци на неё с R-FCN.
Результаты на аналогичных данных говорят сами за себя.
Тем не менее, такой метод измерения нам не подходит, так как боксы корректно определяющие длину и ширину только для горизонтального и вертикального положения, для произвольного положения не подходят и не способны оценивать длину изогнутой рыбы.
Точнее измеряем улов
Размечаем несколько тысяч фотографий ключевыми точками для покрытия всех способов измерения по различным стандартам.
Обучаем модель для регрессии по ключевым точкам, которая увеличит точность измерения длины и сможет влезть в телефон. Если мы переносим детекцию на устройство, то сможем отправлять на классификацию уже обрезанный участок с рыбой, что увеличит надёжность и поможет снять нагрузку с сервера. Телефон будет отправлять запрос только, когда обнаружит рыбу. К сожалению, модель регрессии точек не сможет отличить рыбу от не-рыбы, поэтому нам понадобится модель такого бинарного классификатора на устройство.
Для регрессии по ключевым точкам берём предобученную на ImageNet’e «голову» от архитектуры ResNet50, добавляем 2 полносвязных слоя на регрессию 14 переменных — координаты всех точек. Функция потерь MAE. Вес модели ~ мегабайта.
Аугментации: флипы горизонтальные/вертикальные, яркость, рандомные кропы (хорошо зашли), скейл. Все координаты точек нормировались на [-1, 1]
Для создания бинарного классификатора, создаём свою модель, похожую на AlexNet. Обучаем на рыбах и «не-рыбах».
Тут все стандартно: бинарная кросс энтропия, аугментации, метрика accuracy (выборки сбалансированы)
В дальнейшем мы планируем увеличивать количество распознаваемых видов, превзойти точностью модели человеческую и переносить модель полностью на устройство. Наша цель не просто создать универсальный инструмент для рыбаков, а объединить все комьюнити в едином проекте.