- 更新日: 2019年10月03日
- 公開日: 2019年09月27日
[プログラミングを子供にやらせたい親御さん必見]コンピューターは仮面ライダークウガとアギトを見分けられるか?
令和の AI 社会を突き抜ける「仮面ライダーゼロワン」が始まりましたが、平成ライダーもやっぱりカッコイイですよね。 ところで平成最初のライダーといえば「クウガ」ですが、皆様は平成2番目のライダー「アギト」と見分けがつきますか?
img: 魂ウェブ
私は、いつまで経ってもどっちかな...と悩みます。試しにコンピューターに機械学習させて「クウガ」と「アギト」を見分けられるかテストしました。仮面ライダー❤な方をはじめ、 AI や 機械学習を勉強中の方、ご参考頂ければ幸いです。
今回は Android のアプリ化までご紹介しますが、チュートリアルに従って作業していきますので、アプリ開発&機械学習初心者の方でも大丈夫ですよ。肩の力を抜いて、ご参考下さい。
今回作ったアプリ:
仮面ライダークウガとアギトを見分けるカメラアプリ(beta版)
コンピューターは仮面ライダークウガとアギトを見分けられるか?機械学習してAndroidのAIアプリにしてみた
開発環境
パソコン/ ローカル環境
エディタ/ Visual Studio Code
IDE/ Android Studio
データセット/ Google検索よりクウガとアギトを各100枚ほど
機械学習/ TensorFlow(MobileNetによる再トレーニング)
参考チュートリアル/ TensorFlow for Poets 2: TFLite Android
アプリ作成までの時間/ 約30分
アプリリリース/ 不可(SDK Version、 PackageNameが引っかかる)
オリジナルの画像をコンピューターに学習させる方法は、 TensorFlow の他に Firebase の MLKit などが有名。今回は参考チュートリアルに従って TensorFlow で機械学習を実施。尚、一から画像を機械学習させるのではなく、 MobileNet を使った再トレーニング方式。 MobileNet では 1000以上の画像を学習済みですが、さすがに仮面ライダーはありませんでした。
尚、今回使用するチュートリアルとプログラムは Python2 の実行環境となっていますので、サポート終了(2020年1月1日)のこともあって、永続性は欠けます。オリジナル画像を機械学習させて、 Android アプリに実装するまでの流れ、様子をご参考頂ければ幸いです。
仮面ライダークウガとアギトをコンピューターに学習させて、アプリ化する様子の動画
本テキストと合わせてご参照下さい。
機械学習の用意
今回ご紹介する内容の全体像
今回は、チュートリアル:TensorFlow for Poets 2: TFLite Android を元に機械学習の様子や学習済みデータをアプリに実装する様子をご紹介していきます。
まずは機械学習するためのプログラムが必要になってきますね。以下の GitHub からプログラムを自分のパソコンにインポートしましょう。
https://github.com/googlecodelabs/tensorflow-for-poets-2.git
git clone https://github.com/googlecodelabs/tensorflow-for-poets-2.git
そして今回は機械学習に、フレームワークの TensorFlow を使用、しかもチョット前の TensorFlow 1.7 バージョン。バージョンが違うと実行コマンドとかも違ってきますので、同じバージョンをインストールするようにご注意下さい。
とその前に Python の仮想環境を作っておきましょう。
virtualenv env
source env/bin/activate
pip -V
Python2 系を実行できることを確認して
pip install --upgrade "tensorflow==1.7.*"
もし pip -V
で Python3 系だったら pip2 -V
で Python2 の実行環境があることを確認。自分のパソコンに Python がない場合、 Python2 がない場合は、 GitPod などのクラウド型開発環境を利用すると簡単です。
TensorFlow の準備ができたら、次はデータセット。
データセット
img : Google検索「検索キーワード クウガ」
今回機械学習に使用するデータセットは、 MNIST や iris みたいに世に存在しないタイプ。自分で機械学習対象の「仮面ライダークウガ」や「アギト」の画像を収集する必要が。手元の本やおもちゃを写真に撮ってもいいかもしれませんが、ちょっと大変。そこで今回は Google の画像検索を使ってデータ収集することに。画像を転載する訳ではないので、ライセンスも OK でしょう。要は”人”が見るか、”機械”が見るかのこと。
画像利用に関する法令【著作権法30条(私的使用のための複製)】 を確認する限りでは、個人利用目的であれば Web上の画像を自分のパソコンにダウンロードしてみるのは OK とされています。
ブラウザ上から画像を収集する方法はいくつかありますが、今回は一番簡単な Chrome の拡張機能「Download All Images」 を利用。ボタンひとつで画面上の画像をまとめてダウンロードしてくれます。 画像を収集した後は、不要な画像を削除し、データを整えます。
概ね各100枚の画像が用意できました。
機械学習を実行
コンピューターに「仮面ライダークウガ」と「アギト」の画像を認識してもらうべく、機械学習を実行します。今回実行するプログラムは、冒頭 GitHub からダウンロードしたファイルの中の retrain.py。 retrain.py を実行するとコンピューターが「クウガ」と「アギト」の画像を学習し、「クウガ」と「アギト」の特徴を掴みます。その学習結果が、モデル(retrained_graph.pd)としてファイルに記録。
この学習済みデータ(モデル: retrained_graph.pd) を使うと、コンピューターは「クウガ」と「アギト」を見分けることができる(予定)という訳です。
.pd ファイルは、 protobuf を意味し、 protobuf 自体も Protocol Buffers の略語。学習結果のグラフ定義とモデルの重みを記録したファイルで、チョット特殊です。
IMAGE_SIZE=224
ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}"
python -m scripts.retrain \
--bottleneck_dir=tf_files/bottlenecks \
--how_many_training_steps=1000 \
--model_dir=tf_files/models/ \
--summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" \
--output_graph=tf_files/retrained_graph.pb \
--output_labels=tf_files/retrained_labels.txt \
--architecture="${ARCHITECTURE}" \
--image_dir=tf_files/MLData
機械学習には retrain.py を実行するわけですが、上記のようにいくつかの設定項目を埋める必要があります。各オプション内容について気になる方は、以下をご参考下さい。
上記コマンドの解説
IMAGE_SIZE=224 |
画像の解像度 |
ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}" |
再トレーニング元のデータ:MobileNet の利用割合、 0.5は半分 |
python -m scripts.retrain \ |
scriptsフォルダ内の retrain.py を実行 |
--bottleneck_dir=tf_files/bottlenecks \ |
ボトルネックは、再トレーニングでオリジナル画像がニューラルネットワーク処理された結果。今回学習済みの MobileNet を使っていますので、その最終レイヤーにボトルネックが加わって、学習された形。画像の枚数分、ボトルネックは生成。 |
--how_many_training_steps=1000 \ |
再トレーニングの回数、今回は 1,000回。 1,000回でも多いように思いますが、実はデフォルト設定だと 4,000回。学習精度を高めたい時は 4,000 とか必要でしょうが、今回は流れの確認なので 1,000。 |
--model_dir=tf_files/models/ \ |
こちらは事前トレーニング済みの MobileNet を保存する先を指定。 |
--summaries_dir=tf_files/training_summaries/"${ARCHITECTURE}" \ |
TensorBoard 用のデータ出力。 |
--output_graph=tf_files/retrained_graph.pb \ |
再トレーニングしたモデルを retrained_graph.pb として出力。最終的にアプリにこのモデルをセットする時は .pb ファイルを TensorFlow Lite の .lite 形式に変換。 |
--output_labels=tf_files/retrained_labels.txt \ |
再トレーニングした結果のラベル。画像解析した結果、その画像が何であるかが retrained_labels.txt に。ちなみにラベル名は、データフォルダ名の KUUGA と AGITO が引用される予定。 |
--architecture="${ARCHITECTURE}" \ |
こちらは事前学習済みモデル MobileNet の占める割合。前章のコマンドで実行した ARCHITECTURE="mobilenet_0.50_${IMAGE_SIZE}" が引用。 |
--image_dir=tf_files/MLData |
学習してもらいたいデータのディレクトリ。今回は MLData 内の KUUGA と AGITO フォルダを学習してもらいました。 |
画像クリックで拡大
上記コマンドで retrain.py を実行した結果、 tf_filesフォルダ内に学習済みデータである retrained_graph.pb とラベルデータ retrained_labels.txt が出力されました。試しに上手く「クウガ」と「アギト」を見分けられるかテストしてみます。
機械学習の成果をテスト
テストコマンドの画像
python -m scripts.label_image \
--graph=tf_files/retrained_graph.pb \
--image=tf_files/TestImage/agito1.jpeg
上記コマンドの解説
python -m scripts.label_image \ |
scriptsフォルダ内の label_image.py を実行 |
--graph=tf_files/retrained_graph.pb \ |
予測に使用する学習モデルを retrained_graph.pb に指定 |
--image=tf_files/TestImage/agito1.jpeg |
読み込む画像を指定。今回は学習データに使用しなかったテスト用の画像。 |
画像クリックで拡大
学習データが 100枚ぐらいと少なめでしたので不安でしたが、学習に使わなかったテスト用の「クウガ」と「アギト」の 2種類の画像をコンピューターに読み込ませると、なんとか見分けが付くよう。学習に使ったデータセットが少なかったとこと、機械学習の回数などパラメーターが甘かったのかもしれません。また全然違う「仮面ライダージオウ」の画像をコンピューターに読み込ませると、
img: テレビ朝日/仮面ライダー ZIO
kuuga 0.99948%
agito 0.00052%
とクウガじゃないのに”クウガ”という答えを出しています。学習していないものに対しては ”UNKNOWN” と出力させる方法も必要ですね。
今回ご紹介したように、既存のデータセットでなく、自分の気になる画像をコンピューターに学習させて、その学習結果をテストできるとおもしろいですね。次は、この学習データをスマホにセットして、上記のようなコマンドを使わなくても、カメラ画像で予測してもらうようにセットしてみました。
学習済みデータを.pbから.liteに変換
チュートリアルにもあるように、モデルの retrained_graph.pb をモバイル用の .lite 形式に変換。チュートリアルでは、実行コマンドとして
tflite_convert
を使うとありますが、コマンド入力してみるとエラーに(下図参照)。
画像クリックで拡大
tflite_convert: コマンドが見つかりません
現在の TensorFlow 1.7 には tflite_convert
がない様子。そこで .pb から .lite にデータ変換する方法として、今回は toco
を使用。 tocoは tflite_convert
同様に .pb を .lite に変換可能。
toco \
--input_file=tf_files/retrained_graph.pb \
--output_file=tf_files/optimized_graph.lite \
--input_format=TENSORFLOW_GRAPHDEF \
--output_format=TFLITE \
--input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3 \
--input_array=input \
--output_array=final_result \
--inference_type=FLOAT \
--input_data_type=FLOAT
チュートリアルの tflite_convert
を参考に上記コマンドを実行。すると tf_filesフォルダに optimized_graph.lite が出力されました。
画像クリックで拡大
ちなみに上記コマンドのオプション内容は下記に示すとおりです。
上記コマンドの解説
toco \ |
モデル・コンバーターの toco を呼び出し |
--input_file=tf_files/retrained_graph.pb \ |
変換元のモデルデータ、 TensorFlow形式のモデル |
--output_file=tf_files/optimized_graph.lite \ |
変換後のモデルデータ、 TensorFlow Lite形式のモデル。 |
--input_format=TENSORFLOW_GRAPHDEF \ |
変換元のデータフォーマット、 TENSORFLOW_GRAPHDEF か TFLITE の2択。 |
--output_format=TFLITE \ |
変換後のデータフォーマット、 TENSORFLOW_GRAPHDEF, TFLITE, GRAPHVIZ_DOT の3択。 |
--input_shape=1,${IMAGE_SIZE},${IMAGE_SIZE},3 \ |
--input_shapeは必須項目ではありません*が、チュートリアルでは上記のように設定。TensorFlowのプログラム自体に input_shape は頻繁に登場してきますので、ちょっと難しいパラメーターです。 IMAGE_SIZE は、上記コマンで実行した画像サイズ 224 を意味しますね。 |
--input_array=input \ |
こちらはほぼ固定のオプション値、ちなみに --input_arrayは --saved_model_tag_set で指定された MetaGraphDef 内の SignatureDefs の入力と出力の集約されたアルファベット順のリスト、 ??? ですね。(詳細①、詳細②) |
--output_array=final_result \ |
--output_array も --input_array 同様の内容、とりあえずチュートリアルのまま実行 |
--inference_type=FLOAT \ |
逆量子化する場合の設定値、ちょっと難しいですね。 |
--input_data_type=FLOAT |
変換元が TensorFlowモデルなら FLOAT でOK。 |
Androidアプリにオリジナルのモデルをセット
画像クリックで拡大
Andoid や iOS 用に作成できたモデル optimized_graph.lite を Android のプログラムにセットします。
モデルファイルとラベルファイルのセット先
tensorflow-for-poets-2-master/android/tflite/app/src/main/assets
ファイルのコピペコマンド
cp tf_files/optimized_graph.lite android/tflite/app/src/main/assets/graph.lite
cp tf_files/retrained_labels.txt android/tflite/app/src/main/assets/labels.txt
参考チュートリアルでは、コマンド上でコピペを実行していますが、普通のディレクトリ操作でモデルとラベルのファイルを Android のプロジェクトに貼り付けても OK です。この”モデルをセット”する感覚を知っておくと、画像認識以外の様々な AI アプリで応用することができるでしょう。
これでオリジナルの学習モデルをスマホで使う準備ができました。
オリジナルのAIアプリのテスト
一番最初に git clone 〇〇
したプログラムに Andoid と iOS のプログラムはあって、今回は Andoid の tflite を開きます。 Android Studio を起動し、 tflite を Open。
【Android Studioで開くフォルダ(アプリ)】
tensorflow-for-poets-2-master/android/tflite
画像クリックで拡大
そして今回はカメラを使いますので、実機でテスト。 サンプルプログラムの gradle のバージョンは古いですが、今回はそのままのバージョンで実行してみます。
img: S.H.Figuartsシリーズ
カメラが起動し、 LIVE で画像内の物体を予測できていることが分かりますね。カメラと物体の距離によって認識レベルが違ったりして、実際に自分のスマホで学習モデルを実行してみると、色々気づく点があっておもしろいですね。(上記動画 20秒過ぎた付近でカメラを近づけています、画像認識度が高まった様子を確認できると思います。)
今回は「仮面ライダークウガ」と「アギト」でしたが、全ライダーを機械学習させて識別できるアプリがあったら面白そうですし、カメラがライダーを認識したら決まり文句を発生する、という機能があってもおもしろいかもしれません。例えば、ジオウだったら「なんかイケそうな気がする」とか。
このように機械学習のお勉強もパソコンの"枠"から出て、アプリに展開すると実用感があって学習にも身が入るのではないでしょうか。
今回実行したアプリ・プログラムの流れとしては、セットした学習データ graph.lite と labels.txt をプログラムファイル:ImageClassifier.java によって読み込まれ、カメラからの入力画像データを学習データと照合、そして推測値を出力、という大まかな流れです。一からプログラムを考えて、カメラ機能にモデルファイルの活用に,,,,としていると大変。しかし、今回のように GitHub とか チュートリアルが充実していると助かりますね。
尚、今回のサンプルプロジェクトは古い仕様で build.gradle が書かれているために、 Google Play にこのままの状態では公開することができません。新しい様式に書き換えるか、 build.gradle を編集して今の Google Play の仕様(SDK28以上)に合わせる必要があります。
\AIエンジニアに必要なスキルが身に付く/
まとめ
今回は、 Google公式チュートリアル Codelabs で紹介されている 機械学習 & アプリ開発 を実行しましたが、他にも物体検出できるアプリのチュートリアルやオリジナルの画像にラベルを付けて物体検出させるプログラムなど、機械学習者にとってはタマラナイ教材、たくさんあります。
そして現在 Google は Product Search Tutorial という機能を使って、画像内の物体を検出し、その物体に関係する情報(Webサイトやネットショップ)を表示する機能を準備中。こうした高機能なアプリには、カメラに Google Cloud、 API、機械学習 など複数の要素が絡んでくるでしょう。でも、カメラの画像でそのまま商品検索してくれたら、海外にいった時すごく助かりそうですね。
Product Search Tutorialの例(firebase/mlkit-material-android)
こうした早い展開をみせる機械学習ゾーン、上手くテクノロジーを使いこなし、商機を掴みたいですね。そうした社会の動きとは裏腹に 「機械学習? 回帰や分類、難しすぎる...」「TensorFlow、 pip install できない...」 と止まっているませんか?
CodeCamp では、プログラミング初心者、アプリ開発初心者を対象にオンラインでマンツーマンレッスンを開催中。受講料はかかりますが、「アプリ開発」と「機械学習」と「ITの基本」、全部をいっぺんに学習することもできます。もう数年の内に間違いなく社会に浸透する AI テクノロジー、自分も取り残されないようにしたいですね。
現在 CodeCamp では、レッスンの様子やプログラミングをもっと多くの方に知ってもらうために「無料体験」も随時行っています。完全オンラインで体験できますので、まだの方は一度検討してみて下さいね。
CodeCamp 公式ページ
- この記事を書いた人
- オシママサラ