В новом хобби проекте мне потребовалось детектировать людей на видео. Это одна из основных задач, решаемых искусственным интеллектом, но я давно этим не занимался и несколько отстал от жизни.
Поэтому решил почитать про самые актуальные методы и пощупать их руками. Руками нужно щупать прежде всего потому, что мне нужно распознавать достаточно крупые объекты в простых, но реальных условиях и делать это быстро. То есть, ищется самый быстрый детектор, возможно, в ущерб точности (в разумных пределах).
Вот в этой статье описана достаточно полная картина, включая историческое развитие. Вкратце:
Олдскульные методы компьютерного зрения - Виола-Джонс (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.
Очень надеюсь, что люди в теме прочитают это и дадут свой комментарий.
Ссылки
Комментарии (21)
dobrobelko
27.12.2021 20:10Детекторы в OpenCV мягко говоря не самые быстрые. YOLOv4 модель тренированная в darknet и экспортированная в tkDNN работает со скоростью 170-200 fps на 2080TI в режиме FP16, с INT8 должно быть еще быстрее.
Stantin Автор
27.12.2021 20:46Вы имеете в виду, что сама реализация DNN не быстрая?
Использованная yolo модель взята с их сайта без изменений и тренирована скорее всего по всем правилам даркнета (хотя свечку я понятно не держал).
dobrobelko
28.12.2021 06:50Да. Только если недавно не появилась возможность запускать сам даркнет в OpenCV, а не просто использовать конфиги и сериализованную модель, подтверждения этому я не нашел.
Пока самый быстрый вариант инференса на котором остановился сам, как уже упомянул выше - кастомная darknet YOLOv4 модель экспортированная в tkDNN к которому пришлось дописать простой Python API.
ZlodeiBaal
28.12.2021 00:24Для ваших целей вы не те модели смотрели/сравнивали. В целом вот вам список более быстрых кандидатов без глубокого погружения:
1) yolov5 достаточно отлажен и неплох уже. И там много быстрых моделей. Когда нужна скорость — там больше вариантов чем у v4. И поддержка неплохая/баги фиксят.
2) Yolox достаточно шустрый
3) Можно использовать указанные у вас yolov4, но дать им сильно меньшее разрешение на вход. Учитывая что это сильно более мощные модели, а ускорение будет пропорционально площади — может и вытянет до нужных вам скоростей.
4) Есть несколько платформ где можно у сеток достаточно удобно менять бэкбоны. И потестить тот же SSD/его ближайшие аналоги с более эффективными под вашу платформу бекбонами. Собственно detectron2, mmdetection, PaddleDetection
По бекбонам — Efficientnet, BlazeNet, младшие реснеты.
Но если честно, то думаю, чтобы вам не запариваться проще всего 1/2 пункты проверить.Stantin Автор
28.12.2021 06:50Какая то у yolo5 мутная репутация, не понятно чему верить.
На вход yolo4 подаю 400x400 (также ssd). Можно подать меньше, но вряд-ли разрыв изменится.
Спасибо, почитаю про остальные
ZlodeiBaal
28.12.2021 10:231) Они два года назад выпустили сырое нечто. Сейчас большая часть багов пофикшена, я бы сказал.
2) Можно подавать на yolo 200-200, он будет в 4 раза быстрее, а по качеству просядет не так плохо и все равно может быть лучше SSD.
count_enable
28.12.2021 10:40+2Очень странно судить о качестве детектора по одной (1 шт.) картинке. Почему не взяли какую-то более значимую выборку?
В реальных применениях все универсальные детекторы показывают посредственные результаты. Нужно чётко определиться в каких условиях детектор будет работать: размер объектов, движение и скорость, высота установки камеры, угол, под какими будут видны целевые объекты. Например если нам нужно распознавание людей в магазине (3-10 м), то модель, обученная на ванильном СОСО с кучей изображений людей высотой в 10-20 пикселей будет работать плохо. Надо или дообучать модель, или хотя бы подстроить желаемый mAP.
Stantin Автор
28.12.2021 15:39Я тестировался на нескольких картинках, разница была примерно такая же. Эту выбрал для иллюстрации.
В реальных применениях все универсальные детекторы показывают посредственные результаты
И YOLO и SSD показали достаточнные для меня результаты и весь вопрос был в скорости.
Nagdiel
28.12.2021 12:01Спасибо за статью! Она дает некоторое представление о качестве и скорости работы детекторов. Однако же, не вполне корректно сравнивать число выданных результатов детектирования. Среди них надо различать правильные и ложные срабатывания. Наличие большого числа ложных срабатываний может быть критично для многих приложений.
Что касается скорости работы YOLOv4, то результаты меня откровенно удивили. Приходилось экспериментировать довольно давно вот с этой реализацией YOLOv3 для детектирования автомобилей. Без каких-либо больших усилий удавалось получить скорость работы в 5-10 кадров/сек при неплохом качестве детектирования. Возможно, используемая Вами реализация из OpenCV нуждается в дополнительной настройке.Stantin Автор
28.12.2021 15:46Интересно, Yolo3 считается медленнее чем Yolo4, возможно вы тестировались на хорошем железе?
Имеет значение не само FPS (которое понятно зависит от окружения) а относительная скорость разных детекторов.
Качество детектирования крупных объектов у всех рассмотренных сетей на достаточном уровне.
Nagdiel
28.12.2021 17:39возможно вы тестировались на хорошем железе?
Если правильно помню, на GTX1060 6Gb.Интересно, Yolo3 считается медленнее чем Yolo4
Результаты для меня тем более удивительные, что YOLOv3 по скорости примерно сопоставима с SSD. Разница же в 20 раз в сторону ухудшения, полученная для YOLOv4 в Вашем эксперименте, заставляет думать, что возможно в реализации из OpenCV есть какие-то нюансы. Например, здесь обсуждают, что в определенных кейсах может быть просадка производительности как раз примерно в те же 20 раз при выборе арифметики FP16.Stantin Автор
28.12.2021 18:26Аа, все таки у вас был GPU, я то тестировался именно на CPU, наверное стоило это подчеркнуть в статье более явно, потому что таргет по железу - недорогие облака, у них обычно нет GPU.
Nagdiel
28.12.2021 18:49Ну тогда понятно, SSD с MobileNet backbone действительно должен быть быстрее на CPU. В этом ключе Ваши результаты согласуются с данными из этой публикации.
cepera_ang
Взяли что под руку попало, получили случайные результаты, ух ты, сюрприз.Мобайлнет под процессоры больше заточен, поэтому на процессоре быстрее и отработал (на более новых процессорах со всякими AVX-VNNI картинка может и измениться, а может и нет). Ещё может по-разному препроцесситься картинка — уменьшаться до входа в сеть или нет. В принципе таких людей детектировать достаточно будет что-то вроде 500*500. Что там с квантизацией этих моделей? Видно что и YOLO и SSD нашли людей на трибунах, правда в виде гигантского бокса (возможно при тренировке был класс типа "группа людей, слишком близко для отдельных боксов"). Хоги, виолы-джонсы — всё в топку.
Stantin Автор
>> Мобайлнет под процессоры больше заточен
Запускаются такие хобби-проекты на дешевых облаках, где Tesla 100 для Yolo явно не вариант.
cepera_ang
Ну вы же получили устраивающую вас производительность и качество, разбираться почему оно так, а не иначе — это отдельная и бездонная кроличья нора.
Stantin Автор
Yolo настолько доминирует в информационном пространстве, что такой провал в сравнении с древней реализацией стал для меня большим сюрпризом.
cepera_ang
Попробуйте ещё модельки из OpenVino — сильно заточенные под процессоры, от самого интела и детекция людей там есть отдельной моделью https://github.com/openvinotoolkit/open_model_zoo/blob/master/models/intel/index.md
А вот тут https://docs.openvino.ai/latest/openvino_docs_performance_benchmarks_openvino.html#yolo-v4-tf-608x608 можете посмотреть какие результаты с какими сетями на каких процессорах разумно ожидать. Не знаю какой у вас ноутбук, но Yolo4 за две секунды в опенвино только на атоме выполняется :) А на хороших процессорах (типа i9-10920x) вообще 40 кадров может дать (правда в int8). Впрочем, мобайлнет-ссд на этом же процессоре показывает 2100 кадров в секунду. Так что ваши ожидания от "дешевых облачных процессоров" могут быть на порядок-другой скакать, в зависимости от того, какой-же это конкретный облачный процессор.
Stantin Автор
О, спасибо, openvino как хорошо развился, несколько лет назад там было три модели.
Я честно говоря думал,что оно так и останется, как часто бывает у Интела.
leshabirukov
В Colab или Kaggle можно оценку для GPU сделать, по крайней мере, грубо сравнить с того же сервера CPU.
Stantin Автор
Оценка это хорошо, но мы же про тестирование на реальном окружении