В последние несколько лет серьезно движется прогресс в области нейронных сетей. Появилось множество средств и перспективных архитектур нейронных сетей, которые отлично справляются с задачами классификации и обработки изображений. Некоторое время назад мы решали задачу посвящённую классификации поведения водителей по изображению с камеры.
Постановка задачи
В машине фиксировалась камера и непрерывно снимала поведение различных водителей. Требовалось определить по одной фотографии отвлекается ли водитель от вождения или нет. И в случае если отвлекается определить как именно. Всего предлагалось классифицировать водителя с изображения по 10 классам:- безопасное вождение
- пишет смс правой рукой
- пишет смс левой рукой
- говорит по телефону правой рукой
- говорит по телефону левой рукой
- переключает радио
- пьёт воду
- тянется на заднее сидение
- наводит макияж или поравляет волосы
- разговаривает с пассажиром
Набор изображений из порядка 10000 фотографий был разделён на две части. К одной из них (тренировочной) нам была доступна разметка по классам, ко второй (тестовой) нет. Поскольку система распознания водителей планировалась универсальной. А следовательно каждый раз водители будут разные, то данные были разделены по неповторяющимся водителям. То есть в тестовой части и в тренировочной части они были разные. Это было сделано специально, что бы нейронная сеть не запоминала конкретных водителей, а умела работать в том числе и с новыми.
Исследование
На первом этапе необходимо было определиться как лучше подходить к решению задачи. Было протестировано несколько нейронных сетей. Часть которые мы обучали с нуля и часть предобученных (VGG16, VGG19, Inception). Как и ожидалось предобученные сети показали себя на практике после переобучения намного лучше. Что бы сделать процесс кроссвалидации данных более приближенным к реальности. Данные разбивались на тренировочную и валидационную части не случайным образом, а по водителям. т.е. водители из валидационной части не присутствовали в тренировочной и наоборот.
Было обнаружено что зачастую довольно сложно отличить один класс от другого даже если классификацию проводит человек. Например класс "безопасное вождение" от "разговаривает с пассажиром". Некоторые же классы что человек что нейронная сеть определяли почти со 100% точностью ("пьёт воду"). Видимо за счёт явных маркеров в виде стакана или бутылки в кадре.
Решение задачи
Поскольку данных для тренировки было мало, тренировочный набор был расширен примерно в два раза за счёт использования тех эе изображений, но с небольшими деформациями: поворот на +-5%, небольшое случайное смещение яркости и уменьшение резкости для некоторых изображений. Тренировка проводилась в Python с помощью библиотеки Keras. Использовалась кроссвалидация KFold с K=10. Финальный результат получался при использовании предсказаний сразу трёх сетей. Что позволило сократить ошибку дополнительно примерно на 5%, чем при использовании предсказаний только одной сети.
Результат
Финальное решение корректно классифицировало порядка 90% тестовых изображений. Этот результат может быть значительно улучшен в случае расширения тренировочного набора данных.