いつもの作業の備忘録

作業を忘れがちな自分のためのブログ

【Caffe】物体認識のサンプルを動かす

以下のサイトを元に物体識別のモデルを使ってみる
(単純には行かなかったのでメモ)
Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog

※以下、caffeフォルダは$CAFFE_HOMEとする(これまで~/work/dl_tools/としていたところ)

1.Caltech101をダウンロード&解凍

$ cd $CAFFE_HOME/data/
$ wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
$ tar -xzvf 101_ObjectCategories.tar.gz
$ cd $CAFFE_HOME/data/ilsvrc12
$ sh get_ilsvrc_aux.sh

2.モデルファイルをダウンロード

$CAFFE_HOME/models/bvlc_reference_caffenet/readme.md の最初の方にモデルファイルのダウンロード元が記述されているので確認
readme.md

---
name: BVLC CaffeNet Model
caffemodel: bvlc_reference_caffenet.caffemodel
caffemodel_url: http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
license: unrestricted
sha1: 4c8d77deb20ea792f84eb5e6d0a11ca0a8660a46
caffe_commit: 709dc15af4a06bebda027c1eb2b3f3e3375d5077
---

wgetでモデルファイルをダウンロード

$ cd $CAFFE_HOME/models/bvlc_reference_caffenet
$ wget http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel

3.識別実行

参考元ページ(Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog)のclassify.pyを実行

$ cd $CAFFE_HOME/python
$ python classify.py --raw_scale 255 ../data/101_ObjectCategories/airplanes/image_0001.jpg ../result.npy

最初実行したら以下のエラーが出た

  • "ImportError: No module named google.protobuf.internal"

protobufが入ってないということなのでインストール。apt-getとpipを実行したが、pipだけでも動くかもしれない

$ sudo apt-get install python-protobuf
$ pip install protobuf

さらに、再度classify.pyを実行すると以下のエラーに変わった

  • "ValueError: Mean shape incompatible with input shape"

ilsvrc_2012_mean.npyがCaffeのバージョンによっては正しく動作しないらしいので、下記サイトを参考にio.pyを編集
http://qiita.com/Bonnnou_108/items/41e6dadeff1310b4eb5d

変更前↓

…
if ms != self.inputs[in_][1:]:
    raise ValueError('Mean shape incompatible with input shape.')
…

変更後↓

…
if ms != self.inputs[in_][1:]:
    print(self.inputs[in_])
    in_shape = self.inputs[in_][1:]
    m_min, m_max = mean.min(), mean.max()
    normal_mean = (mean - m_min) / (m_max - m_min)
    mean = resize_image(normal_mean.transpose((1,2,0)),in_shape[1:]).transpose((2,0,1)) * (m_max - m_min) + m_min
    #raise ValueError('Mean shape incompatible with input shape.')
…

classify.pyを実行すると、今回は正しく動作しresult.npyが生成された

4.識別プログラムを作成

元サイトと同様の内容で$CAFFE_HOME下にshow_result.pyを作成

show_result.py↓

#! /usr/bin/env python
# -*- coding: utf-8 -*-
import sys, numpy

categories = numpy.loadtxt(sys.argv[1], str, delimiter="\t")
scores = numpy.load(sys.argv[2])
top_k = 3
prediction = zip(scores[0].tolist(), categories)
prediction.sort(cmp=lambda x, y: cmp(x[0], y[0]), reverse=True)
for rank, (score, name) in enumerate(prediction[:top_k], start=1):
    print('#%d | %s | %4.1f%%' % (rank, name, score * 100))

5.識別実行とクラス名の表示

識別の実行と、識別結果に基づいたクラス名の表示は以下のコマンドでできる

$ cd $CAFFE_HOME
$ python ./python/classify.py --raw_scale 255 data/101_ObjectCategories/airplanes/image_0001.jpg result.npy
$ python show_result.py data/ilsvrc12/synset_words.txt result.npy 

元サイトと同様に、軍用機が最大スコアで出力された

今回使ったネットワークを可視化する方法は以下のページ
【Caffe】ネットワークを可視化する - いつもの作業の備忘録


※参考
http://techblog.yahoo.co.jp/programming/caffe-intro/
http://hogehuga.com/caffe_is_tough/
http://qiita.com/Bonnnou_108/items/41e6dadeff1310b4eb5d
http://iamrobotandproud.hatenablog.com/entry/2015/02/22/191731
http://blog.livedoor.jp/tak_tak0/archives/52215253.html
http://qiita.com/uchihashi_k/items/8333f80529bb3498e32f