Введение. Классифицировать автомобили предполагается по трем классам: легковой автомобиль, грузовой автомобиль и автобус. Кроме того, нужно иметь возможность отличать автомобили от ошибочно детектированных объектов, таких как движущиеся пешеходы, автомобильные тени и пр. В ходе работы будут применяться такие программные средства, как язык программирования Python [1], библиотека компьютерного зрения OpenCV [2], фреймворк для работы с низкоуровневыми библиотеками машинного обучения Keras [3].
Выбор архитектуры нейронной сети. Классификация объектов по их изображениям представляет собой задачу распознавания образов. Специально для этого в 1988 году Яном Лекуномбыла разработана архитектура сверточной нейронной сети (CNN – convolutional neural network) [4]. В отличие от обычной полносвязной, в сверточной сети слои локально связаны. Это позволяет не терять информацию о положении признаков на изображении. Операция свертки представляет собой последовательное прохождение локальных областей изображения через маленькую нейросеть, состоящую из одного слоя, называемую ядром свертки. Каждый сверточный слой может иметь множество таких ядер, каждое из которых занимается выделением определенного признака на всем изображении. Количество ядер свертки выбирает исследователь для каждого сверточного слоя эмпирическим путем. Минимальный размер ядра свертки, способного различать такие признаки, как вертикальные, горизонтальные и косые линии, составляет 3х3. Ядро свертки проходит по всему изображению с определенным шагом, который выбирает исследователь. При этом допускаются перекрытия одной и той же области. Обычной практикой является выбирать нечетный размер стороны ядра свертки. Для ускорения обучения ядра инициализируются особым образом. Помимо размера и шага нужно выбрать способ перемещения ядра по изображению (padding). В обычном случае на выходе сверточного слоя карта признаков уменьшается по формуле (1):
, |
(1) |
где x, y – искомый размер сторон; a, b – исходный размер сторон; m, n – размер сторон ядра свертки (padding = valid). Чтобы сохранись исходный размер карты признаков, можно перемещать ядро свертки с выходом за границы карты. При этом недостающие ячейки заполняются нулями (padding = same). В сверточных слоях может применяться любая функция активации. Из-за своей простоты чаще всего применяется функция ReLU (rectified linear unit), которая просто отсекает отрицательную часть. За сверточным слоем в архитектуре CNN может следовать слой субдискретизации или пулинга. Его задача заключается в уменьшении разрешения карт признаков с помощью функции наибольшего или среднего значения. Это позволяет упростить задачу без потери основных признаков. Размер окна пулинга и его шаг выбирает исследователь, при этом шаг выбирается таким образом, чтобы не допустить перекрытия. Что бы избежать переобучения сети, можно исключать случайным образом часть нейронов в специальном слое – dropout. Часть исключаемых нейронов выбирается исследователем эмпирическим путем. При малом значении можно не достичь желаемого результата, а при слишком высоком сеть будет недообучаться. При обучении нейронной сети распределение входных данных каждого слоя изменяется в процессе обучения, что требует установки меньшей скорости обучения и тщательной инициализации входных параметров. Предложенный компанией Google в 2015 году метод пакетной нормализации (Batch normalization), позволяет решить эту проблему путем нормализации входных данных слоя [5]. На выходе сеть имеет полносвязные слои для классификации. Настраиваемыми параметрами здесь могут быть количество и размер этих слоев. На выходе должен быть слой, по размеру соответствующий количеству классов. В нем применяется функция активации softmax – обобщение логистической функции для многомерного случая. На основе выше описанного принципа действия сверточных сетей, была спроектирована нейронная сеть, представленная на рисунке 1.
Рисунок 1 - Схема спроектированной сверточной нейронной сети.
Сеть принимает на вход одноканальное черно-белое изображение разрешением 6464 пикселя. На выходе сети создается массив из пяти элементов в диапазоне от 0 до 1, каждый из которых соответствует вероятности того, что на изображении находится объект того или иного класса. Класс с наибольшей вероятностью считается ответом сети. В разрабатываемой системе нейронная сеть строится с помощью фреймворка Keras, процесс работы с которым подробно описан в статье [6]. Так как сеть имеет структуру прямого распределения, создается объект класса Sequental. Далее последовательно вызывается метод add, который добавляет в сеть новый слой. Таким образом добавляются слои Activation, BatchNormalization, Conv2D, MaxPooling2D, Dropout, Flatten, Dense в соответствии со структурой сети (рис. 1). Во входном слое дополнительно указывается параметр input_shape.
Подготовка набора данных. Было принять решение собирать данные с помощью детектора, интегрированного в систему автоматического подсчета интенсивности. Детектор работает на основе алгоритма выделения движения и метода Виолы-Джонса. Одним из недостатков этого детектора является детектирование практически любого движения в кадре, так при сборе данных были получены, помимо транспортных средств, движущиеся пешеходы и тени от автомобилей. Для решения этой проблемы принято решение обучить нейронную сеть различать пять классов объектов: легковой и грузовой автомобиль, автобус, пешеход и тень на дороге. Для сбора данных били взяты видео с камер наблюдения, установленных над участками улично-дорожной сети в г. Белгороде.
Обучение нейронной сети. Чтобы приступить к обучению необходимо разбить данные на обучающую и тестовую выборки. Это делается автоматически с помощью функции train_test_split из библиотеки sklearn. Так как метки представлены в виде строк, их нужно бинаризировать. Для этого создается объект класса LabelBinarizer. Для бинаризации тренировочных меток применяется метод fit_transform, а для тестовых – transform. ImageDataGenerator позволяет сгенерировать дополнительные данные за счет различных преобразований: сдвиг, поворот, масштабирование, отзеркаливание.
После создания модели, ее необходимо скомпилировать с помощью метода compile. Для компиляции сети необходимо указать такие параметры, как функция потерь, оптимизатор и параметры метрики. Для обучения применяется оптимизатор SGD – классический метод градиентного спуска [7]. В качестве функции потерь применяется категориальная перекрестная энтропия. Непосредственно обучение происходит в методе fit_generator. Метод возвращает историю обучения, которая сохраняется для последующего анализа. После обучения необходимо сохранить обученную модель с помощью метода save, и записать бинаризированные метки в файл для последующего использования сети. На основе полученной в ходе обучения истории был построен график (рис. 2). По оси абсцисс отложены итерации обучения, по оси ординат – четыре параметра: точность на учебной выборке, потери на учебной выборке, точность на тестовой выборке, потери на тестовой выборке. На последней итерации были достигнуты такие значениясоответственно: 0,9088; 0,2704; 0,9259; 0,2144.
Рисунок 2 - История обучения нейронной сети – точность и потери.
Применение и тест обученной сети. Распознавание происходит в методе predict, а возвращает массив вероятностей. Класс с наибольшей вероятностью считается предсказанием сети. В таблице 1 приведены результаты тестов сети на 42884 примерах.
Таблица 1- Результаты тестирования нейронной сети.
Класс |
Примеров классифицировано |
Точность, % |
|
положительных |
отрицательных |
||
Легковой автомобиль |
23162 |
8472 |
73,22 |
Автобус |
3446 |
437 |
88,75 |
Грузовой автомобиль |
2473 |
144 |
94,50 |
Люди |
3538 |
474 |
88,19 |
Тень |
718 |
20 |
97,29 |
Всего |
33337 |
9547 |
77,74 |
Вывод. Была разработана и обучена сверточная нейронная сеть для классификации ТС в транспортном потоке по трем классам: легковой автомобиль, грузовой автомобиль и автобус. Для устранения неточностей детектирования, нейронная сеть была обучена классифицировать пешеходов и тень от ТС на дороге. Итого нейронная сеть классифицирует объекты пяти классов. При обучении сети были получены высокие показатели точности – 92,59%. Однако при проверке на большем количестве данных итоговая точность составила 77,74%. Возможной причиной недостаточной точности может быть недостаточный размер обучающей выборки.
Библиографический список
1. Python: официальный сайт. [Электронный ресурс] – URL: https://www.python.org/ (дата обращения: 10.11.2019).
2. OpenCV: официальный сайт. [Электронный ресурс] – URL: https://opencv.org/ (дата обращения: 10.11.2019).
3. Keras: официальный сайт. [Электронный ресурс] – URL: https://keras.io/ (дата обращения: 21.12.2019).
4. Y. LeCun, B. Boser, J. S. Denker, D. Henderson, R. E. Howard, W. Hubbard and L. D. Jackel: Backpropagation Applied to Handwritten Zip Code Recognition, Neural Computation. Winter 1989. vol. 1. no. 4. P. 541-551.
5. S. Ioffe, C. SzegedyBatch Normalization: Accelerating Deep Network Training b y Reducing Internal Covariate Shift. – [Электронныйресурс] // proceedings IEEE Conf. on Computer Vision and Pattern Recognition. 2001. 9 p. URL: https://arxiv.org/pdf/1502.03167.pdf (date of the application 21.12.2019).
6. REG.RU: Как начать работу с Keras, DeepLearning и Python: сайт. – URL: https://www.reg.ru/blog/keras/ (дата обращения: 21.12.2019). – Текст: электронный.
7. Акулич И. Л. Математическое программирование в примерах и задачах. М.: Высшая школа, 1986. 310 с.