Нейронные сети для нетривиальных задач в области компьютерного зрения
Системы помощи водителю, распознавание лиц и различных объектов, разработка собственных архитектур сетей
Системы помощи водителю (ADAS)
Одной из самых распространенных задач компьютерного зрения, где сейчас применяются нейросети, является система помощи водителю или даже полностью автономного вождения. Google, Tesla, Uber и другие корпорации работают в этом направлении. Свой интерес демонстрирует большинство крупных компаний. Так, даже Apple, не связанная с данной тематикой, заявила, что хочет выпустить в ближайшем будущем беспилотный автомобиль. В рамках этой темы существует много подзадач с самыми разными решениями. Тему лидаров и радаров и связанные c ними вещи в этот раз опустим, хотя они необходимы для полностью автономного вождения. Подробно остановимся на технологиях компьютерного зрения, так как именно они являются основополагающими в ADAS и автономного вождения.
С точки зрения компьютерного зрения, в ADAS обычно решаются следующие задачи: обнаружение (детекция) и классификация различных объектов и семантическая сегментация дорожных сцен. Результат работы детекции – это, как правило, обведенные описывающими прямоугольниками объекты.
На изображении показаны результаты детекции и классификации. Так работают алгоритмы семейства SSD (Single Shot Detector). Они называются так по понятной причине – здесь на выходе решаются обе задачи и для всех объектов, причем всё это за один прогон алгоритма. С удобством подхода связана его популярность в детекции. А еще пару лет назад всё это разбивалось на этапы: отдельно локализация, отдельно классификация, а перед этим еще и подготовка, возможно, ручное проектирование признаков и прочее. На каждом этапе появлялись свои сложности, приходилось постоянно что-то пробовать и подкручивать, поэтому с приходом свёрточных нейронных сетей все вздохнули свободнее – сети, созданные специально для изображений, автоматически находят наилучшие признаки для работы при правильном проектировании сети и тренировке. А с приходом SSD-подходов проблем стало значительно меньше (добавились, правда, новые, но в целом стало существенно проще и точнее).
На изображении (см. рисунок) – пример работы нашей системы на дорожной сцене из Южной Кореи. На нем алгоритм ищет машины, людей и дорожные знаки. Обычно это минимальный набор, интересующий всех. Имея информацию о расположении этих объектов, можно предупреждать засыпающего водителя об опасном сближении, помогать заметить пешехода и не превышать скорость. Мы также применяли эту информацию для адаптивного круиз-контроля, когда автомобиль старается держать дистанцию до впереди идущего автомобиля. Обычный круиз этим и неудобен: при сближении его приходится отключать и переходить в ручное управление, а при помощи радара и информации с камер можно автоматически регулировать скорость.
Пример работы нашей системы на кадре с Западного Скоростного диаметра Санкт-Петербурга:
Снизу можно наблюдать результат классификации дорожных знаков. Классификацию выполняет отдельный модуль, что дает возможность легко варьировать набор классов. Здесь мы ищем только знаки ограничения скорости и фильтруем ошибки SSD-алгоритма, но эти классы можно расширить.
На кадрах – алгоритмы, рассчитанные на работу на очень слабых устройствах, уровнем чуть сильнее смартфона. Это вносит огромное количество ограничений, ведь нейросети – крайне тяжелые алгоритмы, для одного прогона нужно выполнить от миллионов до сотен миллионов операций, поэтому разработка решения для реального времени требует опыта и мастерства.
Стоит отметить, что эти решения устаревают очень быстро. Можно разработать ПО, а через неделю выйдет прорывная статья, на основе которой можно сделать что-то в разы эффективнее – и быстрее, и точнее. Нужно постоянно «держать руку на пульсе» – читать все новые статьи буквально каждый день (ну уж каждую неделю точно) и анализировать чужие успехи. Существует мнение, что программирование – это область, где все происходит очень быстро, поэтому все учебные программы устаревают моментально и могут быть неактуальны уже через год. Так вот отрасль искусственного интеллекта (ИИ) – это еще более изменчивая область, если сравнивать даже с программированием.
Помимо перечисленных ADAS-задач актуален вопрос поиска дорожной разметки. Любой водитель понимает, что при хорошей разметке знаки практически не нужны, разметка гораздо нагляднее. Поэтому в компьютерном зрении тоже хотелось бы собирать и анализировать эту информацию. Мы такую систему разрабатывали, основываясь на самых современных методах, в том числе семантической сегментации. Вот пример работы системы:
На первом изображении результат семантической сегментации, который потом обрабатывается специальными алгоритмами, чтобы получить координаты линий.
Системы помощи водителю должны не только находить объекты, но и понимать общую обстановку. Когда небольшого набора классов недостаточно и хочется учитывать контекст, как это делает человек, в дело вступает семантическая сегментация. Результатом ее работы является присвоение каждого пикселя на фотографии определенному классу.
Здесь наша система ищет дорогу, автомобили, здания, деревья и тротуар. Это всё только лишь по одному снимку, никакой дополнительной информации! Алгоритмы учитывают не только внешний вид объектов, но и их взаимное расположение, что гораздо ближе к человеческому мышлению, чем формальный поиск внешне похожего, как это делают SSD-подходы.
Как можно видеть на рисунке, сегментация имеет и недостатки. Например, все автомобили отмечены одним большим пятном. Этого достаточно, чтобы не врезаться, но может быть мало, чтобы, например, припарковаться. Поэтому существуют и специальные комбинированные подходы – на выходе таких алгоритмов есть и сегментация, и описывающие прямоугольники:
Самая известная сеть для такого подхода – это Mask-RCNN, она является, по сути, алгоритмом SSD, дополненным сегментацией.[r1] Преимущества велики, но и минусы существенны: данные для такой сети необходимы более сложные (с точки зрения их сбора и обработки), чем для других алгоритмов, а сами сети работают медленнее. Но бывает, что высокие скорости не требуются, например, для распознавания тигров в заповеднике.
Тигры, как люди
По всей территории Дальневосточного заповедника амурского тигра расставлены фотоловушки, которые фотографируют оказавшихся в кадре тигров. Данные собирают и по уникальному рисунку шерсти определяют, что это был за тигр и как он передвигался по заповеднику. Вручную это делать очень долго, поэтому сотрудники заповедника захотели использовать автоматическую систему. Если ADAS – это очень распространенные и даже немного рутинные задачи, то этот проект уникален.
Для разработчиков здесь две основные задачи. Во-первых, нужно убедиться, что на фотографии тигр, потому что в кадр может попасть и другой зверь. Во-вторых, тигра надо аккуратно обрезать на фотографии, чтобы понять, что это за тигр. После всех этих операций тигра надо сравнить с базой для определения разновидности.
Пример из фотоловушки
В кадр могут попасть несколько тигров, поэтому для детекции мы применяли описанный выше подход Mask-RCNN. Вот результат его работы:
Сравнить тигров между собой, чтобы понять, какой тигр из фотоловушки какому тигру в базе соответствует, – не тривиальная задача. Мы попробовали и обдумали множество подходов, в том числе «старый» с ваучерами (раньше такие задачи решались, по сути, попыткой сравнения каждой полоски) и пришли к интересной идее. Для тигров мы использовали наработки для распознавания лиц. Сейчас на основе этого подхода разрабатываются системы идентификации человека в России, в Китае и в других странах. Алгоритм называется Facenet, разработка Google. Суть в том, что нейросеть обучается различать лица между собой, выделяя нужные признаки. На выходе такого алгоритма получаются значения признаков, закодированные в некое N-мерное пространство, что позволяет набор для одного лица сравнивать с набором для другого, просто взяв расстояние между ними в этом пространстве. Чем дальше наборы, тем больше лица различаются.
Мы адаптировали этот подход для сравнения тигров и их полосок на шкурах. Самой серьезной проблемой была нехватка данных – в миллионы раз меньше, чем для лиц. А новые было тяжело собирать: не везде полоски видно, вариантов поз и ориентаций больше, качество снимков с фотоловушек часто неудовлетворительное, особенно ночью. Но в итоге у нас получилось, и нейросеть научилась «смотреть» на полоски. Это очень интересный опыт, насколько нам известно, нейросетевые подходы для опознавания личности животного еще не применяли.
Впоследствии мы сделали для этой системы еще и симпатичный веб-интерфейс.
Сегментация в медицине
В мире компьютерного зрения и сверточных нейросетей задачи классификации считаются практически решенными, а задачи детекции – детально разработанными и исследованными. Для основы хорошего решения задачи классификации или детекции нужен только хороший набор данных (для выдающегося результата, конечно, понадобятся еще опыт и чутье). Сегментация требует залезать «под капот» гораздо чаще. Её промышленное применение ограничивает лишь то, что она значительно медленнее детекции, но вопросы производительности будут решены со временем.
Сегментация востребована в медицинском компьютерном зрении, например, для распознавании рентгеновских снимков. Этот важный метод обследования поставлен на поток, однако для грамотной интерпретации нужен опытный специалист, чья подготовка занимает долгие годы. Идея обучить компьютер и снять эту задачу с человека активно развивается, и прямо сейчас, например, на Kaggle проходит очередное соревнование по распознаванию на снимке пневмонии. Заболевание может протекать скрыто и входит в список наиболее частых причин смерти в мире, поэтому точность диагностики актуальна как никогда.
В сфере медицины мы работаем над одним проектом, который включает в себя сегментацию медицинских изображений в реальном времени на слабом устройстве (для этого готовые сегментационные решения совершенно не подходят). Для решения задачи мы взяли самую популярную и хорошо зарекомендовавшую себя в области медицинских изображений сеть – Unet. Этот алгоритм успешно решает множество задач бинарной сегментации, но скоростью не радует – даже на небольшом разрешении работает по полсекунды и дольше. Поэтому мы переработали архитектуру с учетом более современных идей.
Авторы ряда статей пишут об ускорении работы нейросетей благодаря использованию уже готовых или тривиально создаваемых слоев (это очень важно для последующей развертки). К таким архитектурам относятся ResNeXt, SqueezeNext и MobileNetV2. Особенно известен MobileNet, созданный в Google, – сейчас с этой архитектурой работает едва ли не большая часть современных решений для слабых устройств. SqueezeNext, и Mobilenet можно оптимизировать, задействовав более эффективные для мобильных платформ слои, комбинируя мелкие свертки, специальные соединения слоёв и т.д.
Мы отобрали лучшие идеи, провели множество экспериментов, проверили собственные гипотезы и в итоге получили очень быстрый и маленький Unet, который назвали LUnext (Light Unext). В этой сетке всего два миллиона параметров, и она работает примерно в пять раз быстрее, чем оригинал, конечно, немного уступая в точности. Но выигрыш в скорости перевешивает этот недостаток.
Сервер вместо Data Scientist
Среди задач в сфере машинного обучения встречаются весьма экзотичные. Один раз нас попросили написать сервер, который бы принимал данные и максимально автоматически тренировал на них нейросеть. Конечно, это невозможно – тренировкой должен заниматься квалифицированный специалист. Он принимает решения, исходя из своих знаний, а иногда опирается только на опыт. В этой области искусственного интеллекта многие решения субъективны и интуитивны, поскольку все нюансы, как и почему это работает, человечеством до сих пор не изучены. Все гиперпараметры, решения о тренировке, валидации и тестировании – всё, вплоть до субъективных решений при разметке данных, специалист делает на свой страх и риск.
В нашем случае заказчик утверждал, что его устроит базовое решение, когда сеть сходится минимально и шлифовка (fine-tune) результата не выполняется. Грубо говоря, лишь бы работало. Мы написали такой сервер, оставив в программном интерфейсе для управления минимум опций. Остальные гиперпараметры вычисляются из данных, а если вычисление невозможно, производится попытка угадать что-то близкое. Это сработало на удивление неплохо, хотя до серьезных индивидуальных результатов и не дотянет.
Сфера возможного использования нейросетей, конечно, куда шире, чем в нашем обзоре. Бизнес всё чаще интересуется методами искусственного интеллекта, а значит, в ближайшем будущем автоматизация многих консервативных областей будет более активной.
Михаил СМИРНОВ,
технический директор ООО «Системы компьютерного зрения» (ГК ЛАНИТ)
Максим КУПРАШЕВИЧ,
руководитель группы машинного обучения ООО «Системы компьютерного зрения» (ГК ЛАНИТ)
[r1]Поправила
Опубликовано 05.10.2018