いつもの作業の備忘録

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

【Caffe】特徴量抽出を行いSVMで物体識別する

下記サイトの中盤で紹介されている特徴量抽出部分を実行する
Caffeで手軽に画像分類 - Yahoo! JAPAN Tech Blog

1.ネットワークの定義ファイルを作成

以下のコマンドでimagenet_deploy.prototxtをダウンロードし、名前をimagenet_feature.prototxtと変更。また、元のネットワークでfc6と名付けられている値を取り出すように設定

$ wget https://raw.githubusercontent.com/aybassiouny/wincaffe-cmake/master/examples/imagenet/imagenet_deploy.prototxt
$ mv imagenet_deploy.prototxt imagenet_feature.prototxt
$ vim imagenet_feature.prototxt

imagenet_feature.prototxt

#変更前
layers {
  name: "fc6"
  type: INNER_PRODUCT
  bottom: "pool5"
  top: "fc6"
  blobs_lr: 1
  blobs_lr: 2
  weight_decay: 1
  weight_decay: 0
  inner_product_param {
    num_output: 4096
  }
}
layers {
  name: "relu6"
  type: RELU
  bottom: "fc6"
  top: "fc6"
}
↓
#変更後
layers {
  name: "fc6"
  type: INNER_PRODUCT
  bottom: "pool5"
  top: "fc6wi"
  blobs_lr: 1
  blobs_lr: 2
  weight_decay: 1
  weight_decay: 0
  inner_product_param {
    num_output: 4096
  }
} 
layers {
  name: "relu6" 
  type: RELU
  bottom: "fc6wi"
  top: "fc6"
} 

2.モデルのダウンロード

モデルファイルをダウンロードするスクリプトをダウンロードし、それを実行することでモデルファイルを取得

$ wget https://raw.githubusercontent.com/sguada/caffe-public/master/models/get_caffe_reference_imagenet_model.sh
$ chmod u+x get_caffe_reference_imagenet_model.sh
$ ./get_caffe_reference_imagenet_model.sh

3.特徴量出力用のプログラム作成

1枚の画像の特徴量を抽出するプログラムを作成

feature.py

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

MEAN_FILE = 'path/to/caffe/home/python/caffe/imagenet/ilsvrc_2012_mean.npy'
MODEL_FILE = 'imagenet_feature.prototxt'
PRETRAINED = 'caffe_reference_imagenet_model'
LAYER = 'fc6wi'
INDEX = 4

net = caffe.Classifier(MODEL_FILE, PRETRAINED)
net.transformer.set_mean('data', numpy.load(MEAN_FILE))
net.transformer.set_raw_scale('data',255)
net.transformer.set_channel_swap('data',(2,1,0))

image = caffe.io.load_image(sys.argv[1])
net.predict([image])
feat = net.blobs[LAYER].data[INDEX].flatten().tolist()
print(' '.join(map(str,feat)))

feature.pyを実行すると、スペースで区切られた4096個の数字の羅列が出現。fc6の値(4096個)をベクトルにして出力していることがわかる

$ python feature.py 101_ObjectCategories/airplanes/image_0001.jpg

3.libsvm形式データを作成

4096個のデータをlibsvm形式に変換する必要がある。libsvm形式は以下のような構造

(形式)
クラスID  次元:値  次元:値  次元:値 …

(例)
0 1:-44.596577 2:-30.565985 3:-26.004364 4:-1.526159 ...

feature.pyで抽出した特徴量をlibsvm形式に変換する適当なスクリプトを作成。それらを用いてCaltech101のデータからlibsvm形式の学習データ(train.txt)、評価データ(test.txt)を作成。今回は時間節約のために学習データ20枚、評価データ8枚を用意した
※地味に面倒ですが、pythonやらシェルコマンドやらを使って作成してください

4.SVMの学習と評価

必要なコマンド(libsvm)のインストール

$ sudo apt-get install libsvm-tools

データの正規化とsvmの学習

$ svm-scale -s scale.txt train.txt > train_scaled.txt
$ svm-scale -r scale.txt test.txt > test_scaled.txt
$ svm-train -c 0.03 train_scaled.txt caltech101.model

テスト

$ svm-predict test_scaled.txt caltech101.model result.txt

結果

Accuracy = 72.0297% (582/808) (classification)

特徴量次元数4096に対して学習データ枚数が 20×101=2020枚なので過学習気味になるはずだが、ある程度の性能が確認できた。
result.txtには0~100までの数字が808個並んでいる。これはテストデータ(808枚)に対してどのクラスに識別されたかを示す結果になっている

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


参考
http://techblog.yahoo.co.jp/programming/caffe-intro/
http://hogehuga.com/caffe_is_tough/
https://groups.google.com/forum/#!topic/caffe-users/4r5dxoFpWxk

【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

【Caffe】Ubuntu 14.04へのインストール

インストールしたばかりのUbuntu 14.04にCaffeを導入し、Pythonでcaffeをimportできるのを確認するまでの過程

1.cuDNNのディベロッパ登録

以下のサイトからcuDNNディベロッパメンバーに登録
 https://developer.nvidia.com/cudnn ※私の場合は翌日に登録完了しました

2.Nvidiaドライバ、CUDA Toolkit、cuDNN、Anacondaダウンロード

私はこれらをホームディレクトリ下のwork/dl_toolsにダウンロードしました。

3.Nvidiaドライバ、CUDA Toolkitのインストール

事前に必要なもののインストール

$ sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa-dev
$ sudo apt-get install linux-source
$ sudo apt-get install linux-headers-$(uname -r)

以下の手順に従ってCUIモードに移行(Xが立ち上がっているとインストールできないため)
http://punyo-er-met.hateblo.jp/entry/2016/02/27/121717

本体のインストール

$ cd work/dl_tools/
$ chmod +x NVIDIA-Linux-x86_64-361.28.run 
$ chmod +x cuda_7.5.18_linux.run 
$ sudo ./NVIDIA-Linux-x86_64-361.28.run 
$ ./cuda_7.5.18_linux.run 

CUDA Toolkitのインストール中、いろいろ聞かれるので以下のように回答

Do you accept the previously read EULA? (accept/decline/quit): accept
Install NVIDIA Accelerated Graphics Driver for Linux-x86_64 352.39? ((y)es/(n)o/(q)uit): y
Do you wish to run the installation with 'sudo'? ((y)es/(n)o): y
Do you want to install the OpenGL libraries? ((y)es/(n)o/(q)uit)[ default is yes ]: y
Install the CUDA 7.5 Toolkit? ((y)es/(n)o/(q)uit): y
Enter Toolkit Location [ default is /usr/local/cuda-7.5 ]: 
Do you want to install a symbolic link at /usr/local/cuda? ((y)es/(n)o/(q)uit): y
Install the CUDA 7.5 Samples? ((y)es/(n)o/(q)uit): y
Enter CUDA Samples Location [ default is /home/**** ]: /home/****/work/dl_tools


再度以下の手順でGUIモードに復帰
http://punyo-er-met.hateblo.jp/entry/2016/02/27/121717

パスの設定ファイルを開く

$ vim ~/.profile

以下の内容をファイルの最後に追加

export PATH=$PATH:/usr/local/cuda-7.5/bin
export LD_LIBRARY_PATH=/usr/local/cuda-7.5/lib64:$LD_LIBRARY_PATH
export CUDA_ROOT=/usr/local/cuda-7.5/bin

変更内容を反映

$ source .profile

4.周辺ライブラリの導入

CuDNNインストール

$ cd ~/work/dl_tools
$ tar -zxf cudnn-7.0-linux-x64-v4.0-prod.tgz 
$ sudo cp cuda/include/cudnn.h /usr/local/cuda/include/
$ sudo cp cuda/lib64/* /usr/local/cuda/lib64/

Anacondaのインストール

$ cd ~/work/dl_tools
$ bash Anaconda2-2.5.0-Linux-x86_64.sh 

anacondaをインストールする場所を聞かれるので適当に設定する

BLASのインストール(今回はATLAS)

$ sudo apt-get install libatlas-base-dev

依存ライブラリのインストール

$ sudo apt-get install libprotobuf-dev libleveldb-dev libsnappy-dev libopencv-dev libboost-all-dev libhdf5-serial-dev
$ sudo apt-get install libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

5.Caffeのダウンロードとmake

caffeのダウンロード

$ sudo apt-get install git
$ git clone https://github.com/BVLC/caffe.git

caffeのコンパイル必要なMakefile.configを作る
Makefile.config.exampleを参考にMakefile.configを作成する)

$ cd caffe
$ cp Makefile.config.example  Makefile.config
$ vim Makefile.config

Makefile.configの以下の行を変更

変更前

#USE_CUDNN := 1
・・・
PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib/python2.7/dist-packages/numpy/core/include
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
# ANACONDA_HOME := $(HOME)/anaconda
# PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                # $(ANACONDA_HOME)/include/python2.7 \
                # $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
・・・
PYTHON_LIB := /usr/lib
# PYTHON_LIB := $(ANACONDA_HOME)/lib

変更後

USE_CUDNN := 1
・・・
#PYTHON_INCLUDE := /usr/include/python2.7 \
                /usr/lib/python2.7/dist-packages/numpy/core/include
# Anaconda Python distribution is quite popular. Include path:
# Verify anaconda location, sometimes it's in root.
ANACONDA_HOME := $(HOME)/work/dl_tools/anaconda2
PYTHON_INCLUDE := $(ANACONDA_HOME)/include \
                 $(ANACONDA_HOME)/include/python2.7 \
                 $(ANACONDA_HOME)/lib/python2.7/site-packages/numpy/core/include \
・・・
#PYTHON_LIB := /usr/lib
PYTHON_LIB := $(ANACONDA_HOME)/lib

make実行

$ make all
$ make test
$ sudo cp /usr/lib/x86_64-linux-gnu/libhdf5_hl.so.7 /usr/lib/x86_64-linux-gnu/libhdf5_hl.so.10
$ sudo cp /usr/lib/x86_64-linux-gnu/libhdf5.so.7 /usr/lib/x86_64-linux-gnu/libhdf5.so.10
$ make runtest

6.PyCaffeの導入

必要なライブラリのpipによるインストール

$ sudo apt-get install python-pip
$ cd ~/work/dl_tools/caffe/python
$ for req in $(cat requirements.txt); do sudo pip install $req; done
$ sudo apt-get install python-dev python-numpy python-skimage
$ cd ~/work/dl_tools/caffe/

パスの設定

$ vim ~/.profile

ファイルの末尾に以下を追加

export PYTHONPATH=~/work/dl_tools/caffe/python/:$PYTHONPATH

ファイルを更新し、PyCaffeをmake

$ source ~/.profile
$ make pycaffe

pythonを起動し、import caffeがエラーなく通れば動作確認完了!
ここまででCaffeインストール完了!

もし、protobufが無いとエラーが出れば以下で治るかもしれない

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


※参考
http://www.nal.ics.es.osaka-u.ac.jp/personal/k-yamanishi/CaffeUbuntu.html
http://wiki.ruka-f.net/index.php?Caffe%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
https://groups.google.com/forum/#!topic/caffe-users/9Q10WkpCGxs