Введение в конвейер компьютерного зрения
Мы будем создавать конвейер обнаружения и классификации транспортных средств с использованием методов машинного обучения. Мы будем определять количество автомобилей в кадре и классифицировать их на два класса: внедорожник и седан, и все это в режиме реального времени. В этой статье есть несколько предварительных требований, таких как основы машинного обучения, глубокого обучения, сверточных сетей и трансферного обучения. Чтобы спроектировать и реализовать конвейер компьютерного зрения, мы разделили конвейер на следующие подзадачи:
- Чтение видео: для этой задачи мы использовали OpenCV, чтобы читать видео кадр за кадром, а затем, наконец, отображать исходное видео для пользователя и затем передавать очередь кадров для следующей задачи.
- Обнаружение объектов. Используется предварительно обученная современная модель обнаружения объектов TinyYOLO, которая обучена на наборе данных COCO. Роль TinyYOLO - обнаруживать автомобили в кадрах, которые являются одним из классов, присутствующих в наборе данных COCO.
- Классификатор типов автомобилей: как только мы получим автомобили с их ограниченным прямоугольником для каждого кадра, нам нужно классифицировать их как внедорожники или седаны. Для этого мы использовали классификатор MobileNetV2 и применили концепции трансферного обучения, чтобы изменить модель в соответствии с нашим вариантом использования.
Проектирование трубопроводов, конфигурации моделей и работа
- Для чтения видео мы использовали OpenCV, который считывает видео кадр за кадром со скоростью 30 кадров в секунду.
- Подготовка набора данных: набор данных включает изображения двух классов SUV и Sedan, включая 1540 изображений Sedan и 1519 изображений SUV. Изображения были собраны с помощью веб-скрапинга изображений Google и набора данных Stanford Car Dataset [1], который содержит изображения различных типов автомобилей, включая внедорожники и седаны. Все изображения, собранные с помощью веб-скрейпинга и набора данных Стэнфордского университета, были проверены вручную один раз, чтобы удалить все изображения, которые были нерелевантными или весьма сомнительными. Этот шаг - часть подготовки данных.
- Для Обнаружения объектов мы предпочли TinyYOLO, а не YOLO, поскольку он легче и быстрее по сравнению с более поздними версиями. TinyYOLO может обрабатывать 220 кадров в секунду, тогда как YOLO обрабатывает 20–40 кадров в секунду. Из-за необходимости обнаружения в реальном времени лучше использовать TinyYOLO.
- После того, как все кадры прочитаны с использованием OpenCV, мы передаем очередь кадров в функцию обнаружения, которая использует функцию YOLO's detect_image для обнаружения классов в любом заданном кадре.
- После того, как мы получим все обнаруженные классы и их положение с помощью YOLO, мы будем рассматривать только те обнаруженные объекты, чей класс - автомобиль.
- Наконец, обнаруженный автомобиль с его положением в любом конкретном кадре передается в функцию, которая классифицирует изображение любого автомобиля на внедорожнике или седане. Эта функция в основном использует модель, обученную на тысячах изображений SUV и Sean с использованием модели MobileNet, которую можно найти в MobileNet_TransferLearning.py.
Модель MobileNet и трансферное обучение
- Базовая структура моделей MobileNet выглядит так, как показано на следующем рисунке, который используется повторно с использованием концепции трансферного обучения.
- Модель MobileNet используется в качестве отправной точки, где мы отбросили последний слой и добавили наши собственные слои, как показано на рисунке 2, с двумя дополнительными скрытыми слоями с 512 нейронами, одним скрытым слоем с 256 нейронами и, наконец, одним выходным слоем с одним узлом. поскольку это задача двоичной классификации.
Гиперпараметры и настройка модели
- Выпадение: использовался метод выпадения метода регуляризации на новых слоях с вероятностью 0,2, что помогло уменьшить переоснащение модели, которую можно изучить, за счет меньшего разрыва между точностью и ошибками обучения и проверки.
- Увеличение данных. Пытался использовать увеличение данных, которое выполняет другую операцию, например масштабирование, сдвиг и т. д., но не дало удовлетворительных результатов, поэтому эту операцию отказались.
- Эпох: количество эпох, установленных для этой модели, было 20, поскольку большее количество эпох не давало удовлетворительных результатов на основании достоверности данных, а скорость повышения точности также была низкой, возможно, они были переоборудованы.
- Регуляризация L1 / L2. Попытка поэкспериментировать с регуляризацией веса L1 и L2, но дала худшие результаты с очень высокими ошибками проверки и низкой точностью.
- Компиляция модели. Используемая функция потерь представляет собой двоичную кросс-энтропию с точностью в качестве показателя прогресса. Наконец, веса модели сохраняются под собственным именем в папке saved_models.
- Алгоритмы оптимизации градиентного спуска: экспериментировал с двумя алгоритмами оптимизации: RMSProp и Adam optimizer. Для нашего случая использования Адам давал удовлетворительные результаты, поэтому использовал это. Используемая скорость обучения составляла 0,0001, поскольку более низкая скорость обучения приводила к более медленному обучению с требованием более высоких эпох.
Точность и кросс-энтропия в зависимости от количества эпох
Изменение точности и кросс-энтропии в зависимости от времени / эпохи для оптимизации Adam и RMSProp показано на рисунке 4 ниже. Кроме того, мы предпочли Адама RMSProp из-за менее переоборудованной модели, поскольку разница между точностью обучения и точностью проверки меньше по сравнению с RMSProp. Как и ожидалось, эта модель показала лучшие результаты с лучшими показателями F1 по количеству седанов и внедорожников, что также доказало, что в целом это лучшая модель.
Конечная точность для моделей глубокого обучения
- Оптимизатор Adam (lr = 0,0001): потеря обучения = 0,0772, потеря проверки = 0,8120, точность обучения = 0,9733 и точность проверки = 0,7605.
- Оптимизатор RMSProp (lr = 0,0001): потеря обучения = 0,0887, потеря проверки = 1,8487, точность обучения = 0,9721 и точность проверки = 0,5905.
Оптимизация конвейера
- Производитель-Потребитель попытался использовать шаблон проектирования производитель-потребитель, но не дал значительной разницы во времени, поскольку производитель в нашем случае считыватель кадрового видео работает намного быстрее по сравнению с потребителем (детектор объектов и классификатор), поэтому он не может синхронизироваться и поэтому не используется в этом проекте.
- Проведены эксперименты с параметрами Non-Maximal Suppression (NMS) и Intersection over Union Threshold (IOU) модели YOLO для получения лучших результатов. Этот параметр изменяет порог выделения объектов и убирает все квадраты с малой вероятностью и вероятностью пересечения. Для нашего случая использования с TinyYOLO, оценка NMS 0,2 и долговая расписка 0,2 давали лучшие результаты, что, в конечном итоге, улучшило оценку F1 на основании достоверности.
- Сначала мы попытались обнаружить автомобили с помощью каскадов хаара, но это не дало удовлетворительных результатов, поэтому мы использовали YOLO для обнаружения объектов, производительность которого была намного лучше по сравнению с первым методом. Реализацию первого метода можно найти в Car_Detection_Using_Harr_Cascade.py.
Конвейерный вывод
Вход конвейера - это любое заданное видео, которое отображается пользователю, а выход - видео с обнаруженными автомобилями и их типом (внедорожник / седан), как показано ниже на рисунке 5. Выходные данные системы также представляют собой лист Excel со столбцами «Кадры», «Седан». , SUV, Total Cars, которые затем сравниваются с наземной истиной для расчета F1 Score количества автомобилей на кадр, F1 Score седанов и F1 баллов внедорожников, которые показаны на рисунке 6.
Время выполнения
Наша система медленно обрабатывала 900 кадров за 450 секунд. Время, затраченное на процесс обнаружения объекта с помощью YOLO, и время классификации объекта с помощью модели ML (где количество автомобилей для обнаружения является решающим фактором) по сравнению с кадром показано ниже.
Сильные и слабые стороны дизайна
- Несмотря на то, что это конвейер компьютерного зрения, реализация кода была закодирована по стандартам объектно-ориентированного программирования с отдельными классами для чтения видео, обнаружения объектов, классификации автомобилей и т. Д., Что способствует многоразовому программированию и поможет расширить его. проект.
- Даже при многопоточности и пуле потоков время обработки видео является значительным, что можно уменьшить, запустив это приложение в высокопроизводительной системе с графическими процессорами с поддержкой CUDA.
- Несмотря на то, что набор данных, собранный с помощью веб-скрейпинга и набора данных Стэнфорда, проверяется вручную, существует ряд изображений, которые снижают качество набора данных и, таким образом, снижают общую производительность системы. но в то же время не могут быть удалены из набора данных, поскольку их количество является значительным.
- Создан отдельный файл dependency.yml, чтобы любому новому пользователю было проще настроить этот проект, поскольку возникает ряд проблем из-за проблем с зависимостями и конфликтов версий.
Настройка проекта
Код можно скачать по ссылке на Github.
В том же репозитории Car_Results.xls находится выходной файл excel, который содержит количество автомобилей, седанов, внедорожников, обнаруженных и классифицированных в каждом кадре с помощью Output.avi в качестве выходного видео.
Шаги настройки:
Ссылки
- Https://ai.stanford.edu/~jkrause/cars/car_dataset.html
- Https://machinethink.net/blog/mobilenet-v2/
- Https://keras.io/api/applications/mobilenet/
- Https://www.researchgate.net/publication/337339754_VidCEP_Complex_Event_Processing_Framework_to_Detect_Spatiotemporal_Patterns_in_Video_Streams
- Https://medium.com/analytics-vidhya/you-only-look-once-yolo-implementing-yolo-in-less-than-30-lines-of-python-code-97fb9835bfd2#:~:text= YOLO% 20uses% 20Non% 2DMaximal% 20Suppression, это% 20NMS% 20th threshold% 20to% 200.6 .
- Https://tutorialedge.net/python/concurrency/python-threadpoolexecutor-tutorial/
- Https://machinelearningmaster.com/how-to-calculate-precision-recall-f1-and-more-for-deep-learning-models/
- Https://towardsdatascience.com/transfer-learning-using-mobilenet-and-keras-c75daf7ff299
- Https://www.kaggle.com/vasantvohra1/transfer-learning-using-mobilenet
- Https://keras.io/api/layers/regularizers/
- Https://machinelearningmaster.com/how-to-reduce-overfitting-in-deep-learning-with-weight-regularization/
- Https://medium.com/analytics-vidhya/you-only-look-once-yolo-implementing-yolo-in-less-than-30-lines-of-python-code-97fb9835bfd2#:~:text= YOLO% 20uses% 20Non% 2DMaximal% 20Suppression, это% 20NMS% 20th threshold% 20to% 200.6 .
- Https://github.com/qqwweee/keras-yolo3
- Https://pjreddie.com/darknet/yolo/
- Https://keras.io/api/applications/mobilenet/
- Https://medium.com/@amarbudhiraja/https-medium-com-amarbudhiraja-learning-less-to-learn-better-dropout-in-deep-machine-learning-74334da4bfc5
- Https://github.com/prakhargurawa/Facial-Emotion-Detection-Neural-Net-OpenCV/blob/main/facial_emotion_detection.py
- Https://ruder.io/optimizing-gradient-descent/