我正在使用Caffe框架和python,我用这些图片取出了部分图像:
image = cv2.imread(picture_address)
roi = picture[ y:y+hight, x:x+width]
正如我刚才注意到opencv将图像保存为 numpy.ndarray BGR(而不是rgb)。
当我试图将这个感兴趣的区域传递给Caffe时:
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', mean_array)
net.blobs['data'].data[...] = transformer.preprocess('data', roi)
out = net.forward()
我从Caffe那里得到了错误的预测,但当我拿出那部分并将其保存为文件并使用时:
image = caffe.io.load_image(picture_address)
我会得到正确的预测。所以我得到上面代码的type(image)
,它也是numpy.ndarray
(有人说它是数据类型,并尝试转换它但它是所以两个代码都将图像保存为numpy,但是当我打印出numpy数组时,第一个(Opencv)元素在0-255(整数)范围内,第二个(numpy)在0-1(浮点数)之间,并且两个数组都具有相同的维度(width,height ,color_channels)
。当我做cv2.imshow(ROI)
我看到相同的图像,但Caffe做了不同的预测。
我的问题是:如何将Opencv numpy更改为Caffe numpy以获得真正的预测?
编辑(感谢@Shai评论):
我做了
a = np.array(img, dtype=np.float32)/255
但是当我做print a[0][0]
时我得到了
[ 0.91764706 0.9137255 0.94509804]
来自OpenCV矩阵和
[ 0.90588236 0.9137255 0.96078432]
来自Caffe numpy,这是正确的。尺寸是否改变了?我真的很困惑。
EDIT2:
在cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
之后,两个矩阵看起来相同但在深度检查中,opencv看起来像:
<type 'numpy.ndarray'>
[[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
**[ 0.90196079 0.90980393 0.95686275]** different row
[ 0.90196079 0.90980393 0.95686275]
[ 0.90196079 0.90980393 0.95686275]
[ 0.90196079 0.90980393 0.95686275] ...
和Caffe看起来像:
<type 'numpy.ndarray'>
[[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
[ 0.90588236 0.9137255 0.96078432]
**[ 0.90588236 0.9137255 0.96078432]** different row
[ 0.90196079 0.90980393 0.95686275]
[ 0.90196079 0.90980393 0.95686275]
[ 0.90196079 0.90980393 0.95686275] ...
也许这就是预测不同的原因。但在cv.imshow()
中看起来相同。