• 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();

  • 相关阅读:
    OAuth,JWT ,OIDC你们搞得我好乱啊
    【供应链】供应链的含义及特征
    9、鸿蒙学习-开发及引用静态共享包(API 9)
    C++心决之类和对象详解(中篇)(封装入门二阶)
    【python学习】基础篇-常用模块-re模块:正则表达式高效操作字符串
    第8天:Django Admin高级配置
    使用HTTP代理上网安全吗?
    Kafka开发环境搭建
    【校招VIP】产品分析之活动策划宣传
    Netty之I/O模型
  • 原文地址:https://blog.csdn.net/baobei0112/article/details/125425982