Часть.1 Перевод: Фреймворк Darknet. Нейронные сети для распознавания объектов (Yolo v4, v3 и v2 для Windows и Linux)

Распознавание объектов — это метод компьютерного зрения, который позволяет распознавать и находить объекты на изображениях или видео. С помощью такого рода идентификации и локализации обнаружение объектов может использоваться для их подсчета, определения и отслеживания точного местоположения при отчетливом выделении объектов на сцене. Представьте, что существует изображение, на котором показаны две кошки и человек. Обнаружение объектов позволяет нам сразу классифицировать разновидность найденных объектов, а также находить их экземпляры на самом изображении.

До сих пор большинство современных точных моделей требуют несколько графических процессоров для обучения с большим размером мини-пакетов. Выполнить обнаружение с помощью одного графического процессора делает обучение нейронной сети очень медленным и непрактичным. В этом руководстве мы перевели гайдлайн по использованию нейронной сети YOLOv4, которая может быть обучена на одном графическом процессоре с меньшим размером мини-пакета.

Внимание! Это руководство предназначено для людей, имеющих базовые познания в YOLO. В рамках проекта Beyond Robotics, с 1 по 15 июля будет выходить ряд видеоуроков, посвященных этому фреймворку.

Научная работа по YOLO v4

Научная работа по Scaled YOLO v4 использовать для воспроизведения результатов: ScaledYOLOv4

Больше деталей в статьях, опубликованных в Medium:

Руководство

Обсуждение:

О фреймворке Darknet:


Untitled.png

Научная работа по AP50:95 - FPS (Tesla V100)

Untitled (1).png

Научная работа по AP50:95 / AP50 - FPS (Tesla V100)

tkDNN-TensorRT ускоряет YOLOv4 в ~2 раза для batch=1, в 3-4 раза для batch=4.


GeForce RTX 2080 Ti

Размер сети Darknet, FPS (среднее) tkDNN TensorRT FP32, FPS tkDNN TensorRT FP16, FPS OpenCV FP16, FPS tkDNN TensorRT FP16 batch=4, FPS OpenCV FP16 batch=4, FPS tkDNN ускорение
320 100 116 202 183 423 430 4.3x
416 82 103 162 159 284 294 3.6x
512 69 91 134 138 206 216 3.1x
608 53 62 103 115 150 150 2.8x
Tiny 416 443 609 790 773 1774 1353 3.5x
Tiny 416 CPU Core i7 7700HQ 3.4 - - 42 - 39 12x

Демонстрация результатов

Как оценить AP YOLOv4 на сервере оценки MS COCO
  1. Загрузить и разархивировать датасет test-dev2017 из сервера MS COCO: http://images.cocodataset.org/zips/test2017.zip
  2. Загрузить список изображений для заданий распознования и заменить пути на свои: https://raw.githubusercontent.com/AlexeyAB/darknet/master/scripts/testdev2017.txt
  3. Загрузить файл yolov4.weights 245 MB: yolov4.weights (Google-drive yolov4.weights )
  4. Файл cfg/coco.data должен выглядеть следующим образом:

``` classes= 80 train = /trainvalno5k.txt valid = /testdev2017.txt names = data/coco.names backup = backup eval=coco ```
  1. Создать папку /results/ возле файла ./darknet 
  2. Запустить: ./darknet detector valid cfg/coco.data cfg/yolov4.cfg yolov4.weights
  3. Переименовать файл /results/coco_results.json на detections_test-dev2017_yolov4_results.json и затем сжать его в detections_test-dev2017_yolov4_results.zip
  4. Отправить файл detections_test-dev2017_yolov4_results.zip на сервер оценки MS COCO для test-dev2019 (bbox)

Как оценить FPS у YOLOv4 на GPU
  1. Компилировать Darknet с GPU=1 CUDNN=1 CUDNN_HALF=1 OPENCV=1 внутри Makefile
  2. Загрузить файл yolov4.weights 245 MB: yolov4.weights (Google-drive yolov4.weights )
  3. Выбрать любой .avi/.mp4 формата видеофайл (предпочтительно, чтобы разрешение видео было не больше, чем 1920x1080, чтобы избежать нарушений в производительности ЦПУ)
  4. Запустить одну из двух команд, оценив показатель AVG FPS:
  • включить video_capturing + NMS + drawing_bboxes: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -dont_show -ext_output
  • исключить video_capturing + NMS + drawing_bboxes: ./darknet detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -benchmark

Предварительно обученные модели

Существует файл весов для разных cfg-files (обучены для датасета MS COCO):

FPS на RTX 2070 (R) и Tesla V100 (V):

Компилировано: darknet.exe

Получить cfg-files возможно с помощью пути: darknet/cfg/


Требования


Yolo v4 в других фреймворках


Датасеты

  • MS COCO: использовать ./scripts/get_coco_dataset.sh чтобы получить отмеченный датасет определения MS COCO
  • OpenImages: использовать python ./scripts/get_openimages_dataset.py для отметки тренировочного датасета определения
  • Pascal VOC: использовать python ./scripts/voc_label.py для отметки тренировочного/испытуемого/валидативного датасет определения
  • ILSVRC2012 (классификация ImageNet): использовать ./scripts/get_imagenet_train.sh (также imagenet_label.sh для отметки правильного набора)
  • Датасеты немецких/бельгийских/русских/LISA/MASTIF дорожных знаков для распознавания - использовать эти парсеры
  •  Лист других датасетов

Улучшения в этой репозитории

  • разработал новый детектор объектов на YOLOv4
  • добавил новые модели: CSP, PRN, EfficientNet
  • добавил слои: [conv_lstm], [scale_channels] SE/ASFF/BiFPN, [local_avgpool], [sam], [Gaussian_yolo], [reorg3d] (починил[reorg]), починил [batchnorm]
  • добавил способность тренировать рекурентные модели (со слоями conv-lstm[conv_lstm]/conv-rnn[crnn]) для точного определения на видео
  • добавил увеличение данных: [net] mixup=1 cutmix=1 mosaic=1 blur=1. Добавил активации: SWISH, MISH, NORM_CHAN, NORM_CHAN_SOFTMAX
  • добавил способность тренировки с граф. процессором используя ОЗУ ЦПУ для увеличения mini_batch_size и точности (вместо batch-norm sync)
  • улучшил производительность бинарной нейронной сети в 2-4 раза для определения на ЦПУ и граф. процессора если ты тренировал веса используя модель XNOR-net (bit-1)
  • улучшил производительность нейронной сети на ~7%, объединяя 2 слоя в 1: сверточный + Batch-norm
  • улучшил производительность: определение в раза, на граф. процессоре Volta/Turing (Tesla V100, GeForce RTX, ...) используя Tensor Cores при случае если CUDNN_HALF определен в Makefile или darknet.sln
  • улучшил производительность в ~1.2 раза на FullHD, в ~2 раза на 4K, для определения на видео используя darknet detector demo...
  • улучшил производительность в 3.5 раза техники увеличения данных для тренировки (используя функции OpenCV SSE/AVX вместо вручных функций) - убирает препятствие для тренировки на multi-GPU или GPU Volta
  • улучшил производительность определения и тренировки на Intel CPU с AVX (Yolo v3 ~85%)
  • оптимизировал распределение памяти вовремя изменения размера сети когда random=1
  • оптимизировал инициализацию граф. процессора для определения - используем изначально batch=1 вместо re-init с batch=1
  • добавил правильное исчисление mAP, F1, IoU, Precision-Recall используя команду darknet detector map...
  • добавил рисунок графика average-Loss и accuracy-mAP (map flag) вовремя тренировки
  • запустил ./darknet detector demo ... -json_port 8070 -mjpeg_port 8090 как сервер JSON и MJPEG для получения результатов онлайн через сеть используя свой веб-браузер
  • добавил исчисление отметок (anchors) для тренировки
  • добавил  пример определения и отслеживания объектов
  • добавил советы и предупреждения во время выполнения при неправильном использовании cfg-файла или набора данных
  • добавил поддержку для системы Windows
  • и много других исправлений в коде...

Вдобавок, добавил руководство - How to train Yolo v4-v2 (to detect your custom objects)

Кроме того, вам может быть интересно использовать упрощенный репозиторий, в котором реализовано INT8-исчисление(+30% ускорения и -1% уменьшения mAP)


Как использовать на командной строке

На Linux использовать ./darknet вместо darknet.exe, как здесь:./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights

На Linux найти исполняемый файл ./darknet в корневой папке, на Windows найти здесь \build\darknet\x64

  • Yolo v4 COCO - изображение: darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25
  • Конечные координаты объектов: darknet.exe detector test cfg/coco.data yolov4.cfg yolov4.weights -ext_output dog.jpg
  • Yolo v4 COCO - видео: darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output test.mp4
  • Yolo v4 COCO - WebCam 0darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights -c 0
  • Yolo v4 COCO для net-videocam - Smart WebCam: darknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights http://192.168.0.80:8080/video?dummy=param.mjpg
  • Yolo v4 - сохранить результат как видеофайл res.avidarknet.exe detector demo cfg/coco.data cfg/yolov4.cfg yolov4.weights test.mp4 -out_filename res.avi
  • Yolo v3 Tiny COCO - видео: darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights test.mp4
  • Сервера JSON и MJPEG, которые позволяют множество соединений через веб-браузер ip-address:8070 и порт 8090: ./darknet detector demo ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights test50.mp4 -json_port 8070 -mjpeg_port 8090 -ext_output
  • Yolo v3 Tiny на граф. процессоре #1darknet.exe detector demo cfg/coco.data cfg/yolov3-tiny.cfg yolov3-tiny.weights -i 1 test.mp4
  • Альтернативный метод Yolo v3 COCO - изображение: darknet.exe detect cfg/yolov4.cfg yolov4.weights -i 0 -thresh 0.25
  • Тренировка на Amazon EC2, чтобы видеть mAP & Loss-chart используя URL: http://ec2-35-160-228-91.us-west-2.compute.amazonaws.com:8090 в браузерах Chrome/Firefox (Darknet должен быть компилирован с OpenCV): ./darknet detector train cfg/coco.data yolov4.cfg yolov4.conv.137 -dont_show -mjpeg_port 8090 -map
  • 186 MB Yolo9000 - изображение: darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights
  • Не забудьте поместить data/9k.tree и data/coco9k.map в одну папку вашего приложения, если вы используете cpp api для создания приложения
  • Для обработки списка изображений data/train.txt и сохраните результаты обнаружения в result.json файле использования: darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -ext_output -dont_show -out result.json < data/train.txt
  • Для обработки списка изображений data/train.txt и сохраните результаты обнаружения в result.txt используйте:darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -dont_show -ext_output < data/train.txt > result.txt
  • Псевдо-отметка- для обработки листа изображений  data/new_train.txt и сохранения результатов определения вовремя тренировки Yolo необходимо форматировать каждое изображение как в названии  <image_name>.txt (таким способом можно увеличить количество данных для тренировки: darknet.exe detector test cfg/coco.data cfg/yolov4.cfg yolov4.weights -thresh 0.25 -dont_show -save_labels < data/new_train.txt
  • Для исчисления отметок (anchors): darknet.exe detector calc_anchors data/obj.data -num_of_clusters 9 -width 416 -height 416
  • Для проверки точности [email protected]=50: darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights
  • Для проверки точности [email protected]=75: darknet.exe detector map data/obj.data yolo-obj.cfg backup\yolo-obj_7000.weights -iou_thresh 0.75

Для использования сетевой видеокамеры mjpeg-stream с любым смартфоном Android

  1. Скачать для телефона Android mjpeg-stream soft: IP Webcam / Умный WebCam
  2. Подключите телефон Android к компьютеру по Wi-Fi (через Wi-Fi-маршрутизатор) или USB
  3. Запустите смарт-веб-камеру на своем телефоне
  4. Замените адрес ниже, в приложении телефона (смарт-веб-камера), и запустите:
  • Yolo v4 модель-COCO: `darknet.exe detector demo data/coco.data yolov4.cfg yolov4.weights http://192.168.0.80:8080/video?dummy=param.mjpg -i 0

Как компилировать на Linux/macOS (используя CMake)

Файл CMakeLists.txt будет пытаться найти установленные дополнительные зависимости, такие как CUDA, cudnn, ZED и строить совместно с ними. Это также будет создавать общую библиотеку, чтобы использовать darknet для разработки кода.

Установите powershell, если у вас его еще нет (руководство здесь).

Чтобы обновить CMake на Ubuntu, лучше следовать руководству здесь


Используя vcpkg

Откройте оболочку и введите следующие команды

PS Code/> git clone https://github.com/AlexeyAB/darknet PS Code/> cd darknet PS Code/darknet> ./build.ps1 -UseVCPKG -EnableOPENCV -EnableCUDA -EnableCUDNN

(добавить опцию  -EnableOPENCV_CUDA если вы хотите построить OpenCV с поддержкой CUDA - очень медленно строить!) Если откроете скрипт build.ps1 в начале, найдете все доступные переключатели (switches).

Использование библиотек, предоставленных вручную

Откройте оболочку и введите следующие команды

PS Code/> git clone https://github.com/AlexeyAB/darknet PS Code/> cd darknet PS Code/darknet> ./build.ps1 -EnableOPENCV -EnableCUDA -EnableCUDNN

(убрать опции как -EnableCUDA или -EnableCUDNN если не заинтересованы в них). Если откроете скрипт build.ps1 в начале, найдете все доступные переключатели (switches).


Как компилировать на Linux (используя make)

Совершить make в директории darknet. (Вы можете попробовать скомпилировать и запустить его в Google Colab в облаке ссылка (нажать кнопку «Open in Playground» button в левом верхнем углу и посмотрите видео ссылка) До make, можно установить опции в Makefileссылка

  • GPU=1 для сборки с CUDA, чтобы ускорить используя граф. процессор (CUDA должен быть в /usr/local/cuda)
  • CUDNN=1 для сборки с cuDNN v5-v7, чтобы ускорить тренировку используя граф. процессор(cuDNN должен быть в /usr/local/cudnn)
  • CUDNN_HALF=1 для сборки с Tensor Cores (на Titan V / Tesla V100 / DGX-2 and later) ускорение в 3 раза для определения, и в 2 раза для тренировки
  • OPENCV=1 для сборки с OpenCV 4.x/3.x/2.4.x - позволяет обнаруживать видеофайлы и видеопотоки с сетевых камер или веб-камер
  • DEBUG=1 для сборки дебаженной версии Yolo
  • OPENMP=1 для сборки с поддержкой OpenMP для ускорения Yolo с помощью многоядерного процессора
  • LIBSO=1 для сборки darknet.so и двоичного исполняемого файла uselib , который использует эту библиотеку. Можно попробовать запустить LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4 Как использовать эту SO-библиотеку из вашего собственного кода - вы можете посмотреть на C++ примере  или использовать таким образом: LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights test.mp4
  • ZED_CAMERA=1 чтобы собрать библиотеку с поддержкой ZED-3D-камеры (должен быть установлен ZED SDK), затем запустите LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights zed_camera
  • Вам также необходимо указать, для какой видеокарты генерируется код. Это делается путем установки ARCH=. Если вы используете более новую версию, чем CUDA 11, вам также необходимо отредактировать строку 20 из Makefile и удалить ее gencode arch=compute_30,code=sm_30 \ поскольку поддержка графического процессора Kepler была прекращена в CUDA 11. Вы также можете отказаться от общего ARCH= и убрать комментарий ARCH= для вашей видеокарты.

Чтобы запустить Darknet в Linux, используйте примеры из этой статьи, просто используйте ./darknet вместо darknet.exe, т. е. используйте эту команду: `./darknet detector test ./cfg/coco.data ./cfg/yolov4.cfg ./yolov4.weights


Как компилировать на Windows (используя CMake)

Необходимо:

  •  MSVC
  • CMake GUI  Windows win64-x64 Installer
  • Загрузите zip-архив Darknet с последней версией и распакуйте его: master.zip

На Windows:

  • Start (кнопка) -> All programs -> CMake -> CMake (gui) ->
  • изображение В CMake: Введите входной путь к источнику darknet и выходной путь к двоичным файлам -> Configure (кнопка) -> Optional platform for generator: x64 -> Finish -> Generate -> Open Project ->
  • в MS Visual Studio: Выбрать: x64 and Release -> Build -> Build solution
  • найти исполняемый файл darknet.exe в пути вывода к указанным двоичным файлам

68747470733a2f2f686162726173746f726167652e6f72672f776562742f61792f74792f662d2f61797479662d386275666537712d3136796f65636f6d6d6c7779732e6a706567.jpg


Как компилировать на Windows (используя vcpkg)

Это рекомендуемый подход к сбору Darknet в Windows.

  1. Установите Visual Studio 2017 или 2019. В случае, если вам нужно скачать его, пожалуйста, перейдите сюда: Visual Studio Community. Не забудьте установить пакет на английском языке, это обязательно для vcpkg!
  2. Загрузите CUDA (от v10.0) включение интеграции VS во время установки.
  3. Откройте Powershell (Start -> All programs -> Windows Powershell) и введите эти команды:

PS Code/> git clone https://github.com/AlexeyAB/darknet PS Code/> cd darknet PS Code/darknet> .\build.ps1 -UseVCPKG -EnableOPENCV -EnableCUDA -EnableCUDNN

Добавьте опцию -EnableOPENCV_CUDA, если вы хотите построить OpenCV с поддержкой CUDA - это очень медленно строить!. Попробуйте удалить такие параметры, как -EnableCUDA или -EnableCUDNN, если не заинтересованы в них. Если вы откроете скрипт build.ps1 в начале, найдете все доступные переключатели (switches).


Фонд «Beyond Curriculum» публикует цикл материалов в рамках проекта «Beyond Robotics» при поддержке государственно-частного партнёрства «Шеврон» и Посольства США в Казахстане.