Выбираем быстрый детектор людей в 2021
- вторник, 28 декабря 2021 г. в 00:44:08
В новом хобби проекте мне потребовалось детектировать людей на видео. Это одна из основных задач, решаемых искусственным интеллектом, но я давно этим не занимался и несколько отстал от жизни.
Поэтому решил почитать про самые актуальные методы и пощупать их руками. Руками нужно щупать прежде всего потому, что мне нужно распознавать достаточно крупые объекты в простых, но реальных условиях и делать это быстро. То есть, ищется самый быстрый детектор, возможно, в ущерб точности (в разумных пределах).
Вот в этой статье описана достаточно полная картина, включая историческое развитие. Вкратце:
Олдскульные методы компьютерного зрения - Виола-Джонс (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. Но точность удручает. Скорость метода можно варьировать путем изменения размера картинок (в отличие от нейросетей, HOG не адаптирует под себя входные данные), но даже такой результат получем на разрешении в два раза большем чем для YOLO.
Виола-Джонс. Быстро отработал, но ничего не нашел.
Неожиданно, безоговорочным победителем вышел MobileSSD.
По скорости он значительно обошел обе версии YOLO, а по точности все три нейросети показали солидные результаты.
Олдскульные алгоритмы провалились за пределами теплицы, а по скорости не ушли далеко от MobileSSD.
Возможно, что-то не так было в методике тестирования, например Opencv-DNN - не лучший инструмент для запуска YOLO.
Очень надеюсь, что люди в теме прочитают это и дадут свой комментарий.