1. 程式人生 > >Caffe:使用 classify.py 批量對圖片分類

Caffe:使用 classify.py 批量對圖片分類

一般使用 Caffe 訓練完網路後,會用 test.bin 來測試一下網路的精度,然後還能用 classification.bin 來用網路對圖片進行單張的分類,但是一張一張的分,效率很低,所以我改寫了 classify.py 檔案,使其讀取 test.txt 檔案批量分類,輸出具體哪一張圖片分錯了。

程式碼如下:

# copyright (c) strongnine

import caffe
import sys
import os
import numpy as np
 
caffe_root = '/path/to/your/caffe/' # 指定 caffe 的路徑
sys.
path.insert(0,caffe_root+'python') caffe.set_mode_gpu() deploy = caffe_root+'models/bvlc_alexnet/deploy.prototxt' ## caffe_model = caffe_root+'model/outputs/caffe_alexnet_train_iter_450000.caffemodel' ## labels_name = caffe_root+'data/alexnet/synset_words.txt' labels = np.loadtxt(labels_name, str, delimiter=
'\t') for i in range(len(labels)): exec(labels[i] + "=0") right = 0 false = 0 mean_file = caffe_root+'data/alexnet/train_mean.npy' # 由 imagenet_mean.binaryproto 轉換來 net = caffe.Net(deploy, 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)) test_file = open(caffe_root+'data/alexnet/test.txt', 'r') test_data = test_file.readlines() log = open(caffe_root+'data/alexnet/log/classify_log.log', 'w') image_road = '/your/image/path/' for line in test_data: split = line.split(' ') image = caffe.io.load_image(image_road + split[0]) net.blobs['data'].data[...]=transformer.preprocess('data',image) out = net.forward() prob = net.blobs['prob'].data[0].flatten() top_k = net.blobs['prob'].data[0].flatten().argsort()[-1:-6:-1] log.write(split[0] + ' ' + split[1][0] + ' ' + str(top_k[0])) if str(top_k[0]) == split[1][0]: right += 1 log.write(' right\n') else: false += 1 log.write(' false\n') print(right) print(false) print(right/float(right + false))

執行完成後會輸出分類正確的圖片數量,和分類錯誤的圖片數量,以及所有的正確率。

生成完檢視 log 檔案:

...
cat_01.jpg 0 0 right
cat_02.jpg 0 0 right
person_04.jpg 1 1 right
person_05.jpg 1 0 false
...

第一個數字為標籤類別,第二個數字為分類類別。