Raspberry PiでDeep Learning「DeepBeliefSDKで画像認識」

f:id:karaage:20140430103213j:plain:w640

人工知能にまだ興味深々丸です

 「時代は人工知能だ!とにかくやってみるっきゃない!」と宣言して、以下記事のように本読んでちょっとサンプル動かして放置という人工知能にわか丸出し状態のからあげです。

 このままじゃいかん!ということで、一念発起(勃起ではない)して、再チャレンジすることにしました。

 とりあえず色々本を読んで自分なりに分かったのは以下3つくらいです。たった3つかよという感じですが、そもそもこの3つでさえ間違っているかもしれません。はっきりいってふむふむ分からんです。

  • 「Deep Learning = 人工知能」ではないような気がするしそんな気もする
  • Deep Learningは大量のデータから勝手に分類するのが得意で凄い
  • Deep Learningは学習には膨大な計算量が必要だが学習した結果を使用した分類は非力なマシンでも動く

Deep Learning = 人工知能ではないような気がするしそんな気もする

 自分なりの結論はそもそも知能というものの定義が難しいのでYesともNoともいえないのじゃないかなというところ。男女間に友情は存在するのか?的問いに似ていますね。友情の定義が人によってばらばらだから結論出ないんですよね。

 もっとちゃんと知りたいという人は下記記事読むのがよいと思います。

 

Deep Learningは大量のデータから勝手に分類するのが得意で凄い

 Deep Learningの凄いところは、人間が処理しきれないような膨大なデータを元に、勝手に特徴を見つけ出してよい感じに分類してくれるというところみたいです。でもなんでもデータ放り込めばよいわけじゃなくて、人間がしっかり前処理するのが重要みたいですね。
 Deep Learningを使うと知的な作業ができるし、人間の脳のアナロジを用いた技術なんだけど、これを使うと

Deep Learningは学習には膨大な計算量が必要だが学習した結果を使用した分類は非力なマシンでも動く

 結果を使うだけなら非力なマシンでもOKみたいです。あの教育用の小型PCであるRaspberry Piでも余裕で動いちゃうとか。そしたらやるっきゃないでしょ!

Raspberry Pi+Deep Learningで画像認識

f:id:karaage:20151210222652j:plain:w640
 こいつでDeep Learningだ!

 今回はDeepBeliefSDKというソフトを使いました。Raspberry Piをはじめ、iOS, Linuxと様々なOS上で動きます。

 セットアップに関しては興味が無い方も多そうなので、最後にこそっと書いておきます。気になる人は試してみて下さい。

画像認識結果

 早速気になる認識結果です。

ロンスタさん

f:id:karaage:20151212110823j:plain:w640
 もはやリファレンスとなっているフリー素材。ろんすた (id:lonestartx) さんいつもありがとうございます。

0.137841	horizontal bar
0.088009	kimono
0.012647	suit
0.520930	shoji
0.014808	feather boa
0.014413	stethoscope
0.018758	prison
0.068814	pajama
0.029971	sarong
Classification took 3737 milliseconds

 気になる結果は、50%の確率で障子(shoji)!たしかに!間違いない!あとは、牢屋(prison)とかパジャマとか着物とか、まあなるほどという結果。認識時間は3.7秒

ラーメン

f:id:karaage:20151029122730j:plain:w640
 美味しそうなラーメン

0.022354	spaghetti squash
0.077879	chambered nautilus
0.015964	plate
0.340358	soup bowl
0.021325	mixing bowl
0.059504	acorn squash
0.021479	mushroom
0.062339	carbonara
0.029215	hot pot
0.011043	butternut squash
0.030455	potpie
0.013218	wooden spoon
0.011179	consomme
0.012731	pretzel
0.010026	nacho
0.042974	bagel
0.090078	clam
Classification took 3698 milliseconds

 スープボールとか、スパゲッティとか、それっぽい単語が並んでいます。今回は付属してきた米国での学習データを用いているので、アジア系のものの認識は厳しいですが、なんとなく気持ちが伝わってきますね。

からあげ

f:id:karaage:20151029185841j:plain:w640
 からあげ!

0.078835	spaghetti squash
0.017365	pudding
0.046958	ice cream
0.120962	plate
0.048611	mashed potato
0.026075	French loaf
0.044984	acorn squash
0.041915	hotdog
0.016362	butternut squash
0.155392	meat loaf
0.086183	burrito
0.158076	nacho
0.018138	cheeseburger
0.061287	cauliflower
Classification took 3726 milliseconds

 ラーメンとにたような感じですね。

カメラ

f:id:karaage:20140119130519j:plain:w640
 フィルムカメラ

0.082851	Polaroid camera
0.139260	cassette player
0.047332	reflex camera
0.087592	flash
0.090130	radio
0.013063	tape player
0.059873	loudspeaker
0.442477	projector
Classification took 3701 milliseconds

 おお、ポラロイドカメラとかレフレックスカメラとかありますね。プロジェクタが一番スコア高いですが、まあ分かる気はしますね。

パンダ

f:id:karaage:20140430103213j:plain:w640
 パンダ

0.999887	giant panda
Classification took 3696 milliseconds

 99%パンダ!

まとめ

 最初の方は、Deep Learning大したことねぇなと思っていたのですが、パンダでちょっとびっくりしました。ただ、Deep Learningという技術はデータを与えれば特徴を捉えて分類するという非常に知的な振る舞いをするし、人間の脳の働きのアナロジを用いた技術ではあるのですが、この延長線上に人間のもつ知性とか知能に繋がるかというと、多分そうじゃなくてまだまだ何段もブレイクスルーが必要なのだろうなというのを感じました。研究している人は多分もっと分かっていると思いますが。
 それと同時に、大量のデータを分類するという作業は、だいたい自動化できてしまうのだなというのが分かりました。子供には大量のデータを元に分類するような仕事を選ばないように注意しようと思います。でも結構多いですよね、そういう仕事。弁護士とか、医者とか…
 とりあえず、はてなブログのカテゴリはそのうち勝手に分類してくれるようになりそうですね。あとは面白いブログも勝手に書いてくれたら最高ですね。ちなみにこのブログは誰が書いているんでしょうね、ふふふ。

関連記事


 Flickrの自動分類機能ではパンダは難しかったはずなのですが…学習データの違いなのですかね。


 お待ちかねのセットアップ方法。読みたい人だけ続きをごらんください。

DeepBelief on Raspberry Pi セットアップ方法

 セットアップ方法です。基本は下記サイトに書いてある通りやればできるのですが、一部はまりそうな箇所あったので残しておきます。

事前準備

 まずは下記記事を参考にRaspberry PiにRaspbian Jessieをインストールします。

 続いてビルドするための下準備です。Raspberry Piをネットワークに接続した状態で起動して、以下のコマンドを順に入力していきましょう。git cloneとかhg cloneとかapt-get installなどで結構待ち時間があるので完了までに20分くらいかかります。

$ mkdir ~/projects
$ cd ~/projects
$ git clone https://github.com/jetpacapp/DeepBeliefSDK.git
$ sudo apt-get install -y mercurial
$ hg clone https://bitbucket.org/eigen/eigen
$ ln -s ~/projects/eigen ~/projects/DeepBeliefSDK/eigen
$ cd ~/projects/DeepBeliefSDK/source
$ make clean
$ sudo apt-get install gcc-4.8 g++-4.8
$ sudo rm -rf /usr/bin/gcc
$ sudo rm -rf /usr/bin/g++
$ sudo ln -s /usr/bin/gcc-4.8 /usr/bin/gcc
$ sudo ln -s /usr/bin/g++-4.8 /usr/bin/g++

ビルド

 ビルドの前に参考サイトの情報を元に~/projects/DeepBeliefSDK/source/src/lib/pi/mailbox.cppを下記コマンドで修正します。

$ sudo vi src/lib/pi/mailbox.cpp
変更前
#define MAJOR_NUM 100
変更後
#define MAJOR_NUM 249

 次に以下コマンドでビルド

$ make GEMM=eigen TARGET=pi2

 その後、参考サイト情報を元にファイルコピー

sudo cp libjpcnn.so /usr/lib/
sudo cp src/include/libjpcnn.h /usr/include/

テスト

 完了したら、以下コマンドでテスト。

./jpcnn -i data/dog.jpg -n ../networks/jetpac.ntwk -t -m s -d

 以下のように認識できればOK。

0.015300	soccer ball
0.020866	standard poodle
0.169138	boxer
0.038990	corgi
0.213237	Staffordshire bullterrier
0.024005	greyhound
0.012390	English setter
0.013972	miniature poodle
0.016022	tennis ball
0.025065	dalmatian
0.394529	golden retriever
Classification took 3778 milliseconds

 data/dog.jpgのファイルを差し替えれば好きな写真を認識できます。

関連記事