Chainerでcaffemodelを読み込んで使えるらしいです。素晴らしい!
Chainerでcaffemodelを読み込んで画像を分類する
ただ、例のごとく、Python初心者には何をやっているのかよく分からなかったので解析してみました。
ソースコードは上記リンクのものを利用させていただき、Python初心者が躓きそうなところをピックアップして解説していきます。
CaffeFunction()は、caffemodelファイルを読みこんで、Chainerで呼び出せる関数を生成します。
func()の引数は、(入力データ, 出力層, 出力に関連しない無視する層, 学習フェーズかどうか)です。
層の名前は読み込むcaffemodelによって異なるので、調べる必要があります。
第三引数は指定しなくても結果は変わりません(無視することによって処理時間が短くなるとか?)。
この例では、categoriesは1000要素の配列で、各要素はカテゴリ名となります。
そして、sorted(result)は、resultを(zip(a, b)のaについて)ソートする関数です。
この処理によって、カテゴリを確率の高いものから順に並べた結果を得ることができます。
この例では、iにインデックス、(score, label)にprediction[i]が入ります。
また、{:>3d}や{:>6.2f}はオプション付きの書式であり、>は右詰めのオプションです。
以上です。
Chainerでcaffemodelを読み込んで画像を分類する
ただ、例のごとく、Python初心者には何をやっているのかよく分からなかったので解析してみました。
ソースコードは上記リンクのものを利用させていただき、Python初心者が躓きそうなところをピックアップして解説していきます。
def load(self, path):まずは一番肝になる部分から。
self.func = caffe.CaffeFunction(path)
def _predict_class(self, x):
y, = self.func(inputs={'data': x}, outputs=['loss3/classifier'], disable=['loss1/ave_pool', 'loss2/ave_pool'], train=False)
return F.softmax(y)
CaffeFunction()は、caffemodelファイルを読みこんで、Chainerで呼び出せる関数を生成します。
func()の引数は、(入力データ, 出力層, 出力に関連しない無視する層, 学習フェーズかどうか)です。
層の名前は読み込むcaffemodelによって異なるので、調べる必要があります。
第三引数は指定しなくても結果は変わりません(無視することによって処理時間が短くなるとか?)。
def load_label(self, path):カテゴリ名を記載したファイルの読み込みです。
self.categories = np.loadtxt(path, str, delimiter="\n")
この例では、categoriesは1000要素の配列で、各要素はカテゴリ名となります。
def predict(self, image_path, rank=10):result = zip(a, b)は(a, b)というセットを要素として持つ配列resultを生成します。
x = chainer.Variable(self.load_image(image_path), volatile=True)
y = self._predict_class(x)
result = zip(y.data.reshape((y.data.size,)), self.categories)
return sorted(result, reverse=True)
そして、sorted(result)は、resultを(zip(a, b)のaについて)ソートする関数です。
この処理によって、カテゴリを確率の高いものから順に並べた結果を得ることができます。
def print_prediction(self, image_path, rank=10):enumerate()はインデックスと要素を同時に得るための関数です。
prediction = self.predict(image_path, rank)
for i, (score, label) in enumerate(prediction[:rank]):
print '{:>3d} {:>6.2f}% {}'.format(i + 1, score * 100, label)
この例では、iにインデックス、(score, label)にprediction[i]が入ります。
また、{:>3d}や{:>6.2f}はオプション付きの書式であり、>は右詰めのオプションです。
以上です。