先用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->

本文档介绍了如何利用PyTorch训练FCN模型,并将权重转换为TensorRT engine文件的过程。首先,通过vgg16结构创建TensorRT网络,加载wts权重文件。接着,详细阐述了构建卷积、ReLU和最大池化层的步骤,特别关注了维度匹配问题,如在反卷积层中调整输出尺寸以匹配pooling层。在实现过程中遇到了维度不匹配的错误,通过调整反卷积层的参数解决了该问题。最后,讨论了内存分配不足导致的错误及解决方案,成功生成了fcn.engine文件。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



