Обнаружение пешеходов (обнаружение людей) 4: C++ реализует обнаружение людей (включая исходный код, обнаружение людей в реальном времени)

Обнаружение пешеходов (обнаружение людей) 4: C++ реализует обнаружение людей (включая исходный код, обнаружение людей в реальном времени)

Оглавление

Обнаружение пешеходов (обнаружение людей) 4: C++ реализует обнаружение людей (включая исходный код, обнаружение людей в реальном времени)

1. Введение

2. Модель обнаружения пешеходов (обнаружения человека) (YOLOv5)

(1) Обучение модели обнаружения пешеходов (обнаружения человека)

(2) Преобразование модели Pytorch в модель ONNX

(3) Преобразование модели ONNX в модель TNN

3. Развертывание обнаружения пешеходов (обнаружения человека) на C++

(1) Структура проекта

(2) Настройте среду разработки (OpenCV+OpenCL+base-utils+TNN)

(3) Разверните модель TNN

(4) Конфигурация CMake

(5) основной исходный код

(6) Скомпилируйте и запустите исходный код

4. Эффект обнаружения пешеходов (обнаружение человека) Версия C++

5. Android-версия эффекта обнаружения пешеходов (обнаружения человека)

6. Загрузка исходного кода проекта


1. Введение

Это проект « Обнаружение пешеходов (обнаружение людей) », серия « Реализация обнаружения пешеходов/обнаружения людей на C++ (включая исходный код, обнаружение пешеходов в реальном времени) »; в этой статье в основном используется модель обнаружения пешеходов YOLOv5 (обнаружение людей) после Python обучение Транскрибируется в код C/C++. Мы разработаем простую демонстрацию C/C++ для обнаружения пешеходов (обнаружения человека), которая может работать в режиме реального времени. Обнаружение пешеходов (обнаружение человека) Версия модели C/C++ поддерживает ускорение процессора и графического процессора.При ускорении графического процессора (OpenCL) можно достичь результатов обнаружения в реальном времени, что в основном соответствует требованиям к производительности бизнеса.

Сначала покажем эффект обнаружения пешеходов (обнаружение человека):

[Уважайте оригинальность, пожалуйста, указывайте источник для перепечатки] https://blog.csdn.net/guyuealian/article/details/128954638


Дополнительные статьи из серии «Обнаружение пешеходов (обнаружение человека)» см. по адресу:

  1. Обнаружение пешеходов (обнаружение человека) 1: набор данных обнаружения человека (включая ссылку для скачивания): https://blog.csdn.net/guyuealian/article/details/128821763
  2. Обнаружение пешеходов (обнаружение людей) 2: YOLOv5 реализует обнаружение людей (включая набор данных обнаружения людей и обучающий код): https://blog.csdn.net/guyuealian/article/details/128954588
  3. Обнаружение пешеходов (обнаружение людей) 3: Android реализует обнаружение людей (включая исходный код, обнаружение людей в реальном времени): https://blog.csdn.net/guyuealian/article/details/128954615
  4. Обнаружение пешеходов (обнаружение человека) 4: С++ реализует обнаружение человека (включая исходный код, обнаружение человека в реальном времени): https://blog.csdn.net/guyuealian/article/details/128954638

​ Если вам необходимо выполнить портретную сегментацию и добиться эффекта одноклавишного матирования, обратитесь к статье: " Одноклавишное матирование портретного матирования портретное матирование (исходный код C++ и Android) "


2. Модель обнаружения пешеходов (обнаружения человека) (YOLOv5)

(1) Обучение модели обнаружения пешеходов (обнаружения человека)

Для процесса обучения обнаружению пешеходов (обнаружение людей) см.: Обнаружение пешеходов (обнаружение людей) 2: YOLOv5 реализует обнаружение людей (включая набор данных обнаружения людей и обучающий код): https://blog.csdn.net/guyuealian /статья/подробнее /128954588

Чтобы иметь возможность развертывания на макетной плате или платформе мобильного телефона, я выполнил упрощенную простую модель на YOLOv5s и разработал облегченную версию моделей yolov5s05_416 и yolov5s05_320; облегченная модель может достигать результатов обнаружения в реальном времени на обычных Телефоны Android, процессор (4 потока) составляет около 30 мс, а графический процессор — около 25 мс, что в основном соответствует требованиям к производительности бизнеса. В следующей таблице приведены расчеты и параметры модели yolov5s, облегченных моделей yolov5s05_416 и yolov5s05_320, а также точность их обнаружения.

Модель размер ввода параметры(М) GFLOPS

mAP_0,5

мАР_0,5:0,95
йолов5с 640×640 7.2 16,5 0,98432 0,73693
йолов5s05 416×416 1,7 1,8 0,97004 0,50567
йолов5s05 320×320 1,7 1.1 0,96448 0,44821

(2) Преобразование модели Pytorch в модель ONNX

После обучения модели yolov5s вам необходимо сначала преобразовать модель Pytorch в модель ONNX и использовать onnx-simplifier для упрощения структуры сети. Версия Python предоставила сценарий преобразования ONNX. Команда ввода терминала выглядит следующим образом:

# 转换yolov5s05模型
python export.py --weights "data/model/yolov5s05_320/weights/best.pt" --img-size 320 320

# 转换yolov5s模型
python export.py --weights "data/model/yolov5s_640/weights/best.pt" --img-size 640 640

GitHub: https://github.com/daquexian/onnx-simplifier
Установка: pip3 install onnx-simplifier 

(3) Преобразование модели ONNX в модель TNN

В настоящее время на стороне C++ существует несколько методов развертывания модели CNN. Вы можете использовать такие инструменты развертывания, как TNN, MNN, NCNN и TensorRT. Я использую TNN для развертывания на стороне Android.

Инструмент преобразования TNN:

  • (1) Чтобы преобразовать модель ONNX в модель TNN, обратитесь к официальным инструкциям TNN: TNN/onnx2tnn.md на сайте master Tencent/TNN GitHub.
  • (2) Преобразование в один клик, обязательное для ленивых: преобразование в один клик Caffe, ONNX, TensorFlow в NCNN, MNN, Tengine    (могут быть проблемы с версией, модель TNN, преобразованная этим инструментом, может быть несовместима, она рекомендуется собрать исходный код для преобразования, доступен тест 25 сентября 2022 г.)

После успешного преобразования будут сгенерированы два файла (*.tnnproto и *.tnnmodel), которые будут использоваться позже после скачивания.


3. Развертывание обнаружения пешеходов (обнаружения человека) на C++

Инструмент разработки проекта IDE использует CLion, а соответствующие зависимые библиотеки в основном включают OpenCV, base-utils, TNN и OpenCL (необязательно), среди которых должен быть установлен OpenCV, OpenCL используется для ускорения модели, base-utils и TNN настроены , не нужно устанавливать;

Проект тестируется только на Ubuntu 18.04, пожалуйста, настройте среду разработки самостоятельно в системе Windows.

(1) Структура проекта

(2) Настройте среду разработки (OpenCV+OpenCL+base-utils+TNN)

Проект протестирован только на Ubuntu 18.04, пожалуйста, настройте и скомпилируйте его самостоятельно в системе Windows.

  • Установите OpenCV: обработка изображений

Обработка изображений (например, чтение изображений, обрезка изображений и т. д.) должна выполняться с использованием библиотеки OpenCV.

Руководство по установке: установите opencv и opencv_contrib в Ubuntu 18.04

Библиотека OpenCV использует версию opencv-4.3.0, а библиотека opencv_contrib временно не используется, поэтому устанавливать ее не нужно

  • Установите OpenCL: ускорение модели

 Руководство по установке: Ubuntu16.04 устанавливает OpenCV и OpenCL_xiaozl_284, загрузка исходного кода blog-CSDN blog_clinfo

OpenCL используется для ускорения модели GPU. Если OpenCL не используется для ускорения вывода модели, модель вывода на чистом C++ будет очень медленной.

  • base-utils: библиотека C++

GitHub: https://github.com/PanJinquan/base-utils (устанавливать не нужно, проект уже настроен)

base_utils — это широко используемая библиотека C++ для личного развития, которая объединяет часто используемые алгоритмы, такие как C/C++ OpenCV.

  • TNN: вывод модели

GitHub: https://github.com/Tencent/TNN (устанавливать не нужно, проект уже настроен)

Высокопроизводительная и легкая платформа вывода нейронных сетей с открытым исходным кодом от Tencent Youtu Lab обладает многими выдающимися преимуществами, такими как кроссплатформенность, высокая производительность, сжатие моделей и сокращение кода. Основанная на исходных инфраструктурах Rapidnet и ncnn, инфраструктура TNN еще больше усиливает поддержку и оптимизацию производительности мобильных устройств. поддержка фонового X86 и NV GPU. TNN на мобильном телефоне была реализована во многих приложениях, таких как мобильный QQ, Weishi и Ptu, TNN на сервере, как базовая структура ускорения искусственного интеллекта Tencent Cloud, обеспечила поддержку ускорения для внедрения многих предприятий.

(3) Разверните модель TNN

Обоснование модели проекта использует структуру развертывания TNN (поддерживающую многопоточное ускорение ЦП и ГП); обработка изображений использует библиотеку OpenCV, а ускорение модели использует OpenCL, который может обеспечить обработку в реальном времени на обычном компьютерном оборудовании.

Если вы хотите развернуть собственную обученную модель обнаружения пешеходов (обнаружения человека) в этой демонстрации C++, вы можете преобразовать обученную модель Pytorch в ONNX, затем преобразовать ее в модель TNN, а затем заменить исходную модель собственной моделью TNN. Может.

(4) Конфигурация CMake

Это CMakeLists.txt, который в основном настраивает четыре библиотеки OpenCV+OpenCL+base-utils+TNN , пожалуйста, настройте и скомпилируйте самостоятельно в системе Windows.

cmake_minimum_required(VERSION 3.5)
project(Detector)

add_compile_options(-fPIC) # fix Bug: can not be used when making a shared object
set(CMAKE_CXX_FLAGS "-Wall -std=c++11 -pthread")
#set(CMAKE_CXX_FLAGS_RELEASE "-O2 -DNDEBUG")
#set(CMAKE_CXX_FLAGS_DEBUG "-g")

if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    # -DCMAKE_BUILD_TYPE=Debug
    # -DCMAKE_BUILD_TYPE=Release
    message(STATUS "No build type selected, default to Release")
    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (default Debug)" FORCE)
endif ()

# opencv set
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS} ./src/)
#MESSAGE(STATUS "OpenCV_INCLUDE_DIRS = ${OpenCV_INCLUDE_DIRS}")

# base_utils
set(BASE_ROOT 3rdparty/base-utils) # 设置base-utils所在的根目录
add_subdirectory(${BASE_ROOT}/base_utils/ base_build) # 添加子目录到build中
include_directories(${BASE_ROOT}/base_utils/include)
include_directories(${BASE_ROOT}/base_utils/src)
MESSAGE(STATUS "BASE_ROOT = ${BASE_ROOT}")


# TNN set
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds it for you.
# Gradle automatically packages shared libraries with your APK.
# build for platform
# set(TNN_BUILD_SHARED OFF CACHE BOOL "" FORCE)
if (CMAKE_SYSTEM_NAME MATCHES "Android")
    set(TNN_OPENCL_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_ARM_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_BUILD_SHARED OFF CACHE BOOL "" FORCE)
    set(TNN_OPENMP_ENABLE ON CACHE BOOL "" FORCE)  # Multi-Thread
    #set(TNN_HUAWEI_NPU_ENABLE OFF CACHE BOOL "" FORCE)
    add_definitions(-DTNN_OPENCL_ENABLE)           # for OpenCL GPU
    add_definitions(-DTNN_ARM_ENABLE)              # for Android CPU
    add_definitions(-DDEBUG_ANDROID_ON)            # for Android Log
    add_definitions(-DPLATFORM_ANDROID)
elseif (CMAKE_SYSTEM_NAME MATCHES "Linux")
    set(TNN_OPENCL_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_CPU_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_X86_ENABLE OFF CACHE BOOL "" FORCE)
    set(TNN_QUANTIZATION_ENABLE OFF CACHE BOOL "" FORCE)
    set(TNN_OPENMP_ENABLE ON CACHE BOOL "" FORCE)  # Multi-Thread
    add_definitions(-DTNN_OPENCL_ENABLE)           # for OpenCL GPU
    add_definitions(-DDEBUG_ON)                    # for WIN/Linux Log
    add_definitions(-DDEBUG_LOG_ON)                # for WIN/Linux Log
    add_definitions(-DDEBUG_IMSHOW_OFF)            # for OpenCV show
    add_definitions(-DPLATFORM_LINUX)
elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
    set(TNN_OPENCL_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_CPU_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_X86_ENABLE ON CACHE BOOL "" FORCE)
    set(TNN_QUANTIZATION_ENABLE OFF CACHE BOOL "" FORCE)
    set(TNN_OPENMP_ENABLE ON CACHE BOOL "" FORCE)  # Multi-Thread
    add_definitions(-DTNN_OPENCL_ENABLE)           # for OpenCL GPU
    add_definitions(-DDEBUG_ON)                    # for WIN/Linux Log
    add_definitions(-DDEBUG_LOG_ON)                # for WIN/Linux Log
    add_definitions(-DDEBUG_IMSHOW_OFF)            # for OpenCV show
    add_definitions(-DPLATFORM_WINDOWS)
endif ()
set(TNN_ROOT 3rdparty/TNN)
include_directories(${TNN_ROOT}/include)
include_directories(${TNN_ROOT}/third_party/opencl/include)
add_subdirectory(${TNN_ROOT}) # 添加外部项目文件夹
set(TNN -Wl,--whole-archive TNN -Wl,--no-whole-archive)# set TNN library
MESSAGE(STATUS "TNN_ROOT = ${TNN_ROOT}")


# Detector
include_directories(src)
set(SRC_LIST
        src/yolov5.cpp
        src/Interpreter.cpp)
add_library(dmcv SHARED ${SRC_LIST})
target_link_libraries(dmcv ${OpenCV_LIBS} base_utils)
MESSAGE(STATUS "DIR_SRCS = ${SRC_LIST}")

#add_executable(Detector src/main.cpp)
#add_executable(Detector src/main_for_detect.cpp)
add_executable(Detector src/main_for_yolov5.cpp)
target_link_libraries(Detector dmcv ${TNN} -lpthread)


(5) основной исходный код

Демонстрация обнаружения пешеходов представлена ​​в основной программе src/main_for_yolov5.cpp:

//
// Created by Pan on 2018/6/24.
//

#include <iostream>
#include <string>
#include <vector>
#include "file_utils.h"
#include "yolov5.h"

using namespace dl;
using namespace vision;
using namespace std;


void test_yolov5_detector() {
    const int num_thread = 1;
    DeviceType device = GPU; // 使用GPU运行,需要配置好OpenCL
    //DeviceType device = CPU; // 使用CPU运行

    // 测试YOLOv5s_640
    string proto_file = "../data/tnn/yolov5/yolov5s_640.sim.tnnproto";
    string model_file = "../data/tnn/yolov5/yolov5s_640.sim.tnnmodel";
    YOLOv5Param model_param = YOLOv5s_640;//模型参数

    // 测试YOLOv5s05_416
    //string proto_file = "../data/tnn/yolov5/yolov5s05_416.sim.tnnproto";
    //string model_file = "../data/tnn/yolov5/yolov5s05_416.sim.tnnmodel";
    //YOLOv5Param model_param = YOLOv5s05_416;//模型参数

    // 测试YOLOv5s05_320
    //string proto_file = "../data/tnn/yolov5/yolov5s05_320.sim.tnnproto";
    //string model_file = "../data/tnn/yolov5/yolov5s05_320.sim.tnnmodel";
    //YOLOv5Param model_param = YOLOv5s05_320;//模型参数

    // 设置检测阈值
    const float scoreThresh = 0.3;
    const float iouThresh = 0.5;
    YOLOv5 *detector = new YOLOv5(model_file,
                                  proto_file,
                                  model_param,
                                  num_thread,
                                  device);

    // 测试图片
    string image_dir = "../data/test_image";
    vector<string> image_list = get_files_list(image_dir);
    for (string image_path:image_list) {
        cv::Mat bgr_image = cv::imread(image_path);
        if (bgr_image.empty()) continue;
        FrameInfo resultInfo;
        printf("init frame\n");
        // 开始检测
        detector->detect(bgr_image, &resultInfo, scoreThresh, iouThresh);
        // 可视化代码
        detector->visualizeResult(bgr_image, &resultInfo);
    }
    delete detector;
    detector = nullptr;
    printf("FINISHED.\n");

}

int main() {
    test_yolov5_detector();
    return 0;
}

(6) Скомпилируйте и запустите исходный код

Скомпилируйте скрипт или напрямую: bash build.sh

#!/usr/bin/env bash
if [ ! -d "build/" ];then
  mkdir "build"
else
  echo "exist build"
fi
cd build
cmake ..
make -j4
sleep 1
./demo

  • Если вы хотите проверить производительность процессора, измените src/main_for_yolov5.cpp.

Устройство DeviceType = ЦП;

  • Если вы хотите проверить производительность графического процессора, измените src/main_for_yolov5.cpp (необходимо настроить OpenCL) 

DeviceType device = GPU; // Использовать GPU по умолчанию

На следующих снимках экрана показаны скриншоты сравнения производительности с включенным ускорением OpenCL.Режим вывода на чистом C++ занимает несколько секунд, но после включения ускорения OpenCL режим графического процессора занимает всего дюжину миллисекунд, и производительность значительно повышается.

Процессор
графический процессор

4. Эффект обнаружения пешеходов (обнаружение человека) Версия C++

На следующем рисунке показан эффект обнаружения пешеходов (обнаружения человека) в версии C++:

 Следующий GIF-файл представляет собой эффект обнаружения пешеходов (обнаружения человека) версии Python, а результаты версии C++ и версии Python почти одинаковы.


5. Android-версия эффекта обнаружения пешеходов (обнаружения человека)

Разработка версии алгоритма обнаружения человека для Android завершена.Приложение может достигать эффектов обнаружения и распознавания в реальном времени на обычных телефонах Android.ЦП (4 потока) составляет около 30 мс, а графический процессор - около 25 мс, что в основном соответствует требованиям к производительности бизнеса. Для получения дополнительной информации см.: Обнаружение пешеходов (обнаружение людей) 3: Android реализует обнаружение людей (включая исходный код, обнаружение людей в реальном времени) : https://blog.csdn.net/guyuealian/article/details/128954615

Опыт демо-версии Android для обнаружения человеческого тела: https://download.csdn.net/download/guyuealian/87441942

         


6. Загрузка исходного кода проекта

[Обнаружение пешеходов (обнаружение людей) Загрузка исходного кода C/C++] Обнаружение пешеходов (обнаружение людей) 4: C++ реализует обнаружение людей (включая исходный код, обнаружение людей в реальном времени)

Весь набор содержимого исходного кода проекта включает в себя:

  1. Проект предоставляет модель обнаружения пешеходов (обнаружения человека) YOLOv5: включая модель yolov5s, облегченную модель yolov5s05_416 и yolov5s05_320, три модели обнаружения пешеходов (обнаружения человека); обнаружение и распознавание в реальном времени на обычных мобильных телефонах, ЦП (4 потока) около 30 мс, ГП около 25 мс, включая высокоточную версию модели обнаружения пешеходов (обнаружения человека) yolov5s, CPU (4 потока) около 250 мс, GPU около 100 мс
  2. Исходный код проекта на C++ поддерживает работу процессора и графического процессора, ускорение модели графического процессора необходимо настроить с помощью OpenCL, иначе скорость будет очень низкой.
  3. Исходный код проекта не содержит обучающего кода Python и исходного кода Android;

Если вы хотите испытать эффект обнаружения пешеходов (обнаружения человека), вы можете скачать версию для Android для тестирования.Основной алгоритм обнаружения пешеходов (обнаружения человека) в версиях для Android и C++ одинаков.

  1.  Обнаружение пешеходов (обнаружение людей) Обучение Python, см.: Обнаружение пешеходов (обнаружение людей) 2: YOLOv5 реализует обнаружение людей (включая набор данных обнаружения людей и обучающий код): https://blog.csdn.net/guyuealian/article/ детали /128954588

  2. Обнаружение пешеходов (обнаружение людей) Развертывание Android, см.: Обнаружение пешеходов (обнаружение людей) 3: Android реализует обнаружение людей (включая исходный код, обнаружение людей в реальном времени): https://blog.csdn.net/guyuealian/article /подробнее/ 128954615

Guess you like

Origin blog.csdn.net/guyuealian/article/details/128954638