Используйте Tensorrt для ускорения кода обнаружения целей YOLOv5.

1. Введение

  • В последнее время использую YOLOv5 как апекс ассистента.Тренировочный код сейчас допилен.На полигоне можно использовать запрещенные манекены,но для движущихся целей всегда проблемы с потерей кадров и не догоном. Я измерил FPS и обнаружил, что FPS на моем RTX2060 составляет всего 3 к 5, что в принципе эквивалентно уровню PPT, Мое железо какое-то время не сможет быть обновлено, но я очень хочу закончить поддержку APEX. Так что приходится спасать страну методом кодового ускорения. Я узнал из интернета, что Tensorrt очень хорошо влияет на ускорение кода, так что давайте начнем его пробовать.
  • Сначала поместите текущий вспомогательный эффект распознавания
  • (Позвольте мне сказать вам, что после использования TensorRT для ускорения YOLOv5 FPS может достигать более 100, Удивительно~)

2. Официальный сайт

3. Установите зависимости

3.1 Установите OpenCV

  • Войдите на страницу загрузки Releases - OpenCV , выберите соответствующую платформу и версию OpenCV.

3.1.1 Установка

Извлеките содержимое установочного пакета.Эта
установка ничем не отличается от установки обычного программного обеспечения.Просто нажмите на установочный пакет EXE и перейдите к следующему шагу для завершения.Выберите
место установки


  • Установка

  • После завершения установки в каталоге установки будут сгенерированы две папки build и source Файлы, которые нам понадобятся в дальнейшем, в основном помещаются в папку build

3.1.2 Добавьте переменные среды

Добавьте следующие переменные среды

D:\Program\OpenCV\build\x64\vc16\bin
D:\Program\OpenCV\build\x64\vc16\lib
D:\Program\OpenCV\build\include
D:\Program\OpenCV\build\include\opencv2

после перезагрузки компьютера

3.1.3. Просмотр версии

Введите следующий код opencv_version в командной строке, чтобы просмотреть версию OpenCV.

3.2. Установите TensorRT

3.2.1. Скачать

Сначала перейдите на официальный сайт Nvidia tensorRT, чтобы загрузить версию, подходящую для платформы Windows.

3.2.2. Установка

Этот TensorRT, по сути, представляет собой набор библиотек lib и набор файлов .h.

копировать файлы

  • Скопируйте все библиотеки из TensorRT/ lib в каталог cuda v11.1/lib/ x64 ,
  • Скопируйте все файлы .h из каталога TensorRT/ include в cuda/v11.1/ include .

3.2.3 Добавьте переменные среды

Заполните путь TensorRT/lib в переменной среды path.

  • Таким образом, даже если установка TensorRT завершена

4. Скачать проект

5. Создайте модель WTS

  • Скопируйте gen_wts.py со склада и загруженный файл веса yolov5s.pt в директорию yolov5 6.0
  • Выполните следующую команду, чтобы преобразовать модель
  • python gen_wts.py -w yolov5s.pt -o yolov5s.wts
  • Параметр w — это путь к входной модели pt, а параметр -o — это путь к выходной модели wts.
  • После завершения операции в текущем каталоге будет сгенерирована весовая модель yolov5s.wts.Эта модель является специальной моделью сериализации для последующего преобразования в tensorrt.

6. смейк

6.1. Генерация Makefile

  • Создайте новую папку сборки под текущим складом

  • Откройте Cmake, выберите каталог этого хранилища для исходного файла и выберите только что созданный каталог сборки для сборки.

  • Измените configure

    , чтобы выбрать нужную версию Visual Studio, а также платформу компиляции, а затем нажмите «Готово».

  • Это будет сделано через некоторое время

6.1.1 Настройка CMakeLists.txt

6.1.1.1. Изменить путь зависимостей компиляции

Откройте CMakeLists.txt и измените каталоги OpenCV, TensorRT и dirent.h. Dirent.h входит в состав этого хранилища. Следует отметить, что эти пути должны использовать абсолютные пути и использовать \ для разделения пути.

6.1.1.2. Изменение вычислительной мощности

Конкретные значения см . в разделе
CUDA GPU | NVIDIA Developer
developer.nvidia.com/zh cn/cuda gpus#compute .




7. Скомпилируйте

7.1. Изменение исходного кода

  • Используйте Visual Studio, чтобы открыть файл sln в папке сборки проекта,

    найдите файл yololayer.h и измените его.
  • Измените эти параметры в файле на собственный номер категории модели, входной размер,
  • Если вы используете официальные предварительно обученные веса, вам не нужно их изменять. Но если модель, обученная самостоятельно, не модифицируется, позже будет сообщено об ошибке.
static constexpr int CLASS_NUM = 80;
static constexpr int INPUT_H = 640;  // yolov5's input height and width must be divisible by 32.
static constexpr int INPUT_W = 640;

7.2. Генерация исполняемого файла

  • Измените отладку в верхней части интерфейса на Release, а затем нажмите Generate в строке меню - перегенерировать yolov5

успешно скомпилировать


Вы можете видеть, что соответствующий исполняемый файл был сгенерирован в папке сборки/релиза.

7.3. Генерация двигателя

  • Скопируйте сгенерированную в начале модель yolov5s.wts в папку, где находится exe, и откройте ввод cmd в этой директории
 yolov5 -s yolov5s.wts yolov5s.engine s

  • Здесь мы используем модель s и, наконец, вводим s. Точно так же, если это модель m, последний параметр необходимо изменить на m

  • На этом этапе программа преобразует wts в модель сериализации движка, что займет много времени. Не закрывайте страницу, потому что вы не можете ждать, иначе все предыдущие усилия будут потрачены впустую. Конкретное время связано с вашим Производительность процессора.В общем речь идет о Вам нужно подождать минут 30-40.Здесь долго ждать не надо.Вы можете сначала заняться другими делами,или посмотреть фильм

  • Моему компьютеру потребовалось более тридцати минут, чтобы скомпилировать


  • После создания движка в папке появится модель yolov5s.engine.

8. Рассуждение

8.1. Исполнение рассуждений

  • Скопируйте папку с изображениями на складе в элемент папки EXE, попробуйте угадать, правильно ли это, введите
yolov5 -d yolov5s.engine ./pictures

  • В нем две картинки, и время вывода каждой картинки всего 4 миллисекунды, что составляет 250 кадров в секунду, можно сказать, что эта скорость довольно быстрая.
  • И эффект вывода тоже очень хороший

8.2 Обоснование Python для вызова dll

  • После развёртывания модели как C++ только сейчас можно предугадывать картинки в папке, но это только ограничивается этим, нет возможности сделать это для вызова в программе, и когда мы делаем много задач по обработке изображений , мы фактически используем язык Python, поэтому нам следует дополнительно развернуть модель на Python.

Нажмите на свойства проекта -



  • После изменения расширения целевого файла и типа конфигурации с exe на dll

  • Затем перестройте проект

  • После завершения генерации в папке появится файл yolov5.dll

  • Задайте путь вызываемой вами dll и путь изображения, которое необходимо предсказать.Здесь следует отметить, что параметры Detectorв классе model_pathдолжны передаваться в пути типа bytes, b''а это значит, что строка преобразуется в тип байтов . Если вы не добавите b'', это вызовет TypeError: ожидаемые байты, обнаружена ошибка str.

 det = Detector(model_path=b"./yolov5s.engine",dll_path="./yolov5.dll")  # b'' is needed
img = cv2.imread("./pictures/zidane.jpg")

  • Скопируйте python_trt.py из корневого каталога хранилища в папку, где находится dll-файл
  • Запустите код, если об ошибке не сообщается, будут отображаться следующие результаты теста, просто наслаждайтесь!

8.3 Тестирование производительности

  • Наконец, давайте проверим производительность этого TensorRT.

  • Обнаружение одного изображения плюс время на чтение изображения, изображение занимает всего 0,015 с, что составляет 15 миллисекунд, скорость действительно высокая

  • Для обнаружения 100 изображений требуется всего 1,65 секунды.

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

  • Для 100 снимков требуется всего 0,58 с.Если он продолжит работать, FPS должен быть около 170. То есть на RTX2060Ti эта скорость действительно слишком высока, чтобы иметь друзей~~~

  • Я думаю, что в будущем мой помощник Apex сможет выполнять обнаружение в реальном времени.

9. Отчет об ошибках

  • Ошибка в процессе настройки, файлы проекта могут быть недействительными

  • Ошибка CMake в CMakeLists.txt:3 (проект):

  • Не удалось запустить команду MSBuild:

  • MSBuild.exe

  • Проверьте сообщение об ошибке ниже, чтобы определить, какой файл не может быть найден.

  • Добавьте переменные среды для MSBuild.exe

D:\Program\VisualStudio2022\MSBuild\Current\Bin\amd64

после перезагрузки компьютера

  • Установка оконного SDK
    надежна

  • Набор инструментов CUDA не найден.

описывать

Ошибка в процессе настройки, файлы проекта могут быть недействительными

CUDA_SDK_ROOT_DIR-NOTFOUND

  • Ошибка компиляции Windows CMake: не найден набор инструментов CUDA решение_не найден набор инструментов cuda. ​​Блог Zirong.-CSDN Blog

  • Возможно, набор инструментов CUDA не был проверен, когда вы устанавливали cuda самостоятельно, просто переустановите его снова,


    а затем перезагрузите компьютер.

  • Если ошибка по-прежнему появляется, выполните следующие действия:

  • Вручную скопируйте четыре файла* из папки C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.1\extras\visual_studio_integration**MSBuildExtensions в папку D:\Program\VisualStudio2022\MSBuild\Microsoft\VC\v170* BuildCustomizations

    . успешно примерно через 20 секунд

  • Были испробованы другие стратегии, но они не сработали.
    Используйте более старую версию cmake.

  • Проблема с компиляцией CUDA в Windows, ошибка Cmake: набор инструментов CUDA не найден – 2 Ответа

  • 3.17.1

  • Это никак не связано с версией, если конфигурация правильная, cmake старшей версии также может нормально скомпилироваться.

  • Вручную укажите CUDA_SDK_ROOT_DIR
    , чтобы удалить cuda, а затем переустановить его.Используйте
    Ubuntu для этой компиляции.Используйте
    Visual Studio для переустановки всех связанных файлов с помощью cmake.

  • Не удалось продолжить выполнение кода, так как не удалось найти cudnn64_8.dll. Переустановка программы может решить эту проблему.

  • Эта ошибка должна быть неверным местом распаковки загруженного файла cudnn, просто переустановите его.

  • TensorRT был связан с cuBLAS/cuBLAS LT 11.3.0, но загружал cuBLAS/cuBLAS LT 11.2.1.

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

  • Так что по чужим требованиям выбирайте соответствующую версию совершенно честно, cuda11.3, cuDNN 8.1.0

  • После изменения правильного cudnn на один отчет об ошибке меньше

  • После изменения cuda на 11.3 все ошибки исчезли,


    и его можно скомпилировать через некоторое время.

  • Ленивая загрузка CUDA не включена. Его включение может значительно сократить использование памяти устройства. См. CUDA_MODULE_LOADINGhttps://docs.nvidia.com/cuda/cuda-c-programming-guide/index.htmlenv-vars .

  • Просто перейдите на другую версию TensorRT.

  • FileNotFoundError: не удалось найти модуль «E:\Documents\Desktop\Yolov5_Tensorrt_Win10-master\build\Release\yolov5.dll» (или одну из его зависимостей). Попробуйте использовать полный путь с синтаксисом конструктора.

использовать абсолютный путь

не решил

  • Версия Python слишком высока, просто используйте более низкую версию Python3.7.Как
    правило, версия ниже python3.7 не сообщает об ошибке, но python3.8 сообщает об ошибке.Причина ошибки в том, что python3.8 выполнил проверку безопасности.
    Конкретный принцип Вы можете проверить этот блог iyn.me/i/post 40.html

  • Python 3.8 изменяет правила загрузки динамически подключаемых библиотек (DLL) в Windows.

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

  • К надежным местам относятся:

  • Путь, по которому находится библиотека DLL (укажите полный или частичный путь к библиотеке DLL при загрузке библиотеки DLL, и путь считается доверенным, если файл существует).

  • Пути добавляются с помощью add_dll_directory().

  • (надежное расположение системы)

  • OSError: [WinError -529697949] Ошибка Windows 0xe06d7363

  • github.com/Monday Leo/Yolov5 Tensorrt Win10/issues/8

из-за несовместимости версий

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

  • После компиляции почему в папке сборки нет sln файла
  • Потому что запускать только configure, но не запускать generate

    generate sln file
  • Внимательно посмотрите на запущенный процесс, он должен быть выполнен с ошибкой
    выполнения теста CMAKE_HAVE_LIBC_PTHREAD.

  • Visual Studio не создает DLL-файлы

  • Отсутствуют необходимые зависимые библиотеки или заголовочные файлы

  • Возможно, проблема с sln-файлом, созданным на предыдущем шаге.

  • OSError: исключение: чтение нарушения прав доступа 0x0000000000000000

  • Win10 TensorRT-**8.4.3.1 **+ CUDA 11.7 + cudnn8.6.0.163

несоответствие версий

  • Может быть достаточно один раз регенерировать решение Это
    очень метафизично, но это действительно так
    .

10. Ссылки

Различные ресурсы, используемые в этом случае

рекомендация

отblog.csdn.net/u014723479/article/details/130967449