Платформа обнаружения объектов Darknet и YOLO
Darknet — это платформа нейронных сетей с открытым исходным кодом, разработанная в основном на C и C++, с поддержкой ускорения CUDA.
YOLO (You Only Look Once), передовая система обнаружения объектов в реальном времени, является заметной реализацией в рамках Darknet.
Узнайте больше о том, как Hank.ai вносит свой вклад в сообщество Darknet/YOLO:
Анонсируем Darknet V3 «Джаз»: https://darknetcv.ai/blog/announcing-darknet-v3-jazz
Веб-сайт Darknet/YOLO: https://darknetcv.ai/
Часто задаваемые вопросы по Darknet/YOLO: https://darknetcv.ai/faq/
Discord-сервер Darknet/YOLO: https://discord.gg/zSq8rtW
Статьи
1. YOLOv7: https://arxiv.org/abs/2207.02696
2. Scaled-YOLOv4: https://arxiv.org/abs/2102.12725
3. YOLOv4: https://arxiv.org/abs/2004.10934.
4. YOLOv3: https://pjreddie.com/media/files/papers/YOLOv3.pdf.
Общая информация
Платформа Darknet/YOLO сохраняет свою позицию одной из самых быстрых и точных систем обнаружения объектов.
Ключевые преимущества Darknet/YOLO:
Бесплатный и открытый исходный код: Darknet/YOLO имеет полностью открытый исходный код, что позволяет бесплатно интегрировать его в существующие проекты, в том числе коммерческие.
Высокая производительность: Darknet V3 («Джаз»), выпущенный в октябре 2024 года, демонстрирует замечательную производительность, достигая скорости до 1000 кадров в секунду на наборе данных LEGO с графическим процессором NVIDIA RTX 3090.
Универсальность. ЦП-версию Darknet/YOLO можно развернуть на различных платформах, включая Raspberry Pi, облачные серверы, настольные компьютеры, ноутбуки и мощные учебные устройства. Для версии с графическим процессором требуется графический процессор NVIDIA с поддержкой CUDA.
Межплатформенная совместимость: Известно, что Darknet/YOLO безупречно работает на Linux, Windows и Mac.
Управление версиями в даркнете
Darknet 0.x: относится к оригинальному инструменту Darknet, разработанному Джозефом Редмоном в период с 2013 по 2017 год. У него не было официального номера версии.
Darknet 1.x: Эту версию поддерживал Алексей Бочковский с 2017 по 2021 год. У нее также не было официального номера версии.
Darknet 2.x «OAK»: эта версия спонсировалась Hank.ai и поддерживалась Стефаном Шареттом, начиная с 2023 года. Это был первый выпуск, в котором была представлена команда версии. Версия 2.x возвращалась до конца 2024 года.
Darknet 3.x «JAZZ»: эта версия, выпущенная в октябре 2024 года, ознаменовала собой важный этап разработки, представив новый API C и C++, повышенную производительность и многочисленные исправления ошибок.
MSCOCO Предварительно обученные веса
Различные популярные версии YOLO были предварительно обучены на наборе данных MSCOCO. Этот набор данных состоит из 80 классов, которые можно найти в файле cfg/coco.names.
Предварительно подготовленные веса доступны для скачивания:
1. YOLov2 (ноябрь 2016 г.)
* YOLOv2-крошечный
* YOLOv2-полный
2. YOLOv3 (май 2018 г.)
* YOLOv3-крошечный
* YOLOv3-полный
3. YOLOv4 (май 2020 г.)
* YOLOv4-крошечный
* YOLOv4-полный
4. YOLOv7 (август 2022 г.)
* YOLOv7-крошечный
* YOLOv7-полная
Пример использования:
`
wget --no-clobber https://github.com/hank-ai/darknet/releases/download/v2.0/yolov4-tiny.weights
darknet02displayannotatedimages coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
darknet03display_videos coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights image1.jpg
DarkHelp coco.names yolov4-tiny.cfg yolov4-tiny.weights video1.avi
`
Примечание. Предварительно обученные веса MSCOCO предоставляются в первую очередь для демонстрационных целей. Настоятельно рекомендуется обучение пользовательских сетей, при этом MSCOCO обычно используется для проверки функциональности системы.
Создание даркнета
Darknet использует C++17 или новее, OpenCV, и использует CMake для создания файлов проекта.
Процесс сборки:
1. Google Colab. Инструкции Google Colab такие же, как инструкции для Linux. Обратитесь к подкаталогу colab для записных книжек Jupyter, демонстрирующих конкретные задачи.
2. Метод Linux CMake:
* Предпосылки:
* Инструменты, необходимые для сборки: sudo apt-get install build-essential.
* Git: sudo apt-get install git
* OpenCV: sudo apt-get install libopencv-dev
* CMake: sudo apt-get install cmake
* Установка:
* Создайте рабочие каталоги: mkdir ~/srccd ~/src.
* Клонируйте репозиторий: git clone https://github.com/hank-ai/darknet.
* Перейдите в каталог Darknet: cd darknet.
* Создайте каталог сборки: mkdir build
* Сборка Даркнета:
* сборка компакт-диска
* cmake -DCMAKEBUILDTYPE=Выпуск ..
* сделать -j4
* упаковка
* Установите пакет: sudo dpkg -i darknet-VERSION.deb
* Необязательно: установка CUDA/cuDNN.
* Загрузите и установите CUDA с https://developer.nvidia.com/cuda-downloads.
* Загрузите и установите cuDNN с https://developer.nvidia.com/rdp/cudnn-download или https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#cudnn-package-manager- обзор установки
* Убедитесь, что вы можете запустить nvcc и nvidia-smi. Возможно, вам придется изменить переменную PATH.
* Если вы устанавливаете CUDA или cuDNN позже или обновляетесь до более новой версии, обязательно пересоберите Darknet после изменения вашей среды.
3. Метод Windows CMake:
* Предпосылки:
* Git: установка winget Git.Git
* CMake: установка winget Kitware.CMake
* NSIS: установка winget nsis.nsis
* Visual Studio 2022 Community Edition: установка winget Microsoft.VisualStudio.2022.Community
* Измените установку Visual Studio, включив в нее поддержку C++:
* Откройте установщик Visual Studio.
* Нажмите «Изменить»
* Выберите «Разработка настольных компьютеров на C++».
* Нажмите «Изменить», а затем «Да».
* Установка:
* Откройте командную строку разработчика для VS 2022 (не PowerShell).
* Установите Microsoft VCPKG:
* CDC:
* mkdir c:srccd c:src
* git-клон https://github.com/microsoft/vcpkg
* компакт-диск vcpkg
* bootstrap-vcpkg.bat .vcpkg.exe интегрируется
* установить .vcpkg.exe интегрировать powershell.vcpkg.exe установить opencv[contrib,dnn,freetype,jpeg,openmp,png,webp,world]:x64-windows
* Клонируйте Даркнет и собирайте:
* компакт-диск c:src
* клон git https://github.com/hank-ai/darknet.git
* диск даркнет
* сборка mkdir
* сборка компакт-диска
* cmake -DCMAKEBUILDTYPE=Выпуск -DCMAKETOOLCHAINFILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake ..
* msbuild.exe /property:Platform=x64;Configuration=Release /target:Build -maxCpuCount -verbosity:normal -detailedSummary darknet.sln
* msbuild.exe /property:Platform=x64;Configuration=Release PACKAGE.vcxproj
* Необязательно: установка CUDA/cuDNN.
* Загрузите и установите CUDA с https://developer.nvidia.com/cuda-downloads.
* Загрузите и установите cuDNN с https://developer.nvidia.com/rdp/cudnn-download или https://docs.nvidia.com/deeplearning/cudnn/install-guide/index.html#download-windows.
* Разархивируйте cuDNN и скопируйте каталоги bin, include и lib в C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/[version] (при необходимости перезаписав существующие файлы).
* Убедитесь, что вы можете запустить nvcc.exe. Возможно, вам придется изменить переменную PATH.
Использование даркнета
CLI (интерфейс командной строки)
Общее использование: Darknet предлагает интерфейс командной строки (CLI) для взаимодействия со своими функциями. Это не является исчерпывающим; дополнительные функции см. в интерфейсе командной строки проекта DarkHelp.
Предварительно обученные модели. Для большинства команд вам понадобится файл .weights вместе с соответствующими файлами .names и .cfg. Вы можете либо обучить свою собственную сеть (настоятельно рекомендуется), либо использовать предварительно обученные модели, доступные в Интернете. Примеры включают в себя:
* LEGO Gears (обнаружение объектов на изображениях)
* Rolodex (обнаружение текста на изображениях)
* MSCOCO (стандартное обнаружение объектов класса 80)
Общие команды:
Помощь: помощь в даркнете
Версия: версия даркнета
Прогнозирование с помощью изображения:
* V2: тест детектора даркнета cars.data cars.cfg cars_best.weights image1.jpg
* V3: darknet02displayannotatedimages cars.cfg image1.jpg
* DarkHelp: DarkHelp cars.cfg cars_best.weights image1.jpg
Выходные координаты:
* V2: тест детектора даркнета животные.данные животные.cfg животныеbest.weights -extoutput собака.jpg
* V3: darknet01inference_images животные собака.jpg
* DarkHelp: DarkHelp --json животные.cfg животные.названия животных_best.weights собака.jpg
Обработка видео:
* Версия 2:
* демо-версия детектора даркнета животные.данные животные.cfg животныеbest.weights -extoutput test.mp4 (Видео-прогноз)
* демо-версия детектора даркнета животные.данные животные.cfg животные_best.weights -c 0 (ввод с веб-камеры)
* демо-детектор даркнета животные.данные животные.cfg животныеbest.weights test.mp4 -outfilename res.avi (сохранение результатов в видео)
* Версия 3:
* darknet03display_videos животные.cfg test.mp4 (Видео-прогноз)
* darknet08display_webcam животные (вход с веб-камеры)
* darknet05processvideosmultithreaded животные.cfg животные.названия животных_best.weights test.mp4 (сохранение результатов в видео)
* Темная помощь:
* DarkHelp животные.cfg животные.названия животных_best.weights test.mp4 (Видео-прогноз)
* DarkHelp животные.cfg животные.названия животных_best.weights test.mp4 (сохранение результатов на видео)
Вывод JSON:
* V2: демо-версия детектора даркнета животные.данные животные.cfg животныеbest.weights test50.mp4 -jsonport 8070 -mjpegport 8090 -extoutput
* V3: darknet06imagestojson животные image1.jpg
* DarkHelp: DarkHelp --json животные.названия животных.cfg животные_best.weights image1.jpg
Выбор графического процессора: демонстрационная версия детектора даркнета животные.данные животные.cfg животные_best.weights -i 1 test.mp4
Оценка точности:
* карта детектора даркнетаdrive.datadrive.cfgdriving_best.weights... (mAP@IoU=50)
* карта детектора даркнета животные.данные животные.cfg животныеbest.weights -iouthresh 0,75 (mAP@IoU=75)
Расчет якоря: (используйте DarkMark для оптимального перерасчета якоря)
* Детектор даркнета Calcanchors Animals.data -numof_clusters 6 -ширина 320 -высота 256
Сетевое обучение:
* детектор даркнета -map -dont_show train животные.данные животные.cfg
Обучение новой сети
DarkMark: рекомендуемый подход для аннотирования и обучения — использовать DarkMark, который автоматизирует процесс создания необходимых файлов Darknet.
Ручная настройка:
1. Создайте каталог проекта: например, ~/nn/animals/, чтобы обучить сеть обнаружению животных.
2. Скопируйте файл конфигурации: выберите файл конфигурации шаблона из cfg/ (например, cfg/yolov4-tiny.cfg) и поместите его в каталог вашего проекта.
3. Создайте файл .names. В том же каталоге создайте текстовый файл с именем Animals.names. Перечислите классы, которые вы хотите обнаружить, по одному в строке, без пустых строк и комментариев. Пример:
`
собака
кот
птица
лошадь
`
4. Создайте файл .data. В том же каталоге создайте текстовый файл с именем животные.данные. Этот файл содержит информацию о ваших тренировочных данных. Пример:
`
классы=4
train=/home/username/nn/animals/animals_train.txt
valid=/home/username/nn/animals/animals_valid.txt
имена=/home/имя_пользователя/nn/animals/animals.names
резервная копия =/home/имя пользователя/nn/животные
`
5. Каталог набора данных: создайте каталог для хранения изображений и соответствующих аннотаций (например, ~/nn/animals/dataset). Для каждого изображения потребуется связанный файл .txt с описанием аннотаций. Эти файлы .txt должны иметь определенный формат, и их лучше всего создавать с помощью DarkMark или аналогичного программного обеспечения.
6. Файлы обучения и проверки. Создайте «обучающие» и «действительные» текстовые файлы, как указано в вашем файле .data. В этих файлах перечислены изображения, которые будут использоваться для обучения и проверки соответственно.
7. Измените файл конфигурации:
* Размер пакета: установите пакет = 64.
* Подразделения: начните с подразделения = 1. При необходимости увеличьте значение в зависимости от объема памяти вашего графического процессора.
Максимальное количество пакетов: используйте максимальное количество пакетов = 2000 классов. В данном случае maxbatches=8000.
* Шаги: установите шаги на 80% и 90% от max_batches. Пример: шаги=6400,7200.
* Ширина и высота: отрегулируйте размеры сети (ширину и высоту). Обратитесь к FAQ по Darknet/YOLO для получения рекомендаций по определению оптимальных размеров.
* Классы: обновите классы=..., чтобы они соответствовали количеству классов в вашем файле .names (в данном случае классы=4).
Фильтры: настройте фильтры =... в разделах [convolutional] перед каждым разделом [yolo]. Посчитайте, используя фильтры = (количество классов + 5) 3. В данном случае фильтры = 27.
8. Начните обучение: перейдите в каталог вашего проекта и выполните следующую команду:
`
Детектор даркнета -map -dont_show train животные.данные животные.cfg
`
* Подробный вывод: для получения более подробной информации об обучении используйте --verbose.
* Прогресс: лучшие веса будут сохранены как животные_best.weights, а прогресс тренировок можно будет отслеживать с помощью файлаchart.png.
Другие инструменты и ссылки
DarkMark: для управления проектами Darknet/YOLO, аннотирования изображений, проверки аннотаций и создания обучающих файлов.
DarkHelp: надежная альтернатива Darknet CLI с такими функциями, как мозаика изображений, отслеживание объектов и API C++ для коммерческих приложений.
Часто задаваемые вопросы по Darknet/YOLO: https://darknetcv.ai/faq/
Канал Стефана Шаретта на YouTube: здесь можно найти обучающие материалы и примеры видеороликов: https://www.youtube.com/channel/UCOQ-nJ8l6kG3153g09XwY8g.
Discord-сервер Darknet/YOLO: https://discord.gg/zSq8rtW
Дорожная карта
Последнее обновление: 30 октября 2024 г.
Завершенный:
1. Заменено qsort() на std::sort() там, где это применимо во время обучения (некоторые оставшиеся случаи).
2. Удалены check_mistakes, getchar() и system().
3. Преобразовал Darknet для использования компилятора C++ (g++ в Linux, VisualStudio в Windows).
4. Исправлена сборка Windows.
5. Исправлена поддержка Python.
6. Встроена библиотека даркнета.
7. Снова включены метки на предсказаниях (код "Алфавит").
8. Повторно включен код CUDA/GPU.
9. Снова включил CUDNN.
10. Снова включил половину CUDNN.
11. Удалена жестко закодированная архитектура CUDA.
12. Улучшена информация о версии CUDA.
13. Снова включил AVX.
14. Удалены старые решения и Makefile.
15. OpenCV сделан необязательным.
16. Убрана зависимость от старой библиотеки pthread.
17. Удалены приставки.
18. Переписал CMakeLists.txt, чтобы использовать новое обнаружение CUDA.
19. Удален старый «алфавитный» код и удалено более 700 изображений в данных/метках.
20. Реализована сборка из исходного кода.
21. Улучшен вывод номера версии.
22. Оптимизация производительности, связанная с обучением (в процессе).
23. Оптимизация производительности, связанная с выводами (в процессе).
24. По возможности используется передача по ссылке.
25. Очищены файлы .hpp.
26. Переписал darknet.h.
27. Использовал cv::Mat как правильный объект C++ вместо приведения к void*.
28. Исправлено или стандартизировано использование внутренней структуры изображения.
29. Исправлена сборка для устройств Jetson на базе ARM (новые устройства Jetson Orin работают).
30. Улучшен API Python в версии 3.
Краткосрочные цели:
1. Замените printf() на std::cout (в процессе).
2. Изучите поддержку старых камер ZED.
3. Улучшить и стандартизировать анализ командной строки (в процессе).
Среднесрочные цели:
1. Удалите весь код char* и замените его на std::string.
2. Устранить предупреждения компилятора и обеспечить последовательную обработку предупреждений (в процессе).
3. Более эффективно использовать cv::Mat вместо пользовательских структур изображений в C (в разработке).
4. Замените старую функциональность списка на std::vector или std::list.
5. Исправлена поддержка одноканальных изображений в оттенках серого.
6. Добавить поддержку N-канальных изображений, где N > 3 (например, изображений с дополнительной глубиной или тепловым каналом).
7. Текущая очистка кода (в процессе).
Долгосрочные цели:
1. Устраните проблемы CUDA/CUDNN со всеми графическими процессорами.
2. Перепишите код CUDA+cuDNN.
3. Изучите возможность добавления поддержки графических процессоров сторонних производителей.
4. Реализовать поддержку повернутых ограничивающих рамок или атрибута «угол».
5. Добавьте поддержку ключевых точек/скелетонов.
6. Внедрить тепловые карты (в разработке).
7. Внедрите сегментацию.