en ру

Использование нейронных сетей для решения задач, связанных с анализом изображений

Использование нейронных сетей для решения задач, связанных с анализом изображений

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

Постановка задачи

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

  • безопасное вождение
  • пишет смс правой рукой
  • пишет смс левой рукой
  • говорит по телефону правой рукой
  • говорит по телефону левой рукой
  • переключает радио
  • пьёт воду
  • тянется на заднее сидение
  • наводит макияж или поравляет волосы
  • разговаривает с пассажиром

Набор изображений из порядка 10000 фотографий был разделён на две части. К одной из них (тренировочной) нам была доступна разметка по классам, ко второй (тестовой) нет. Поскольку система распознания водителей планировалась универсальной. А следовательно каждый раз водители будут разные, то данные были разделены по неповторяющимся водителям. То есть в тестовой части и в тренировочной части они были разные. Это было сделано специально, что бы нейронная сеть не запоминала конкретных водителей, а умела работать в том числе и с новыми.

Исследование

На первом этапе необходимо было определиться как лучше подходить к решению задачи. Было протестировано несколько нейронных сетей. Часть которые мы обучали с нуля и часть предобученных (VGG16, VGG19, Inception). Как и ожидалось предобученные сети показали себя на практике после переобучения намного лучше. Что бы сделать процесс кроссвалидации данных более приближенным к реальности. Данные разбивались на тренировочную и валидационную части не случайным образом, а по водителям. т.е. водители из валидационной части не присутствовали в тренировочной и наоборот.
Было обнаружено что зачастую довольно сложно отличить один класс от другого даже если классификацию проводит человек. Например класс "безопасное вождение" от "разговаривает с пассажиром". Некоторые же классы что человек что нейронная сеть определяли почти со 100% точностью ("пьёт воду"). Видимо за счёт явных маркеров в виде стакана или бутылки в кадре.

Решение задачи

Поскольку данных для тренировки было мало, тренировочный набор был расширен примерно в два раза за счёт использования тех эе изображений, но с небольшими деформациями: поворот на +-5%, небольшое случайное смещение яркости и уменьшение резкости для некоторых изображений. Тренировка проводилась в Python с помощью библиотеки Keras. Использовалась кроссвалидация KFold с K=10. Финальный результат получался при использовании предсказаний сразу трёх сетей. Что позволило сократить ошибку дополнительно примерно на 5%, чем при использовании предсказаний только одной сети.

Результат

Финальное решение корректно классифицировало порядка 90% тестовых изображений. Этот результат может быть значительно улучшен в случае расширения тренировочного набора данных.

Оставить заявку