前篇:自己的歪曲理解
前段時間用matlab提特徵,畢竟我是小白,matlab對我來講是最容易編程的了(雖然,大牛的變成結構很好,我的就只能浪費時間複雜度了,唉~~~),但是效果還是可以的。
最近需要用python來改寫代碼,從昨天白天到今天上午,我用python提出來的特徵竟然和matlab不一樣。。。。天哪。。。。怎麼可能呢。同樣的結構,同樣的參數,同樣的圖片,怎麼可能不一樣呢。
後來,我仔細對比了兩個代碼,發現了下面兩點需要特別注意的地方。
1. 注意,python中
transformer=caffe.io.Transformer({'data': net.blobs['data'].data.shape})
這句話中圖片的大小是(160,160,3)
之後transformer.set_transpose('data', (2,0,1))中圖片的大小變為(3,160,160)
而transformer.set_mean('data', np.load(meanFile))中,mean檔案的大小是(3,160,160),所以為了遷就mean檔案的維數,故意將data維數變換了一下。
但是,進caffe,維數要變成(160,160,3)啊,(好麻煩,但是大神肯定有好方法,我不知道,希望各位指點我~~~在這裡,xinyu謝過大家了~~~),所以,又加了一句transformer.set_channel_swap('data', (2,1,0))。這裡為什麼是(2,1,0),而不是(1,2,0),是因為要和我的matlab匹配,我的matlab裡是height*width*3的,所以這裡就是這樣的。這個大家提特徵的時候也要注意。
2. 特大注意。
matlab裡匯入圖片的時候是(0,255)的是把,但是。python匯入caffe裡的可不是哦。caffe.io.load_image(image)這句話中,caffe匯入的圖片是(0,1)的。
我天,我這一晚上加一上午,就發現了這一個問題,天哪。。。
是的,如果你想要和你的matlab一樣的結果,那麼,你的這裡要寫成caffe.io.load_image(image)*255。
經過折騰,終於一樣了。。。
這很重要,大家一定要留意了。
總結:
1 維數問題
2 caffe輸入圖片問題
後篇:網友的好心協助
以為自己特別有理的時候,出現了一位網上的朋友(csdn號:nusit_305,太感謝他了),告訴我我的理解是錯誤的,來自於我對python庫理解的不深刻,以及caffe python介面理解不深刻。誤導大家了。著實不好意思。
下面是正確解釋:
(1)python內建的映像庫讀入的映像是H*W*C維度順序,caffe是使用opencv,讀入的映像是C*H*W維度順序,io.set_transpose()功能是實現H*W*C轉換為C*H*W,這樣就統一成N*C*H*W的blob中資料格式。
(2)讀取的映像正常是RGB通道儲存,使用io.set_channel_swap()是將RGB轉換成BGR通道順序。
(3)不是caffe匯入的圖片是(0,1),原因是python介面使用的matplotlib庫,這個庫載入的圖片數值是[0,1],可以使用介面函數set_raw_scale(‘data’,255)實現[0,1]–>[0,255].