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()

ここにある私が使用するモデル(det1.prototxt および det1.caffemodel)

これらの結果を得るために使用した画像:

ここに画像の説明を入力

両方のケースから得た結果:

ここに画像の説明を入力

結果は似ていますが、同じではありません。

UPD: 型変換の問題ではないようです (修正されましたが、何も変更されていません)。conv1 層 (最初のチャネル) の後に畳み込みの結果を matlab に保存し、同じデータを python で抽出しました。両方の画像が python cv2.imshow で表示されるようになりました。

入力層のデータ(データ)は全く同じなので、同じ方法でチェックしました。

そして、最初の(conv1)レイヤーでも違いが見えることがわかります。カーネルが何らかの形で変換されたように見えます。

ここに画像の説明を入力

違いがどこに隠されているか誰にも言えませんか?

4

1 に答える 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() 

コメントで私に助言してくれたすべての人に感謝します!

于 2016-10-06T09:57:57.127 に答える