Amazon Lookout for Visionで行う「機械学習による欠陥品検出」、活用のTips

みなさん、機械学習(以下、MLにします)してますか？

MLを取り巻く環境は、特に今年(2020年)で劇的に進化していると感じています。
とくに「振り分け済みの画像(やデータ)を用意すればいいんだよ」というタイプの、自動化されたML "AutoML" が発展してきており、アルゴリズムやパラメータ調整を知らなくてもMLの恩恵を受けられるようになりました。

ここで紹介する [Amazon Lookout for Vision](https://aws.amazon.com/lookout-for-vision/) は、AWSの大型カンファレンス「[AWS re:Invent 2020](https://reinvent.awsevents.com/)」で発表された AutoML 型の ML サービスで、画像による欠陥品検出(異常検知)を行ってくれます。
**特筆すべきポイント**は、最低20枚の正常と最低10枚の異常、計30枚あれば学習と推論が行えるようになっています。実際、ここで紹介するのも正常=30枚、異常=42枚でうまく動きました。

詳細は[クラスメソッドさんのブログに数多く掲載](https://dev.classmethod.jp/?s=Amazon+Lookout+for+Vision)されていますし、[Amazon Lookout for Vision を使ってみた](https://qiita.com/SatoshiGachiFujimoto/items/d16da5fba4a1c85fb1dc) という記事も存在するので、私からは Amazon Lookout for Vision を使う際のTipsを紹介します。

**注意※** 2020年12月時点ではプレビューサービスであるため、GAとなった時には無効になるTipsもあると思います。是非お試しください。

## Amazon Lookout for Vision ができる事、対象外な事

Amazon Lookout for Vision は「正常・異常の分類」(いわゆるバイナリ分類)を行ってくれます。3種類以上の分類をしたければ [Amazon SageMaker](https://aws.amazon.com/jp/sagemaker/) 等を使いましょう。

また、画像の前処理はAmazon Lookout for Visionのスコープ外です。
たとえば対象物を中心に持ってきたり、背景を均一化したり、サイズを調整したり、明るさや色味の調整をしたりといった事は、Amazon Lookout for Visionに学習／推論の前に終わらせる必要があります。

## ML で使うデータの準備

データを準備しましょうといっても、中々準備できるものではないので今回は「[PhotoshopとImageMagickで画像を生成](https://qiita.com/ma2shita/items/39ca13feeb43348b9f36)」するという手法でデータを作りました。このまま Amazon Lookout for Vision でお使いいただけます。

データのシナリオは「ボタンに貼るラベルの品質チェック」です。ちゃんと貼れていれば正常、ずれていたら異常という判定になります。

画像ファイルは[こちら(ZIP/24MB)](https://ma2shita.s3-ap-northeast-1.amazonaws.com/ml/images-for-training-defect-determination-by-ML.zip)です。ライセンスは[CC BY-NC-ND 4.0](https://creativecommons.org/licenses/by-nc-nd/4.0/deed.ja)です。
フォルダ構成は以下の通りです。

* `for_train` が、学習用データセット
* `for_test` が、テスト用データセット
* `for_eval` が実際に試験する用のデータ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/0e0504ef-2e34-6c5c-8d8f-043716d7f0fa.png)

`for_train/normal/` の中身の様子です。
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F22754%2Facaef6aa-db29-ac7b-2a6b-168e82bec497.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&w=1400&fit=max&s=0ae734f1ed8b88ef88a6e8f03f51e03c) 

## Amazon Lookout for VisionをRaspberry Pi から使う

Amazon Lookout for Visionを手軽に外部システムから使う方法は[AWS CLI](https://docs.aws.amazon.com/ja_jp/lookout-for-vision/latest/developer-guide/inference-detect-anomalies.html)です。
そこで Raspberry Pi に AWS CLI を入れ、USBカメラを取り付ければクラウドを使った推論マシンの出来上がりです。

物理はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/9c8e8030-0095-8924-f3bb-39b2482d1b5a.png)

```console:AWS_CLI等のインストール
$ sudo pip3 install awscli
$ sudo apt install fswebcam
```

```console:fswebcamとAWSCLI経由の推論
$ fswebcam -d /dev/video0 -S 60 -r 1280x720 --no-banner image.jpg
$ aws lookoutvision detect-anomalies --project-name labeling_anomaly_detect --model-version 1 --content-type=image/jpeg --body image.jpg
```

fswebcam のオプションについては [fswebcamでピントを合わせる&ぶれない画像を撮影する方法](https://qiita.com/Go-zen-chu/items/63f65156c748b34e1678) をご覧ください。

実際に使った画像は左から image1.jpg, image2.jpg, image3.jpg です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22754/78bca0b6-6cd4-b2ea-3f96-6db129b740c6.png)

[結果はJSON](https://docs.aws.amazon.com/ja_jp/lookout-for-vision/latest/developer-guide/inference-detect-anomalies.html)で得られます。

```json-doc
// image1.jpg
{
    "DetectAnomalyResult": {
        "Source": {
            "Type": "direct"
        },
        "IsAnomalous": false,
        "Confidence": 0.6450086236000061
    }
}

// image2.jpg
{
    "DetectAnomalyResult": {
        "Source": {
            "Type": "direct"
        },
        "IsAnomalous": false,
        "Confidence": 0.3430061340332031
    }
}

// image3.jpg
{
    "DetectAnomalyResult": {
        "Source": {
            "Type": "direct"
        },
        "IsAnomalous": true,
        "Confidence": 0.524972677230835
    }
}
```

`IsAnomalous` が推論結果、 `Confidence` が信頼度(%)となります。信頼度は低いようですが IsAnomalous が期待通り返ってきているので、使えるのではないでしょうか。

## Tips 1: 推論可能な画像ファイルの解像度は、学習時の解像度と合わせる必要あり

もし学習時に 1280x720 の画像を利用したら、`detect-anomalies` でも 1280x720 の画像を使用する必要があります。異なる解像度だと `detect-anomalies` の際に
 `Image failed to pass validation.` というエラーが返ってくるので、その時は解像度を確認してください。

※これはかなりハマった

## Tips 2: テスト用データセットも使用すると、思ったような結果を返してくれそう

Amazon Lookout for Visionは学習時にテスト用のデータセット(正常10枚以上、異常10以上、計20枚)が指定できますが、これをセットすると精度がかなり上がりました。
MLにあまり詳しくないので理由がわからずじまいで申し訳ないのですが、結果の共有です。

具体的にはデータセット作成時に、テスト用のデータセットを指定します。先のZIPファイルであれば `for_test` を指定する形です。
![](https://docs.google.com/drawings/d/e/2PACX-1vRAeZ-k4aRXyVy8y0mjhA8WTl_4F677yMBifdp9vSztq6ISI7dJL6wHLPnw0hTVNPgAaPNU6MzGSW_U/pub?w=830&h=489)

何度か試したところ、画像をすべて学習用に振り分けるくらいなら、そこからテスト用データセットに切り出した方が思い通りの結果が出てきました。

## Tips 3: 料金の見積もり

[料金は従量課金](https://aws.amazon.com/lookout-for-vision/pricing/)です。学習は50枚程度の画像で1回あたり40~50分、検証は1回あたり15分くらいかかります。検証にも推論の従量課金が適用されます。
トータルで1回あたり3~4USD(オレゴンリージョン)くらいで、これ以外にAmazon S3の分が入ります。（微々たるものですが）

注意する点は、推論を継続的に行う場合(= detect-anomalies による推論)は、推論を行うインスタンスを立ち上げておく必要があり、そこは時間課金です(推論回数での課金ではありません)

実際4回ほどオレゴンリージョンで試した結果は 14.30 USDでした。内訳は以下の通りです。

```
Amazon Lookout for Vision Inference: $4.37
  > $4.0 per hours for Inference:Inference in US West (Oregon)65.576 minutes  $4.37
Amazon Lookout for Vision Training: $9.93
  > $2.0 per hours for Training:Training in US West (Oregon)298.000 minutes  $9.93
```

## おわりに

概ね2時間程度あれば試すことができます。冬休みの余暇にいかがでしょうか？

あと注意(二回目)ですが、2020年12月時点ではプレビューサービスであるため、GAとなった時には無効になるTipsもあると思います。AWSさんは日々アップデートがされているので、ぜひ皆さんの目で確かめてください。

MLのデータを準備するところは [無ければ作ればいいじゃない！ImageMagick(と、ほんの少しのPhotoshop)で作る「機械学習用の画像](https://qiita.com/ma2shita/items/39ca13feeb43348b9f36) といった技がありますので、そちらも確認してみてくださいね。

EoT