背景
生成 AI 真っ盛りな昨今(2023/8)ですが、あえてオーソドックスな画像識別の話です。
もちろん探せば色々と出てくるのですが、
- 最初から独自の識別モデルを作る少し長め & 難しめのものだったり
- 記述が古くて今の Google Colaboratory の環境だとエラーが出たり
と言うことだったので、まずは
- ImageNet の 1000 クラスで良いから学習済みのモデルを使って、画像識別をとにかくシンプルに試せるようにする
としてまとめたものです。
環境
- Google Colaboratory
- 無償版で OK です
- ランタイムのハードウェアアクセラレータも CPU でも良いです
また、今回は Keras とその学習済みモデルである Xception を使ったものにしました。(ResNet50 はサンプルがあるので)
手順
- Google Colaboratory で新規ノートブックを作成します。
- 画像を作業ディレクトリにアップロードします。
例えばこちら(Stable Diffusion に作ってもらいました)
- 次のソースコードを「コード」セクションに貼り付けて実行します。
"識別する画像の読み込み"箇所の引数(ソースコード上は penguin.png となっているところ)をアップロードした画像ファイル名に変えてください
from keras.applications.xception import Xception, preprocess_input, decode_predictions
from keras.utils import load_img, img_to_array
import numpy as np
# モデルの読み込み
model = Xception(weights='imagenet')
# 識別する画像の読み込み
img_path = 'penguin.png'
img = load_img(img_path, target_size=(299, 299))
# 画像データを予測で使えるように処理
x = img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
# 予測実行
preds = model.predict(x)
# 結果のラベル(クラス)と確率を表示
print('Predicted:', decode_predictions(preds, top=3)[0])
- Xception のモデルは画像の入力サイズが
299 x 299
だそうなのでtarget_size
も合わせています。他のモデルを使う場合は、それぞれの規定に合わせて変える必要があるようです(ResNet50
であれば224 x 224
とか) - Keras のページの ResNet50 のサンプルコードをほぼそのまま流用していますが、import の記載とその関数の使うところを、今の Google Colaboratory でワーニングが出ないよう修正しました
実行結果例
きちんとking_penguin
の確率が一番高く出てますね。(マイク成分は影響出なかった模様) モデルやクラスの一覧のダウンロードは最初だけで、2回目以降の実行では行われません。
これに加えて、例えば Flask で簡易的な Web UI を作ることで、
- スマホでそのページを表示
- カメラで写真撮ってモデルで識別
なんてことも実現できますね。
以上、とにかく・シンプル・ひとまず
の画像識別の試し方、でした。
あとがき
もとはと言うと、今私が所属している企業も画像識別エンジンの API サービスを提供していて、それを使った小中学生でも楽しめるようなワークショップを開発して Web アプリも作ったのですが、残念ながら API サービスが終了となり。
開発したワークショップも Web アプリもお蔵入りになっていたのですが、生成 AI 絡みで Google Colaboratory であれこれ試し始めたところで「ん?そういえば GPU も使えるなら、独自のモデルを作る画像識別エンジンもサクッとできるんじゃ?」と。一通り動くものはできたので、復活にも目処がついたところです。(なので、この記事はそこからの選抜)
ちなみに学習用の画像データが 3 クラスで 100枚くらいの転移学習だったら、MacBook Pro Intel 版のローカルでやってもそんなに時間はかからなかったのは少し驚きました。