先週末(2019.3.16), Urban Data Challenge 2018のファイナルが行われ, CODE for YAMATOKORIYAMAが金魚愛(AI)育成プロジェクトとして取り組んでいる「Kingyo AI Navi」が, アイデア部門の金賞[1]を受賞した.
関連記事:
・「Kingyo AI Navi」のアプリ化を考える (1)
・「Kingyo AI Navi」のアプリ化を考える (2)
・「Kingyo AI Navi」のアプリ化を考える (3)
・「Kingyo AI Navi」のアプリ化を考える (4)
・「Kingyo AI Navi」のアプリ化を考える (5)
・「Kingyo AI Navi」のアプリ化を考える (6)
この「Kingyo AI Navi」のアイデアをアプリ化するには, 金魚の種類を見分ける機能が必須である.
金魚の種類識別については, これまでもKeras + TensorFlowによるカスタムモデル[2]や, Cloud AutoML Vision[3]などを検討してきた.
「Kingyo AI Navi」のアプリ仕様からすると, 金魚の写真から種類を識別できればよく, 後々のことを考えると端末側よりはサーバ側でやる方がよさそうである.
前回は, とりあえずCloud AutoML Visionがどんなものか触ってみただけだったが, 今回もう少しきちんと試してみようと思って, 再度トライしてみた.
1. Kingyo AI Naviとは
そもそも, 「Kingyo AI Navi」って何なのか.
詳細な仕様はまったくないが, 以下のようなことができたらいいな, って感じ.
① 金魚にカメラをかざすと, 金魚の種類を推定!
② 金魚の特徴・飼い方と必要な道具がわかる!
③ 金魚の入手先(生息地)や関連スポットをマップ上に表示
2. Cloud AutoML Visionで金魚識別
2.1 金魚データセットの準備
金魚のデータは, 以前主にネットから収集したものを利用.
ただ, Cloud AutoML Visionはカテゴリ毎に100枚程度必要とのことなので, 今回はData Augmentationでデータの水増しを行った.
(少なくても一応学習はできるので, 前回はそのまま学習させていたが...)
Data Augmentationには, KerasのImageDataGeneratorを利用した.
[コード]
from keras.preprocessing import image TRAIN_DIR = './data/train_images' SAVE_DIR = './data/gen_images' classes = 'azumanishiki chakin chinshurin chobi chotengan comet demekin \ edonishiki hamanishiki kyariko nankin oranda ranchu ryukin sakuranishiki \ seibungyo shubunkin suihogan tancho tosakin wakin zikin'.split() def make_savedir(dir, subdirs): # データ保存ディレクトリ if os.path.exists(dir): shutil.rmtree(dir) os.mkdir(dir) for d in subdirs: os.mkdir(os.path.join(dir,d)) def make_images(imgdir, savedir, subdirs): for d in subdirs: path = os.path.join(imgdir, d) datagen = image.ImageDataGenerator( rotation_range=20, width_shift_range=0.1, height_shift_range=0.1, zoom_range = [1.2, 1.5], fill_mode='nearest', horizontal_flip = True) files = glob(os.path.join(imgdir, d, '*')) num = len(files) print('{} : {}'.format(d, num)) for i, f in enumerate(files): x = image.load_img(f) x = image.img_to_array(x) x = np.expand_dims(x, axis=0) gen = datagen.flow(x, batch_size=1) for j in range(10): images = next(gen) gen_img = images[0].astype(np.uint8) path, ext = os.path.splitext(os.path.basename(f)) fname = '{}_{:02d}.jpg'.format(path, j+1) image.save_img(os.path.join(savedir, d, fname), gen_img) if __name__ == '__main__': make_savedir(SAVE_DIR, classes) make_images(TRAIN_DIR, SAVE_DIR, classes)
2.2 画像アップロード
データは, train/valid/testに分け, Cloud AutoML VisionのCreate Datasetからcsvを選択することでインポートできる機能を利用した.
① 画像を格納しているディレクトリから, Google Cloud Storageへコピー
$ gsutil -m cp -r ./AutoMLData gs://{PROJECT-ID}-vcm/{DATASET}/img/
② GCSのパスとラベル情報の入ったCSVを作成し, 同じバケットへコピー
$ gsutil cp all_data.csv gs://{PROJECT-ID}-vcm/{DATASET}/csv/
例) all_data.csv
2.3 学習
Cloud AutoML Visionは, 毎月10個のモデルまで, 最初の1時間のモデル学習が無料である.
まずは, 無料1時間で学習, そして, 追加学習+2時間.
(Max24Hの追加学習ができるのだが, さすがに今回は$480($20/Hour)は出せないので, とりあえず2時間のみ)
昨日(2019.3.23)のGCPUG in Nara #3 懇親会の時, Googleの方と話をしていたら, 無料1時間はそれなりに学習, 追加学習すると時間に応じてモデル構造やパラメータ等も変えながらより精度が改善されるように学習しているとのこと.
Keras+TensorFlowで, InceptionResNetV2をFine Tuningしてやっと90%にあとちょっとで手が届く感じだったが, $40の追加学習であっさりと越えられてしまった.
AutoML Visionすごい!! まさに, 「性能は金しだい!!」って感じ.
2.4 API呼び出し
Cloud AutoML Visionで学習したモデルを利用して, 金魚の種類を分類するところは, 以前の記事[3]を参照のこと.
まぁ, ある程度精度も出そうなので, 次はアプリ側の検討に取り組もう.
他のメンバから, LINE Botの枠組みを使えないかといったアイデアが出ているので, まずはそのあたりから検討してみようと思う.
----
参照URL:
[1] UDC2018審査結果 | アーバンデータチャレンジ
[2] 金魚って見分けられる? (4) | みらいテックラボ
[3] Cloud AutoML Visionは金魚を見分けられるか? | みらいテックラボ
Google Cloud Platformではじめる機械学習と深層学習
|
Google Cloud Platformによる機械学習システム構築
|
|