TensorRT5.1入门 sampleSSD

15 篇文章 0 订阅

1.PPM格式图像

知识来源:PPM文件格式详解(侵删,用作学习积累)
  PPM(Portable Pixmap Format)是源自PBM(位图bitmap,仅有黑与白,没有灰)和PGM(grayscale map,灰度图),PPM是通过RGB三种颜色显现的图像(pixmaps).
  这三种图,无论哪种图像文件都是通过2个字节[magic number]来表明文件格式的类型以及编码方式(ASCII或者Binary),magic number分别为P1,P2,P3,P4,P5,P6.

Magic NumberTypeEncoding
P1BitmapASCII
P2GraymapASCII
P3PixmapASCII
P4BitmapBinary
P5GraymapBinary
P6PixmapBinary

PPM格式:
PPM图像格式分为两部分,分别为头部分和图像数据部分。
头部分:由3部分组成,通过换行或空格进行分割,一般PPM的标准是空格。
第1部分:P3或P6,指明PPM的编码格式,
第2部分:图像的宽度和高度,通过ASCII表示
第3部分:最大像素值,0-255字节表示。

2.执行过程中的问题:[E] [TRT] mbox_conf: all concat input tensors must have the same dimensions except on the concatenation axis

在没有看官方教程之前,自己对SSD尝试的做demo,输出以下错误.

[E] [TRT] mbox_conf: all concat input tensors must have the same dimensions except on the concatenation axis.

提示进行concat的数据的dimensions不同,无法做concat,当时为了尽快跑出demo,就直接没有思考为什么就看了教程,如下图所示.
在这里插入图片描述
  观察第二步骤,让我将所有的Flatten参数格式改为reshape_param格式. 我按照教程所写,逐步更改flatten_param改成reshape_param的形式, 在我所用的sampleSSD网络中,就是12个Flatten层的更改.
在这里插入图片描述  后来发现,执行仍然报错,仍然提示我concat输入的tensor的dims必须相同,和上面的报错一样.
  重新检查了一次每个reshape的输出,发现并没有错误.
  后来才知道,因为没用过caffe,对.prototxt的书写格式并不熟悉,除了修改param之外,type值也要从"Flatten"改为"Reshape",如下图所示,改完之后正常运行.在这里做一个记录.(此前查了很多,发现没有这个问题,果真是查不到的问题不是极难就是极白痴,很明显,我就是那个白痴.)
[E] [TRT] mbox_conf: all concat input tensors must have the same dimensions except on the concatenation axis

后来想了想,为什么一定要把flatten层改成Reshape层,Flatten作为特殊的Reshape,应该也不会出现dim不同的报错,因为flatten层说到底就是特殊的Reshape层.

但是看了warning,感觉大致的意思就是Flatten层将输入隐式的flatten到fc层,但是其他情况下会造成未定义的情况.

Warning: Flatten layer ignored. TensorRT implicitly flattens input to FullyConnected layers, but in other circumstances this will result in undefined behavior.

我就怀疑是Flatten层根本没有起到自己的作用.
  于是我将concat层去掉,先后输出了Flatten层和修改之后的Reshape层(为了好找错误我将SSD分成了conf,loc和prior三个单独网络,下图是基于loc网络的,基于6种feature map输出了6个层)
在这里插入图片描述  如上图所示,在未将flatten层改成reshape层之前,flatten之后的层的输出,就是feature map的原来大小,没有被展平,说明flatten层在这里完全没有起作用.下面是改为Reshape之后.
在这里插入图片描述  如上图所示,6个输出层输出了应该有的展平之后的结果,比如conv4_3_norm_mbox_loc_flat层,这里显示的输出是23104 * 1 * 1, 是由最初 512 * 38 * 38 的conv4 做卷积成为 16 * 38 * 38 (16=4*4=class_num * 4(这个4代表box的四个用来定位的值)).而38 * 38 * 16恰好等于23104,reshape(展平)之后,恰好是23104 * 1 * 1.
由此看来,Flatten层确实是不起作用的,所以才导致最上面的报错,于是我就去查了官方文档.在TensorRT5.x的文档上没有找到确切的Flatten的信息,但是在TensorRT4.0的开发者文档中,有这么一个部分介绍Flatten.

在这里插入图片描述
  好了,这下明白了,Flatten只能用在FC层前面,结合Warning,可能Flatten接在Permute之后的Conv后面就会不起作用,但是具体为啥,我也还在查相关的资料,这个错误困扰了我两天,现在解决了,记录一下.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值