retinaface在ubuntu20.04(wsl2)下使用tensorrt(c++)部署

1. 参考博客:
            1. Retinaface Tensorrt Python/C++部署:https://blog.csdn.net/weixin_45747759/article/details/124534079
            2. B站视频教程:https://www.bilibili.com/video/BV1Nv4y1K727/
            3. Retinaface_Tensorrt github 仓库:https://github.com/Monday-Leo/Retinaface_Tensorrt
            4. Ubuntu 20.04 上安装 CMake 3.20 的详细步骤:https://blog.csdn.net/qq_50380073/article/details/139766140
            5. Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system:https://blog.csdn.net/quantum7/article/details/135332971
            6. 如何在 Ubuntu 20.04 上安装 OpenCV:https://blog.csdn.net/qq_33532713/article/details/122994933
            7. 安装OpenCV时遇到的几种错误:https://blog.csdn.net/weixin_44697198/article/details/125101732
            8. 【torch、torchvision、torchaudio】版本对应关系:https://blog.csdn.net/qq_38308388/article/details/130947484

2. 确认 ubuntu 版本:
            执行 lsb_release -a,输入信息如下:

        No LSB modules are available.
        Distributor ID: Ubuntu
        Description:    Ubuntu 20.04.6 LTS
        Release:        20.04
        Codename:       focal


       

3. ubuntu20.04( wsl2 ) 中安装 TensorRT-8.6.1.6、cuda_11.6、cudnn:
            1. 安装步骤:略( 参考 https://blog.csdn.net/heshiyuan1406146854/article/details/141247117 )
            2. 版本展示:
                        1. 执行 nvcc  -V,输入信息如下:            

            nvcc: NVIDIA (R) Cuda compiler driver
            Copyright (c) 2005-2022 NVIDIA Corporation
            Built on Tue_Mar__8_18:18:20_PST_2022
            Cuda compilation tools, release 11.6, V11.6.124
            Build cuda_11.6.r11.6/compiler.31057947_0

                        2. 从 tensorrt 安装位置 /soft/TensorRT-8.6.1.6 可以看出版本为 8.6.1.6
                        3. cudnn 版本: cudnn-linux-x86_64-8.9.7.29_cuda11-archive

4. 英伟达显卡(NVIDIA GeForce RTX 4070 Ti)驱动版本:   

    +-----------------------------------------------------------------------------------------+
    | NVIDIA-SMI 555.52.01              Driver Version: 555.99         CUDA Version: 12.5     |
    |-----------------------------------------+------------------------+----------------------+
    | GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
    |                                         |                        |               MIG M. |
    |=========================================+========================+======================|
    |   0  NVIDIA GeForce RTX 4070 Ti     On  |   00000000:01:00.0  On |                  N/A |
    | 30%   27C    P8              6W /  285W |     792MiB /  12282MiB |      0%      Default |
    |                                         |                        |                  N/A |
    +-----------------------------------------+------------------------+----------------------+

    +-----------------------------------------------------------------------------------------+
    | Processes:                                                                              |
    |  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
    |        ID   ID                                                               Usage      |
    |=========================================================================================|
    |    0   N/A  N/A        23      G   /Xwayland                                   N/A      |
    |    0   N/A  N/A        28      G   /Xwayland                                   N/A      |
    |    0   N/A  N/A        30      G   /Xwayland                                   N/A      |
    +-----------------------------------------------------------------------------------------+

5. ubuntu20.04(wsl2) 中安装 cmake( 3.17.1 ):

    1. apt update
    2. apt install build-essential
    3. apt install -y openssl libssl-dev
    4. wget https://cmake.org/files/v3.17/cmake-3.17.1.tar.gz( 速度太慢,可以使用迅雷下载 )
    5. tar -zxvf cmake-3.17.1.tar.gz
    6. cd cmake-3.17.1
    7. ./configure
    8. make
    9. make install
    10. 执行 cmake  --version 显示 cmake version 3.17.1

            

6. ubuntu20.04(wsl2) 中安装 opencv( 3.4.6 ):
            1. 安装构建工具和所有的依赖软件包:       

        apt install build-essential cmake git pkg-config libgtk-3-dev \
        libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \
        libxvidcore-dev libx264-dev libjpeg-dev libpng-dev libtiff-dev \
        gfortran openexr libatlas-base-dev python3-dev python3-numpy \
        libtbb2 libtbb-dev libdc1394-22-dev libopenexr-dev \
        libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev

            2. 在 github 上下载 opencv-3.4.6.zip、opencv_contrib-3.4.6.zip
            3. unzip opencv-3.4.6.zip && unzip opencv_contrib-3.4.6.zip
            4. cd opencv-3.4.6 && mkdir  build && cd build
            5. 

        cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/usr/local \
        -D INSTALL_C_EXAMPLES=ON \
        -D INSTALL_PYTHON_EXAMPLES=ON \
        -D OPENCV_GENERATE_PKGCONFIG=ON \
        -D OPENCV_EXTRA_MODULES_PATH=/soft/opencv_contrib-3.4.6/modules \
        -D BUILD_EXAMPLES=ON ..

            6. make( 报找不到文件 "#include boostdesc_bem.i" 等,请参考博客:https://blog.csdn.net/weixin_44697198/article/details/125101732
            7. make  install
            8. 验证 opencv 是否安装成功:
                        方法1:在任意位置执行 pkg-config --modversion opencv,输出 3.4.6
                        方法2:
                                    1. cd /soft/opencv-3.4.6/samples/cpp/example_cmake
                                    2. 因为我的电脑为台式机,没有摄像头,该测试样例下的 example.cpp 是调用摄像头进行测试的,我这里修改了 example.cpp 的代码,主要是将 main 函数的代码修改为如下所示:                

                cv::Mat src = cv::imread("../0001.jpg");
                cv::Mat gray;
                cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
                cv::imwrite("../0001_gray.jpg", gray);

                                      即将一个图片转换为灰度图
                                    3. 向 /soft/opencv-3.4.6/samples/cpp/example_cmake 目录上传一张 0001.jpg
                                    4. mkdir build && cd build && cmake .. && make,发现在 /soft/opencv-3.4.6/samples/cpp/example_cmake 目录下成功生成了灰度图 0001_gray.jpg


7.  下载 Retinaface_Tensorrt 代码:

    mkdir /data/code/c_code && cd  /data/code/c_code && git clone  git clone https://github.com/Monday-Leo/Retinaface_Tensorrt


8.  下载 Pytorch_Retinaface 代码:

    mkdir /data/code/python_code && cd /data/code/python_code && git clone https://github.com/biubug6/Pytorch_Retinaface


9.  安装 Python 的 torch 环境( ps:一定要加对应的版本号,否则下载的版本对应的cuda不符合自己的电脑实际安装的 cuda 版本;不要指定国内镜像,国内镜像很可能找不到自己电脑 cuda 版本对应的版本的 python 安装包 ):

    pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 -f https://download.pytorch.org/whl/torch_stable.html


10. 安装 opencv-python :

    pip install opencv-python  -i  https://pypi.mirrors.ustc.edu.cn/simple/


11. 将 /data/code/c_code/Retinaface_Tensorrt/gen_wts.py 拷贝到 /data/code/python_code/Pytorch_Retinaface 目录


12. 将百度网盘( https://pan.baidu.com/s/12nl4d_oKrj2aLXEKYcwxiQ( l7ls ) ) 中的2个权重文件( Resnet50_Final.pth、mobilenet0.25_Final.pth ) 拷贝到 /data/code/python_code/Pytorch_Retinaface 下的 weights 目录( 不存在 weights,新建即可 )

13. 可以去修改 /data/code/python_code/Pytorch_Retinaface/gen_wts.py 文件中如下行的 default 和 help 参数:

parser.add_argument('--network', default='mobile0.25', help='mobile0.25 or resnet50')   // 大概是在第11行

           
14. 执行 python3 gen_wts.py,发现在 /data/code/python_code/Pytorch_Retinaface 下成功生成了 mobile0_25.wts( 此时通过 win10宿主机的任务管理器发现是在消耗 GPU )


15. 测试 Retinaface_Tensorrt:
            1. cd /data/code/c_code/Retinaface_Tensorrt,修改 CMakeLists.txt,添加如下内容:             

        set(OpenCV_DIR "/soft/opencv-3.4.6/build")
        set(TRT_DIR "/soft/TensorRT-8.6.1.6")
        include_directories( "/soft/TensorRT-8.6.1.6/include" )


            2. cp /soft/TensorRT-8.6.1.6/targets/x86_64-linux-gnu/lib/libnvinfer.so /usr/local/lib/
            3. mkdir  build
            4. cd build
            5. cmake ..
            6. make

                        常见报错的解决方案:

                               1. 头文件、库文件找不到:根据自己安装 opencv、cuda、tensorrt、cudnn 等的方式不同,可能会找不到一些文件,使用 find 命令查找对应的文件所在位置,修改具体报错的源文件或者修改CMakeLists.txt,或者修改 ubuntu 环境变量等,怎么熟练怎么来

                                2. github上 Retinaface_Tensorrt 仓库中的操作指南中作者是举的在 windows 上使用 vs ide来编译的例子,使用的是 CMakeLists.txt( 是给 window环境使用的 ),还有一个 CMakeLists_linux.txt,我使用的是后者,但是会有一个坑,就是当头文件、库文件的问题都解决好以后,会碰到一个在 /data/code/c_code/Retinaface_Tensorrt/retina_mnet.cpp 和
/data/code/c_code/Retinaface_Tensorrt/retina_r50.cpp 文件中报错,不识别 “extern "C" __declspec(dllexport) void Detect(void *h, int rows,....” 这句语法的问题,这是因为 dllexport 是给 windows 平台使用的( 可执行百度 dllexport 用法 ),Linux 平台不需要,直接干掉就行,即把  __declspec(dllexport) 删掉即可


            7. 发现在当前目录下成功生成了 retina_mnet
            8. 将 /data/code/python_code/Pytorch_Retinaface 目录下的 mobile0_25.wts 问价复制到当前目录下
            9. 执行 .retina_mnet -s               // 将wts转换为engine序列化模型
            10. 大概等待几分钟后在当前目录下成功生成了 retina_mnet.engine
            11. cp /data/code/c_code/Retinaface_Tensorrt/pictures/test.jpg  ./
            12. ./retina_mnet -d        // 发现执行成功了,对 test.jpg 进行人脸检测,在当前目录下生成了框选人脸后的图片 0_mnet_result.jpg
            13. 测试人脸识别时发现一个有趣的现象,一张人很多的大合照,没识别出任何人脸,怀疑可能是因为人脸太多,或者每个人脸都不是很清晰,但是我将图片放大( 清晰度是没有变化的,虽然人脸大了,但是更模糊了 ),截取了图片中一部分的照片,再进行识别,发现识别出了很多人脸了,todo 研究下是否是参数设置的问题,类似阈值啥的,类似那种在性能和识别率之间权衡的参数配置

16. 完整的 CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

project(retinaface)

set(OpenCV_DIR "/soft/opencv-3.4.6/build")
set(TRT_DIR "/soft/TensorRT-8.6.1.6")

add_definitions(-std=c++11)

option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Debug)

find_package(CUDA REQUIRED)

if (CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
    message("embed_platform on")
    include_directories(/usr/local/cuda/targets/aarch64-linux/include)
    link_directories(/usr/local/cuda/targets/aarch64-linux/lib)
else()
    message("embed_platform off")
    include_directories(/usr/local/cuda/include)
    link_directories(/usr/local/cuda/lib64)
endif()

#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -Wfatal-errors -D_MWAITXINTRIN_H_INCLUDED")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -D_MWAITXINTRIN_H_INCLUDED")

cuda_add_library(decodeplugin SHARED ${PROJECT_SOURCE_DIR}/decode.cu)
target_link_libraries(decodeplugin nvinfer cudart)

find_package(OpenCV)
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories( "/soft/TensorRT-8.6.1.6/include" )

add_executable(retina_r50 ${PROJECT_SOURCE_DIR}/calibrator.cpp ${PROJECT_SOURCE_DIR}/retina_r50.cpp)
target_link_libraries(retina_r50 nvinfer)
target_link_libraries(retina_r50 cudart)
target_link_libraries(retina_r50 decodeplugin)
target_link_libraries(retina_r50 ${OpenCV_LIBRARIES})

add_executable(retina_mnet ${PROJECT_SOURCE_DIR}/calibrator.cpp ${PROJECT_SOURCE_DIR}/retina_mnet.cpp)
target_link_libraries(retina_mnet nvinfer)
target_link_libraries(retina_mnet cudart)
target_link_libraries(retina_mnet decodeplugin)
target_link_libraries(retina_mnet ${OpenCV_LIBRARIES})

add_definitions(-O2 -pthread)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值