TensorRT5.1入門 sampleSSD

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 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字節表示。

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後面就會不起作用,但是具體爲啥,我也還在查相關的資料,這個錯誤困擾了我兩天,現在解決了,記錄一下.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章