• yolov5 C++部署学习笔记


    1,common.cpp 使用tensorrt API 搭建yolov5模块单元

    1. 1)头文件
    2. #include "NvInfer.h" //tensorrt API的头文件
    3. #include "yololayer.h" //tensorrt 插件头文件
    4. #include <opencv2/opencv.hpp> //opencv 头文件
    5. 2)命名空间
    6. using namespace nvinfer1;
    7. 3)网络layer实现及其他函数实现
    8. //yolov5 需要实现的网络layer包括:convBlock, focus,bottleneck, bottleneckCSP, C3,SPP,SPPF,yololayer的插件layer
    1. 3.1 convBlock
    2. ILayer* convBlock(INetworkDefinition *network, std::map<std::string, Weights>& weightMap, ITensor& input, int outch, int ksize, int s, int g, std::string lname) {
    3. Weights emptywts{ DataType::kFLOAT, nullptr, 0 };
    4. int p = ksize / 3;
    5. IConvolutionLayer* conv1 = network->addConvolutionNd(input, outch, DimsHW{ ksize, ksize }, weightMap[lname + ".conv.weight"], emptywts);
    6. assert(conv1);
    7. conv1->setStrideNd(DimsHW{ s, s });
    8. conv1->setPaddingNd(DimsHW{ p, p });
    9. conv1->setNbGroups(g);
    10. IScaleLayer* bn1 = addBatchNorm2d(network, weightMap, *conv1->getOutput(0), lname + ".bn", 1e-3);
    11. // silu = x * sigmoid
    12. auto sig = network->addActivation(*bn1->getOutput(0), ActivationType::kSIGMOID);
    13. assert(sig);
    14. auto ew = network->addElementWise(*bn1->getOutput(0), *sig->getOutput(0), ElementWiseOperation::kPROD);
    15. assert(ew);
    16. return ew;
    17. }

    2, yolov5.cpp

    1. // 1,创建一个网络生成器
    2. IBuilder* builder = createInferBuilder(gLogger);
    3. // 2,生成一个空的网络
    4. INetworkDefinition* network = builder->createNetwork();
    5. // 3,添加输入
    6. ITensor* data = network->addInput(INPUT_BLOB_NAME, dt, Dims3{ 3, INPUT_H, INPUT_W });
    7. // 4, 添加网络层 common.h

    1,分配显卡

    cudaSetDevice(DEVICE);

    2, 加载engine模型

    1. #创建推理进行时runtime
    2. IRuntime* runtime = createInferRuntime(gLogger);
    3. assert(runtime != nullptr);
    4. #创建引擎,反序列化二值引擎文件
    5. ICudaEngine* engine = runtime->deserializeCudaEngine(trtModelStream, size);
    6. assert(engine != nullptr);
    7. #创建执行上下文contex,用于推理
    8. IExecutionContext* context = engine->createExecutionContext();

  • 相关阅读:
    Qt5开发从入门到精通——第六篇三节( 图像与图片——双缓冲机制)
    SpringBoot项目打印接口请求日志,CommonsRequestLoggingFilter实现方式
    物联网设备安全性:构建可信任的智能生态系统
    面试题库(六):数据库相关
    内网隧道代理技术(二十三)之 DNS隧道反弹Shell
    Linux基础
    mybatis用拦截器实现字段加解密
    电子电气架构 --- 关于DoIP的一些闲思 下
    2023年节假日JSON
    JavaScript面向对象
  • 原文地址:https://blog.csdn.net/baobei0112/article/details/125425982