1. 程式人生 > >caffe中使用python進行影象預測

caffe中使用python進行影象預測

在剛接觸caffe時,我們一般使用.bat 或者.sh命令來檢視訓練好的模型或者預測新的圖片,很多時候會顯得不方便,之前我們配置了MATLAB和python介面,因此,可以使用python來進行相關操作。

#coding=utf-8
import caffe
import numpy as np

caffe_root='D:/caffe/caffe-windows' #根目錄
MEAN_PROTO_PATH = caffe_root+'/data/work/imagenet_mean.binaryproto'               # 待轉換的pb格式影象均值檔案路徑
MEAN_NPY_PATH = caffe_root+'/data/work/mean.npy'
# 轉換後的numpy格式影象均值檔案路徑 blob = caffe.proto.caffe_pb2.BlobProto() # 建立protobuf blob data = open(MEAN_PROTO_PATH, 'rb' ).read() # 讀入mean.binaryproto檔案內容 blob.ParseFromString(data) # 解析檔案內容到blob array = np.array(caffe.io.blobproto_to_array(blob))# 將blob中的均值轉換成numpy格式,array的shape (mean_number,channel, hight, width)
mean_npy = array[0] # 一個array中可以有多組均值存在,故需要通過下標選擇其中一組均值 np.save(MEAN_NPY_PATH ,mean_npy)

然後寫預測圖片的py檔案,

#coding=utf-8

#作用:可以用來批處理圖片進行分類
import os
import caffe
import numpy as np

caffe_root='D:/caffe/caffe-windows' #根目錄
deploy=caffe_root+'/data/work/lenet.prototxt' #deploy檔案的路徑
caffe_model=caffe_root+'/data/work/lenettt_iter_5000.caffemodel' #caffe_model的路徑 mean_file=caffe_root+'/data/work/mean.npy' #mean_file的路徑 labels_filename=caffe_root+'/data/work/test.txt' #name.txt的路徑 #預讀待分類的圖片 # dir=caffe_root+'/data/work/test/99.bmp' dir='D:/caffe/caffe-windows/data/work/test/' filelist=[] filenames=os.listdir(dir) #返回指定目錄下的所有檔案和目錄名 for fn in filenames: fullfilename=os.path.join(dir,fn) #os.path.join--拼接路徑 filelist.append(fullfilename) #filelist裡儲存每個圖片的路徑 net=caffe.Net(deploy,caffe_model,caffe.TEST) #載入model和network #圖片預處理設定 transformer=caffe.io.Transformer({'data':net.blobs['data'].data.shape}) #設定圖片的格式(1,3,28,28) lenet5模型 transformer.set_transpose('data',(2,0,1)) #改變維度的順序,由原始圖片(28,28,3)變為(3,28,28) transformer.set_mean('data',np.load(mean_file).mean(1).mean(1)) #減去均值 transformer.set_raw_scale('data',255) #縮放到[0,255]之間 transformer.set_channel_swap('data',(2,1,0)) #交換通道,將圖片由RGB變成BGR labels=np.loadtxt(labels_filename,str,delimiter='/t') #讀取類別名稱檔案 #載入圖片 for i in range(0,len(filelist)): img=filelist[i] #獲取當前圖片的路徑 #print filenames[i] #列印當前圖片的名稱 im=caffe.io.load_image(img) #載入圖片 net.blobs['data'].data[...]=transformer.preprocess('data',im) #執行上面的預處理操作,並將圖片載入到blob中 #執行測試 out=net.forward() prob=net.blobs['prob'].data[0].flatten() #取出最後一層(prob)屬於某個類標的概率值,'prob'為最後一層的名稱 #print prob index1=prob.argsort()[-1] #獲取最大概率值對應的index # index2=prob.argsort()[-2] #獲取第二大概率值對應的index # index3=prob.argsort()[-3] #獲取第三大概率值對應的index # index4=prob.argsort()[-4] #獲取第四大概率值對應的index # index5=prob.argsort()[-5] #獲取第5大概率值對應的index print filenames[i],' is ', labels[index1],' ',prob[index1] #輸出label--prob # print labels[index2],'--',prob[index2] # print labels[index3],'--',prob[index3] # print labels[index4],'--',prob[index4] # print labels[index5],'--',prob[index5]