В новом хобби проекте мне потребовалось детектировать людей на видео. Это одна из основных задач, решаемых искусственным интеллектом, но я давно этим не занимался и несколько отстал от жизни.
Поэтому решил почитать про самые актуальные методы и пощупать их руками. Руками нужно щупать прежде всего потому, что мне нужно распознавать достаточно крупые объекты в простых, но реальных условиях и делать это быстро. То есть, ищется самый быстрый детектор, возможно, в ущерб точности (в разумных пределах).
Вот в этой статье описана достаточно полная картина, включая историческое развитие. Вкратце:
Олдскульные методы компьютерного зрения - Виола-Джонс (aka каскад Хаара)(2001) и Histogram of Oriented Gradients (2006)
Сверточные нейросети из которых начинают выделяться MobileSSD и YOLO (2014 - 2017)
Различные версия YOLO (с 2018)
По итогу, там утверждается, что самый быстрый детектор - это YOLOv4.
Что касается первых двух этапов, я нашел серию неплохих статей:
первая описывает олдскульные методы, подчеркивая их быстроту и нестабильность
вторая часть рассказывает о нейросетях на 2018 год, приходя к выводу, что самый быстрый MobileSSD
Попробуем сравнить YOLO vs MobileSSD работающие через OpenCV. Ну а раз OpenCV, добавим к тесту Виолу-Джонса и HOG, они все равно туда входят.
Итак, находим интересную картинку на стоке:
![https://unsplash.com/photos/PhhtSyCeN0I https://unsplash.com/photos/PhhtSyCeN0I](https://habrastorage.org/getpro/habr/upload_files/c47/873/c35/c47873c3566a0fb829ead4cc199c5167.jpg)
Окружение
Нам понадобятся:
Python3 64bit
opencv_python
MobileSSD (последняя версия, которая у меня работает с OpenCV - это ssd_mobilenet_v1_coco_2017_11_17)
YOLOv4 (нормальная и tiny версии)
Тест
Запускаем бенчмарк (на моем лаптопе, который примерно соответсвует стандартному облачному юниту) и получаем несколько неожиданные результаты:
yolo found 12 persons in 1.97 seconds avg
tiny_yolo found 8 persons in 0.22 seconds avg
ssd found 14 persons in 0.1 seconds avg
hog found 2 persons in 0.18 seconds avg
haar found 0 persons in 0.07 seconds avg
YOLO обнаружило много людей, но сделало это очень медленно - на картинку ушло 2 секунды (официальные бенчмарки говорят про 100 FPS на самом мощном GPU, но на дохленьком CPU - как видно нет).
![YOLO YOLO](https://habrastorage.org/getpro/habr/upload_files/38c/813/fe3/38c813fe3f45c983aca9c0867dc45769.jpg)
TinyYOLO - на 30% меньше детекций, но почти в 10 раз быстрее.
Это согласуется с данным других источников:
The FPS (Frames Per Second) in YOLOv4-tiny is approximately eight times that of YOLOv4. However, the accuracy for YOLOv4-tiny is 2/3rds that of YOLOv4 when tested on the MS COCO dataset.
![TinyYOLO TinyYOLO](https://habrastorage.org/getpro/habr/upload_files/407/eda/0bb/407eda0bba85899a9a1473b93352231e.jpg)
Старенький MobileSSD еще в 2 раза быстрее TinyYOLO. Это очень неожиданно. Может быть кто-нибудь из читателей сможет объяснить?
![MobileSSD v1 MobileSSD v1](https://habrastorage.org/getpro/habr/upload_files/28f/d0c/6d9/28fd0c6d9f5ce1ab83b10eae3421d71c.jpg)
HOG медленнее MobileSSD и слегка быстрее TinyYOLO. Но точность удручает. Скорость метода можно варьировать путем изменения размера картинок, но даже такой результат получем на разрешении в два раза большем чем для YOLO.
![](https://habrastorage.org/getpro/habr/upload_files/43c/186/28a/43c18628af100456dfbd5f8f9d710883.jpg)
Виола-Джонс. Быстро отработал, но ничего не нашел.
Заключение
Неожиданно, безоговорочным победителем вышел MobileSSD.
По скорости он значительно обошел обе версии YOLO, а по точности все три нейросети показали солидные результаты.
Олдскульные алгоритмы провалились за пределами теплицы, а по скорости не ушли далеко от MobileSSD.
Возможно, что-то не так было в методике тестирования, например Opencv-DNN - не лучший инструмент для запуска YOLO.
Очень надеюсь, что люди в теме прочитают это и дадут свой комментарий.