【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