...

среда, 31 января 2018 г.

Статья о том, как мы попробовали применить современные нейросетевые технологии, чтобы находить каски на головах людей

Раньше все свои интеллектуальные модули мы строили на традиционных алгоритмах видеоанализа (далее мы будем называть их «классическими»). О нейросетях мы, конечно, знали, и пробовали их применять еще в далеком 2008. В частности, сравнивать изображения людей по кластерам. Но результаты не были выдающимися (в том числе из-за невысокого уровня развития нейросетей). И мы на многие годы стали приверженцами «классики» машинного зрения. А все нейросети были у нас в головах :)

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

Вдобавок ко всему, этот способ разработки представлялся гораздо более надежным – он сразу позволяет сделать вывод «пойдет или не пойдет»: когда начинаешь работать с «классическим» алгоритмом, сразу не понимаешь, правильно выбран путь или нет, получится решить задачу так или нет. И требуется какое-то (часто существенное) время, чтобы дойти до результата, который можно оценить. Так, например, мы около месяца возились со стереонасадкой для камеры, чтобы реализовать новый подсчет посетителей, но в итоге не получили с ней ничего дельного (см. статью «Рождение сверхновой: как появляются новые функции на примере 3D-подсчета посетителей»). А с нейросетями все нагляднее: уже по маленькой выборке из нескольких картинок можно оценить, пойдет или не пойдет. Если не идет – поменять выборку и проверить снова. Найти правильный тип данных и подход получается намного быстрее, а дальше надо просто улучшать выборку, чтобы получать все более высокие результаты.

Когда появилась задача создать детектор отсутствия касок (подробнее о том, как она появилась в статье «Custdev в разработке продуктов для видеонаблюдения»), сходу у нас не было понимания, как можно решить ее традиционными методами. Мы решили проверить, удастся ли сделать это с применением нейросетей. И вообще так ли хороши современные нейронные сети, как о них говорят?..

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

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

I способ

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

Опасения подтвердились: на таких картинках нейросеть не смогла толком обучиться – точность нахождения касок на новом тестовом наборе составляла порядка 70%. Она была совершенно неприемлема для работы модуля, но в то же время, это доказывало, что решить задачу с применением нейросетей можно!

Вообще, точность детектора касок складывается из чувствительности (отвечает за «ловлю» людей без касок) и процента ложных срабатываний (отвечает за ошибочную «ловлю» людей в касках). В условиях реального предприятия, где будет применяться детектор, люди в большинстве случаев ходят в касках, поэтому даже небольшой процент ложных срабатываний превратится в большой объем неправильных данных в выдаче.

За начальный ориентир была принята точность: не менее 60% чувствительности и не более 3% ложных срабатываний. И на самом деле это были нешуточные требования.

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

II способ

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


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

Наша выборка была среднего размера (несколько тысяч картинок голов в касках и без касок), она включала каски разного цвета и немного отличающиеся по форме. Чтобы улучшить результаты и избежать переобучения, нам пришлось всерьёз заняться техниками аугментации (искусственного расширения обучающей выборки) и регуляризации (ограничения параметров нейросети). В результате на тестовой выборке точность дошла до 85-88%. Это хороший показатель, но, чтобы еще снизить ошибки, мы сделали пост-обработку: решение о том, что человек без каски и надо выводить «тревогу» принимается не по одному кадру, а по результатам анализа каждого отдельного человека на нескольких кадрах подряд.

В ходе тестирования нас также не очень устроила работа детектора голов, поэтому мы сделали уточнение найденных на изображении голов… тоже с помощью нейросети. На самом деле и в одном, и в другом случае это не одна сеть, а несколько, объединенных в каскад для большей точности (но здесь мы будем называть их просто нейросетями).

Для своей нейросети мы взяли классическую сверточную архитектуру, которая хорошо себя зарекомендовала в задачах классификации. Но пробовали разные архитектуры, в том числе самые современные и сложные — из сотни слоев с сотней миллионов параметров. Принципиально с усложнением нейросети результат не улучшился. На своем опыте мы подтвердили, что теорема Вапника-Червоненкиса работает: сложность классификатора должна соответствовать сложности задачи. Если классификатор будет слишком сложный, то он просто запомнит все ответы и не будет работать. Если он будет слишком простой – не сможет обучиться.

Нам хватило довольно простой нейросети для решения относительно несложной задачи детекции касок.

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

1) за 2,5 месяца разработали работающий модуль, который пошел на первые объекты для тестового использования. По нашей оценке, разработка классическими методами у нас бы заняла не меньше полугода.

2) используем в детекторе отсутствия касок 2 набора нейросетей, обученных на разных данных. Первый находит головы людей в кадре, а второй – определяет, в каске эта голова или нет.

3) достигли заявленного порога точности — более 60% чувствительности на 1,5% ложных срабатываний.

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

Первый успешный опыт ставит закономерный вопрос: теперь все модули видеоанализа разрабатывать с применением нейросетей? И пока ответить на него однозначно трудно.
Есть модули, в переводе которых на нейросети сейчас мы не видим смысла. Потому что там итак все хорошо решается классическими методами. Например, подсчет посетителей (особенно в новой 3D-реализации). Сейчас на классических методах машинного зрения он работает очень хорошо и достигает точности 98%. И если бы мы применили нейросети, еще не известно, сработали бы они так или нет. А вот для детекции дыма и огня нейросети точно подходят.

Если выводить критерий применимости нейросетей в видеоанализе, его можно сформулировать как-то так: если заранее понятно, как и какие признаки использовать, то можно обойтись «классикой», в противном случае – можно попробовать нейросети.

В 3D-подсчете есть хороший признак – это расстояние до точки. Или в детекторе оставленных предметов, например, тоже легко его найти – особая точка на границе предмета, за которой можно следить и сравнивать ее, или контур. А вот в огне непонятно, что за признаки брать. Цвет? — всегда найдется что-нибудь такого же цвета, как огонь. Форма? — огонь может быть самой разнообразной формы. Мерцание во времени? — но непонятно, какое именно оно должно быть. Придумывать признаки заранее здесь — гиблое дело, поэтому пусть лучше это делает нейросеть.

Но вернемся к нашей задачи.

Итак, она решена. Ответ и соответствующие выводы получены:

Let's block ads! (Why?)

Комментариев нет:

Отправить комментарий