[Amazon Rekognition] 部分画像の利用と、サイズのフィルタでCustom Labelsの検出精度が上げられることを確認してみました

2020.03.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

CX事業本部の平内(SIN)です。

Amazon Rekognition の Custom Labelsでは、ビジネスシーンに合せた独自のオブジェクトの検出が可能ですが、データセットの数が少なすぎると、やはり、精度の高いモデルを作成するのは難しいと思います。しかし、少数のデータセットでモデルが作成できれば、それに越した事はありません。

今回は、検出する画像に一定の条件を付加することで、どれぐらいの精度が出せるかを試してみました。

2 データセット

対象としたオブジェクトは、商品棚に釣られた以下の5種類の商品です。

  • PRETZEL
  • OREO
  • PRIME
  • CRATZ
  • ASPARA

先日作成した、データセット作成用のアプリで、照明を変化させたり、凹み具合を変更したり、回転してみたりして、各商品60枚ほど撮影しました。所要時間は、1時間程度です。

参考:[Amazon Rekognition] Custom Labelsのデータセットを高速に作成するアプリを作ってみました

各商品のラベルが、それぞれ60程度となっています。

3 モデル

上記のデータセットで、作成したモデルは、F1 score 0.983となりました。

あくまで、商品棚に釣られた商品の検出という要件から、以下の制約を課したことで、少数のラベルで、高いスコアを得られているものと理解してます。

  • 商品は、正面から見る(概ね正面から撮影する)
  • 裏返しは考慮しない(裏向けに釣られる事自体がエラー)

4 全体撮影

商品棚全体を撮影した画像でのDetectionは、ことごとく失敗しました。この利用方法では、このモデルは、使えません。

BAD

BAD

やや、近づくと少し良くなりますが、まだ、実用に耐えられません。

BAD

BAD

5 対象物のみ

更に近づいて、対象商品のだけを撮影した画像では、ほぼ100%検出が可能でした。(データセットの作り方にも影響していると思います)

GOOD

GOOD

GOOD

GOOD

GOOD

6 部分画像

先の結果から、全体の撮影画像から、マーカー等で、対象商品の撮影されてる部分だけを対象とすることで、精度が上がるのではという事で、試してみました。

参考:[OpenCV] ArUcoマーカーを使用して、安定した商品の監視映像を撮影してみました。

ここまでの撮影は、2304 × 1536で行われていましが、一部を切り取るという考えから、320×240で試してみましたが、かなりの精度が出ました。

GOOD

GOOD

GOOD

GOOD

GOOD

7 部分画像(低解像度)

部分画像となると、最初の画像の解像度に依存しますが、確認のため、160×90で試してみた結果です。解像度が一定以下になると、精度は、一気に下がるため、ある程度の解像度の確保が必要なようです。

BAD

BAD

BAD

BAD

GOOD

8 対象物のサイズ

画像に占める対象物の大きさを条件にすると、検出の精度が更に上がります。

マーカー等で画像を処理すると、映るべき対象物のサイズが概ね計算できますので、検出結果からその情報を加味してフィルターするイメージです。

下は、本来正解であるはずの「CRATZ」より、Comfidenceの高い「PRIME」が多数検出されている様子です。

BAD

そして、同じ結果ですが、画像に占める対象物のサイズの高さを0.3以上としたフィルタを当てると、以下のようになります。

GOOD

下記もサイズでフィルタすることで、Comfidenceの高い「PRIME」を排除している様子です。

GOOD

9 最後に

Amazon Rekognition の Custom Labelsで、事前の画像の処理と条件フィルタを当てることで、オブジェクト検出の精度を上げられることを確認できました。

条件によって色々変わってくる(考慮すべき事項がある)と思いますが、これぐらい少数のデータセットで、これだけ精度が出せるであれば、十分使える場面があると思います。