标签:
这两周在跑一个模型,我真的是被折腾的要崩溃了。
最后原因就是数据类型的问题,你说是不是应该管小黑屋啊。
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时能够注意到这个问题。
罗嗦那么多,其实有一种直接的办法,如果均值是浮点型的,不要四舍五入,即使不作转换,第一种情况也不会是大部分0了,看来在python里也是遵守类型转换往高一级的类型靠拢的原则啊。
我真的是绕了个大弯啊,我的天呢。
skimage.io.imread vs caffe.io.load_image
标签:
原文地址:http://www.cnblogs.com/jianyingzhou/p/4571454.html