На развитие компьютерного зрения в последние 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 (выборки сбалансированы)
В дальнейшем мы планируем увеличивать количество распознаваемых видов, превзойти точностью модели человеческую и переносить модель полностью на устройство. Наша цель не просто создать универсальный инструмент для рыбаков, а объединить все комьюнити в едином проекте.
Комментарии (31)
shurupkirov
24.10.2017 16:51Грибы да, интересно было бы, а то бывают неурожайные годы, когда надо брать то, что есть)
manefesto
24.10.2017 16:52и еще бы с поваренной книгой, тогда мы бы узнали что за зелье варили викинги из мухоморов
lifestyle
24.10.2017 17:42Главное правило грибника: если ты не уверен даже в знакомом грибе — выброси его, не рискуй!
shurupkirov
24.10.2017 20:59ну вот в нашей полосе обабки берут редко, обычно красные и белые, но в неурожайные года и обабок гриб)
JediPhilosopher
24.10.2017 18:26Я об этом тоже как-то думал. Но с грибами опасно иметь дело: не отличит по ошибке приложение поганку от сыроежки, кто-то отравится, а кто потом будет за это отвечать?
Даже если в лицензионном соглашении прописать кучу всяких отказов от ответственности, просто получится что приложение бесполезно, ведь даже 1-2% false positive когда несъедобный гриб принят за съедобный — это слишком большой риск. В итоге человек все равно должен разбираться в грибах и проверять то что выдаст приложение. А зачем оно тогда ему нужно?haiflive
25.10.2017 07:38да ладно, примерно такой же процент грибов ядовитые из всего разнообразия, травятся в основном из-за не правильного приготовления
lifestyle
24.10.2017 17:54Супер! Как рыбаку-и-программисту-любителю, статья очень интересна, спасибо)
grey_rat
24.10.2017 22:37У нас в Беларуси крупняк не часто попадается, в смысле сазаны за 5 кг, щуки примерно такого же веса или сомы за 20 кг. В основном лещ, плотва, окунь, карась, густера, уклейка и пр. мелочёвка. В этом году рядом со мной мужичёк линя ровно на пол метра вытянул. И то, он дома его не взвешивал, а только рулеткой померил. На морской рыбалке там да, другие трофеи.
Язя от голавля отличить можно. Сложнее не большие густёрки, белоглазки, подлещики, синец. А есть ещё гибриды или брачные наряды рыб.
Соревновательного процесса в любительской рыбалке как такового нет у нас, это скорее просто отдых, ну и если поймается что-то трофейное, то и соседи за вас порадуются и помогут вытянуть рыбку если что. Как бы более простое отношение, главное полученные впечатления от самой рыбалки, а фото рыбы это уже как небольшое дополнение.
Germanets
25.10.2017 10:51Как вариант монетизации — собирать местоположения с крупными уловами и продавать другим рыбакам полученные «рыбные места» за некоторую плату, точность при это можно уменьшить до какого-то озера\части акватории реки) Только при этом надо отфильтровать всевозможные рынки и домашние адреса, где нет озёр\рек поблизости)
monte1977
25.10.2017 14:20никогда не шутите с рыбаками и грибниками на тему их мест, вас не поймут. это святая-святых. п.с это не касается планых мест и заказных рекламных обзоров.
TimsTims
25.10.2017 12:03Рассказы типа «я поймал ВОТ такую рыбу» не будут восприниматься всерьез.
Эти рассказы обычно проходят за кружкой пива в шумной дружной компании, когда рассказываются всякие байки, и точная величина размера рыбы здесь не играет особой роли, главное — душевная компания.
eyesless
25.10.2017 13:11очень интересная статья! а я вот на ондроеде пилю пет-проект тоже для рыбаков приложение, прогноз погоды и клёва рыбы… и оказывается, что большая часть народных примет (которые, кстати массово транслируются и в интернете), научного подтверждения не имеет (типа влияния давления на самочувствие рыбы)… можт быть, тут тоже имеет смысл пойти методом накопления и анализа данных об успешности рыбалок? но для этого нужно, чтобы пользователи массово и активно размещали информацию о своих уловах… упс :)
monte1977
25.10.2017 16:37измените немного подход, вам нужен архив погоды, точное место и достаточное количество отчетов с точным временем. в результате этого делаете в последствии предсказание.
более точнее будет при наличии дополнительных локальных сведений в виде уровень воды, температура воды, наличие других факторов, к примеру плотин с их графиком работы и скоростью течения.
причем расчет делать не только по точке, если к примеру речка, а брать в учет 200-500 км выше по течению.eyesless
25.10.2017 23:16я не нашел открытых данных по температуре воды в реках и озерах… кроме морей… и не удивительно в общем, что этих данных нет, если представить механизм расчета такой температуры… была бы тепература воды с историей этого одного уже было бы достаточно для довольно точного прогноза рыбьего аппетита… но, так как ее нет, придется делать модель опосредованно через погоду в атмосфере
monte1977
27.10.2017 09:35все знать можно, но сложно :) по россии я не знаю, по германии в своем регионе мы часто перед рыбалками смотрим на колебания и уровень, особенно весной и после периода дождей. в нашем регионе есть открытые данные по многим показателям, даже анализы качества воды.
luadb.lds.nrw.de/LUA/hygon/pegel.php?interaktiv=T карта
для скачивания luadb.lds.nrw.de/LUA/hygon/pegel.php?rohdaten=ja
практически на всех судоходных путях, водохранилищах, речках с водозабором делаются замеры, вопрос только где эти данные оседают.
varton86
25.10.2017 13:12Было подумал, что смартфон подскажет, рыбное ли место, но нет. Искусство заголовка :) Хотя, наверное в приложении можно прикрутить функцию по частоте фото рыбаков, как в этих местах ловится.
monte1977
25.10.2017 13:12вам как идея. помогите фирме navionics опознавать по картинке эхолота, когда идет сканирование (sonarchart) для построения карты глубин, тип дна (песок, глина, водоросли и тд.) вас поцелуют рыбаки во все дырки и памятник поставят, можете запродать это и другим производителям.
TimsTims
26.10.2017 18:43Кстати вспомнил года 2 назад на хабре была статья, как один чел «хотел всем помочь» — сделал сайт для рыбаков с подсказкой самых клёвных мест, типа ты делишься местом, и другие об этом узнают. Но реальность оказалось суровой — настоящие рыбаки очень нелюбят выдавать своих нычек, и уж тем более им не нужны лишние соседи, которые будут там ловить «твою рыбу», и тебе мешать.
Короче не прокатил проект, и мораль была такова: «сначала найдите целевую аудиторию, и проверьте — действительно ли ей это интересно.»
manefesto
Немного увлекаюсь рыбалкой, и не всегда могу определить рыбу по виду
Ваше приложение очень бы помогло
Теперь осталось сделать приложения для грибов
PS: Про грибы я не шучу
Code_phobos Автор
Про грибы мы еще подумаем :) А приложение доступно в AppStore — itunes.apple.com/app/deep-fish/id1269532116?mt=8
Ugrum
А андроид в пролёте что ли?
Code_phobos Автор
Возможно, в следующем году после того, как протестируем версию для iOS
RoboForm
Для Android у нас есть, например, «ручной» определитель: play.google.com/store/apps/details?id=ru.ecosystem.fish
manefesto
В конце статьи добавьте