2018/08/10

【07.実践1】GoogLeNetで画像認識の実行と改造

どうも、ディープなクラゲです。
ゼロから学ぶディープラーニング推論」シリーズの7回目記事です。
このシリーズでは、Neural Compute StickとRaspberryPiの使い方をゼロから徹底的に学び、成果としてディープラーニングの推論アプリケーションが作れるようになることを目指しています。

第7回目は、いよいよディープラーニング推論を実践します。
今回はコードの内容は深く追わずに、とにかく推論を実行させてみましょう。

【 目次 】


GoogLeNetとは

GoogleNetとは、2014年に行われた画像認識技術コンテスト(ILSVRC)で優勝したチームの人工知能のモデル名です。
優勝したチームはグーグルで、モデルとは第1回目のときに説明した「モデルと重み」の「モデル」です。
他にも2012年の優勝モデルAlexNetや、2015年の優勝モデルResNetなどが有名です。
今回の推論では、対象画像を1000種類(動物や乗り物、モノなど)の中から分類します。

ディープラーニング推論実行

お気づきかもしれませんが、実はインストール時の一番最後にGoogLeNetを実行しています。
もう一度、復習で実行してみましょう。

GoogLeNetのあるフォルダへ移動します

cd ~/workspace/ncsdk/examples/caffe/GoogLeNet

実行します

python3 run.py

実行結果はこんな感じです

以下の結果が読み取れました

prediction 0 は 0.996の確率(つまり99.6%)で electric guitar
prediction 1 は 0.003の確率(つまり0.3%)で acoustic guitar
prediction 2 以降は 0.0の確率

そして、このサンプルコードは以下の写真をディープラーニングの推論に入力しているというのを前回お伝えしたかと思います。

ここまでは前回の復習です。

改造して別の画像を推論

さて、このままだとエレキギターの推論しかできない状態なので、run.pyを改造したいと思います。
元のコードは取っておいて、コピーしてから改造しましょう
まずは "run2.py"という名前にコピーします

cp run.py run2.py

nanoで開きます

nano run2.py

73行目に以下の記述があります。
ちなみに、nanoで現在のカーソル行を知るには Ctrl + C を押すと中央下に行数が出てきます。

img = cv2.imread(EXAMPLES_BASE_DIR+'data/images/nps_electric_guitar.png')

どうやら どこかのフォルダにある 'data/images/nps_electric_guitar.png' の画像を読み込んでいるっぽいというのが分かりますね。
(詳しいコードの解説は次回行います。まずは雰囲気でつかんでください)

ファイルマネージャーを開いて imagesフォルダを見てみましょう
以下のパスをたどれば、出てきます
/home/pi/workspace/ncsdk/examples/data/images

nps_electric_guitar.png をダブルクリックしてみて下さい。先ほどのエレキギターの画像が出てきたと思います。
つまり、73行目のファイル名を改造すれば、別の画像でディープラーニング推論できるということです。
cat.jpgという画像ファイルがフォルダにあります

run2.pyの73行目をcat.jpgに変更してみましょう

img = cv2.imread(EXAMPLES_BASE_DIR+'data/images/cat.jpg')

これで保存して実行します

python3 run2.py

結果はこちらです

40.28%で tiger cat
32.437で tabby cat
8.99%で Egyptian cat
ということで、ネコであることはもちろん、その種類も当たっていそうです。

様々な画像を推論

サンプル画像は他にもいくつかあります。
画像毎にソースコードを変更しなおすのは面倒なので、プログラムから画像ファイル名を入力して実行できるように改造します。

python基礎「その他」で学習した input を使います。
変数filenameに入力して、それを文字列連結を使ってcv2.imreadの引数に繋げます。
run2.pyの73行目の変更と、上に2行新規で追加してください

print('input file name')
filename = input()
img = cv2.imread(EXAMPLES_BASE_DIR+'data/images/' + filename)

画像は何でもOKです。上記のフォルダ内にあるサンプル画像でなくても、インターネットからダウンロードした画像や、デジカメで撮った写真などで試してみてください。

ラズパイとPCとのファイルのやり取りですが、USBメモリを使って行うことも可能ですが、SFTPを使えば無線でやり取りが可能です。
SFTPのやり方は、こちらのページの「SSHの設定方法」と「ファイル転送(SFTP)」を参照してください。
http://jellyware.jp/kurage/raspi/ssh.html

現状の改造方法だと、キーボードから入力したり、何度もpython3コマンド実行したりするのが面倒ですね。
後の記事で、USBカメラに映っている映像をリアルタイム推論させるコードに挑戦しますので、ご期待ください。


今回はコードの内容をあまり見ずに、とにかく実行することに専念しましたが、次回はこのサンプルソースをじっくりと見て理解します。
以上、「GoogLeNetで画像認識の実行と改造」でした。