Введение в конвейер компьютерного зрения

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

  1. Чтение видео: для этой задачи мы использовали OpenCV, чтобы читать видео кадр за кадром, а затем, наконец, отображать исходное видео для пользователя и затем передавать очередь кадров для следующей задачи.
  2. Обнаружение объектов. Используется предварительно обученная современная модель обнаружения объектов TinyYOLO, которая обучена на наборе данных COCO. Роль TinyYOLO - обнаруживать автомобили в кадрах, которые являются одним из классов, присутствующих в наборе данных COCO.
  3. Классификатор типов автомобилей: как только мы получим автомобили с их ограниченным прямоугольником для каждого кадра, нам нужно классифицировать их как внедорожники или седаны. Для этого мы использовали классификатор 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 нейронами и, наконец, одним выходным слоем с одним узлом. поскольку это задача двоичной классификации.

Гиперпараметры и настройка модели

  1. Выпадение: использовался метод выпадения метода регуляризации на новых слоях с вероятностью 0,2, что помогло уменьшить переоснащение модели, которую можно изучить, за счет меньшего разрыва между точностью и ошибками обучения и проверки.
  2. Увеличение данных. Пытался использовать увеличение данных, которое выполняет другую операцию, например масштабирование, сдвиг и т. д., но не дало удовлетворительных результатов, поэтому эту операцию отказались.
  3. Эпох: количество эпох, установленных для этой модели, было 20, поскольку большее количество эпох не давало удовлетворительных результатов на основании достоверности данных, а скорость повышения точности также была низкой, возможно, они были переоборудованы.
  4. Регуляризация L1 / L2. Попытка поэкспериментировать с регуляризацией веса L1 и L2, но дала худшие результаты с очень высокими ошибками проверки и низкой точностью.
  5. Компиляция модели. Используемая функция потерь представляет собой двоичную кросс-энтропию с точностью в качестве показателя прогресса. Наконец, веса модели сохраняются под собственным именем в папке saved_models.
  6. Алгоритмы оптимизации градиентного спуска: экспериментировал с двумя алгоритмами оптимизации: 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 в качестве выходного видео.

Шаги настройки:

Ссылки

  1. Https://ai.stanford.edu/~jkrause/cars/car_dataset.html
  2. Https://machinethink.net/blog/mobilenet-v2/
  3. Https://keras.io/api/applications/mobilenet/
  4. Https://www.researchgate.net/publication/337339754_VidCEP_Complex_Event_Processing_Framework_to_Detect_Spatiotemporal_Patterns_in_Video_Streams
  5. 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 .
  6. Https://tutorialedge.net/python/concurrency/python-threadpoolexecutor-tutorial/
  7. Https://machinelearningmaster.com/how-to-calculate-precision-recall-f1-and-more-for-deep-learning-models/
  8. Https://towardsdatascience.com/transfer-learning-using-mobilenet-and-keras-c75daf7ff299
  9. Https://www.kaggle.com/vasantvohra1/transfer-learning-using-mobilenet
  10. Https://keras.io/api/layers/regularizers/
  11. Https://machinelearningmaster.com/how-to-reduce-overfitting-in-deep-learning-with-weight-regularization/
  12. 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 .
  13. Https://github.com/qqwweee/keras-yolo3
  14. Https://pjreddie.com/darknet/yolo/
  15. Https://keras.io/api/applications/mobilenet/
  16. Https://medium.com/@amarbudhiraja/https-medium-com-amarbudhiraja-learning-less-to-learn-better-dropout-in-deep-machine-learning-74334da4bfc5
  17. Https://github.com/prakhargurawa/Facial-Emotion-Detection-Neural-Net-OpenCV/blob/main/facial_emotion_detection.py
  18. Https://ruder.io/optimizing-gradient-descent/