知识来源: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 Number | Type | Encoding |
---|---|---|
P1 | Bitmap | ASCII |
P2 | Graymap | ASCII |
P3 | Pixmap | ASCII |
P4 | Bitmap | Binary |
P5 | Graymap | Binary |
P6 | Pixmap | Binary |
PPM格式:
PPM图像格式分为两部分,分别为头部分和图像数据部分。
头部分:由3部分组成,通过换行或空格进行分割,一般PPM的标准是空格。
第1部分:P3或P6,指明PPM的编码格式,
第2部分:图像的宽度和高度,通过ASCII表示
第3部分:最大像素值,0-255字节表示。
在没有看官方教程之前,自己对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",如下图所示,改完之后正常运行.在这里做一个记录.(此前查了很多,发现没有这个问题,果真是查不到的问题不是极难就是极白痴,很明显,我就是那个白痴.)
但是看了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后面就会不起作用,但是具体为啥,我也还在查相关的资料,这个错误困扰了我两天,现在解决了,记录一下.