YOLOv4 – самая точная real-time нейронная сеть на датасете Microsoft COCO

    Darknet YOLOv4 быстрее и точнее, чем real-time нейронные сети Google TensorFlow EfficientDet и FaceBook Pytorch/Detectron RetinaNet/MaskRCNN.

    Эта же статья на medium: medium
    Код: github.com/AlexeyAB/darknet
    Статья: arxiv.org/abs/2004.10934


    Мы покажем некоторые нюансы сравнения и использования нейронных сетей для обнаружения объектов.

    Нашей целью было разработать алгоритм обнаружения объектов для использования в реальных продуктах, а не только двигать науку вперед. Точность нейросети YOLOv4 (608x608) – 43.5% AP / 65.7% AP50 Microsoft-COCO-testdev.

    62 FPS – YOLOv4 (608x608 batch=1) on Tesla V100 – by using Darknet-framework
    400 FPS – YOLOv4 (416x416 batch=4) on RTX 2080 Ti – by using TensorRT+tkDNN
    32 FPS – YOLOv4 (416x416 batch=1) on Jetson AGX Xavier – by using TensorRT+tkDNN




    Для начала несколько полезных ссылок



    Сравнение различных нейронных сетей


    Наша нейронная сеть YOLOv4 и наш собственный DL-фреймворк Darknet (C/C++/CUDA) лучше по скорости FPS и точности AP50:95 и AP50 на датасете Microsoft COCO, чем DL-фреймворки и нейронные-сети: Google TensorFlow EfficientDet, FaceBook Detectron RetinaNet/MaskRCNN, PyTorch Yolov3-ASFF, и многие другие… YOLOv4 достигает точности 43.5% AP / 65.7% AP50 на тесте Microsoft COCO при скорости 62 FPS TitanV или 34 FPS RTX 2070. В отличии от других современных детекторов, YOLOv4 может обучить любой, у кого есть игровая видеокарта nVidia с 8-16 GB VRAM. Теперь не только крупные компании могут обучать нейронную сеть на сотнях GPU / TPU для использования больших размеров mini-batch для достижения более высокой точности, поэтому мы возвращаем контроль над искусственным интеллектом обычным пользователям, потому что для YOLOv4 большая мини-партия не требуется, можно ограничиться размером 2 – 8.

    YOLOV4- оптимальная для использования real-time, т.к. сеть лежит на кривой оптимальности по Парето на графике AP(accuracy) / FPS(speed).



    Графики точности (AP) и скорости (FPS) множества нейронных сетей для обнаружения объектов замеренных на видеокартах GPU TitanV/TeslaV100, TitanXP/TeslaP100, TitanX/TeslaM40 для двух основных индикаторов точности AP50:95 и AP50

    Для честного сравнения мы берём данные из статей и сравниваем только на GPU с одинаковой архитектурой.

    У большинства практических задач есть минимально необходимые требования к детекторам – это минимально допустимые точность и скорость. Обычно минимально допустимая скорость от 30 FPS (кадров в секунду) и выше для real-time систем.

    Как видно из графиков, в Real-time системах с FPS 30 и более:

    • для YOLOv4-608 необходимо использовать RTX 2070 за 450$ (34 FPS) с точностью 43.5% AP / 65.7% AP50
    • для EfficientDet-D2 необходимо использовать TitanV за 2250$ (42 FPS) с точностью 43.0% AP / 62.3% AP50
    • для EfficientDet-D0 необходимо использовать RTX 2070 за 450$ (34 FPS) с точностью 33.8% AP / 52.2% AP50

    Т.е. YOLOv4 требует в 5 раза более дешевое оборудование и при этом точнее, чем EfficientDet-D2 (Google-TensorFlow). Можно использовать EfficientDet-D0 (Google-TensorFlow) тогда стоимость оборудования будет одинаковая, но точность будет на 10% AP ниже.
    Кроме того, некоторые промышленные системы имеют ограничения по тепловыделению или по использованию пассивной системы охлаждения – в этом случае вы не сможете использовать TitanV даже имея деньги.

    При использовании YOLOv4 (416x416) на GPU RTX 2080 Ti с использованием TensorRT+tkDNN мы достигаем скорость в 2x раза больше, а при использовании batch=4 в 3x-4x раза больше – для честного сравнения мы не приводим эти результаты в статье на arxiv.org:

    Нейронная сеть YOLOv4 (416x416) FP16 (Tensor Cores) batch=1 достигает 32 FPS на вычислителе nVidia Jetson AGX Xavier при использовании библиотеки TensorRT+tkDNN: github.com/ceccocats/tkDNN
    Чуть меньшую скорость дает библиотека OpenCV-dnn скомпилированная с CUDA: docs.opencv.org/master/da/d9d/tutorial_dnn_yolo.html

    Иногда скорость (FPS) некоторых нейронных сетей в статьях указывается при использовании высокого batch size или при тестировании на специализированном программном обеспечении (TensorRT), которое оптимизирует сеть и показывает повышенное значение FPS. Сравнение одних сетей на TRT с другими сетями без TRT не является честным. Использование высокого batch size увеличивает FPS, но также увеличивает задержку (а не уменьшает её) по сравнению с batch=1. Если сеть с batch=1 показывает 40 FPS, а с batch=32 показывает 60 FPS, то задержка будет 25ms для batch=1, и ~500ms для batch=32, т.к. будут обрабатываться только ~2 пакета (по 32 изображения) в секунду, из-за этого использование batch=32 неприемлемо во многих промышленных системах. Поэтому мы сравнивали на графиках результаты только c batch=1 и без использования TensorRT.

    Любой процесс может управляться либо людьми, либо компьютерами. Когда компьютерная система действует с большим запаздыванием из-за малой скорости и совершает слишком много ошибок, то ей нельзя доверить полное управление действиями, в этом случае процессом управляет человек, а компьютерная система только дает подсказки – это рекомендательная система – человек работает, а система только подсказывает где были совершены ошибки. Когда же система работает быстро и с высокой точностью, такая система может управлять процессом самостоятельно, а человек только присматривает за ней. Поэтому всегда важны и точность, и скорость системы. Если вам кажется, что 120 FPS для YOLOv4 416x416 это слишком много для вашей задачи, и лучше взять алгоритм медленнее и точнее, то скорее всего в реальных задачах вы будете использовать что-то слабее, чем Tesla V100 250 Watt, например, RTX 2060/Jetson-Xavier 30-80 Watt, в этом случае вы получите 30 FPS на YOLOv4 416x416, а другие нейронные сети по 1-15 FPS или вообще не запустятся.

    Особенности обучения различных нейронных сетей


    Вы должны обучать EfficientDet с размером mini-batch = 128 на нескольких GPU Tesla V100 32GB, в то время как YOLOv4 была обучена всего на одной GPU Tesla V100 32GB с mini-batch = 8 = batch/subdivisions, и может быть обучена на обычной игровой видеокарте 8-16GB GPU-VRAM.
    Следующий нюанс, трудность обучения нейронной сети для обнаружения собственных объектов. Сколько бы времени вы не обучали другие сети на одной GPU 1080 Ti, вы не получите заявленной точности, показанной на графике выше. Большинство сетей (EfficientDet, ASFF, …) надо обучать на 4 – 128 GPUs (с большим размером mini-batch используя syncBN) и надо обучать каждый раз заново для каждого разрешения сети, без выполнения обоих условий невозможно достичь заявленной ими точности AP или AP50.


    Вы можете видеть зависимость точности обнаружения объектов от размера минибатча в других детекторах, т.е. используя 128 видеокарт вместо 8 видеокарт и скорость обучения в 10 раз выше и конечная точность на 1.5 AP выше – MegDet: A Large Mini-Batch Object Detector arxiv.org/abs/1711.07240

    Yolo ASFF: arxiv.org/abs/1911.09516
    Following [43], we introduce a bag of tricks in the training process, such as the mixup algorithm [12], the cosine [26] learning rate schedule, and the synchronized batch normalization technique [30].

    EfficientDet: arxiv.org/abs/1911.09070
    Synchronized batch normalization is added after every convolution with batch norm decay 0.99 and epsilon 1e-3.

    Each model is trained 300 epochs with batch total size 128 on 32 TPUv3 cores.

    cloud.google.com/tpu/docs/types-zones#europe
    v3-32 TPU type (v3) – 32 TPU v3 cores – 512 GiB Total TPU memory

    Вы должны использовать 512 GB TPU/GPU-RAM чтобы обучить модель EfficientDet с Synchronized batch normalization при batch=128, в то время как для обучения YOLOv4 использовался mini-batch=8 и только 32 GB GPU-RAM. Несмотря на это, YOLOv4 быстрее/точнее публичных сетей, хотя обучена только 1 раз с разрешением 512x512 на 1 GPU (Tesla V100 32GB / 16GB). При этом использование меньшего размера mini-batch size и GPU-VRAM не приводит к такой драматической потери точности, как в других нейронных сетях:


    Источник: arxiv.org/abs/2004.10934

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

    Нашу сеть достаточно обучить один раз с network resolution 512x512, и затем можно использовать с разными network resolutions в диапазоне: [416x416 – 512x512 – 608x608].

    Большинство же других моделей требуется обучать каждый раз отдельно для каждого network resolution, из-за этого обучение занимает в разы больше времени.

    Особенности измерения точности алгоритмов обнаружения объектов


    Всегда можно найти изображение, на котором один алгоритм будет работать плохо, а другой алгоритм будет работать хорошо, и наоборот. Поэтому для тестирования алгоритмов обнаружения используется большой набор из ~20 000 изображений и 80 различных типов объектов — MSCOCO test-dev dataset.

    Чтобы алгоритм не пытался просто запомнить хэш каждого изображения и координаты на нем (overfitting), точность обнаружения объектов всегда проверяется на изображениях и метках, которые алгоритм не видел во время обучения – это гарантирует, что алгоритм сможет обнаруживать объекты на изображениях/видео, которые он никогда не видел.

    Чтобы никто не мог совершить ошибку в расчете точности, в открытом доступе есть только тестовые изображения test-dev, на которых вы производите обнаружение, а результаты отправляете на CodaLab evaluation server, на котором программа сама сравнивает ваши результаты с тестовыми аннотациями, которые никому не доступны.

    MSCOCO dataset состоит из 3-ех частей

    1. Обучающий набор: 120 000 изображений и json-файл с координатами каждого объекта
    2. Валидационный набор: 5 000 изображений и json-файл с координатами каждого объекта
    3. Тестовый набор: 41 000 jpg-изображений без координат объектов (часть из этих изображений используется для определения точности в задачах: Object Detection, Instance Segmentation, Keypoints, ...)

    Особенности разработки YOLOv4


    При разработке YOLOv4 мне приходилось самому разрабатывать и нейронную сеть YOLOv4 и фреймворк Darknet на C/C++/CUDA. Т.к. в Darknet нет автоматического дифференцирования и автоматического выполнения chain-rule, то все градиенты приходится реализовывать вручную на CUDA C++. С другой стороны, мы можем отходить от строгого следования chain-rule, изменять backpropagation и пробовать очень нетривиальные вещи для повышения стабильности обучения и точности.

    Дополнительные выводы при создании нейронных сетей


    • Не всегда лучшая сеть для классификации объектов будет лучшей в качестве backbone для сети, используемой для обнаружения объектов
    • Использование weights обученных с фичами, которые увеличили точность в классификации, может негативно сказаться на точности детектора (на некоторых сетях)
    • Не все фичи заявленные в различных исследованиях улучшают точность сети
    • Не все фичи совместимы между собой и некоторые комбинации фич зачастую уменьшают точность сети при использовании совместно.
    • Не всегда сеть с более низким BFLOPS будет быстрее, даже если BFLOPS меньше в десятки раз
    • Сети для обнаружения объектов требуют более высокого разрешения сети для обнаружения множества объектов разного размера и их точного местоположения, это требует более высокого receptive field для покрытия увеличенного разрешения сети, а значит требуется больше слоев со stride=2 и/или conv3x3, и больший размер weights (filters) для запоминания большего числа деталей объектов.

    Использование и обучение YOLOv4


    Обнаружение объектов с помощью обученных моделей YOLOv4 встроено в библиотеку OpenCV-dnn github.com/opencv/opencv/issues/17148 так что вы можете использовать YOLOv4 напрямую из OpenCV без использования фреймворка Darknet. Библиотека OpenCV поддерживает выполнение нейронных сетей на CPU, GPU (nVidia GPU), VPU (Intel Myriad X). Подробнее: docs.opencv.org/master/da/d9d/tutorial_dnn_yolo.html

    OpenCV (dnn) framework:


    Darknet framework:


    tkDNN+TensorRT — Максимальная скорость обнаружения объектов используя YOLOv4: TensorRT + tkDNN github.com/ceccocats/tkDNN

    • 400 FPS – YOLOv4 (416x416 batch=4) on RTX 2080 Ti
    • 32 FPS – YOLOv4 (416x416 batch=1) on Jetson AGX Xavier

    Использование YOLOv4 может быть расширено до обнаружения 3D-Rotated-Bboxes или ключевых точек /facial landmarks, например:

    github.com/ouyanghuiyu/darknet_face_with_landmark

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 11

      0
      По поводу того что для трейна EfficientDet нужны очень большие батчи — только если трейн с нуля. Если использовать перенос обучения с использованием небольшого датасета — использование небольших батчей не такая уж проблема. Пробовал на нескольких небольших датасетах — вроде неплохо себя EfficientDet показывал.
        +2
        Есть 2 варианта:
        1. Если делать Transfer-learning / Fine-tuning без заморозки weights/BN, то точность на 0.5 — 1.5 AP ниже с малым mini-batch, чем с большим, т.к. статистика mean/variance будет вычислена заново с малым mini-batch.
        2. Если заморозить большую часть weights и BN-statistic, то проблем с маленьким mini-batch почти нет, но это подходит только если контекст и объекты обучающего датасета сильно совпадают с pre-trained weights, т.к. в этом случае большая (замороженная) часть сети не обучается. Если контекст/объекты сильно отличаются, то точность может упасть на 10 — 20 AP.


        Это справедливо для больших корректных датасетов: Microsoft COCO, Google OpenImages, Stanford ImageNet, Berkeley BDD100k, Toyota Kitti… А на малых датасетах что угодно может быть.

        Для точности формулировок Transfer-learning vs Fine-tuning: github.com/AlexeyAB/darknet/issues/2139
        • Transfer-learning — перенос весов из одной задачи в другую: классификация -> обнаружение
        • Fine-tuning — перенос весов между одинаковыми задачами: обнаружение -> обнаружение
          0
          Использовал веса для backbone, которым выступает EfficientNet, а трейнилась собственно «голова» — biFPN, так что все же перенос обучения. И backbone замораживалась, но за уточнение спасибо.
        0
        Приветствую автора статьи, почему centermask только в одном графике, как показывает текущие результаты по всем детекторам в разрезе MAP/Fps эта сеть прямой конкурент по данным показателям для Yolov4, я тестировал обе сети (сконвертированный centermask с помощью torch2trt и yolov4 от tkdnn) и для моих задач результат в разрезе качества и скорости практически идентичны
          +1
          Потому что мы сравниваем данные опубликованные в статьях авторов этих нейронных сетей, за которые они ручаются и вряд ли они занижают свои результаты и достижения. И потому что авторы CetnerMask опубликовали свои результаты только на GPU Pascal и только AP (без AP50).

          Все фичи которые применяются при определении точности (ensembles, multiscale/flip, high resolution, ...), должны применяться и при определении скорости.

          В отличие от большинства других статей, мы публикуем наши результаты на нескольких архитектурах GPU: Maxwell/Pascal/Volta. И сравниваем точность/скорость только на одинаковых архитектурах.

          А не как авторы статей CenterNet, EfficientDet,… запускают свои сети на быстрых GPU, а чужие на старых медленных GPU )

          Авторы статьи CenterNet сравнили свой CenterNet на GPU-Pascal с производительность 11 TFlops с Yolov3 на старой GPU-Maxwell с производительностью 6 TFlops.

          Screenshot CenterNet: arxiv.org/pdf/1904.07850.pdf
          6.1. Object detection Table 1 shows our results on COCO validation with different backbones and testing options, while Figure 1 compares CenterNet with other real-time detectors. The running time is tested on our local machine, with Intel Core i7-8086K CPU, Titan Xp GPU, Pytorch 0.4.1, CUDA 9.0, and CUDNN 7.1



          Screenshot Yolov3 (2018): arxiv.org/pdf/1804.02767v1.pdf


          А если сравнить честно на одной и той же GPU, то:
          CenterNet-DLA (SS + Flip) — 28 FPS (TitanXP) — 39.2% AP — 57.1% AP50
          Darknet YOLOv3 608x608 — ~34 FPS (TitanXP) — 33.0% AP — 57.9% AP50

          Авторы EfficientDet из Google Brain пошли ещё дальше, они использовали GPU Volta с Tensor Cores — запустили EfficientDet на GPU не на 1, а на 2 поколения выше, чем Yolov3 :) Но они хотя бы формально поступили чуть более честно – к своему неверному сравнению сделали сноску (что сравнение не верно) – которую увидят только те, кто разбираются: arxiv.org/pdf/1911.09070v4.pdf


          Как выглядит честное сравнение Yolov3 и EfficientDet на одинаковом GPU вы видите на наших графиках.

          И это им приходится мухлевать, чтобы победить старую YOLOv3, не говоря уже о новой YOLOv4, которая значительно точнее/быстрее.

          Чего уж там говорить о горе любителях сравнения из интернета, которые точность проверяют на одном фреймворке с высоким разрешением с multiscale/flip inference-time-data-augmentation и на val5k-датасете, а скорость проверяют на другом фреймворке с низким разрешением без multiscale/flip да ещё с квантованием int8. И сравнивают с другими моделями на test-dev датасете да ещё так же на разных GPU. Вообщем все что только можно смешают и перепутают.

          PS
          YOLOv4 создавалась при поддержке Academia Sinica и MoST (Ministry of Science and Technology) Taiwan в рамках проекта, целью которого изначально было не создать, а выбрать лучшую нейронную сеть по заказу коммерческих корпораций. Поэтому они достаточно тщательно проверяли наши результаты. Собственно Tsung-Yi Lin автор MSCOCO, RetinaNet, FPN,… выходец из Academia Sinica тоже в курсе этих разработок, как и многие другие значимые люди.
          0

          Использовал darknet от AlexeyAb для нескольких домашних проектов на yolov3(распознавание дорожных знаков и распознавание эвакуаторов), обучал на RTX2080. В принципе все работало неплохо. Правда, знаки обучались почти неделю. Единственное, что не смог сделать, перенести обученные модели на jetson nano.

            0
            1) А что с поддержкой int8? Когда вышла YOLOv3 у нас какие-то были проблемы при попытке всё это перетащить на TensorRT (вроде с tiny там тоже что-то было весьма конкурентное). В результате получалось что какие-то аналоги под int8 были пошустрее без существенной потери качества по сравнению с Yolo.
            В статье у вас вижу только int16. С int8 не тестили, или какие-то ограничения архитектуры?

            2) Вообще этот проект интересно весьма выглядит — github.com/ceccocats/tkDNN на который вы ссылку приводите. Что-то я нигде на формумах под Jetson ссылок не видел. Хотя он должен массу проблем решать.
            Это что-то новое?

            3) А сколько fps показывает на Jetson tx2 и Jetson nano? На днях читал что на nano чуть ли не 1 fps у кого-то вышло.
              +1
              1. Проблем с int8 квантованием Yolo в TensorRT не было, были проблемы с производительностью из-за необходимости использовать кастомную активацию leaky, легко решалось заменой на relu: arxiv.org/pdf/1904.02024.pdf
              Сейчас Yolov3 нативно поддерживается в nVidia Deepstream 4.0 (TensorRT) поэтому никаких проблем вообще нет: news.developer.nvidia.com/deepstream-sdk-4-now-available
              Мало того, Xnor.ai научились обучать Yolo на bit1 весах, собственно основатели и создали Yolo: www.forbes.com/sites/janakirammsv/2020/01/19/apple-acquires-xnorai-to-bolster-ai-at-the-edge/#7727a8913975

              2. tkDNN относительно новая библиотека.

              3. Я запускал YOLOv4 256x256 async=3 (Leaky вместо Mish) на 1 Watt neurochip Intel Myriad X со скоростью 11 FPS. При этом точность на MSCOCO test-dev такая же как у обычного YOLOv3:
              YOLOv4 256x256 (leaky) — 33.3% AP — 53.0% AP50
              YOLOv3 416x416 (default) — 31.0% AP — 55.3% AP50.
              Можно такую умную камеру+нейрочип использовать shop.luxonis.com — одновременно и объекты обнаруживает и расстояние до них

              YOLOv3-spp 192x320 на iPhone (A13 iOS) показывает более 30 FPS apps.apple.com/app/id1452689527
                0
                Всё-таки TPU от Intel и Jetson Nano это принципиально разные штуки. Первый сильно энергоэффективнее если сеть на нём работает. Но архитектура там сильно разная, как результат — производительность может рандомно прыгать. Но да, nano под tensorrt должен быть побыстрее в большинстве случаев.

                Да не суть. Всё равно хорошо что новые сети появляются и точность растёт.
              0
              Приветствую автора. Подскажите пожалуйста, есть ли какие либо исследования детальные по neck (FPN,PAN,biFPN,FPN в YOLOv4), интересуют в большей степени case study по поводу количества блоков в пирамиде, оптимального числа fmaps которые нужно отправлять в fpn ( стандарт 256, тестил и 128, но супер сильной разницы не заметил) и по тому как сделать fpn более efficient с точки зрения forward pass затрат времени.Как я вижу вы проводили довольно большей ресерч по поводу комбинаций различных модулей и параметров, возможно вы и об этом знаете.
                0
                Количество фильтров/слоев в Neck (FPN, PAN, BiFPN, ASFF, ...) сильно зависит от network resolution, backbone, dataset, BoF/BoS,… чуть что-то изменил, и надо заново подбирать. Это всегда будет поиск компромисса или точнее и медленнее, или быстрее, но точность хуже. Мы же старались добавить фичи, которые увеличивают точность без уменьшения скорости, и которые затем можно использовать в любых других сетях, детекторах или даже задачах.

                Единственное, что могу посоветовать, это использовать те же скейл параметры (α = 1.2, β = 1.1, γ = 1.15), как в EfficientNet/Det для compound scaling method, если хотите уменьшить/увеличить сеть и скорость/точность. arxiv.org/abs/1905.11946

                Вы можете использовать NAS (как часть AutoML) для подбора оптимальной архитектуры, но если вы не Google, который может тратить миллионы $ на NAS, то больших результатов ждать не стоит. en.wikipedia.org/wiki/Neural_architecture_search

                В Google-brain использовали NAS в большей или меньшей степени для: NAS-FPN, MnasNet + NECK, EfficientNet/Det, MixNet,… а все равно не смогли сделать сеть точнее, чем старая Yolov3 при той же скорости, если запускать обе на том же GPU (TitanV/TeslaV100).

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое