IBM Watsonの画像認識APIサービスのVisual Recognitionが今年の1月で終了してしまいました。(既存ユーザはもう少し使えるようですが)
困ったものなのですが、画像認識モデルの作成をVisual Recognitionのように簡単に(環境構築を含めるともっと簡単)、しかも無料で使えるサービスとして、GoogleのTeachable Machineを使ってみることにします。
Teachable Machineでのモデル作成
Teachable Machineは極めて簡単に使えるツールで、細かい説明は不要でしょう。機械学習がどんなものかさえ分かっていれば、あとは画面を見れば想像がつきます。(時間があれば、このブログで入門編を書くかもしれません。)
ざっと、こんな具合です。画面の左がトレーニングデータで、画像ファイルを正方形に加工してZipファイルで圧縮したものをドラッグ・アンド・ドロップすればOKです。
あとは、ラベル(ここではDogとCat)を付けて、トレーニングを開始すれば、数分以内にトレーニング済みモデルの動作を確認できる状態になります。
画面の右側で猫の画像を使ってテストを行い、Catの可能性が94%と出ています。
モデルのエクスポートとPythonでの動作確認
次に、作ったモデルをPythonから使ってみることにします。
画面右の「プレビュー」というところに「モデルをエクスポートする」というボタンがあるのでクリックしてみると、このようなダイアログが表示されます。Teachable Machineでは、TensorFlow.js、TensorFlow、TensorFlow Liteの3種類でエクスポートができます。
今回はGoogle Collaboratory(Colab)で動かしてみようと思うので、Pythonから呼び出せるTensorFlow形式にします。TensorFlow形式だと、モデル変換の種類としてKerasとSavedmodelが選択できますが、下に掲載されているスニペットがKerasのh5形式を前提としているので、Kerasを選択します。
ダウンロードされたh5ファイルと、テスト用の画像ファイルをColabにアップロードし、Teachable Machineの画面上で示されたスニペットをそのままセルに貼り付けて実行すると(画像ファイル名のみ書き換えが必要)、このような結果が表示されます。
h5ファイルと合わせてダウンロードされたlabels.txtファイルを見ると、戻り値の1つ目がDogの確信度、2つ目がCatの確信度であることが分かるのですが、この結果を見るとCatの方が0.93となっていてテスト画像を猫と判断したことが分かります。
Watson Machine Learningにデプロイできるか(途中)
ひとまず、Teachable Machineで作ったモデルをPythonから呼び出せることは分かりましたが、最終的にWeb API(だってVisual RecognitionはWeb APIになるから)にするために、Watson Machine Learning(ML)が使えないか試してみます。
Watson MLへのTensorFlowモデルのデプロイ方法は、別にまとめようと思いますので、ここでは要点だけ。
まず、現状の結果から言うと、デプロイは上手くいっていません。
このように、Keras model load failed with error: Unknown layer: Functionalというエラーが出ています。この手のエラーは、h5を作ったTensorFlowのバージョンと、Watson MLのTensorFlowのバージョンの相違が原因であることが多いようなのですが、Teachable Machineがh5ファイルを作った時のTensorFlowのバージョンが定かではありません。
ただ、少なくともColabでは上手く動いたので、ColabのTensorFlowのバージョンはどうかというと、2.4.1です。だから、Watson ML側でもTensorFlow 2.4系の環境にデプロイすれば上手く行くのでは?と思うわけです。
Watson MLで使える環境は、下記のプログラムで分かります。
client.software_specifications.list()
上図の続きがあるのですが、TensorFlow2系だと、tensorflow_2.1-py3.7しか見当たりません。そこで、このようなコードでモデルの設定をした上でデプロイを試みました。
sofware_spec_uid = client.software_specifications.get_id_by_name("tensorflow_2.1-py3.7")
metadata = {
client.repository.ModelMetaNames.NAME: 'dog-cat',
client.repository.ModelMetaNames.TYPE: 'tensorflow_2.1',
client.repository.ModelMetaNames.SOFTWARE_SPEC_UID: sofware_spec_uid
}
published_model = client.repository.store_model(
model='./keras_model.h5.tgz',
meta_props=metadata
)
published_model_uid = client.repository.get_model_uid(published_model)
metadata = {
client.deployments.ConfigurationMetaNames.NAME: "Deployment of dog-cat",
client.deployments.ConfigurationMetaNames.ONLINE: {}
}
created_deployment = client.deployments.create(published_model_uid, meta_props=metadata)
その結果が上記のエラーというわけです。Watson MLがTensorFlow 2.4をサポートするのを待てば良いという話なのか、他の理由および方法があるのか、さらに探ってみたいと思います。