FCN8s 转 tensorrt(通过wts文件)

TensorRT学习(1):通过pth生成wts文件 TensorRT学习(1):通过pth生成wts文件 1. pth文件简介 pth文件是pytorch保存模型的一种方式,该文件只保存模型的参数。模型参数实际上一个字典类型,通过key-value的形式存储。 2. wts文件格式示例(来自wang-xinyu大佬的github) 第一行代表该文件有多少行,不包括它本身。之后每行格式为: [weight name] [value count = N] [value1] [value2], ..., [valueN] 10 conv1.weight 阅读详情

先用pytorch训练FCN,然后把权重的pth文件,先转为wts文件,然后在NX板上转为tensorrt的engine文件

只写具体思路和遇到的问题,完整版参考github

这里写的是paper里的由vgg16而来的FCN,首先实现vgg16的tensorrt
先来看下vgg16的结构

'vgg16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']

其中每一层的数字表示输出的channel数,输入channel是前一个数字,每层后面带有relu层,M表示max pooling layer

参考pytorch版vgg代码,可知
每个卷积层默认kernel size=3, padding=1, max pooling的kernel size=2, stride=2

首先定义输入层(现在实现的是create engine函数)

ITensor* data = network->addInput(INPUT_BLOB_NAME, dt, Dims3{3, INPUT_H, INPUT_W}); //输入size,这里是3通道

输入size根据实际需要,这里是640x640

然后从wts文件里面load weights

std::map<std::string, Weights> weightMap = loadWeights("../fcn.wts"); //wts文件对应的文件夹

这里实现一个卷积层,一个relu层,一个max pooling层,后面整个vgg以此类推
实现第一个block,也就是[64, 64, M]
注意我们这里的vgg并不需要自己训练,直接用官网的预训练权重即可,可以看到wts文件中是pretrained_net.features.X.weight, X的位置是数字,那么怎么知道X的数字对应VGG的第几层呢?我们可以数,从0开始,比如[64, 64, M]
0对应第一层,1对应64后跟着的relu,2对应第2个64, 3对应后面跟着的relu,4对应M,以此类推

那么第一层卷积层可以这样写

//64是输出channel,输入channel不需要指定
IConvolutionLayer* conv1 = network->addConvolutionNd(*data, 64, DimsHW{3, 3}, weightMap["pretrained_net.features.0.weight"], weightMap["pretrained_net.features.0.bias"]);
conv1->setPaddingNd(DimsHW{1, 1}); //H, W padding=1

然后是relu层

IActivationLayer* relu1 = network->addActivation(*conv1->getOutput(0), ActivationType::kRELU);

第二个64

conv1 = network->addConvolutionNd(*relu1->getOutput(0), 64, DimsHW{3, 3}, weightMap["pretrained_net.features.2.weight"], weightMap["pretrained_net.features.2.bias"]);
conv1->setPaddingNd(DimsHW{1, 1});
relu1 = network->addActivation(*conv1->getOutput(0), ActivationType::kRELU);

max pooling

IPoolingLayer* pool1 = network->addPoolingNd(*relu1->getOutput(0), PoolingType::kMAX, DimsHW{2, 2});
pool1->setStrideNd(DimsHW{2, 2});

这样就完成了第一个block [64, 64, ‘M’],后面的写法一样
这样就完成了VGG16的部分

VGG16一共有5个max pooling layer, 记作pool1 ~ pool5

根据paper可知,FCN是要把pool5进行反卷积,和pool4相加,还要把相加的结果过bn层和relu层后,再和pool3相加,具体见下图

这里实现把pool5进行反卷积,和pool4相加的部分,其他以此类推
在这里插入图片描述定义反卷积层

IDeconvolutionLayer* deconv1 = network->addDeconvolutionNd(*pool5->getOutput(0), 512, DimsHW{3,3}, weightMap["deconv1.weight"], weightMap["deconv1.bias"]);

deconv1->setStride(DimsHW{2, 2});
deconv1->setPrePadding(DimsHW{1, 1}); //pytorch中的padding
deconv1->setDilationNd(DimsHW{1, 1}); //pytorch中的dilation
deconv1->setPostPadding(DimsHW{2, 2}); //pytorch中的output_padding

定义相加层,把pool5的反卷积层和pool4加起来

IElementWiseLayer* out1 = network->addElementWise(*pool4->getOutput(0), *deconv1->getOutput(0), ElementWiseOperation::kSUM);

但是这里遇到了问题,出现了以下error

Error Code 9: Internal Error ((Unnamed Layer* 32) [ElementWise]: broadcast dimensions must be conformable

这是因为相加的维度不匹配,那么需要看一下输入维度分别是什么
我们把输入维度打印出来,需要看pool5, deconv1和pool4的维度

cout << "pool5 shape" << endl;
cout << pool5->getOutput(0)->getDimensions().d[0] << endl;
cout << pool5->getOutput(0)->getDimensions().d[1] << endl;
cout << pool5->getOutput(0)->getDimensions().d[2] << endl;

可以看到

pool5 shape
512
20
20
deconv1 shape
512
39
39
pool4 shape
512
40
40

可以看到pool5的size是20 x 20, 但卷积后变成了39 x 39, 和pool4的40 x 40不匹配

查了pytorch ConvTranspose2d的文档,输出的size应该是

Hout​=(Hin​−1)×stride[0]−2×padding[0]+dilation[0]×(kernel_size[0]−1)+output_padding[0]+1
Wout​=(Win​−1)×stride[1]−2×padding[1]+dilation[1]×(kernel_size[1]−1)+output_padding[1]+1

用这个公式计算,deconv1的size应该是40 x 40的,除非实现细节和pytorch不同,通过尝试,把post padding改为0,结果变成了40 x 40, 即需要把这行注释掉,具体实现底层细节不是很清楚

//deconv1->setPostPadding(DimsHW{2, 2}); //pytorch中的output_padding

然后过一个bn层

IScaleLayer* bn1 = addBatchNorm2d(network, weightMap, *out1->getOutput(0), "bn1", 1e-5);

addBatchNorm2d的实现细节如下

IScaleLayer* addBatchNorm2d(INetworkDefinition *network, std::map<std::string, Weights>& weightMap, ITensor& input, std::string lname, float eps) {
    float *gamma = (float*)weightMap[lname + ".weight"].values;
    float *beta = (float*)weightMap[lname + ".bias"].values;
    float *mean = (float*)weightMap[lname + ".running_mean"].values;
    float *var = (float*)weightMap[lname + ".running_var"].values;
    int len = weightMap[lname + ".running_var"].count;
    std::cout << "len " << len << std::endl;

    float *scval = reinterpret_cast<float*>(malloc(sizeof(float) * len));
    for (int i = 0; i < len; i++) {
        scval[i] = gamma[i] / sqrt(var[i] + eps);
    }
    Weights scale{DataType::kFLOAT, scval, len};

    float *shval = reinterpret_cast<float*>(malloc(sizeof(float) * len));
    for (int i = 0; i < len; i++) {
        shval[i] = beta[i] - mean[i] * gamma[i] / sqrt(var[i] + eps);
    }
    Weights shift{DataType::kFLOAT, shval, len};

    float *pval = reinterpret_cast<float*>(malloc(sizeof(float) * len));
    for (int i = 0; i < len; i++) {
        pval[i] = 1.0;
    }
    Weights power{DataType::kFLOAT, pval, len};

    weightMap[lname + ".scale"] = scale;
    weightMap[lname + ".shift"] = shift;
    weightMap[lname + ".power"] = power;
    IScaleLayer* scale_1 = network->addScale(input, ScaleMode::kCHANNEL, shift, scale, power);
    assert(scale_1);
    return scale_1;
}

到这里,所有的模块实现都已完成,剩下的就是组装了

可能还会遇到一个error

Error Code 10: Internal Error (Could not find any implementation for node 

这个问题的原因大概率是内存没分配够

config->setMaxWorkspaceSize(XX) //具体依情况而定

这样就能生成fcn.engine文件了

深入浅出之wts文件 wts文件在深度学习模型的存储、共享和部署中起到了重要的作用。它允许用户将复杂的模型权重信息简化为一种便于管理和迁移的格式,使得模型的使用变得更加高效和灵活。在实际应用中,了解和使用.wts文件格式有助于优化模型的开发流程。 阅读详情

相关推荐

unity转微信小游戏:使用CDN加载游戏(微信开发者工具云开发CDN)

unity转微信小游戏:使用CDN加载游戏(微信开发者工具云开发CDN)

会潜水的小火龙的博客 3071

TensorRT实现EfficientDet推理加速(二)

一、参考资料 为什么你比官方的运行速度快 全网第一SoTA成绩却朴实无华的pytorch版efficientdet PyTorch转TensorRT流程 一文掌握Pytorch-onnx-tensorrt模型转换 onnx-tensorrt安装 ONNX前向inference调试 二、重要说明 论文中介绍说EfficiendDet-D1(640)的infer速度为16ms,实际上测试没有那么快;需要跑一下 efficientdet官方仓库 代码,测试真实速度; 在GTX 1650(4GB)显卡上,测试Ef

IT菜鸟 4461

Docker深度详解:从原理到实践的全方位指南

本文深入解析了Docker容器化技术的核心原理与实战应用。主要内容包括:1) Docker核心架构与优势,对比容器与虚拟机的关键差异;2) 企业级部署方案,涵盖离线安装与多镜像源配置;3) 高级镜像构建技术,如参数化构建、缓存优化及安全扫描;4) 容器生命周期管理,包括健康检查、资源限制及数据持久化方案。文章提供了丰富的代码示例和生产级配置建议,如使用Trivy进行安全扫描、精确控制容器资源等技术细节,帮助开发者全面掌握现代容器化技术。

weixin_42593797的博客 1280

[模型部署] ONNX模型转TRT模型部分要点

ONNX模型转TRT模型时的部分要点。

LaineGates的专栏 1312

三维重建之条纹投影结构光(三)——相位展开优化与多频外差实践

本文深入探讨了三维重建中条纹投影结构光技术的核心环节——相位展开优化。针对传统路径跟踪法存在的误差传播与路径依赖问题,重点解析了多频外差法的原理与优势,并通过详细的C++代码实践,展示了如何利用三频外差法实现鲁棒、高精度的相位展开,从而获得连续的绝对相位图,为后续三维点云生成奠定坚实基础。

weixin_29074295的博客 529

深入剖析:NAND Flash与SD NAND(贴片式SD卡)存储扇区分配表架构差异与优化策略

本文深入探讨了NAND Flash与SD NAND(贴片式SD卡)在存储技术中的架构差异及其优化策略。NAND Flash作为非易失性存储器,依赖主控芯片进行坏块管理和磨损均衡,而SD NAND则通过内置控制器和标准文件系统(如FAT)简化了存储管理。两者在写入性能、容量扩展和可靠性方面各有优劣,NAND Flash需通过磨损均衡和写入合并优化性能,而SD NAND则通过高容量和高速传输提升效率。文章为嵌入式系统开发者和硬件工程师提供了关于如何根据需求选择并优化存储介质的参考。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1236

Error Code 10: Internal Error (Could not find any implementation for node xxx_xx.)解决方法

Error Code 10: Internal Error (Could not find any implementation for node xxx_xx.)解决方法

zhaozebin666的博客 5267

实验手册(灾难恢复)

我们发现DC1与DC2的复制出现问题,此时我们检查了在DC2中,DC1是否被正确注册。这里选择还原系统状态,因为我们原DC1上只备份了AD的数据,所以我们在新的这台服务器上还原的也是AD数据库。因为我们是单域下的测试,只测试了一个域,所以它会出现这样的报错。我们选择远程共享文件夹,我们备份的时候,是在备份这台服务器上的。同时删除SRV记录,A记录,NS记录,SOA记录,框框里面的所有有关dc1的记录全部删除。如果在企业中AD数据的备份是每周或者每月都会有一次备份,选择恢复AD数据库的时间。

weixin_52364868的博客 1309

YOLOv5目标检测实战:Jetson Nano部署

PyTorch版的YOLOv5是高性能的实时目标检测方法。Jetson Nano是英伟达含有GPU的人工智能硬件。本课程讲述如何部署YOLOv5在Jetson Nano开发板上。部署完成后可进行图像、视频文件和摄像头视频的实时目标检测。部署时使用AI视频处理加速引擎TensorRT和DeepStream。 课程内容包括:原理篇(DeepStream介绍、TensorRT介绍、 tensorrtx介绍)、实践篇(Nano硬件搭建、烧录系统镜像、安装远程登录工具、安装和测试DeepStream、安装yolov5、生成yolov5s.wts文件、生成yolov5s.engine、使用DeepStream部署yolov5、Nano部署测试)

Cadence OrCAD: 层次化设计 Hierarchical Design

详细介绍OrCAD的原理图层次化设计方法。

Fantasy237的博客 1万+

什么是 SAPGUI 里的 Logon Group/Server

这意味着,不同的用户连接可以被分配到不同的应用服务器,以实现均衡的资源利用和降低某一服务器的负载压力。在这种配置下,欧洲的用户登录时选择“EUROPE_GROUP”,系统将自动选择一个位于欧洲的数据中心的服务器进行连接,这样不仅减少了网络延迟,还实现了服务器间的负载均衡。用户在 SAPGUI 中登录时,只需选择相应的 Logon Group(例如“FIN_GROUP”),系统就会自动将他们的连接请求分配到当前负载最小的应用服务器上,这种动态分配大大提升了系统的响应速度和稳定性。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1069

TensorRT 加载模型onnx报错: Error Code 10: Internal Error (Could not find any implementation for node

Error Code 10: Internal Error (Could not find any implementation for node

努力是为了躺平 4039

3D结构光 vs TOF——手机厂商为何选择TOF方案?

3D视觉感知技术路线分析:结构光与TOF对比 3D视觉感知领域存在结构光和TOF两大主流技术。结构光基于三角定位法,精度高(毫米级)但工作距离短(<1.5米),适合人脸识别等近距离场景;TOF通过测量光脉冲飞行时间计算深度,精度中等(厘米级)但工作距离长(0.5-5米+),更适合AR导航等中远距离应用。手机厂商选型时考虑:前置认证选择结构光(如苹果FaceID),后置场景倾向TOF(安卓阵营),因后者更适配全面屏设计、环境适应性强且成本优势明显。两种技术互补共存,共同推动3D感知应用发展。

致力于lidar应用开发 111

wts文件生成engine文件的方法

在电脑上(x_86平台)上获取wts文件,并将该文件转移到jetson平台上,这里以yolov5.wts为例: (备注):获取wts文件方法可参考以下链接(只要获得wts文件,则链接内剩余内容无需看): Pytorch模型–>wts 文件–>TensorRT模 下载tensorrtx项目(这里使用的是yolo5-v3.0版本): cd ~/ git clone -b yolov5-v3.0 https://github.com/wang-xinyu/tensorrtx.git 将yolov5.w

郭建洋的博客 6499

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

onnx转wts文件与转engine文件的区别

Engine文件是TensorRT的序列化模型,其中包含神经网络的结构和权重。可以在TensorRT中使用Engine文件来进行推理。- WTS文件是权重文件,其中包含神经网络的所有参数,但不包括网络结构。可以在TensorRT中使用WTS文件来加载预先训练好的权重。因此,如果您只需要加载预先训练好的权重,则可以将ONNX转换为WTS文件。如果您需要进行推理,则应将ONNX转换为Engine文件。ONNX转换为WTS文件和转换为Engine文件有一些区别。

maobin_1的博客 1354

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

PaddleOCR推理报错:Broadcast维度不匹配问题解析与解决

PaddleOCR推理报错:Broadcast维度不匹配问题解析与解决 【免费下载链接】PaddleOCR 飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits...

gitblog_01418的博客 635

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

yolov5 C++部署学习笔记

yolov5 C++部署学习笔记 2, yolov5.cpp 1,分配显卡cudaSetDevice(DEVICE);2, 加载engine模型

2985

Jetson nano + yolov5 + TensorRT

救救孩子

weixin_55014591的博客 824

[Debug] TensorRT-Polygraph工具

[Debug] TensorRT-Polygraph工具

ccheiheihei的博客 1890

生成tensorrt引擎错误记录-yolov5

warning: ‘nvinfer1::Dims::type’ is deprecated [-Wdeprecated-declarations] note:TRT_DEPRECATED DimensionType type[MAX_DIMS]; //!< The type of each dimensi

qq_42362891的博客 1万+

【解决方案】onnx 转 TensorRT (.plan, .trt) 报错 Error[10]: Could not find any implementation 或 OutOfMemory 问题

【解决】将动态输入输出的 .onnx 模型转化为 .plan 过程中,出现了 Error[10] Could not find any implementation for node {ForeignNode 报错。

weixin_44212848的博客 4005

TensorRT5输出engine网络层

        由于TensorRT5的API相对于TensorRT4有了不少改变,特别是删除了config类,无法打印转换后生成的trt_engine网络层。通过依次读取network每个layer并判断layer类别,输出layer的设置属性,可以达到更好的查看效果。         代码如下: const std::string kShowLayerType[24] = { "...

mengdeyuanterry的博客 2964

YOLOv5(PyTorch)目标检测实战:TensorRT加速部署

PyTorch版的YOLOv5是高性能的实时目标检测方法。 TensorRT是针对英伟达GPU的加速工具。本课程讲述如何使用TensorRT对YOLOv5进行加速和部署。   本课程的YOLOv5使用ultralytics/yolov5,分别在Ubuntu和windows10系统上做TensorRT加速和部署演示。课程内容包括:原理篇(YOLOv5网络架构与组件、TensorRT基础、TensorRT INT8量化、tensorrtx介绍、CUDA编程方法)、实践篇(Ubuntu和Windows10系统上的TensorRT部署演示)、代码解析篇(YOLOv5的TensorRT加速的代码解析) 。本课程提供注释后的YOLOv5的TensorRT加速代码。 除本课程《YOLOv5(PyTorch)目标检测实战:TensorRT加速部署》外,本人推出了有关YOLOv5目标检测的系列课程。请关注该系列的其它视频课程,包括:《YOLOv5(PyTorch)目标检测实战:训练自己的数据集》Ubuntu系统:https://edu.youkuaiyun.com/course/detail/30793Windows系统:https://edu.youkuaiyun.com/course/detail/30923《YOLOv5(PyTorch)目标检测:原理与源码解析》https://edu.youkuaiyun.com/course/detail/31428《YOLOv5(PyTorch)目标检测实战:Flask Web部署》https://edu.youkuaiyun.com/course/detail/31140

NVIDIA Xavier pytorch深度学习环境配置 & yolov5目标检测 & TensorRT加速

xavier 目标检测 深度学习 pytorch

qq_44942565的博客 5377

Jetson Nano | DeepStream部署Yolov5(Pytorch模型-->wts 文件-->TensorRT模型)

https://blog.youkuaiyun.com/onetwothree_go/article/details/116132760 https://zhuanlan.zhihu.com/p/296314513 https://blog.youkuaiyun.com/hahasl555/article/details/116500763?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162948266716780264096806%2522%252C%252

W1995S的博客 1万+
上一篇: leetcode 1306. Jump Game III(跳跃游戏 3)
下一篇: jetson nx tensorRT: 使用engine文件进行网络推理(语意分割,内存零copy,同步异步inference)
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值