2017-05-30 62 views
0

我試圖從caffe模型動物園(沒有微調)運行pretrained googlenet模型。該模型和deploy.prototxt都從https://github.com/BVLC/caffe/tree/master/models/bvlc_googlenet咖啡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

我可以看到代碼的一些問題。首先,您應該在設置平均值之前使用np.transpose,因爲在caffe.io.load中,圖像仍具有形狀(224,224,3)。其次,您需要將圖像從[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

真棒,謝謝。 –