做了好长的时间的图像分类,用caffe训练的模型正确率很高,但是用单张图片进行测试识别时,效果特别差,检测的出来的几乎都是同一类,查了一些资料,终于找到了解决办法。
原因1:如果训练用了GPU,那么测试的时候也要注意用GPU
原因2:注意测试图片的读取格式。
我就是错在了这里,参考的博客https://blog.csdn.net/u013841196/article/details/72799680
在图片进行通道转换时,常用的代码如下:
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1)) # 通道变换,例如从(530,800,3) 变成 (3,530,800)
transformer.set_mean('data', mu) #mu是像素的均值
transformer.set_raw_scale('data', 255) # rescale from [0, 1] to [0, 255]
transformer.set_channel_swap('data', (2, 1, 0)) # swap channels from RGB to BGR
(1)当用caffe.io.load_image方式读取图片时:
image = caffe.io.load_image(image_file) #加载图片
使用caffe.io.load_image()读进来的是RGB格式和0~1(float)
所以在进行识别之前要在transformer中设置transformer.set_raw_scale('data',255)(缩放至0~255)
以及transformer.set_channel_swap('data',(2,1,0)(将RGB变换到BGR)需要下面的5行代码
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1)) # 通道变换,例如从(530,800,3) 变成 (3,530,800)
transformer.set_mean('data', mu) #mu是像素的均值
transformer.set_raw_scale('data', 255) # rescale from [0, 1] to [0, 255]
transformer.set_channel_swap('data', (2, 1, 0)) # swap channels from RGB to BGR
2.使用cv2.imread()来读取图片
cv2.imread()接口读图像,读进来直接是BGR 格式and 0~255
所以不需要再缩放到【0,255】和通道变换【2,1,0】,不需要transformer.set_raw_scale('data',255)和transformer.set_channel_swap('data',(2,1,0))只要下面的三行代码就可以
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1)) # 通道变换,例如从(530,800,3) 变成 (3,530,800)
transformer.set_mean('data', mu) #mu是像素的均值
我当初用的是cv2.imread()来读取图片,用的却是caffe.io.load_image()的代码段,所以出现了这个错误。