В новом хобби проекте мне потребовалось детектировать людей на видео. Это одна из основных задач, решаемых искусственным интеллектом, но я давно этим не занимался и несколько отстал от жизни.
Поэтому решил почитать про самые актуальные методы и пощупать их руками. Руками нужно щупать прежде всего потому, что мне нужно распознавать достаточно крупые объекты в простых, но реальных условиях и делать это быстро. То есть, ищется самый быстрый детектор, возможно, в ущерб точности (в разумных пределах).
Вот в этой статье описана достаточно полная картина, включая историческое развитие. Вкратце:
Олдскульные методы компьютерного зрения - Виола-Джонс (aka каскад Хаара)(2001) и Histogram of Oriented Gradients (2006)
Сверточные нейросети из которых начинают выделяться MobileSSD и YOLO (2014 - 2017)
Различные версия YOLO (с 2018)
По итогу, там утверждается, что самый быстрый детектор - это YOLOv4.
Что касается первых двух этапов, я нашел серию неплохих статей:
первая описывает олдскульные методы, подчеркивая их быстроту и нестабильность
вторая часть рассказывает о нейросетях на 2018 год, приходя к выводу, что самый быстрый MobileSSD
Попробуем сравнить YOLO vs MobileSSD работающие через OpenCV. Ну а раз OpenCV, добавим к тесту Виолу-Джонса и HOG, они все равно туда входят.
Итак, находим интересную картинку на стоке:
Окружение
Нам понадобятся:
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 - как видно нет).
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.
Старенький MobileSSD еще в 2 раза быстрее TinyYOLO. Это очень неожиданно. Может быть кто-нибудь из читателей сможет объяснить?
HOG медленнее MobileSSD и слегка быстрее TinyYOLO. Но точность удручает. Скорость метода можно варьировать путем изменения размера картинок, но даже такой результат получем на разрешении в два раза большем чем для YOLO.
Виола-Джонс. Быстро отработал, но ничего не нашел.
Заключение
Неожиданно, безоговорочным победителем вышел MobileSSD.
По скорости он значительно обошел обе версии YOLO, а по точности все три нейросети показали солидные результаты.
Олдскульные алгоритмы провалились за пределами теплицы, а по скорости не ушли далеко от MobileSSD.
Возможно, что-то не так было в методике тестирования, например Opencv-DNN - не лучший инструмент для запуска YOLO.
Очень надеюсь, что люди в теме прочитают это и дадут свой комментарий.