どこから見てもメンダコ

軟体動物門頭足綱八腕類メンダコ科

AutoML Visionでお手軽Object Detection(工業製品の傷検出)


Google Cloud AutoML Visionがいつの間にか物体検出に対応していました。
定義済みカテゴリの検出だけでなく、自作データセットのラベル付けから物体検出器の訓練・テストまでをGUIで行えるサービスです。

cloud.google.com

www.atmarkit.co.jp

というわけでさっそく試していきたいと思います。
【記事作成:2019年6月時点での情報です】


このサービスの何がうれしいの??

『物体検出』とは、ある画像の中に、”どこに”、”何が”、”いくつ” 存在するかの計数を自動化するもっとも重要な画像処理のタスクのひとつです。

応用先は無数にあり、例えば製造業での外観検査の機械化、自動運転での歩行者検出などいくらでも思いつきます。

その分かりやすさゆえに、「うちでもこういう作業を自動化するのに使えないかな??」という感じでPoCを気軽に頼まれることの多いタスクでもあります。

horomary.hatenablog.com

物体検出自体はgoogle先生が公開しているObjectDetectionAPIを使用すれば(Pythonわかる人なら)簡単にできますが、tensorflowはプログラミングスキルの無い人がPoCをやるにはあまりに高い障壁でした。

このサービスではGUIを使用してラベル付けから推論まで通して行えるので物体検出PoC実施の障壁が大きく下がるのが何よりのうれしさです。画像のアップロードやトレーニングの設定などはこちらで行い、ラベル付けだけはドメイン知識を持つ人にやってもらうという分業がスムーズに行えます。

ただ、GCPの利用が許可されている企業は(とくに製造業は)それほど多くないと思われ、しばらくの間は本番運用はローカルマシンでやることになりそうです。
クラウドのメリットとは、、、)


DAGMデータセット

今回はDAGMデータセットのクラス2を使用します。 これは工業製品の傷検出アルゴリズムのコンテストで使用された画像セットです。

(画像はリンク先より転載)

DAGM 2007

f:id:horomary:20190608234602p:plain

各クラスは正常画像(1000枚)と人為的に作成された欠陥画像(150枚)で構成されておりクラスごとに欠陥の種類が異なります。

例えばクラス1欠陥画像(画像右下)は一部がややぼやけた画像になっており、クラス2欠陥画像(画像右上)はひっかき傷のようなものがつけられた画像になっています。今回は傷状欠陥のクラス2画像を使用します。

余談ですがこのコンテストの採点では偽陽性よりも偽陰性の存在を20倍悪く評価したようです。欠陥を見逃すくらいならオオカミ少年の方がマシだという製造業の価値観が反映されていますね。


準備

まずはGCPへログインし、ナビゲーションメニュー>ストレージからバケットを作成し、画像が格納されたフォルダをアップロードします

f:id:horomary:20190608232118p:plain


つぎにナビゲーションメニュー>人工知能>Visionからオブジェクト検出を選択します。

f:id:horomary:20190608232146p:plain


新しいデータセットから新規データセットを作成します。ここでは”DAGM_1560002278771”という名前のデータセットを作成しました。 f:id:horomary:20190608232959p:plain


データセットのインポート

地味に面倒なのがデータセットのインポートです。

なぜか GCP上での画像へのパスが記載されたcsv という形式でしかデータセットをインポートできない仕様になっています。画像を直接ドラッグアンドドロップというやり方を期待していたので困惑します。

以下はデータセットを記述する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の形式】

  • 10列で構成されるカンマ区切りcsvファイル (UTF-8)

  • 1列目はデータセットの分割情報で、TRAIN/TEST/UNASSIGNEDのどれかを記入。
    UNASSIGNEDにしとけば勝手にtrain-test分割してくれる。

  • 2列目はGCPにある画像へのパス

  • 3列目以降はカテゴリと矩形情報を記入する。
    今回はラベル付けもGCP上でやるので空欄にしておいてOK。


やってて思ったんだけどcsvファイルつくるの地味にめんどくさい。
とくに空欄ありcsvファイルの作成はExcelオンリーだと厳しいものがある。矩形選択のできるテキストエディタを使えないと作業がだるすぎる。

AutoMLの狙うユーザー層はここで引き返すような気がするのでgoogle先生なんとかしてください、、、


csvファイルができたらこれもGCPストレージへアップロードした後、'BROWSE'からファイルを選択してインポート。 エラーメッセージなしでインポートが終わったら”インポート”タブから”イメージ”タブに移動すると下のような感じになってるはず。 f:id:horomary:20190609002959p:plain


ラベリング

新規ラベルを追加 から”scratch” (ひっかき傷) を定義。

"イメージ"タブに表示されている画像をクリックすることで矩形情報の追加画面へ遷移する。

矩形作成して保存を繰り返すだけの非人間的な作業を150枚分やりました.

f:id:horomary:20190609005434p:plain


ラベル付け後の姿 f:id:horomary:20190609014041p:plain


一枚ごとに保存しなければいけないのはよいのですが、保存のたびに5秒くらい待ち時間があるのが地味にストレス。おかげで150枚の画像のラベル付け作業する間にサメ映画一本見れました。

ちなみに作成したラベル・矩形情報はデータをエクスポートから入力のcsvと同じ形式で出力することができます。

f:id:horomary:20190609122958p:plain


レーニン

"トレーニング"タブから2クリックで学習開始。

設定としては”推論が遅いけど精度が良いモデル”と”推論が早いけど精度が低いモデル”のどちらが良いか選ぶだけです。 faster-RCNN系かYolo系かみたいな違いだと思われます。

f:id:horomary:20190609015723p:plain


レーニングの進行状況は確認できないので無料枠でトライアルしている身としてはちょっと不安になる。

一時間ぐらいでトレーニング終了しました。

以下のようにモデルの評価を確認できます。

f:id:horomary:20190609123111p:plain


テストと使用

レーニングが終了したら”テストと使用”タブからモデルのデプロイを選択すると画像をアップロードすることができるようになります。

ためしに一枚画像をアップロードしてみるとたしかにキズの検出ができていることがわかります。

f:id:horomary:20190609123027p:plain


まとめ

データセットのアップロード形式がやや分かりづらいこととアノテーションの保存に時間がかかることが気になりましたが全体としては素晴らしいサービスだと思います。

ある業務フローに物体検出を組み込めそうかどうかを不毛に議論する前にまずやってみてから考えましょう!というアプローチがとりやすくなるな、と強く感じました。

GCP機械学習サービスは最近どんどん増強されているので、自然言語処理などほかのサービスも試していけたらと思います。