Windows下caffe用fine-tuning訓練好的caffemodel來進行影象分類
小菜準備了幾張驗證的圖片存放路徑為caffe根目錄下的 examples/images/, 如果我們想用一個微調訓練好的caffemodel來對這張圖片進行分類,那該怎麼辦呢?下面小菜來詳細介紹一下這一任務的步驟。一般可以同兩種方式進行測試,分別是基於c++介面和python介面。不管是用c++來進行分類,還是用python介面來分類,我們都應該準備這樣三個檔案:
1、 caffemodel檔案。
就是之前小菜fine-tuning訓練好的caffemodel,小菜用的是result_iter_1000.caffemodel。
2、均值檔案。
有了caffemodel檔案,就需要對應的均值檔案,在測試階段,需要把測試資料減去均值。這個檔案我們用指令碼來下載,在caffe根目錄下執行:
data/ilsvrc12/get_ilsvrc_aux.sh
執行並下載後,均值檔案放在 data/ilsvrc12/ 資料夾裡。不過小菜用的是自己的資料集的均值檔案,也就是fine-tuning時生成的均值檔案mean.binaryproto。
3、synset_words.txt檔案
在呼叫指令碼檔案下載均值的時候,這個檔案也一併下載好了。裡面放的是1000個類的名稱。小菜自己在examples/myfile/目錄下建立一個自己的ynset_words.txt,裡面寫了根據小菜需要分類的6個類別文字。
資料準備好了,我們就可以開始分類了,我們給大家提供兩個版本的分類方法:
一、c++方法
在caffe根目錄下的 examples/cpp-classification/ 資料夾下面,有個classification.cpp檔案,就是用來分類的。一開始安裝caffe時,編譯了caffe.sln會在Build/x64/Release/下有
classification.exe,直接條用就行。我們就直接執行命令:
build/x64/examples/cpp_classification.exe (此處有空格)\
examples/myfile/deploy.prototxt (此處有空格) \
examples/myfile/result_iter_1000.caffemodel (此處有空格)\
examples/myfile/mean.binaryproto (此處有空格)\
examples/myfile/synset_words.txt (此處有空格)\
examples/images/cat.jpg
命令很長,用了很多的\符號來換行。可以看出,從第二行開始就是引數,每行一個,共需要4個引數。為了方便小菜這裡把這命令寫到指令碼檔案裡了(xxx.sh),在cygwin裡直接執行。
執行成功後,輸出top-5結果:
———- Prediction for examples/images/cat.jpg ———-
0.3134 - “n02123045 tabby, tabby cat”
0.2380 - “n02123159 tiger cat”
0.1235 - “n02124075 Egyptian cat”
0.1003 - “n02119022 red fox, Vulpes vulpes”
0.0715 - “n02127052 lynx, catamount”
即有0.3134的概率為tabby cat, 有0.2380的概率為tiger cat ……
二、python方法
python介面可以使用jupyter notebook來進行視覺化操作,因此推薦使用這種方法。建立一個test.py格式的指令碼程式碼如下,在test.py根目錄下(CMD)通過執行Python test.py來驗證測試圖片的分類結果,也可以在cygwin中執行。程式碼如下:
**#coding=utf-8
****#載入必要的庫******
import numpy as np
import sys,os,caffe
**#設定當前目錄**
caffe_root = 'd:/caffe-master/'
sys.path.insert(0, caffe_root + 'python')
import caffe
os.chdir(caffe_root)
net_file=caffe_root + 'examples/myfile/deploy.prototxt'
caffe_model=caffe_root + 'examples/myfile/result_iter_1000.caffemodel'
mean_file=caffe_root + 'examples/myfile/mean.npy'
****#python/caffe/imagenet/ilsvrc_2012_mean.npy****
net = caffe.Net(net_file,caffe_model,caffe.TEST)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
im=caffe.io.load_image(caffe_root+'examples/images/2.jpg')
net.blobs['data'].data[...] = transformer.preprocess('data',im)
out = net.forward()
****#imagenet_labels_filename = caffe_root + 'data/ilsvrc12/synset_words.txt'****
imagenet_labels_filename = caffe_root + 'examples/myfile/synset_words.txt'
labels = np.loadtxt(imagenet_labels_filename, str, delimiter='\t')
top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1]
for i in np.arange(top_k.size):
print top_k[i], labels[top_k[i]]