对于同一网络,python 和 MATLAB caffe 的结果不同
Results for python and MATLAB caffe are different for the same network
我正在尝试移植 MTCNN_face_detection_alignment 的 MATLAB 实现
至 python。我对 MATLAB 和 python.
使用相同版本的 caffe 绑定
重现问题的最少可运行代码:
MATLAB:
addpath('f:/Documents/Visual Studio 2013/Projects/caffe/matlab');
warning off all
caffe.reset_all();
%caffe.set_mode_cpu();
caffe.set_mode_gpu();
caffe.set_device(0);
prototxt_dir = './model/det1.prototxt';
model_dir = './model/det1.caffemodel';
PNet=caffe.Net(prototxt_dir,model_dir,'test');
img=imread('F:/ImagesForTest/test1.jpg');
[hs ws c]=size(img)
im_data=(single(img)-127.5)*0.0078125;
PNet.blobs('data').reshape([hs ws 3 1]);
out=PNet.forward({im_data});
imshow(out{2}(:,:,2))
Python:
import numpy as np
import caffe
import cv2
caffe.set_mode_gpu()
caffe.set_device(0)
model = './model/det1.prototxt'
weights = './model/det1.caffemodel'
PNet = caffe.Net(model, weights, caffe.TEST) # create net and load weights
print ("\n\n----------------------------------------")
print ("------------- Network loaded -----------")
print ("----------------------------------------\n")
img = np.float32(cv2.imread( 'F:/ImagesForTest/test1.jpg' ))
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
avg = np.array([127.5,127.5,127.5])
img = img - avg
img = img*0.0078125;
img = img.transpose((2,0,1))
img = img[None,:] # add singleton dimension
PNet.blobs['data'].reshape(1,3,img.shape[2],img.shape[3])
out = PNet.forward_all( data = img )
cv2.imshow('out',out['prob1'][0][1])
cv2.waitKey()
我使用的模型位于 here(det1.prototxt 和 det1.caffemodel)
我用来获得这些结果的图像:
两种情况下我得到的结果:
结果相似,但不相同。
UPD:看起来不是类型转换问题(已更正,但没有任何改变)。
我在 matlab 中保存了 conv1 层(第一个通道)之后的卷积结果,并在 python 中提取了相同的数据,两个图像现在都显示为 python cv2.imshow。
输入层的数据(data)完全一样,我用同样的方法检查了
正如您所见,即使在第一个 (conv1) 层上也能看到差异。
看起来内核以某种方式发生了变化。
谁能说出隐藏的差异在哪里?
找到问题源了,是因为MATLAB看到图像转置了。
此 python 代码显示与 MATLAB 代码相同的结果:
import numpy as np
import caffe
import cv2
caffe.set_mode_gpu()
caffe.set_device(0)
model = './model/det1.prototxt'
weights = './model/det1.caffemodel'
PNet = caffe.Net(model, weights, caffe.TEST) # create net and load weights
print ("\n\n----------------------------------------")
print ("------------- Network loaded -----------")
print ("----------------------------------------\n")
img = np.float32(cv2.imread( 'F:/ImagesForTest/test1.jpg' ))
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img=cv2.transpose(img) # <----- THIS line !
avg = np.float32(np.array([127.5,127.5,127.5]))
img = img - avg
img = np.float32(img*0.0078125);
img = img.transpose((2,0,1))
img = img[None,:] # add singleton dimension
PNet.blobs['data'].reshape(1,3,img.shape[2],img.shape[3])
out = PNet.forward_all( data = img )
# transpose it back and show the result
cv2.imshow('out',cv2.transpose(out['prob1'][0][1]))
cv2.waitKey()
感谢所有在评论中给我建议的人!
我正在尝试移植 MTCNN_face_detection_alignment 的 MATLAB 实现 至 python。我对 MATLAB 和 python.
使用相同版本的 caffe 绑定重现问题的最少可运行代码:
MATLAB:
addpath('f:/Documents/Visual Studio 2013/Projects/caffe/matlab');
warning off all
caffe.reset_all();
%caffe.set_mode_cpu();
caffe.set_mode_gpu();
caffe.set_device(0);
prototxt_dir = './model/det1.prototxt';
model_dir = './model/det1.caffemodel';
PNet=caffe.Net(prototxt_dir,model_dir,'test');
img=imread('F:/ImagesForTest/test1.jpg');
[hs ws c]=size(img)
im_data=(single(img)-127.5)*0.0078125;
PNet.blobs('data').reshape([hs ws 3 1]);
out=PNet.forward({im_data});
imshow(out{2}(:,:,2))
Python:
import numpy as np
import caffe
import cv2
caffe.set_mode_gpu()
caffe.set_device(0)
model = './model/det1.prototxt'
weights = './model/det1.caffemodel'
PNet = caffe.Net(model, weights, caffe.TEST) # create net and load weights
print ("\n\n----------------------------------------")
print ("------------- Network loaded -----------")
print ("----------------------------------------\n")
img = np.float32(cv2.imread( 'F:/ImagesForTest/test1.jpg' ))
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
avg = np.array([127.5,127.5,127.5])
img = img - avg
img = img*0.0078125;
img = img.transpose((2,0,1))
img = img[None,:] # add singleton dimension
PNet.blobs['data'].reshape(1,3,img.shape[2],img.shape[3])
out = PNet.forward_all( data = img )
cv2.imshow('out',out['prob1'][0][1])
cv2.waitKey()
我使用的模型位于 here(det1.prototxt 和 det1.caffemodel)
我用来获得这些结果的图像:
两种情况下我得到的结果:
结果相似,但不相同。
UPD:看起来不是类型转换问题(已更正,但没有任何改变)。 我在 matlab 中保存了 conv1 层(第一个通道)之后的卷积结果,并在 python 中提取了相同的数据,两个图像现在都显示为 python cv2.imshow。
输入层的数据(data)完全一样,我用同样的方法检查了
正如您所见,即使在第一个 (conv1) 层上也能看到差异。 看起来内核以某种方式发生了变化。
谁能说出隐藏的差异在哪里?
找到问题源了,是因为MATLAB看到图像转置了。 此 python 代码显示与 MATLAB 代码相同的结果:
import numpy as np
import caffe
import cv2
caffe.set_mode_gpu()
caffe.set_device(0)
model = './model/det1.prototxt'
weights = './model/det1.caffemodel'
PNet = caffe.Net(model, weights, caffe.TEST) # create net and load weights
print ("\n\n----------------------------------------")
print ("------------- Network loaded -----------")
print ("----------------------------------------\n")
img = np.float32(cv2.imread( 'F:/ImagesForTest/test1.jpg' ))
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
img=cv2.transpose(img) # <----- THIS line !
avg = np.float32(np.array([127.5,127.5,127.5]))
img = img - avg
img = np.float32(img*0.0078125);
img = img.transpose((2,0,1))
img = img[None,:] # add singleton dimension
PNet.blobs['data'].reshape(1,3,img.shape[2],img.shape[3])
out = PNet.forward_all( data = img )
# transpose it back and show the result
cv2.imshow('out',cv2.transpose(out['prob1'][0][1]))
cv2.waitKey()
感谢所有在评论中给我建议的人!