В новом хобби проекте мне потребовалось детектировать людей на видео. Это одна из основных задач, решаемых искусственным интеллектом, но я давно этим не занимался и несколько отстал от жизни.

Поэтому решил почитать про самые актуальные методы и пощупать их руками. Руками нужно щупать прежде всего потому, что мне нужно распознавать достаточно крупые объекты в простых, но реальных условиях и делать это быстро. То есть, ищется самый быстрый детектор, возможно, в ущерб точности (в разумных пределах).

Вот в этой статье описана достаточно полная картина, включая историческое развитие. Вкратце:

  • Олдскульные методы компьютерного зрения - Виола-Джонс (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

Окружение

Нам понадобятся:

  • 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
  1. 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
  1. Старенький MobileSSD еще в 2 раза быстрее TinyYOLO. Это очень неожиданно. Может быть кто-нибудь из читателей сможет объяснить?

MobileSSD v1
MobileSSD v1
  1. HOG медленнее MobileSSD и слегка быстрее TinyYOLO. Но точность удручает. Скорость метода можно варьировать путем изменения размера картинок, но даже такой результат получем на разрешении в два раза большем чем для YOLO.

  1. Виола-Джонс. Быстро отработал, но ничего не нашел.

Заключение

Неожиданно, безоговорочным победителем вышел MobileSSD.

По скорости он значительно обошел обе версии YOLO, а по точности все три нейросети показали солидные результаты.

Олдскульные алгоритмы провалились за пределами теплицы, а по скорости не ушли далеко от MobileSSD.

Возможно, что-то не так было в методике тестирования, например Opencv-DNN - не лучший инструмент для запуска YOLO.

Очень надеюсь, что люди в теме прочитают это и дадут свой комментарий.

Ссылки

Комментарии (21)


  1. cepera_ang
    27.12.2021 18:35
    +1

    Взяли что под руку попало, получили случайные результаты, ух ты, сюрприз.


    Мобайлнет под процессоры больше заточен, поэтому на процессоре быстрее и отработал (на более новых процессорах со всякими AVX-VNNI картинка может и измениться, а может и нет). Ещё может по-разному препроцесситься картинка — уменьшаться до входа в сеть или нет. В принципе таких людей детектировать достаточно будет что-то вроде 500*500. Что там с квантизацией этих моделей? Видно что и YOLO и SSD нашли людей на трибунах, правда в виде гигантского бокса (возможно при тренировке был класс типа "группа людей, слишком близко для отдельных боксов"). Хоги, виолы-джонсы — всё в топку.


    1. Stantin Автор
      27.12.2021 19:02

      >> Мобайлнет под процессоры больше заточен

      Запускаются такие хобби-проекты на дешевых облаках, где Tesla 100 для Yolo явно не вариант.


      1. cepera_ang
        27.12.2021 19:09

        Ну вы же получили устраивающую вас производительность и качество, разбираться почему оно так, а не иначе — это отдельная и бездонная кроличья нора.


        1. Stantin Автор
          27.12.2021 20:53

          Yolo настолько доминирует в информационном пространстве, что такой провал в сравнении с древней реализацией стал для меня большим сюрпризом.


      1. cepera_ang
        27.12.2021 19:31
        +1

        Попробуйте ещё модельки из 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 кадров в секунду. Так что ваши ожидания от "дешевых облачных процессоров" могут быть на порядок-другой скакать, в зависимости от того, какой-же это конкретный облачный процессор.


        1. Stantin Автор
          27.12.2021 20:43

          О, спасибо, openvino как хорошо развился, несколько лет назад там было три модели.

          Я честно говоря думал,что оно так и останется, как часто бывает у Интела.


      1. leshabirukov
        28.12.2021 15:17

        Запускаются такие хобби-проекты на дешевых облаках, где Tesla 100 для Yolo явно не вариант.

        В Colab или Kaggle можно оценку для GPU сделать, по крайней мере, грубо сравнить с того же сервера CPU.


        1. Stantin Автор
          28.12.2021 16:30

          Оценка это хорошо, но мы же про тестирование на реальном окружении


  1. dobrobelko
    27.12.2021 20:10

    Детекторы в OpenCV мягко говоря не самые быстрые. YOLOv4 модель тренированная в darknet и экспортированная в tkDNN работает со скоростью 170-200 fps на 2080TI в режиме FP16, с INT8 должно быть еще быстрее.


    1. Stantin Автор
      27.12.2021 20:46

      Вы имеете в виду, что сама реализация DNN не быстрая?

      Использованная yolo модель взята с их сайта без изменений и тренирована скорее всего по всем правилам даркнета (хотя свечку я понятно не держал).


      1. dobrobelko
        28.12.2021 06:50

        Да. Только если недавно не появилась возможность запускать сам даркнет в OpenCV, а не просто использовать конфиги и сериализованную модель, подтверждения этому я не нашел.

        Пока самый быстрый вариант инференса на котором остановился сам, как уже упомянул выше - кастомная darknet YOLOv4 модель экспортированная в tkDNN к которому пришлось дописать простой Python API.


  1. ZlodeiBaal
    28.12.2021 00:24

    Для ваших целей вы не те модели смотрели/сравнивали. В целом вот вам список более быстрых кандидатов без глубокого погружения:
    1) yolov5 достаточно отлажен и неплох уже. И там много быстрых моделей. Когда нужна скорость — там больше вариантов чем у v4. И поддержка неплохая/баги фиксят.
    2) Yolox достаточно шустрый
    3) Можно использовать указанные у вас yolov4, но дать им сильно меньшее разрешение на вход. Учитывая что это сильно более мощные модели, а ускорение будет пропорционально площади — может и вытянет до нужных вам скоростей.
    4) Есть несколько платформ где можно у сеток достаточно удобно менять бэкбоны. И потестить тот же SSD/его ближайшие аналоги с более эффективными под вашу платформу бекбонами. Собственно detectron2, mmdetection, PaddleDetection
    По бекбонам — Efficientnet, BlazeNet, младшие реснеты.

    Но если честно, то думаю, чтобы вам не запариваться проще всего 1/2 пункты проверить.


    1. Stantin Автор
      28.12.2021 06:50

      1. Какая то у yolo5 мутная репутация, не понятно чему верить.

      2. На вход yolo4 подаю 400x400 (также ssd). Можно подать меньше, но вряд-ли разрыв изменится.

      3. Спасибо, почитаю про остальные


      1. ZlodeiBaal
        28.12.2021 10:23

        1) Они два года назад выпустили сырое нечто. Сейчас большая часть багов пофикшена, я бы сказал.
        2) Можно подавать на yolo 200-200, он будет в 4 раза быстрее, а по качеству просядет не так плохо и все равно может быть лучше SSD.


  1. count_enable
    28.12.2021 10:40
    +2

    Очень странно судить о качестве детектора по одной (1 шт.) картинке. Почему не взяли какую-то более значимую выборку?

    В реальных применениях все универсальные детекторы показывают посредственные результаты. Нужно чётко определиться в каких условиях детектор будет работать: размер объектов, движение и скорость, высота установки камеры, угол, под какими будут видны целевые объекты. Например если нам нужно распознавание людей в магазине (3-10 м), то модель, обученная на ванильном СОСО с кучей изображений людей высотой в 10-20 пикселей будет работать плохо. Надо или дообучать модель, или хотя бы подстроить желаемый mAP.


    1. Stantin Автор
      28.12.2021 15:39

      Я тестировался на нескольких картинках, разница была примерно такая же. Эту выбрал для иллюстрации.

      В реальных применениях все универсальные детекторы показывают посредственные результаты

      И YOLO и SSD показали достаточнные для меня результаты и весь вопрос был в скорости.


  1. Nagdiel
    28.12.2021 12:01

    Спасибо за статью! Она дает некоторое представление о качестве и скорости работы детекторов. Однако же, не вполне корректно сравнивать число выданных результатов детектирования. Среди них надо различать правильные и ложные срабатывания. Наличие большого числа ложных срабатываний может быть критично для многих приложений.

    Что касается скорости работы YOLOv4, то результаты меня откровенно удивили. Приходилось экспериментировать довольно давно вот с этой реализацией YOLOv3 для детектирования автомобилей. Без каких-либо больших усилий удавалось получить скорость работы в 5-10 кадров/сек при неплохом качестве детектирования. Возможно, используемая Вами реализация из OpenCV нуждается в дополнительной настройке.


    1. Stantin Автор
      28.12.2021 15:46

      Интересно, Yolo3 считается медленнее чем Yolo4, возможно вы тестировались на хорошем железе?

      Имеет значение не само FPS (которое понятно зависит от окружения) а относительная скорость разных детекторов.

      Качество детектирования крупных объектов у всех рассмотренных сетей на достаточном уровне.


      1. Nagdiel
        28.12.2021 17:39

        возможно вы тестировались на хорошем железе?

        Если правильно помню, на GTX1060 6Gb.

        Интересно, Yolo3 считается медленнее чем Yolo4


        Результаты для меня тем более удивительные, что YOLOv3 по скорости примерно сопоставима с SSD. Разница же в 20 раз в сторону ухудшения, полученная для YOLOv4 в Вашем эксперименте, заставляет думать, что возможно в реализации из OpenCV есть какие-то нюансы. Например, здесь обсуждают, что в определенных кейсах может быть просадка производительности как раз примерно в те же 20 раз при выборе арифметики FP16.


        1. Stantin Автор
          28.12.2021 18:26

          Аа, все таки у вас был GPU, я то тестировался именно на CPU, наверное стоило это подчеркнуть в статье более явно, потому что таргет по железу - недорогие облака, у них обычно нет GPU.


          1. Nagdiel
            28.12.2021 18:49

            Ну тогда понятно, SSD с MobileNet backbone действительно должен быть быстрее на CPU. В этом ключе Ваши результаты согласуются с данными из этой публикации.