這兩周在跑一個模型,我真的是被折騰的要崩潰了。
最后原因就是數據類型的問題,你說是不是應該管小黑屋啊。
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吧。