Pythonが隆盛のAIプログラミングですが、私はWEB屋なのであくまでもJavascriptにこだわりたい、と思い、オブジェクト検出・CoCo-SSDの転移学習に挑戦してみました。ゴルファーが泣いて喜ぶ、壮大な野望を目論みつつ、日々勉強中です。
tfjsのMobilenet(画像分類)においては、こちらにチュートリアルがあり、比較的容易に転移学習が可能です。前回の「渋野日向子プロのスイングを機械学習してみた」は、これを改良しています。
##JSサンプルが無い
思った以上に、JSでのCoCo-SSD転移学習の事例が無いことがわかりました。
そこで、いずれにせよGPU環境が必要にもなるので、Google Colab上で、Pythonで転移学習させ、出来上がったモデルを tfjs_converter を使ってJSモデルに変換しよう、と思い、実践しました。
Pythonならいくらでも転移学習の事例が転がってますね。その中からとあるGithubのものを使用しました。小手始めに、画像・映像から「渋野日向子プロとボールを追いかける」ことを目標にしました。
##アノテーション作成が大変
オブジェクト検出を作った方ならご存知の通り、1枚の画像から「渋野プロ」と「ボール」を一つずつ正方形で囲ってXMLにするのが大変。。もちろんツールを使いましたが、20枚作成が限界でした。。先人の皆さん、本当にご苦労様です。
##Pythonモデルは出来たが。。
Jupyter Notebook、便利ですね。作成した画像とXMLに入れ替えて、Google Colab上でipyonbに準じて実行し、無事Pythonモデルは出来ました。8000エポックで、誤差ほぼなし。ただし元画像20枚は少ないので、どこかで影響は出るかも。
あとは、こちらにある通りにJS版に変換すればOK、と思っていましたが、これがエラーを吐きまくり、何とか出来たと思っても今度はJS側で「Unknown op 'NonMaxSuppressionV5'」というエラーで動作しない。
##引数値が違ってる
こちらにある通り、Python版のモデルはそのままJS版では動かないので、Pythonモデルからあれこれ取り除かないといけない、ということで、tensorflowjs_converterのヘルプをよく見ると、
「--output_node_namesは、--input_format=tf_frozen_modelでしか使えない」
とあったので、--input_format=tf_frozen_modelとして、入力ファイルに「./saved_model」ではなく、.pbファイルを指定して実行したら、無事変換成功しました。
Tensorflowはバージョン依存が激しいようなので、特に過去記事には要注意です。
##PC性能に依存します
何はともあれ、ブラウザで動くので、PCのスペックと回線状況に依存します。モデル読み込み〜描画までに数十秒掛かることも。この辺りがJS版の弱点ですね。
予想はしていましたが、動画やライブで使えるようになるには、スマフォを含めたスペックアップと軽量モデルが必要に思います。
ただ、これが手持ちの機器でライブで軽快に動作するようになると、スポーツおいても用途が多くなると思っています。
##何に使う?
将来的には、高価な測定機器に匹敵するものを作ろうと模索中。
協力者を募っています。
あと、セマンティックセグメンテーションの転移学習にも挑戦しようかな。
お題は「渋野日向子プロを隠そう」かな。