• Unet语义分割训练和TensorRT部署


    参考链接:https://gitee.com/dogeblog/unet#%E4%BB%8B%E7%BB%8D
    防止失效,以下记录:
    介绍
    基于unet的语义分割。 包括标注,标注结果转训练集,数据集训练,训练结束后转tensorrt,tensorrt客户端部署。

    tensorrt部署后,640*360的图,在rtx3090推理时间4-5ms

    原始代码来源
    unet代码源于https://github.com/milesial/Pytorch-UNet
    tensorrt代码源于https://github.com/wang-xinyu/tensorrtx 与 https://github.com/YuzhouPeng/unet-tensorrt
    1.标注
    参考https://gitee.com/doge_ac_cn/labelme#installation

    2.生成unet训练的数据集
    1.先把labelme标注的结果放在 labelme绘制mask/labelme 文件夹下。

    2.然后先后运行labelme2coco.py和genneratemask.py,分别生成coco标注文件和mask文件。

    3.训练
    1.把原图和mask分别拷贝到 Pytorch-UNet/data 的img和mask文件夹下

    2.运行train.py

    3.命令行输入tensorboard --logdir=runs

    然后进入http://localhost:6006/ 即可查看运行的loss值,学习率,验证集效果。
    4.转tensorrt 的 推理 engine
    看unet2tensorrt的readme即可

    这里直接转的话,会与python的结果有误差

    详情见作者的issue https://github.com/wang-xinyu/tensorrtx/issues/526 与 https://github.com/YuzhouPeng/unet-tensorrt/issues/8

    作者代码链接:
    https://download.csdn.net/download/zhouzongzong/86400386

    5、Cmake文件(关于如何用Cmake配置opencv C++环境)
    参考链接:https://blog.csdn.net/Wuhao9_/article/details/123980679

    cmake_minimum_required(VERSION 2.6)
    
    project(unet)
    
    add_definitions(-std=c++11)
    
    option(CUDA_USE_STATIC_CUDA_RUNTIME OFF)
    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_BUILD_TYPE Debug)
    
    set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS};-std=c++11;-g;-G;-gencode;arch=compute_30;code=sm_30)
    
    # cuda directory
    include_directories(${PROJECT_SOURCE_DIR}/include)
    include_directories(C:/Program Files/NVIDIA GPU\ Computing\ Toolkit/CUDA/v11.4/include)
    link_directories(C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v11.4/lib/x64)
    
    # tensorrt
    include_directories(F:/yolov5_tensorRT/TensorRT-8.0.3.4/include)
    link_directories(F:/yolov5_tensorRT/TensorRT-8.0.3.4/lib)
    
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Ofast -Wfatal-errors -D_MWAITXINTRIN_H_INCLUDED")
    
    # link library and add exec file
    add_executable(unet ${PROJECT_SOURCE_DIR}/unet.cpp)
    target_link_libraries(unet nvinfer)
    target_link_libraries(unet cudart)
    
    add_definitions(-O2 -pthread)
    
    # opencv library
    find_package(OpenCV)
    include_directories(${OpenCV_INCLUDE_DIRS})
    target_link_libraries(unet ${OpenCV_LIBS})
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述
    Cmake后生成文件:
    在这里插入图片描述

    6、错误定位:基本运行检查改为默认值(D8016:O2和RTC1命令行选项不兼容)在这里插入图片描述
    下面命令行删除,否则出现,error D8021: 无效的数值参数
    在这里插入图片描述
    7、运行测试:
    运行前需要更改路径权重参数路径:
    在这里插入图片描述
    确认使用推理的精度:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    利用unet -s命令生成引擎文件unet.engine

    在这里插入图片描述
    利用unet -d …/samples 进行测试,kTF32精度时间
    在这里插入图片描述利用unet -d …/samples 进行测试, kFP16精度时间
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    PTQ量化和QAT量化
    Sora 的工作原理(及其意义) [译]
    java面试题:java中的单例设计模式及两种实现方法的代码举例
    Nacos与Eureka的区别
    2023 年 亚太赛 APMCM ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析
    判断链表中是否有环
    uboot源码
    串口与协议-推荐阅读
    《Effective C++》条款21
    linux下安装java
  • 原文地址:https://blog.csdn.net/zhouzongzong/article/details/126334252