Google Cloud AutoML Visionがいつの間にか物体検出に対応していました。
定義済みカテゴリの検出だけでなく、自作データセットのラベル付けから物体検出器の訓練・テストまでをGUIで行えるサービスです。
というわけでさっそく試していきたいと思います。
【記事作成:2019年6月時点での情報です】
このサービスの何がうれしいの??
『物体検出』とは、ある画像の中に、”どこに”、”何が”、”いくつ” 存在するかの計数を自動化するもっとも重要な画像処理のタスクのひとつです。
応用先は無数にあり、例えば製造業での外観検査の機械化、自動運転での歩行者検出などいくらでも思いつきます。
その分かりやすさゆえに、「うちでもこういう作業を自動化するのに使えないかな??」という感じでPoCを気軽に頼まれることの多いタスクでもあります。
物体検出自体はgoogle先生が公開しているObjectDetectionAPIを使用すれば(Pythonわかる人なら)簡単にできますが、tensorflowはプログラミングスキルの無い人がPoCをやるにはあまりに高い障壁でした。
このサービスではGUIを使用してラベル付けから推論まで通して行えるので物体検出PoC実施の障壁が大きく下がるのが何よりのうれしさです。画像のアップロードやトレーニングの設定などはこちらで行い、ラベル付けだけはドメイン知識を持つ人にやってもらうという分業がスムーズに行えます。
ただ、GCPの利用が許可されている企業は(とくに製造業は)それほど多くないと思われ、しばらくの間は本番運用はローカルマシンでやることになりそうです。
(クラウドのメリットとは、、、)
DAGMデータセット
今回はDAGMデータセットのクラス2を使用します。 これは工業製品の傷検出アルゴリズムのコンテストで使用された画像セットです。
(画像はリンク先より転載)
各クラスは正常画像(1000枚)と人為的に作成された欠陥画像(150枚)で構成されておりクラスごとに欠陥の種類が異なります。
例えばクラス1欠陥画像(画像右下)は一部がややぼやけた画像になっており、クラス2欠陥画像(画像右上)はひっかき傷のようなものがつけられた画像になっています。今回は傷状欠陥のクラス2画像を使用します。
余談ですがこのコンテストの採点では偽陽性よりも偽陰性の存在を20倍悪く評価したようです。欠陥を見逃すくらいならオオカミ少年の方がマシだという製造業の価値観が反映されていますね。
準備
まずはGCPへログインし、ナビゲーションメニュー>ストレージ
からバケットを作成し、画像が格納されたフォルダをアップロードします
つぎにナビゲーションメニュー>人工知能>Vision
からオブジェクト検出を選択します。
新しいデータセット
から新規データセットを作成します。ここでは”DAGM_1560002278771”という名前のデータセットを作成しました。
データセットのインポート
地味に面倒なのがデータセットのインポートです。
なぜか ”GCP上での画像へのパスが記載されたcsv” という形式でしかデータセットをインポートできない仕様になっています。画像を直接ドラッグアンドドロップというやり方を期待していたので困惑します。
# : 最小構成csvのサンプル #: dagm_cls2バケットのClass2_defフォルダに全画像がある UNASSIGNED,gs://dagm_cls2/Class2_def/1.png,,,,,,,,, UNASSIGNED,gs://dagm_cls2/Class2_def/2.png,,,,,,,,, UNASSIGNED,gs://dagm_cls2/Class2_def/3.png,,,,,,,,, UNASSIGNED,gs://dagm_cls2/Class2_def/4.png,,,,,,,,, UNASSIGNED,gs://dagm_cls2/Class2_def/5.png,,,,,,,,,
【csvの形式】
1列目はデータセットの分割情報で、
TRAIN
/TEST
/UNASSIGNED
のどれかを記入。
UNASSIGNED
にしとけば勝手にtrain-test分割してくれる。2列目はGCPにある画像へのパス
3列目以降はカテゴリと矩形情報を記入する。
今回はラベル付けもGCP上でやるので空欄にしておいてOK。
やってて思ったんだけどcsvファイルつくるの地味にめんどくさい。
とくに空欄ありcsvファイルの作成はExcelオンリーだと厳しいものがある。矩形選択のできるテキストエディタを使えないと作業がだるすぎる。
AutoMLの狙うユーザー層はここで引き返すような気がするのでgoogle先生なんとかしてください、、、
csvファイルができたらこれもGCPストレージへアップロードした後、'BROWSE'からファイルを選択してインポート。 エラーメッセージなしでインポートが終わったら”インポート”タブから”イメージ”タブに移動すると下のような感じになってるはず。
ラベリング
新規ラベルを追加
から”scratch” (ひっかき傷) を定義。
"イメージ"タブに表示されている画像をクリックすることで矩形情報の追加画面へ遷移する。
矩形作成して保存を繰り返すだけの非人間的な作業を150枚分やりました.
ラベル付け後の姿
一枚ごとに保存しなければいけないのはよいのですが、保存のたびに5秒くらい待ち時間があるのが地味にストレス。おかげで150枚の画像のラベル付け作業する間にサメ映画一本見れました。
ちなみに作成したラベル・矩形情報はデータをエクスポート
から入力のcsvと同じ形式で出力することができます。
トレーニング
"トレーニング"タブから2クリックで学習開始。
設定としては”推論が遅いけど精度が良いモデル”と”推論が早いけど精度が低いモデル”のどちらが良いか選ぶだけです。 faster-RCNN系かYolo系かみたいな違いだと思われます。
トレーニングの進行状況は確認できないので無料枠でトライアルしている身としてはちょっと不安になる。
一時間ぐらいでトレーニング終了しました。
以下のようにモデルの評価を確認できます。
テストと使用
トレーニングが終了したら”テストと使用”タブからモデルのデプロイ
を選択すると画像をアップロードすることができるようになります。
ためしに一枚画像をアップロードしてみるとたしかにキズの検出ができていることがわかります。
まとめ
データセットのアップロード形式がやや分かりづらいこととアノテーションの保存に時間がかかることが気になりましたが全体としては素晴らしいサービスだと思います。
ある業務フローに物体検出を組み込めそうかどうかを不毛に議論する前にまずやってみてから考えましょう!というアプローチがとりやすくなるな、と強く感じました。