hans

hans

【Python】【Caffe】4. クラス分類検出モデル《PythonでCaffeモジュールを呼び出す》


GitHub のコードアドレス: https://github.com/HansRen1024/Use-Python-to-call-Caffe-module

前書き#

mnist トレーニングセットは単一チャネルですので、2 つのバージョンがあります。いくつかの細部が異なるかもしれませんが、機能は同じです。アイデアは、画像をネットワークに入力し、最後の softmax 層から各クラスの確率を取得し、最大確率のクラスを取得することです。

caffe/python/classify.py は、caffe モジュールの Classifier クラスを呼び出すもので、実際にはこのクラスの内容と上記の方法のアイデアは同じです。2 つの方法は同じ結果にたどり着くための異なる方法です。

一、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()] #下記の2つの文と同じ機能です

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

二、3 チャネル画像に適用するコード:#

#!/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()] #下記の2つの文と同じ機能です

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

上記の内容は以下を参考にしています: http://www.cnblogs.com/denny402/p/5685909.html

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。