skimage.io.imread vs caffe.io.load_image


這兩周在跑一個模型,我真的是被折騰的要崩潰了。

最后原因就是數據類型的問題,你說是不是應該管小黑屋啊。

skimage.io.imread得到的是uint8的數據,而caffe.io.load_image得到的是0-1之間的小數。

img=skimage.io.imread(img_path), uint8,0-255

img=caffe.io.load_image(img_path), float,0-1

這個還不是最關鍵的,關鍵是在使用時的實際情況。

caffe里,使用caffe.io.load_image時,需要把值轉換為0-255之間,所以要乘255.

img=skimage.io.imread(img_path),uint8,0-255

img=caffe.io.load_image(img_path)*255,float,0-255

然后最關鍵的平方,在DL中,要減去均值才行是吧,於是

img=skimage.io.imread(img_path)-mean,uint8,0-255

img=caffe.io.load_image(img_path)*255-mean,float,0-255

 

此時看似沒什么問題。但是第一種方式,減掉均值后,很多地方變成0了。這個在對整圖操作時,可能影響還不大,但是如果你要考慮局部的信息,比如像素點的局部信息,此時你就等着吧,絕對因為大部分是0,什么都沒有了。

而第二種情況,因為是浮點數,減均值后還是有值的,在0附近的小數,於是這個還是比較正常的輸入值,對DL來說,當你定位到局部信息時,還是比較真實的。

於是,我是這么做的,把第一種情況得到的圖像都乘以1.0,然后就看到圖像的像素值變成浮點型了。這樣以來,在減均值時,就好了。

img=(skimage.io.imread(img_path))*1.0,uint8,0-255

img=caffe.io.load_image(img_path)*255,float,0-255

 

這個問題可是困擾了我N天啊,真是個大坑,掉進去了,希望以后再用python時能夠注意到這個問題。

 

羅嗦那么多,其實最重要的是均值要是浮點型的,不要四舍五入,其實img轉換根本沒什么用在這里,關鍵還是均值,一定不能是整型數啊。

 

我真的是繞了個大彎啊,我的天呢。

 

還有一個坑,如果你讀圖時賦值給img=skimage.io.imread(img_path)

但是,如果你減均值時這么干的,

img -= mean

 

那么你必須在讀取圖像后趕快把img后面乘上1.0了,轉成浮點型,要不然的話,減掉均值再賦值給img,還是給轉成整型了,於是還是不行啊。

唉,真的是各種坑啊,所以以后還是乖乖用caffe的io吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM