2017-05-30 14 views
0

私はカフェモデル動物園(微調整なし)から事前に訓練されたグーグルネットモデルを実行しようとしています。モデルとdeploy.prototxtは両方以下Caffe GoogleNetのモデルの予測は常に同じです

https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenetからダウンロードされた私が使用しているコードです:

net = caffe.Net('deploy.prototxt', 'bvlc_googlenet.caffemodel', caffe.TEST) 
net.blobs['data'].reshape(1,3,224,224) 

image_path = '1.png' 
img = caffe.io.load_image(image_path) 
img = caffe.io.resize(img, (224, 224, 3)) 

# mean subtraction 
img[0,:,:] -= 104/255.0 
img[1,:,:] -= 117/255.0 
img[2,:,:] -= 123/255.0 

# 224,224,3 -> 3,224,224 
img = np.transpose(img, (2, 0, 1)) 

out = net.forward(data=np.array([img]))['prob'] 
print(np.argmax(out)) 

は、モデルのロードのように正常に見えるが、それにもかかわらず、入力に関わらず、常に同じクラス(885)を出力します。理由は何でしょうか?

UPD:実際には、減算を行うかどうかにかかわらず、同じ問題が他のモデルにも適用されます。常に検出されているクラスだけが異なるものに変更されます。

答えて

1

コードにはいくつか問題があります。最初にcaffe.io.loadに画像がまだ形状(224,224,3)を持っているので、平均を設定する前にnp.transposeを使用する必要があります。次に、イメージを[0,1]から[0,255]にスケール変更する必要があることです。また、caffeは特定の順序で画像を期待しています。 Small explanation is given here。したがって、デフォルトRGBをBGR形式に変更する必要があります。

これらの変換をきれいにまとめる変圧器caffe.io.transformerの使用をお勧めします。ご例えば

、変圧器とのコードは次のようになります。

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) 
transformer.set_mean('data', np.array([104,117,123])) 
transformer.set_transpose('data',(2,0,1)) 
transformer.set_channel_swap('data',(2,1,0)) 
transformer.set_raw_scale('data', 255.0) 

image_path = 'cat.jpg' 
img = caffe.io.load_image(image_path) 
img = caffe.io.resize(img, (224, 224, 3)) 

net.blobs['data'].reshape(1,3,224,224) 
net.blobs['data'].data[:,:,:] = transformer.preprocess('data',img) 
output = net.forward() 
out = net.blobs['prob'].data[0].flatten() 
labels = np.loadtxt(labels_file, str, delimiter='\t') 
print(np.argmax(out)) 
print ('output label : ' + labels[out.argmax()]) 
+0

素晴らしい、ありがとう。 –

関連する問題