hans

hans

【Python】【Caffe】四、classification檢測模型《python調用caffe模塊》


GitHub 程式碼地址: https://github.com/HansRen1024/Use-Python-to-call-Caffe-module

前言#

mnist 訓練集是單通道的,所以有兩個版本。有一些細節不同,但功能相同。思路是將圖片丟進網路進行一次前向傳播,通過最後 softmax 層得到對應每一類別的概率,取最大概率類。

caffe/python/classify.py 是調用 caffe 模塊中 Classifier 類,其實這個類內容和上面方法思路是一樣的。兩種方法殊途同歸。

一、適用於 mnist 程式碼:#

還是要著重強調一件事:deploy.prototxt 檔案,強烈建議直接從 train.prototxt 改,最後一層名字是 “prob”,輸入維度是:1, 1,
28, 28

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 30 20:41:03 2017

author: hans

"""

import caffe
import numpy as np


deploy='doc/deploy_lenet.prototxt' # 需要修改inout_dim: 1, 1, 28, 28
caffe_model='models/lenet_iter_10000.caffemodel'
img='doc/7.jpg'
labels_filename='doc/words.txt'
labels = np.loadtxt(labels_filename, str, delimiter='\t')
mean_file='doc/mnist_mean.npy'

net = caffe.Net(deploy, caffe_model, caffe.TEST)

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #data blob 結構(n, k, h, w)
transformer.set_transpose('data', (2, 0, 1)) #改變圖片維度順序,(h, w, k) -> (k, h, w)
transformer.set_mean('data', np.load(mean_file).mean(1).mean(1))
transformer.set_raw_scale('data', 255) #將像素範圍改成縮放到[0,1]
# transformer.set_channel_swap('data', (2, 1, 0)) # mnist單通道不需要轉換

im = caffe.io.load_image(img) #加載圖片
im = caffe.io.resize_image(im,(28,28,1)) # 修改圖片尺寸維度

caffe_in = transformer.preprocess('data', im) #將處理好的數據放入caffe_in
out = net.forward(**{'data': caffe_in}) #將數據放入網路中進行一次前向傳播
prob = out['prob'].reshape(10,) # 可以看出網路中blob都是以字典形式存儲數據的。

# net.blobs['data'].data[...] = transformer.preprocess('data', im)#與上面功能相同
# net.forward()
# prob = net.blobs['prob'].data[0].flatten()

print prob

# print 'the class is:', labels[prob.argmax()], 'accuracy: ', prob[prob.argmax()] #跟下面兩句話功能相同

order = prob.argsort()[-1]
print 'the class is:', labels[order], 'accuracy: ', prob[order]

二、使用於三通道圖片程式碼:#

#!/usr/bin/env python2
# -*- coding: utf-8 -*-
"""
Created on Sun Jul 30 20:41:03 2017

author: hans

"""

import caffe
import numpy as np
deploy='.prototxt'
caffe_model='.caffemodel'
img='.jpg'
labels_filename='.txt'
mean_file='.npy'

net = caffe.Net(deploy, caffe_model, caffe.TEST)

transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) #data blob 結構(n, k, w, h)
transformer.set_transpose('data', (2, 0, 1)) #改變圖片維度順序,(w, h, k) -> (k, w, h)
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)) # RGB -> BGR

im = caffe.io.load_image(img)
# 將處理好的數據放入網路中名為'data'的bolb內,就是放入net預分配的內存中。
net.blobs['data'].data[...] = transformer.preprocess('data', im)

out = net.forward() # 網路結構,模型和數據都已經準備好,無需加參數

labels = np.loadtxt(labels_filename, str, delimiter='\t')
prob = net.blobs['prob'].data[0].flatten()
print prob

# print 'the class is:', labels[prob.argmax()], 'accuracy: ', prob[prob.argmax()] #跟下面兩句話功能相同

order = prob.argsort()[-1]
print 'the class is:', labels[order], 'accuracy: ', prob[order]

以上部分內容參考自: http://www.cnblogs.com/denny402/p/5685909.html

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。