【速報】次世代の外観検査！？プロンプトを駆使した異常検知

先日、革新的な画像の異常検知（SAA）が出てきました。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">何やら革命的な臭いがする...<br><br>SAMを使った異常検知手法<a href="https://t.co/wmwFcbULdq">https://t.co/wmwFcbULdq</a><br><br>コードはこちら<a href="https://t.co/3npK3FhnEz">https://t.co/3npK3FhnEz</a> <a href="https://t.co/JDs30bEJyQ">pic.twitter.com/JDs30bEJyQ</a></p>&mdash; shinmura0 (@shinmura0) <a href="https://twitter.com/shinmura0/status/1660487268413640705?ref_src=twsrc%5Etfw">May 22, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

本稿では、操作手順 & 触ってみた感想をご報告します。

# 特長
本題に入る前に、どこら辺が革新的なのかざっくり説明します。
※　SAAの詳細は[論文](https://arxiv.org/abs/2305.10724)をご参照ください。

+ 学習データは不要
  + 通常、学習（正常）データを数百枚用意しますが、この手法では正常データを必要としません。
+ ドメイン知識を導入できる
  + 予め、異常の傾向をプロンプトに入れることにより、異常の特徴をモデルに教えることができます。

二点目が特に大きく、今までの異常検知では、**積極的に異常の傾向を取り込むことができません**でしたが、この手法では、この点を改良しています。

# 操作手順
## 使ってみる
まず、[公式リポジトリ](https://github.com/caoyunkang/Segment-Any-Anomaly)に行って、```Open in Colab```をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/a04f22cb-0476-9d2d-9e07-77fc8fc163a9.png)

あとは、```すべてのセルを実行```を押すだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/59516deb-e053-0214-4a55-982e98dc0804.png)

無事、異常部分を検出できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/ed69f762-e61b-6cc5-3c14-42e6d1e0e230.png)

ちなみに、プロンプトは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/f720eae0-a838-eb99-97b2-a4022ea36409.png)
```defects```でした。**このプロンプトだけで、異常を検出できるのは凄い！**

## 難しい画像に変える
折角なので、難しい画像に変えてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/6ea0653f-9642-fac0-ca00-0b54367f20ae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/19ce375a-31f6-c834-2342-d2b3f555e765.png)

これらの```wood_demo.png```を```cable_demo.png```に変えます。

以下の画像がターゲットです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/ad84f036-d925-622a-08ca-f712cddbadb7.png)

このままcodeを実行すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/59b11910-ab7c-fd97-f103-0c1646833928.png)
うまくいきません。

## チューニングする

ここからチューニングしていきます。まず、プロンプト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/f720eae0-a838-eb99-97b2-a4022ea36409.png)
```defects```を```the black hole on the cable```に変えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/f5764a5e-5384-7685-3c0b-00fcf316dcfd.png)
だいぶ改善しましたが、まだ過検知（False positive）があります。

続いて、bounding_boxの閾値```box_threshold```でフィルターをかけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/d35f5d1f-9828-bbfd-1494-aad4ef81cf01.png)
```0.15```を```0.28```に変えます。すると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/63ec8518-855b-7e3b-a3e0-ab1a3ef56364.png)

ほぼ完璧なセグメンテーションができました。

# 使ってみた感想
+ とりあえず重い
  + 巨大モデル&大きい画素数を使っているので、推論に時間がかかる　→　軽いモデル&画素数を下げれば改善するかも？
    + それでも、推論時間がネックで、SAA単独では使えないかもしれない。　→　[PaDiM](https://arxiv.org/abs/2011.08785)を一次フィルター、SAAを二次フィルターにすれば、**精度&推論時間をカバーし合えるかも**
+ チューニングできる
  + 異常の大きさやプロンプトを調整できるので、色々カスタムできそう。逆にいうと、チューニングが大変かも。ただ、異常の特徴を予め入力できるので、**従来手法では検出できなかった異常を検出できる可能性がある**
+ SAAがゲームチェンジャーになるかも
  + [SPADE](https://qiita.com/h1day/items/e65d840e557a14cf1a37)や[Gussian-AD](https://arxiv.org/abs/2005.14140)（マハラノビスAD法）が、画像の異常検知界隈を一変させたように、SAAが一つの時代を作る可能性がある。つまり、SAAは今後の**スタンダードになる可能性がある。**
+ まだまだ整備中（2023年5月24日現在）
  + [issue](https://github.com/caoyunkang/Segment-Any-Anomaly/issues/10)によると、本気のSAA+は実装していないらしいので、真の実力は出ていない模様
  + SAA+は近日中に公開予定