皆さん、こんにちは。AnyTechの立浪と申します。
さて、皆さんは外観検査による異常検知には興味がおありでしょうか?最近いたるところで名前を聞く異常検知手法PatchCoreの影響か、2023年のCVPRでは異常検知手法の提案が急激に増えたように思います。PatchCoreは弊社の木村が過去の記事でも紹介していますね。今回は2023年のCVPRに採択された論文の中から、WinCLIPとWinCLIP+という異常検知手法をご紹介したいと思います。これは代表的なVision and Language ModelであるCLIPを使った異常検知手法です。CLIPらしくテキストを使っており、これまでになかった着眼点も含まれているモデルです。他のAnyTechのメンバーのほうが異常検知に詳しいので、私が解説するなどおこがましいですが、お付き合いいただけましたら幸いです。
論文
https://arxiv.org/pdf/2303.14814.pdf
リポジトリ
背景
外観検査においては、欠陥画像が少なく、そのバリエーションが多いという問題があります。そのため、正常サンプルのみを使ってモデルを学習し、異常検出を行う手法が試みられてきました。以前木村が紹介した手法である、DM2, SPADE, PaDiM, PatchCoreもこのような方法でしたね。これらの手法は、訓練に使った正常画像からどれだけ逸れているかを測り、一定以上にそれている画像を異常として扱います。MVTech-ADなどのデータセットで素晴らしい結果を達成してきていますが、そのような結果の達成のためには、100枚程度の正常画像が必要です。訓練に使う正常画像が少ない場合は、もっと性能が向上する余地は残されていると言われています。
また、既存手法は必要以上にオーダーメイドに主眼を置きすぎているため、環境の変化に弱い可能性があります。「傷がある」、「汚れている」、「解れている」などの異常は、個別の正常画像に強く依存しないことが多いでしょう。このような状況下ではZero-shotでもある程度の性能が出せると思われます。一方で、正常画像と比較してどのように違うかを評価しなければ異常であることがわからないことがあるケースもあります。この場合は、数枚の画像を使うFew-shotの設定も必要となります。
今回紹介するWinCLIPおよびWinCLIP+では、Zero-shotとFew-shot(One-shotからFour-shot)の異常検知に焦点をあてています。そして、そのためには言語が重要であるという仮定の元、Vision and Lungage ModelであるCLIPをベースとした異常検知の手法に仕上がっています。Zero-shotのWinCLIPは言語特徴との比較で、Few-shotの手法であるWinCLIP+はWinCLIPに正常画像との比較も加えて、強力な精度を達成しています。
アルゴリズム
Zero-shotのWinCLIPはCLIPによる異常分類のためのプロンプトアンサンブル、異常セグメンテーションのためのWindow-based CLIPから構成されます。Few-shotのWinCLIP+は、それに加えて、少数の正常画像を参照して、比較する機能を追加されています。これらについてを順に説明します。
言語ドリブンZero-shot異常分類
正常用のプロンプトや異常用のプロンプトを用意します。これらのプロンプトを作るために、予めプロンプトのテンプレートと、正常と異常に対応する状態の単語を用意しておきます。それらの組み合わせから、プロンプトを生成します。
ラベルごとのテキスト埋め込み量の平均を計算し、ぞれぞれを正常クラスと異常クラスのテキスト表現とします。
あとは、通常のCLIPのZero-shot分類(内積とsoftmaxによる類似度計算)に従って、異常度の分類スコアが計算できます。
Window-based CLIPによる異常セグメンテーション
上述の方法で、Zero-shot異常分類はできました。それに加えて、ピクセルレベルの異常も予測します。そのための Window-based CLIP(WinCLIP)が提案されています。WinCLIPはCLIPの画像エンコーダーを使って、画像から特徴マップを得る手法です。
スライディングウィンドウの集合を使います。各スライディングウィンドウはのインデックスの周りののカーネルが1で、それ以外の領域が0であるマスクとみなします。のインデックスでの特徴は、画像に対してスライディングウィンドウを適用し、それを画像エンコーダーでエンコードした特徴のクラストークンとします。式で書くと以下のとおりです。
この特徴をカーネルサイズとについて取得してます。さらに、画像全体をでエンコードしたクラストークンも使います。これらに対して、それぞれ先のテキスト特徴量との類似度計算(内積のsoftmax)を行い、正常と異常のセグメンテーションマップを作成しておきます。CLIPに詳しくない方は、CLIPの以下の原論文を見ればイメージがつきやすいとおもいます。
ウィンドウの調和集約
次に、スライディングウィンドウを適用して生成した異常スコアに、スライディングウィンドウで重み付けした調和平均を使って正規化しセグメンテーションを改善します。
複数スケールの集約
最後に、とカーネルのスライディングウィンドウで作成した異常セグメンテーションと画像全体スケールの異常セグメンテーションに対して、調和平均を計算します。それを最終的なWinCLIPの異常セグメンテーションとして採用します。
WinCLIP+
最後に、WinCLIP+に新たに追加された、少数の正常画像を使用する部分のアルゴリズムについて説明します。いくつかの正常画像$r$について、予めとのスライディングウィンドウ特徴マップ、でエンコードしたパッチトークンの特徴マップを取得しておきます。これらの特徴マップについて、コサイン類似度を計算してそれを元に正常画像との乖離度マップを計算します。
この特徴マップを算術平均したと、WinCLIPの手法で計算した異常セグメンテーションマップの調和平均をとります。これをWinCLIP+の異常セグメンテーションマップとします。また、の最大値とWinCLIPの異常分類スコアの算術平均をWinCLIPの異常分類スコアと定義します。
比較
論文では、MVTech-ADおよびVisAのデータセットに対して、WinCLIP+とPatchCoreに代表される既存手法が比較がされています。異常分類の比較では、One-shotからFour-shotのいずれの場合でも、既存手法を大きく上回っています。例えば、MVTech-ADのデータセットでOne-shot異常分類すると、WinCLIP+はAUROC93.1%を達成し、PatchCoreを9.7%上回っています。それどころか、MVTech-ADではZero-shotのWinCLIPが、Four-shotのPatchCoreを上回っています。VisAのデータセットではそこまでではないですが、それでもフェアな比較をすると常にPatchCoreを上回っています。また、異常セグメンテーションでも同様に、WinCLIP+がPatchCoreらの既存手法を上回っています。
まとめ
今回は学習済のCLIPを用いたZero-shot外観検査向け異常検知手法 WinCLIPとFew-shot外観検査向け異常検知手法WinCLIP+をご紹介しました。検査したい画像を、プロンプトエンジニアリングしたテキスト特徴と比較、正常画像と比較し、異常分類や異常セグメンテーションを行える手法でした。個人的な感想ですが、プロンプトは一度作ってしまえば広く使い回せると考えられますので、非常に再利用性が高い手法だと思います。また、正常画像も数枚だけでよく、データに少し変化があったとしても更新しやすく、保守コストが安い手法だと思います。
AnyTechでは外観検査の異常検知の相談を承っております。弊社が得意とする流体だけでなく、そうでない対象の異常検知でも相談を承れます。ご興味ある方は、ぜひお気軽にお問い合わせください。