N高等学校アドベントカレンダー2018 3日目です。
現役高校生の大杉直也31歳です。巷で話題のディープラーニングについての記事です。アオリでも釣りでもなく、今どきではディープラーニングを使ったり、ディープラーニングで学習させたりが、非常に簡単にできてしまうので、そのへんのtipsをざっくりまとめました。
本記事想定読者に求めるスキル:コピペと最低限のインターネット検索
ディープラーニングをつかう
Google Colaboratory
まず、ディープラーニングを実行したり学習させたりする環境の準備です。Google アカウントがあれば、Google Colaboratory (以下、Colab と称する)というサービスを使えば、なんと無料(本記事執筆時点では)でディープラーニングを実行したり学習させたりする環境が使えてしまいます。GPUも無料で使えてしまいます。
Colabをさらに知りたい場合は、その元ネタの Jupyter notebook とPython 3 について勉強してください。本記事ではとりあえず、環境が無料で使えてしまうことの紹介に留めます。
Keras
ディープラーニングのオープンソースです。ライセンスを守ればこれも無料で使えてしまいます。これを使うと”学習済み”の実行可能なディープラーニングのモデルがやはり無料で入手できてしまいます。
https://keras.io/ja/applications/
サンプルをつくったので、それでとりあえず動くところまで解説します。
サンプル
上記の ColabとKeras を使ったサンプルコードです。とりあえずうごく、最小限しか書いてないです。(アクセスにはGoogleアカウントが必要です)
編集・実行権限はない設定にしてあるので、ファイルタブからドライブにコピーを保存を押して、自分用のファイルを作ってください。
その後、ランタイムのところのセルの実行を選択してください。Colab というよりも元ネタのJupyter notebook ではコードをセルという単位を分けることができ、分割実行ができるので毎回最初から実行せずとも必要なところだけ実行できるのがとても便利です。
このサンプルでは、インターネット上の画像をダウンロードしてきて、その画像に写っているものがなにかをディープラーニングが予測してくれます。このサンプルでは、ImageNet という画像認識の研究者がよく使ってる画像データベースを使ってディープラーニングで学習した結果を使っています。なので、ImageNetにはない日本の漫画キャラを予測はできないのですが、一般的な物体でしたらだいたい予測できます(一般物体認識課題とよばれる)。
import keras
これでKeras を読み込みます。ColabならデフォルトでKerasが使える状態になってるので、import 文を一行書くだけです。
# 学習済みモデル
model = keras.applications.inception_resnet_v2.InceptionResNetV2(weights='imagenet')
weights='imagenet'と書くとImageNetで学習済みのディープラーニングのモデルが使えます。ここではInceptionResNetV2というやつを使ってますが、他にもモデルはいくつかあります。
他のモデルや使用例はKearsの公式ドキュメントをご参照ください。本サンプルも半分はここのコピペでできています。
https://keras.io/ja/applications/
import requests
from IPython.display import display, HTML
# 画像はここから https://www.pakutaso.com/ (アクセスできるところだったら何でも良い)
url = 'https://www.pakutaso.com/shared/img/thumb/TOMcatDSC01809_TP_V.jpg'
img = requests.get(url)
# いったん画像を適当に保存
# Colabだと最長で12時間で消されるので安心(?)
file_path = 'tmp_image'
with open(file_path, 'wb') as f:
f.write(img.content)
f.close()
予測したい画像をとってきてます。ここのurl の部分を適当な画像のリンクに変えるとその画像でなにが写っているのかの予測をしています。
display(HTML("<img src='{0}' width=300/>".format(url)))
これは本質的じゃないのですが、一応つけました。url元がどんな画像かを表示させてます。
import numpy as np
from keras.preprocessing import image
img_path = file_path
img = image.load_img(img_path, target_size=(224, 224))
ここでfile_pathの画像(tmp_image)を読み込んでます。上で保存したやつです。読み込むさいにtarget_sizeで224×224の画像に変換しているのは、今回のモデルが224×224の画像向けだからです。
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = keras.applications.inception_resnet_v2.preprocess_input(x)
ここも今回のモデルで使えるようにする処理です。おまじないです(inception_resnet_v2.preprocess_inputって関数まで用意されてては他に言いようが)
preds = model.predict(x)
ここがディープラーニングでの予測しているところです。上の画像を変換したものがxに入ってるので、それがなにかをあててます。
予測結果を人間が読みやすく、それっぽい順で上から3つとってきて表示されてるのが、以下の処理です。
print('Predicted:', keras.applications.inception_resnet_v2.decode_predictions(preds, top=3)[0])
ここのtopってところで上位いくつまでとってくるかを指定しています。本サンプルでは、猫の画像を入れたら、上から順にtabby(トラネコ)が0.967、tiger_cat(ジャガー)が0.032、Egyptian_cat(エジプト猫?)が0.0001 と予測され、この数字が1に近ければ近いほどそれっぽいということになります。完璧ですね。
上記のColabをコピーして、urlのリンク先を変えて色々と試してみると結構面白いです。
ここの部分
url = 'https://www.pakutaso.com/shared/img/thumb/TOMcatDSC01809_TP_V.jpg'
ここまで、Web画像になにが写ってるかをディープラーニングで当てるやり方でした。
ディープラーニングを学習させる
上記のサンプルには、InceptionResNetV2 というモデルを使いました。ディープラーニングとひとくちでいっても、部品の組み合わせ方やらパラメータの数字によって、いろんな種類があります。
ディープラーニングを学習させるには、学習環境とデータとモデルが必要になります。
本記事のコンセプトは”お金をかけずに”なので、学習環境はColabで良しとして、あとはデータとモデルが必要です。
モデルもKerasの中に InceptionResNetV2 のような実績のあるモデルがいくつも用意されているので、それをまずは見てみると良いです。それならコピペでも戦えます。
Kaggle
Kaggle というサイトがデータを入手するには便利です。このサイトでは、ディープラーニングなどの性能を競うコンテストが頻繁に開催されており、中には賞金付きのコンテンストもあります。つまり、このKaggleというサイトは無料で使えるどころか、お金までもらえる可能性があるということです。やったね!
https://www.kaggle.com/
またKaggleの中でも自分のディープラーニングのモデルを丁寧に公開している人もいます。
例えば、
https://www.kaggle.com/axelius/simple-cnn
研究者やエンジニアの共有文化は本当に素晴らしいですね!
ディープラーニングを勉強する
ここまで、高校生でもお金をかけずにコピペでできるディープラーニングを実施するために、便利なTipsを書いてきました。
ここからさらに先へ進むには
- もっと強い環境の準備
- ちゃんとしたコーディング
- ディープラーニングそのものの理解
が必要になってきます。1にはクラウドやインフラの知識+金が必要になってきますし、2はプログラミング技能が必要ですし、3は色んな入門書がありますが最低でも大学の理工学系学部の初めの方で学ぶ偏微分やら行列演算やらがわからないと厳しいです。
ちゃんとしたAI人材になるには、コピペから先の道はまぁまぁ厳しいです。逆に言えば、今回みたいな誰でも簡単にできて覚えられることは、それができたところで人材とよべる人にはなれないです。アオリでも釣りでもなく、と前置きしましたが撤回します。これで今日から君もAI人材の部分はアオリでした。
2018年の世界では、特にカスタマイズしない画像認識は、高校生でもお金をかけずにコピペでできることがおわかりいただけたでしょうか?
31歳のおっさんも高校生でもお金をかけずにコピペでできるレベルが現代だとどの辺りなのかを把握し続けなければならないのがしんどいですが、この分野は人類が進歩してる感が明確に見えるので楽しいです。