Поиск по сайту Поиск

Как ИИ отслеживает небезопасное поведение водителей

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

Все автомобилисты так или иначе сталкиваются с пробками на дорогах. Монотонное движение побуждает лишний раз достать смартфон и написать в чат о своих проблемах, полистать новостную ленту или отвлечься разговором. Невинные на первый взгляд занятия могут стоить человеческой жизни. В США по этим причинам происходят 20% аварий. В русскоязычной терминологии проблема носит название «рассеянное вождение».

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

Что, если научиться выделять небезопасное поведение и вовремя предупреждать о нём водителей во избежание происшествий? Звучит, как неплохая задача классификации для свёрточных нейронных сетей. 

Рассмотрим, как создать отслеживающую рассеянных водителей нейросеть с помощью Python, Keras и Tensorflow. Если раньше вы не работали с этими инструментами, рекомендуем сначала ознакомиться с нашей статьёй «Как начать работу с Keras, Deep Learning и Python». В конце материала можно скачать и посмотреть исходный код.

Импортируем библиотеки

В качестве бэкэнда нейросети будем использовать Keras и Tensorflow. Импортируем необходимые библиотеки:

import os
import tensorflow
os.environ['KERAS_BACKEND'] = 'tensorflow'
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' # 3 = Сообщения INFO, WARNING и ERROR не печатаются

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from keras.preprocessing.image import ImageDataGenerator

Строка 3 устанавливает tensorflow как бэкэнд для keras, а строка 4 скрывает все логи.

Импорт набора данных

Файл driver_imgs_list.csv содержит список всех изображений из обучающей выборки, а также ссылки на людей и имена классов. Имя класса указывает на вид активности человека на фотографии.

dataset = pd.read_csv('driver_imgs_list.csv')
dataset.head(5)
https://cdn-images-1.medium.com/max/800/1*ByrPGJEuWD8xkz8hRgyCpA.png
Первые 5 строк набора данных

Обзор изображений

Перед обработкой изображений полезно хотя бы частично просмотреть датасет, поэтому отобразим по одной фотографии из каждого класса. Метки classname не содержат никакого информативного описания. Чтобы понимать, что означают классы c0, c1 и так далее, создадим словарь и добавим заголовки к каждому из них:

import os
from IPython.display import display, Image
import matplotlib.image as mpimg

activity_map = {'c0': 'Safe driving', 
                'c1': 'Texting - right', 
                'c2': 'Talking on the phone - right', 
                'c3': 'Texting - left', 
                'c4': 'Talking on the phone - left', 
                'c5': 'Operating the radio', 
                'c6': 'Drinking', 
                'c7': 'Reaching behind', 
                'c8': 'Hair and makeup', 
                'c9': 'Talking to passenger'}

Каталог train содержит в себе 10 вложенных папок, каждая из которых соответствует изображениям одного из классов. Итеративно пройдём по всем каталогам и отобразим первые фотографии в них. 

plt.figure(figsize = (12, 20))
image_count = 1
BASE_URL = 'imgs/train/'
for directory in os.listdir(BASE_URL):
    if directory[0] != '.':
        for i, file in enumerate(os.listdir(BASE_URL + directory)):
            if i == 1:
                break
            else:
                fig = plt.subplot(5, 2, image_count)
                image_count += 1
                image = mpimg.imread(BASE_URL + directory + '/' + file)
                plt.imshow(image)
                plt.title(activity_map[directory])

Строка 10 выводит 10 изображений, организованных в коллаж (5 по вертикали и 2 по горизонтали). image_count определяет число отображаемых фотографий в диапазоне от 1 до 10.

https://cdn-images-1.medium.com/max/800/1*bb_x6o9QZMh4y4D-Mg4AkA.png
Различное поведение водителей

Строим модель

Создадим свёрточную нейронную сеть с тремя слоями Conv2D (за каждым располагается слой MaxPooling2D), 1 слоем Flatten и 3 слоями Dense. Поскольку проблема является многоклассовой, последний слой Dense содержит 10 нейронов, а потери определяются с помощью categorical_crossentropy (категориальной кроссэнтропии).

classifier = Sequential()
classifier.add(Conv2D(filters = 128, kernel_size = (3, 3), activation = 'relu', input_shape = (240, 240, 3), data_format = 'channels_last'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Conv2D(filters = 64, kernel_size = (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Conv2D(filters = 32, kernel_size = (3, 3), activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))
classifier.add(Flatten())
classifier.add(Dense(units = 1024, activation = 'relu'))
classifier.add(Dense(units = 256, activation = 'relu'))
classifier.add(Dense(units = 10, activation = 'sigmoid'))
classifier.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
classifier.summary()
Модель классификатора

Создаём обучающую выборку

Дополним обучающую выборку с помощью функции ImageDataGenerator. Также используем метод flow_from_directory, чтобы считывать соответствующие каждому классу изображения из нужной папки. Разделяем данные на обучающие и тестовые в соотношении 80% и 20%. Обратите внимание, что все изображения масштабируются в вещественный диапазон [0…1] (rescale).

train_datagen = ImageDataGenerator(rescale = 1.0/255, 
                                   shear_range = 0.2, 
                                   zoom_range = 0.2, 
                                   horizontal_flip = True, 
                                   validation_split = 0.2)

training_set = train_datagen.flow_from_directory('imgs/train', 
                                                 target_size = (240, 240), 
                                                 batch_size = 32,
                                                 subset = 'training')

validation_set = train_datagen.flow_from_directory('imgs/train', 
                                                   target_size = (240, 240), 
                                                   batch_size = 32,
                                                   subset = 'validation')

Теперь обучим модель и посчитаем точность и потери.

Обучаем модель

Используем функцию fit_generator:

classifier.fit_generator(training_set,
                         steps_per_epoch = 17943/32,
                         epochs = 10,
                         validation_data = validation_set,
                         validation_steps = 4481/32)

Модель достигает точности в 97%.

Заключение 

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

Датасет можно найти здесь ( ~4 ГБ).

С оригинальной статьёй можно ознакомиться на портале towardsdatascience.com. Другие решения можно посмотреть в соревновании от Kaggle.

Как оформить ЛПХ в 2026 году: пошаговое руководство
Вместе с экспертами Destra Legal разбираемся, как оформить ЛПХ в 2026 году — пошагово и без сложных юридических терминов. Будет...
Read More
Продвижение локального бренда в городе: топ эффективных приемов и механик
Как локальному бизнесу конкурировать с федеральными сетями, не имея многомиллионных бюджетов и штата маркетологов? Задача кажется нерешаемой, но на практике...
Read More
Как заранее узнать о выездной налоговой проверке и подготовиться
Компании и ИП обязаны вовремя платить налоги, сборы и взносы. Чтобы подтвердить честность расчетов, они сдают декларации в налоговую (ФНС)....
Read More
Как вывести премиальный туристический сервис в онлайн: от сарафанного радио к сайту-продавцу
Многие предприниматели в сфере услуг уверены: если бизнес построен на личных рекомендациях и многолетней репутации, сайт не нужен. «Меня и...
Read More
Как бизнесу работать с трендами: от теории к практике
Тренды заметно влияют на изменение рынка, потребительские запросы и факторы конкуренции. Предпринимателю важно вовремя замечать тенденции и понимать, какие из...
Read More
Эмоциональная регуляция: что это такое и как ей научиться
Дедлайны горят, клиенты требуют невозможного, а от новостей иногда хочется спрятаться под одеяло. В таких условиях способность держать себя в...
Read More
Продвижение в соцсетях в 2026 году: чего лучше избегать
В третьей, заключительной, части вместе с Ефимом Кузнецовым, бренд-директором Placebo 25 Entertainment, разбираем обратную сторону трендов 2026: что перестало работать,...
Read More
Продвижение в соцсетях в 2026 году: как встроить тренды в стратегию
В первой части мы разобрали ключевые тренды соцсетей 2026 года: персонализацию, работу с микро- и наноинфлюенсерами, интерактив, социальную ответственность брендов...
Read More
Продвижение в соцсетях: тренды и рабочие инструменты в 2026 году
Соцсети перестали быть просто площадкой для публикаций. Сегодня это полноценная экосистема: алгоритмы ранжируют контент по глубине просмотра, аудитория мгновенно считывает...
Read More
СМИ без хаоса: как выстроить системную работу с медиа
Работа со СМИ помогает не только повысить узнаваемость компании, но и укрепить доверие клиентов, привлечь новую аудиторию и усилить экспертный...
Read More