用訓練好的caffemodel對單個/批量圖片進行分類


一、單個圖片進行分類

  這個比較簡單,在*.bat文件中輸入以下代碼:

@echo off
set BIN_DIR=D:\caffe\caffe-windows\Build\x64\Release
set DEPLOY_DIR=D:\gaokun\caffe_train_test_tool
set CAFFEMODEL_DIR=D:\ChineseCharacterdata\caffemodel\HCL_1_800_HWDB_Train_3232
set MEAN_DIR=D:\ChineseCharacterdata\HCL_1_800_HWDB_Train_3232
set LABEL_DIR=D:\gaokun\caffe_train_test_tool
set IMG_DIR=D:\gaokun\testImg\Img
echo "run classification caffe ... !"
%BIN_DIR%/classification.exe %DEPLOY_DIR%\*.prototxt %CAFFEMODEL_DIR%\*.caffemodel %MEAN_DIR%\mean.binaryproto %LABEL_DIR%\synset_words.txt %IMG_DIR%\*.png

設置好相關路徑后,雙擊*.bat文件即可運行。

二、批量對圖片進行分類

  在對單個圖片進行分類就想知道如何批量對圖片進行分類。自己搜索了一些資料,發現需要調用python,使用python文件實現目的。 

  下面是批量對圖片進行分類的代碼(自己修改):

#coding=utf-8
#作用:可以用來批處理圖片進行分類

import os
import caffe
import numpy as np

root='C:/Users/Administrator/Desktop/' #根目錄
deploy=root+'11/alexnet.prototxt'      #deploy文件的路徑
caffe_model=root+'11/HCL_1_800_HWDB_Train_3232_iter_480000.caffemodel'  #caffe_model的路徑
mean_file=root+'11/mean.npy'     #mean_file的路徑--注意,在python中要將mean.binaryproto轉換為mean.npy格式
labels_filename=root+'11/synset_words.txt'  #sysset_words.txt的路徑

#預讀待分類的圖片
import os
dir=root+'Img/'
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)
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

#加載圖片
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()
    
    labels=np.loadtxt(labels_filename,str,delimiter='/t') #讀取類別名稱文件
    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
    
    print labels[index1],'--',prob[index1]   #輸出label--prob
    print labels[index2],'--',prob[index2]
    print labels[index3],'--',prob[index3]
    print labels[index4],'--',prob[index4]

  在這里需要注意是:

  (1) "import caffe"的前提是需要編譯了pycaffe,具體可以看我的caffe小問題匯總(持續更新)第5個問題

  (2) 在這里均值文件mean.binaryproto需要轉換為mean.npy文件,其python代碼如下:

#!/usr/bin/env python--將mean.binaryproto文件轉為python可以使用的mean.npy文件
import numpy as np
import sys,caffe

root='C:/Users/Administrator/Desktop/11/'  #設置根目錄
mean_proto_path=root+'mean.binaryproto'    #mean.binaryproto路徑
mean_npy_path=root+'mean.npy'              #mean.npy路徑

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)            #保存

  如此,只要設定相關的路徑,即可利用訓練好的caffemodel對圖片進行批量分類。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM