• 基于TensorRT的YOLO(V345)模型部署《方案二》


    之前写过一个部署方案,即:基于TensorRT的YOLO(V345)模型部署《方案一》,以下链接

    https://www.cnblogs.com/winslam/p/13816143.html

    今天尝试的是另一个开源方案,部署环境和之前一样(实际上是我懒得改环境,一波三折,好在测试通过)

    先把项目下载下来:

    https://github.com/wang-xinyu/tensorrtx

    打开D: ensorrtx-masteryolov5 准备用cmake生成vs2017工程,修改CMakeLists.txt文件如下:

     1 cmake_minimum_required(VERSION 2.6)
     2 
     3 project(yolov5) # 1
     4 set(OpenCV_DIR "D:\Program Files (x64)\opencv412\opencv\build")  #2 # 这里之前使用的是opencv with contrib,报错,所以改为原版
     5 set(TRT_DIR "D:\TensorRT-7.1.3.4")  #3
     6 
     7 add_definitions(-std=c++11)
     8 option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
     9 set(CMAKE_CXX_STANDARD 11)
    10 set(CMAKE_BUILD_TYPE Debug)
    11 
    12 set(THREADS_PREFER_PTHREAD_FLAG ON)
    13 find_package(Threads)
    14 
    15 # setup CUDA
    16 find_package(CUDA REQUIRED)
    17 message(STATUS "    libraries: ${CUDA_LIBRARIES}")
    18 message(STATUS "    include path: ${CUDA_INCLUDE_DIRS}")
    19 
    20 include_directories(${CUDA_INCLUDE_DIRS})
    21 
    22 set(CUDA_NVCC_PLAGS ${CUDA_NVCC_PLAGS};-std=c++11; -g; -G;-gencode; arch=compute_75;code=sm_75)
    23 ####
    24 enable_language(CUDA)  # add this line, then no need to setup cuda path in vs
    25 ####
    26 include_directories(${PROJECT_SOURCE_DIR}/include)
    27 include_directories(${TRT_DIR}\include)
    28 
    29 # -D_MWAITXINTRIN_H_INCLUDED for solving error: identifier "__builtin_ia32_mwaitx" is undefined
    30 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")
    31 
    32 # setup opencv
    33 find_package(OpenCV QUIET
    34     NO_MODULE
    35     NO_DEFAULT_PATH
    36     NO_CMAKE_PATH
    37     NO_CMAKE_ENVIRONMENT_PATH
    38     NO_SYSTEM_ENVIRONMENT_PATH
    39     NO_CMAKE_PACKAGE_REGISTRY
    40     NO_CMAKE_BUILDS_PATH
    41     NO_CMAKE_SYSTEM_PATH
    42     NO_CMAKE_SYSTEM_PACKAGE_REGISTRY
    43 )
    44 
    45 message(STATUS "OpenCV library status:")
    46 message(STATUS "    version: ${OpenCV_VERSION}")
    47 message(STATUS "    libraries: ${OpenCV_LIBS}")
    48 message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")
    49 
    50 include_directories(${OpenCV_INCLUDE_DIRS})
    51 link_directories(${TRT_DIR}\lib)
    52 
    53 #add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h 
    54 #                ${PROJECT_SOURCE_DIR}/hardswish.cu ${PROJECT_SOURCE_DIR}/hardswish.h)   #4 # 红色的删除了,已经改为56行
    55 
    56 add_executable(yolov5 ${PROJECT_SOURCE_DIR}/yolov5.cpp ${PROJECT_SOURCE_DIR}/yololayer.cu ${PROJECT_SOURCE_DIR}/yololayer.h )   #4
    57 
    58 target_link_libraries(yolov5  "nvinfer" "nvinfer_plugin")   #5
    59 target_link_libraries(yolov5 ${OpenCV_LIBS})          #6
    60 target_link_libraries(yolov5 ${CUDA_LIBRARIES})   #7
    61 target_link_libraries(yolov5 Threads::Threads)       #8

    configure、generate之后,用ide打开,载入cuda、tensorrt的属性表,

    在yolov5.cpp中指定具体模型文件路径(文件应该是原本yolov5模型转换后的文件?):

    std::map<std::string, Weights> weightMap = loadWeights("D:\tensorrtx-master\yolov5\build\yolov5s.wts");

    然后在release x64模式下编译成功。

    (编译可参考:https://github.com/wang-xinyu/tensorrtx/blob/master/tutorials/run_on_windows.md   记得还有个include头文件下载

    接下来在powershell上操作

    生成“.engin”文件

    PS D:	ensorrtx-masteryolov5uildRelease> .yolov5.exe  -s
    Loading weights: D: ensorrtx-masteryolov5uildyolov5s.wts
    Building engine, please wait for a while...
    [10/15/2020-16:02:24] [W] [TRT] Half2 support requested on hardware without native FP16 support, performance will be negatively affected.
    Build engine successfully!

    测试,提前将图片放在新建的samples文件夹下,复制到源码根目录:

    PS D:	ensorrtx-masteryolov5uildRelease> .yolov5.exe  -d D:	ensorrtx-mastersamples
    181ms
    11ms
    11ms
    11ms

    效果图在exe所在文件夹。

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    在最后,作者提供了另一个测试环境的方式,顺便也是解释整个模型部署的流程,

    链接:https://github.com/wang-xinyu/pytorchx

    我们将项目下载下来,放在D: ensorrtx-master下,

    进入测试项目:D: ensorrtx-masterpytorchx-master

    进入lenet文件夹

    在python环境执行:

    python lenet5.py   
    python inference.py

    打印以下内容正常:

    接着在C++环境测试(理论输出结果和上图一样)

    进入D: ensorrtx-masterlenet,拷贝其中C++源码新建工程,我直接建在这里了(懒)

     和上篇博客一样加载cuda、tensorrt的属性表

    将 216行的

     std::ofstream p("lenet5.engine");

    改为:

     std::ofstream p("lenet5.engine", std::ios::binary);

    (参考:https://github.com/wang-xinyu/tensorrtx/issues/25)

    修改76行,指定具体路径

    std::map<std::string, Weights> weightMap = loadWeights("D:\tensorrtx-master\pytorchx-master\lenet\lenet5.wts");

    指定以下指令

    PS D:	ensorrtx-masteryolov5uildx64Release> .lenet.exe -d   
    Output:
    0.0949623, 0.0998472, 0.110072, 0.0975036, 0.0965564, 0.109736, 0.0947979, 0.105618, 0.099228, 0.0916792,

    这里的输出和上图差不多,是正常的,模型转换成功

    参考:https://github.com/wang-xinyu/tensorrtx/blob/master/tutorials/run_on_windows.md

  • 相关阅读:
    使用Visual C++进行串口通信编程
    预处理器进行调试
    怎样用C#实现完整文档打印功能
    如何能练就成一个卓越的程序员
    C# 实现Epson热敏打印机打印 Pos机用
    HARD HARD STUDY
    同步文本框内容的JS代码
    导出Excel之判断电脑中office的版本
    js设置IE检查所存网页的较新版本之‘每次访问此页时检查’
    批量更新sql表某字段范围内的随机数
  • 原文地址:https://www.cnblogs.com/winslam/p/13821374.html
Copyright © 2020-2023  润新知