首页 文章

对于同一网络,python和MATLAB caffe的结果是不同的

提问于
浏览
3

我试图将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))

蟒蛇:

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)

我用来得到这些结果的图像:

enter image description here

我从两个案例得到的结果:

enter image description here

结果相似,但不相同 .

UPD:看起来不是类型转换问题(更正了,但没有改变) . 我在matlab中保存了conv1层(第一个通道)之后的卷积结果,并在python中提取了相同的数据,现在这两个图像都是由python cv2.imshow显示的 .

输入层(数据)上的数据完全相同,我使用相同的方法进行检查 .

正如您可以看到即使在第一个(conv1)图层上也可以看到差异 . 看起来内核以某种方式进行了转换 .

enter image description here

任何人都可以说隐藏的区别在哪里?

1 回答

  • 2

    我找到了问题来源,这是因为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()
    

    感谢所有在评论中建议我的人!

相关问题