【異常検知】たった30分で画像の異常検知モデルの作成と性能検証ができた話＆手順を解説！【外観検査AI】

アメリカの外観検査界隈で話題になっている[画像異常検知AIプラットフォーム「ADFI」](https://adfi.jp/)を使ってみたら、あまりにも感動したので、詳しく記事にしたいと思います。

結論として **「画像の異常検知モデルを開発するエンジニアは絶対に試した方がいい」** ということを声を大にして言いたいです！
~~（うちの会社が見積もり工数を●人月と提示してた外観検査AI導入案件が、わずか３日間で完成してしまったなんて、顧客には絶対に言えない）~~

https://adfi.jp/

# ざっくり概要

## ADFIとは？

**画像の異常検知モデルの作成と性能検証を自動で実行してくれるクラウドプラットフォーム。**
自分が作成したAIモデルはAPI経由で自由に利用できます。
（先日の案件では、工場内のカメラに接続したPCからADFIのAPIを呼び出す形で、外観検査システムを構築しました。）

なんと、モデル作成と性能検証は無料で試せます！（APIを利用する場合は有料。）

**我々がADFIでやることは、「トレーニング画像とテスト画像のアップロード」と「閾値の設定」の２つだけ！**

プログラミング不要で簡単に画像の異常検知モデルが作れて、性能検証まで自動でやってくれるんです。
もちろん、ディープラーニングなどの機械学習で面倒な、ハイパーパラメータの設定やチューニングなどは全く不要なので、機械学習の素人でも扱えるレベル。ありがたや～。


![テスト結果（初期状態）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/77a1fa2c-22da-5b71-ea4a-37eb8753a6ed.png)

↑こんな感じで性能検証結果の概要を画面表示してくれる。さらに詳細な検証結果のレポートをCSVでダウンロードできるので便利！


## ADFIで使える異常検知手法

下記２種類の手法が使えます。
GPUマシン持ってない人でも深層距離学習モデルをクラウドで無料で作れるのは嬉しいですね！

 - **Deep Metric Learning（深層距離学習）**
たいていのケースで利用可能。学習に異常データが５枚以上必要。
ADFIの画面では「DML」と表記されている。

 - **MSPC（多変量統計的プロセス管理）**
画像内の検査対象の位置が固定されているケースのみ利用可。学習に異常データが不要。
ADFIの画面では「PCA-MSPC」と表記されている。

## 試しに異常検知モデルを作成してみた結果

ネットで公開されている画像の異常検知データセットをいくつか試して、学習時間や性能を測定してみました。
ADFIの無料プランだとアップロードできる画像枚数の上限があり、１データセットあたり100枚までに制限されているので、学習データ数＋テストデータ数＝100枚になっています。
※画像の上限枚数が100から500に変更されたようです。（2022/9/10追記）

**各データセットの画像：**
![画像例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/08bf0ff9-fd44-53ee-a06f-feb153d817c4.png)


**ADFIで各データセットの異常検知モデルを作成した結果**

| データセット名 | Rotary beacon light | Bottle | Hazelnut | Metal Nut | Wood |
|--|--|--|--|--|--|
| データ提供サイト | ADFI | MVTec | ADFI | MVTec | MVTec |
| 手法 | MSPC | MSPC | DML | DML | DML |
| 学習データ数 | 50 | 50 | 60 | 60 | 60 |
| 学習データのうち異常データ数 | 0 | 0 | 10 | 10 | 10 |
| テストデータ数 | 50 | 50 | 40 | 40 | 40 |
| 学習に要した合計時間 | 22秒 | 18秒 | 10分12秒 | 10分37秒 | 10分51秒 |
| テストに要した合計時間 | 3秒 | 4秒 | 6秒 | 4秒 | 3秒 |
| 正解率(Accuracy) | 100% | 98.0% | 100% | 100% | 100% |
| 再現率(Recall) | 100% | 96.7% | 100% | 100% | 100% |
| 適合率(Precision) | 100% | 100% | 100% | 100% | 100% |


驚くべき結果でした！
**かなり学習データ数を少なくしたのに、ほぼ100%の正解率。**
しかも、こんなに **学習時間が短い（20秒～10分！）** とは！

ADFIの得意・不得意や限界を知るためにも、次回の記事では、もっと難しいデータセットで検証してみたいと思います！


# ADFIを使ってみる！（手順解説）

ADFIの画面は英語表記なので、ちょっと心理的ハードルが高いですが、誰でも異常検知モデルを作成できるように手順を解説します。

## 大まかな流れ

1. アカウント作成＆ログイン

2. プロジェクト作成＆データセット作成

3. 画像アップロード

4. 検査対象範囲を設定

5. 異常検知モデル作成

6. 閾値の設定

7. テスト＆性能検証結果の確認

## 1. アカウント作成＆ログイン

①[ADFIのWEBサイト](https://adfi.jp/)（ https://adfi.jp/ )の右上の「Sign In/Sign Up」を押す。
②「Create a new account」を押す。
③アカウント登録フォームに、メールアドレスなどの必要情報を入力して、チェックボックスにチェックを入れて「REGISTRATION」を押す。
④登録したメールアドレスに、確認メールが届くので、メール内のリンクを押すと、アカウント登録完了。
⑤登録したアカウントでログインする。

## 2. プロジェクト作成＆データセット作成

![プロジェクト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/ece10cb9-3958-0fb2-5cbe-d06ec99cfa1c.png)

①ログイン直後の画面で、右上の「NEW PROJECT」ボタンを押して、プロジェクトを新規作成する。
②作成したプロジェクト名のリンクを押す。
③「Project Detail」と表示されている画面の下部に「Dataset for PCA-MSPC」と「Dataset for DML」のリストがあるので、作りたいデータセットの右側の「NEW DATASET」ボタンを押して、データセットを新規作成する。
④作成したデータセット名のリンクを押す。

## 3. 画像アップロード

![データセット画像アップロード前後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/fbec594d-0555-ab94-39b0-b2cba7ae9dec.png)

①「Normal Training image」ボタンを押して、学習用の正常データをアップロードする。
②（DMLの場合のみ）「Anomalous Training image」ボタンを押して、学習用の異常データをアップロードする。異常データの右側の「Select」ボタンを押して、異常箇所を選択する。
③「Normal Test image」ボタンを押して、テスト用の正常データをアップロードする。
④「Anomalous Test image」ボタンを押して、テスト用の異常データをアップロードする。
※アップロードする画像ファイルを複数選択すれば、一度に複数枚の画像をアップロードできます。（最初は気づかずに地道に１枚ずつアップロードしてました。）

## 4. 検査対象範囲を設定

任意で画像中の検査対象の範囲を設定することもできる。

![インスペクションレンジ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/10e8c3df-8da1-508a-2025-eb3680f83256.png)

①「INSPECTION RANGE SETTING」タブを押す。
②画像の中をドラッグして、検査対象の範囲を設定する。
③「Save Inspection Range」ボタンを押す。

※DMLの場合、検査対象範囲を変更すると、選択済みの異常箇所の位置がずれるため、異常箇所の選択をやり直す必要がある。

## 5. 異常検知モデル作成

①「Create AI Model」ボタンを押すと、学習開始。しばし待つ。

## 6. 閾値の設定
学習が完了したら、「AI MODEL SETTING」タブで閾値を設定できる。
閾値は、「Main」と「Sub」の２つ同時に設定できる。
そのため、外観検査システムに導入した際には、厳しめの閾値と緩めの閾値を同時に設定しておいて「検査結果が２つの閾値の間だった場合は人間の目視検査に回す」といった運用が可能。（さっそく先日の案件で活用しました）

![閾値自動.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/9cf76018-6a89-8862-769d-279bfbcc80a2.png)


①「AI MODEL SETTING」タブを押す。
②「Set Auto Threshold」ボタンを押す。閾値が自動設定される。
③（自分で閾値を調整したい場合）テストデータのスコア分布のヒストグラムを確認しながら、閾値に任意の値を入力した後、「Save Threshold」ボタンを押す。

![ヒストグラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/5f8db9c8-16aa-7546-5ceb-7a7ad7713fba.png)


## 7. テスト＆性能検証結果の確認

![テスト結果（閾値変更後）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2535236/2befda9a-0c3a-6d75-24ee-be753cb72ad1.png)

①「TEST」タブを押す。
②「TEST」ボタンを押すと、テスト結果が表示される。
③「Download」ボタンを押すと、データ単位での詳細なテスト結果をCSV形式でダウンロードできる。
④納得できる結果になるまで、「6. 閾値の設定」と「7. テスト＆性能検証結果の確認」を繰り返す。


## 補足

公式のオペレーションマニュアルの日本語版を見つけました。
この記事じゃ、よくわからん、という人は、公式のマニュアルを見てください。

https://adfi.jp/ja/manual/



# 所感

## 使ってみてADFIの良かったところ

 - コーディング無しで、超速で画像の異常検知モデルを作成＆検証できた！
 - モデル作成＆検証だけなら無料！
 - GPUマシンを使わなくても、クラウド上で深層距離学習モデルが作成できる！

## 使ってみてADFIの悪かったところ

 - ボタンを押しても、画面上で最新の値に更新されない時があった。（ブラウザを更新したら、無事、最新の値が表示されました。）
 - 画像をアップロード中に、ローディング画面のまま、フリーズした時があった。（ブラウザを更新したら直りました。）

## まとめ

「とうとう異常検知の分野にも、強力なプラットフォームが出てきたな！」という印象。
今まで時間がかかっていた異常検知モデル作成＆検証が一瞬で終わるのは、超ありがたかった！

次回は、もっと他のデータセットを使って、どのくらいの性能のモデルをADFIで作成できるのか検証してみたいと思います！

**↓検証した記事＆ADFIでアプリ作った記事(追記)：**

https://qiita.com/umapyoi/items/b5d3c823c0a9f30a5aa4

https://qiita.com/umapyoi/items/9e3998a7001cc0ed5e67

https://qiita.com/umapyoi/items/aa7c829b4591653f1b50

https://qiita.com/umapyoi/items/ec64142dd3c70e90a9dc

https://qiita.com/umapyoi/items/eba3842aeab19b62f3a6

# 関連する記事

https://qiita.com/umapyoi/items/7f0de31c2ac89d3c8338

https://qiita.com/umapyoi/items/5a0e21338c64fc7c44e2

https://qiita.com/umapyoi/items/b5942e3fe379c6751b1e