スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。



にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

Caffe(Deep Learning)を使って画像の分類をしてみる

前回はGPUを使ってDeep LearningをするためにCaffeの導入をしました。
今回は学習済みネットワークを使って画像の分類(画像内に写っているものの推定)をやってみます。

□モデルやネットワーク、画像の準備
・モデル定義ファイルの準備
cd ~/caffe/examples/imagenet/
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

・学習済みネットワークの準備
ILSVRC2012のデータセットで学習済みのネットワークをお借りします
(ライセンス上これを使ったプログラムは商用には使用できません)
cd ~/caffe/data/ilsvrc12/
./get_ilsvrc_aux.sh

これでcaffe/models/bvlc_reference_caffenet/の下に
bvlc_reference_caffenet.caffemodelが
ダウンロードされるはずですが自分の場合されなかったので
http://dl.caffe.berkeleyvision.org/bvlc_reference_caffenet.caffemodel
から直接ダウンロードしました

・テスト画像の準備
cd ~/caffe/
wget http://www.vision.caltech.edu/Image_Datasets/Caltech101/101_ObjectCategories.tar.gz
tar xzvf 101_ObjectCategories.tar.gz

・ソースファイルの修正
~/caffe/python/caffe/io.pyにバグらしきものがあり
そのままだと実行できないらしいので254から255行目の

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.')

に書き換え

□画像の分類
さて、いよいよ画像の分類をさせてみます
まずcaffeに準備されている~/caffe/python/classify.pyを使います
cd ~/caffe/python/
python classify.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg ../result.npy

エラーなく実行されるようなら大丈夫です
しかし、classify.pyは分類結果が表示されないので
Caffeで手軽に画像分類|Yahoo!デベロッパーネットワーク
http://techblog.yahoo.co.jp/programming/caffe-intro/
を参考に以下のコードを作りました
(python使ったことがないのでちょっと雑です。申し訳ないです。)
2015/07/14:2バイト文字で実行エラーがあったため# -- coding: utf-8 -- を追記

#!/usr/bin/env python
# -- coding: utf-8 --

import numpy,os,sys,argparse,glob,time,caffe

#モデル定義ファイル
MODEL_FILE="../models/bvlc_reference_caffenet/deploy.prototxt"
#学習済みのネットワーク
PRETRAINED_MODEL_FILE="../models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"
#分類カテゴリ
CATEGORY_FILE="../data/ilsvrc12/synset_words.txt"
#学習済み全画像の平均値
MEAN_FILE="caffe/imagenet/ilsvrc_2012_mean.npy"

def main(argv):

pycaffe_dir = os.path.dirname(__file__)
parser = argparse.ArgumentParser()

parser.add_argument(
"input_file",
help="Input image."
)
parser.add_argument(
"--images_dim",
default='256,256',
help="Canonical 'height,width' dimensions of input images."
)
parser.add_argument(
"--input_scale",
type=float,
help="Multiply input features by this scale to finish preprocessing."
)
parser.add_argument(
"--raw_scale",
type=float,
default=255.0,
help="Multiply raw input by this scale before preprocessing."
)
parser.add_argument(
"--channel_swap",
default='2,1,0',
help="Order to permute input channels. The default converts " +
"RGB -> BGR since BGR is the Caffe default by way of OpenCV."
)
args = parser.parse_args()

image_dims = [int(s) for s in args.images_dim.split(',')]

mean = numpy.load(MEAN_FILE)

channel_swap = None
if args.channel_swap:
channel_swap = [int(s) for s in args.channel_swap.split(',')]

# USE GPU
caffe.set_mode_gpu()

# Make classifier.
classifier = caffe.Classifier(MODEL_FILE, PRETRAINED_MODEL_FILE,
image_dims=image_dims, mean=mean,
input_scale=args.input_scale, raw_scale=args.raw_scale,
channel_swap=channel_swap)

# Classify image
scores = Classify(args.input_file,classifier)

prediction = zip(scores[0].tolist(), numpy.loadtxt(CATEGORY_FILE, str, delimiter="\t"))
prediction.sort(cmp=lambda x, y: cmp(x[0], y[0]), reverse=True)

#Show result
for rank, (score, name) in enumerate(prediction[:3], start=1):
print('#%d | %s | %4.1f%%' % (rank, name, score * 100))

def Classify(img_file,classifier):

# Load image file.
inputs = [caffe.io.load_image(os.path.expanduser(img_file))]

# Classify.
start = time.time()
predictions = classifier.predict(inputs)
print("Done in %.2f s." % (time.time() - start))
return predictions

if __name__ == '__main__':
main(sys.argv)

これをclassify_new.pyという名前で~/caffe/pythonに保存して実行
python classify_new.py --raw_scale 255 ../101_ObjectCategories/airplanes/image_0001.jpg

□実行結果
Screenshot from 2015-06-21 05:32:24

飛行機、軍用機と分類されました

実行時間はcpuモードでは2秒、今回のgpuモードでは0.4秒でした
gpuを使えば3~4倍近く早くなるようです

今回は学習済みのネットワークを使ったので、~/caffe/data/ilsvrc12/synset_words.txtに記載されるカテゴリのみの分類となります。
このsynset_words.txt、結構大事なカテゴリが抜けてたりするので、何かにそのまま使うというのはちょっと難しいです。
そこで、自分で分類を作りたいと思うのですが、それにはネットワークに学習させる必要があります。
次はそれに触れようとおもいます。


参考にさせて頂いた記事
・Caffeの使い方 | Caffe-RubyWiki
http://wiki.ruka-f.net/index.php?Caffe
・Caffeで手軽に画像分類
http://techblog.yahoo.co.jp/programming/caffe-intro/


にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

スポンサーサイト

ご家庭で手軽にDeep LearningするためにCaffe(GPUモード)をインストールする方法

ご家庭で手軽にDeep LearningするためにCaffe(GPUモード)をインストールする方法を紹介します

マイマシン概要
CPU: Intel(R) Core(TM) i5 CPU 1067MHz
メモリ: DIMM3 8GB 2.67GHz
GPU: GeForce GT 425M

私はまっさらなUbuntu14.04を用意してから導入しました
(必要コマンドのみを記載しているので、コマンドが通ったかの確認はご自身で行ってください)

□NVIDIAグラフィックドライバとCUDAのインストール

・下準備
必要なアプリの導入と不必要な情報の削除
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
sudo apt-get install linux-source
sudo apt-get install linux-headers-$(uname -r)
sudo apt-get remove --purge nvidia*

・nouveauの無効化
nouveauは標準で入っているグラフィックドライバ、インストールの妨げになるので無効化
sudo nano /etc/modprobe.d/blacklist-nouveau.conf

でblacklist-nouveau.confを開いて以下の文字を記載

blacklist nouveau
blacklist lbm-nouveau
options nouveau modeset=0
alias nouveau off
alias lbm-nouveau off

保存して閉じたら以下のコマンドでOptionを追加して再起動
echo options nouveau modeset=0 | sudo tee -a /etc/modprobe.d/nouveau-kms.conf
sudo update-initramfs -u
sudo reboot

・ダウンロード
Nvidiaのサイトから自分のハードのドライバ(NVIDIA-Linux-x86_64-***.**.run)をダウンロード
http://www.nvidia.co.jp/Download/index.aspx?lang=jp


CUDAもダウンロード
wget http://developer.download.nvidia.com/compute/cuda/6_5/rel/installers/cuda_6.5.14_linux_64.run

・インストール
GUIが起動中だとインストールできないので
Ctrl + Alt + F1でCUIへ移る(ブラウザとかが閉じてしまうので下記コマンドはメモ等とる)

sudo service lightdm stop
chmod +x NVIDIA-Linux-x86_64-***.**.run
chmod +x cuda_6.5.14_linux_64.run
sudo ./NVIDIA-Linux-x86_64-340.46.run
sudo ./cuda_6.5.14_linux_64.run

・PATHの設定
sudo nano ~/.profile

.profileを開いて以下の行を追加

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

システムへ反映
source ~/.profile

2015/07/14:LD_LIBRARY_PATHではリンクされない場合があるので、以下のようにシステム全体で共有するリンクにしておくとよい

sudo nano /etc/ld.so.conf

/etc/ld.so.confを開いて以下の行を追加

/usr/local/cuda-6.5/lib64/

システムへ反映
sudo ldconfig

□BLASのインストール
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 libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler

g++は4.6でないとだめなので
標準でg++4.8がインストールされている場合は
4.6を優先して使えるように設定

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update; sudo apt-get install gcc-4.6 g++-4.6
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 10
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 10
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 20

□Caffe本体のインストール
gitが入っていない場合はgitをインストール
sudo apt-get install git

・caffeのダウンロード
ホームディレクトリ直下に展開
sudo git clone https://github.com/BVLC/caffe.git

・caffeのmake前の設定
cd caffe
sudo cp Makefile.config.example Makefile.config
sudo nano Makefile.config

でMakefile.configを開いて以下を変更

#CUSTOM_CXX := g++を使用するヴァージョンの
CUSTOM_CXX := g++-4.6に書き換え

CUDA_DIR := /usr/local/cudaをcudaのライブラリがある
CUDA_DIR := /usr/local/cuda-6.5に書き換え

BLAS := atlasは始めの方でいれたBLASの種類によって異なる
今回はatlasなのでそのまま

・Caffeのmake
sudo make all
sudo make test
sudo make runtest

以上で最後まで通ればインストール完了

□PythonでCaffeを使うのに必要なもののインストール
CaffeをPythonで使いたい人は以下のようにPythonの設定をする
sudo apt-get install python-scipy python-matplotlib python-scikits-learn ipython python-h5py python-leveldb python-networkx python-nose python-pandas python-dateutil python-protobuf python-yaml python-gflags python-skimage cython python-numpy python-setuptools
sudo easy_install -U pip
cd ~/caffe/python
for req in $(cat requirements.txt); do sudo pip install $req; done
cd ..
sudo make pycaffe

・PATHの設定
sudo nano ~/.profile

で.profileに以下の行を追加

export PYTHONPATH=~/caffe/python:$PYTHONPATH

保存して閉じたら以下のコマンドで.profileを反映
source ~/.profile

以上、Caffeの導入は完了です。
使い方はまた後日書きたいと思っています。

参考にさせて頂いた記事
・Caffeのwiki
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
・Ubuntu 14.04 上での Caffe の導入手順メモ
http://www.nal.ics.es.osaka-u.ac.jp/personal/k-yamanishi/CaffeUbuntu.html
・Caffeで手軽に画像分類
http://techblog.yahoo.co.jp/programming/caffe-intro/


にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

Deep Learning(人工知能、AI)始めました

機械に何か判別させたい場合ってありますよね。
たとえば、写真に映っているのがりんごなのかバナナなのかとか。
そういうのって、手で判別プログラムを書くと凄く大変なので、機械学習とかニューラルネットワークとかを使ったりします。
どっちも、たくさん学習データ(いろんなアングルのバナナとかりんごの画像)を与えて機械に覚えさせて、判別させます。
でも画像の情報全部を学習すると大変なことになるので、情報を抽象的な特徴にうまーく落とし込んで学習できるのがニューラルネットワークです。

ニューラルネットワークは人間の脳のシナプスの仕組みを真似して考えられたもので、一長一短はありますが、機械学習よりも優れていると一般には思われているようです。
Deep Learningというのは最近注目され始めた技術で(発案は大分昔ですが・・・)ニューラルネットワークの一種で、ネットワークのノード(脳でいうシナプス)を多層につなげたものです。

Wikipedia | ディープラーニング
https://ja.wikipedia.org/wiki/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%83%A9%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0

その認識精度は人間には到底及ばないものの、私達が機械に持っているイメージを大きく塗り替えるものがあります。
以下のように画像中の犬や帽子、テレビや果物などを初めてみる画像でも認識できます。

g_d_1.png
g_d_2.png
引用:Building a deeper understanding of images

GoogleやFacebookは既に活用していて、画像のタグ付け、分類で大きな成果をあげているそうです。
それが、個人でも使えるFrameworkとなっているので、最近入れてみて、自分もやってみました。

飛行機や戦車、色々と判別できます。
tank.jpg
airplain.jpg

猫や、その種類までも判別可能です。
初めてみる画像でも、斜めからのアングルでも遠目でも近目でも割と大丈夫です。
cats.jpg


Ubuntu14.04上でCaffeというFrameworkをGPU演算で使っているのですが、導入が鬼門なわりにWEBにまとまった情報がない(CPU演算はみなさんやられているようですが、GPUはあまりない)ので、また紹介しようと思います。

Caffe | Deep Learning Framework
http://caffe.berkeleyvision.org/

ではでは


にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

プロフィール

回路師

Author:回路師
趣味がロボットと動画製作です。
便利な機械やあほなマシンの動画を投稿しています.

最新記事
最新コメント
カテゴリ
電子工作キット








月別アーカイブ
書籍






Twitter
リンク
RSSリンクの表示
ソーシャル

検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。