【3D異常検知・本編】3次元データを活用した異常検知方法の検証

本記事は、当社オウンドメディア「Doors」に移転しました。

約5秒後に自動的にリダイレクトします。

3次元データを活用した異常検知モデルであるBTFについて検証を進める連載記事です。

本稿では、本連載のメインテーマであるBTFモデルの技術的な解説と検証結果を紹介します。

 

こんにちは。アナリティクスサービス部の尾村です。

これまで不良品検出のために、2次元の画像データを利用する様々なモデルが提案されてきました。
一方で、近年の3Dセンサーの精度と可用性の向上により、3次元データを扱う様々な手法が提案されています[MVTec 3D-AD]

本稿では、初めに2次元画像データにおいてSOTA*1を達成した異常検知手法であるPatchCore[PatchCore]について説明し、PatchCoreを改良し3次元の特徴を加えることで、より高い精度で不良部分を判定できる異常検知手法であるBTF (Back to the Feature)[BTF]について、技術的な解説と検証結果を紹介します。

 

 

異常検知とは

異常検知とは、特に画像を用いた不良品検出の文脈では、部品や製品の外見上の欠陥を見つける技術のことです。

技術の分類として、学習用データセットの性質と使い方によって、以下のように大きく2種類に分けられます。

  • 教師あり異常検知(Supervised anomaly detection)

    学習用データセットは、正常なものも異常なものも含めて、全てラベル付けされている必要があります。
    これは、正常なものと異常なものを分類するように学習したモデルを使って異常を見つける方法です。

    手法としては、深層学習による分類モデル等があります。

  • 教師なし異常検知(Unsupervised anomaly detection)

    ラベル付けされていないデータセットを使い、テスト用データセットに含まれる異常を見つける方法です。
    また、以下に示す半教師あり異常検知も、教師なし異常検知として扱われることがあるようです。本稿では、参考論文[MVTec 3D-AD][BTF]と同様に、半教師あり異常検知も教師なし異常検知として扱うことにします。

    手法としては、正規分布のような確率分布を使った外れ値の定義付けや、k近傍法のようなクラスタリング等があります。

    • 半教師あり異常検知(Semi-Supervised anomaly detection)

      全てのデータセットがラベル付けされている必要がなく、学習用データセットのうち正常なものの一部あるいは全てがラベル付けされている必要があります[AD Survey]
      正常なデータのみで学習をしたモデルを使って異常を見つける方法であり、異常なデータを入力したときに正常なデータを入力したときと比較すると逸脱した出力がされることを期待しています。
      すなわち、教師あり異常検知とは異なり、異常なデータのラベル付けが必要ありません。

      手法としては、入力画像を再構成するAutoEncoderやGAN等があります*2

 

この分類のうち、本稿では教師なし異常検知を取り上げ、特にPatchCoreアルゴリズムに基づいた異常検知方法について説明を進めます。

また、PatchCoreは本来、異常検知のために部品や製品の写真といった2次元画像を対象としていますが、
本稿ではBTF論文結果に準じて、PatchCoreを改良することで、3次元データの異常検知をする方法について紹介します[BTF]

なお、結果再現のために同著者によるGithubリポジトリを利用しました[BTF GitHub]

 

2次元画像と3次元データそれぞれの利点と欠点

異常検知の分野で、2次元画像を使う場合と3次元データを使う場合に、それぞれの利点と欠点について説明します。

以下の画像のように、異常検知対象に、傷やへこみ等の幾何学的な異常がある場合には、2次元画像では判別が難しく、3次元データでは異なる角度から見ることができるため判別が容易な状況があります。
一方で、色の違いによる異常がある場合には、2次元画像では容易に判別できますが、3次元データでは角度によっては判別が難しい場合があります。

 

2次元画像と3次元データの比較[BTF]
上部が2次元画像、下部が3次元データについて異なる角度から見た場合です。
左2つのクッキーとジャガイモの例は、へこみによる異常の例を示し、
右2つのコネクタ部品であるケーブルグランドと発泡体であるウレタンフォームの例は、色の変化による異常の例を示しています。

 

PatchCoreとは

PatchCoreは、2次元画像を使った異常検知手法であり、工業用の製品や部品のデータセットであるMVTec ADにおいてSOTAを記録するほど高い精度を出しました[PatchCore]

MVTec ADデータセットに対して異常検知した際のベストスコアの推移*3

画像毎に異常であるかどうかの判定に、上記画像のようにAU ROCで#1 (SOTA)を達成しています。
ピクセル毎に異常であるかどうかの判定については、この時点では、AU ROCで#13であり一番良いわけではありません。

また、深層学習モデルの学習が必要ないことから学習時間が比較的短く、推論時間も短くなるための工夫もされています。

実際に、既に提案されていた異常検知手法であるSPADE[SPADE]やPaDiM[PaDiM]と比較した結果、推論時間はSPADEよりも高速であり、小さいモデル(PatchCore-1%)ではPaDiMと同等の性能です。

推論時間の比較[PatchCore]
PatchCore-n%の表記について、nは元のMemory Bankからサブサンプリングされた割合(百分率)を表しています。

PatchCore-1%は、PatchCore-100%のモデルに対して1/100の特徴量のみを保持します。
そのため、推論時間は短くなりますが、スコアは悪くなる可能性があります。

 

手法

画像をパッチ(Patch)と呼ばれる小さな領域に分割して、ImageNetデータセット[ImageNet]による学習済み深層学習モデル等を利用して特徴量を抽出します。
つまり、PatchCoreによる異常検知のために新たに深層学習モデルの学習が必要ないことから、学習時に計算資源上のコストがかかりにくいです

深層学習モデルとして、論文中では、ResNet-50やWideResnet-50、DenseNet等が使われています。

 

PatchCoreの手法におけるキーポイントは、PatchCore論文[PatchCore]の3章で紹介されているように、次に示す3つの手法です。

  1. パッチ毎の特徴量抽出(Locally aware patch features)

  2. パッチ特徴量数の削減(Coreset-reduced patch-feature memory bank)

  3. 異常検知 (Anomaly Detection with PatchCore)

 

PatchCoreで異常検知をするための具体的な手順は、次の画像に示す通りです。

PatchCoreの訓練時と推論時のプロセス[PatchCore]

上の画像から、PatchCoreは、「データ前処理」「学習時」「推論時」の3つのステップで構成されていることが分かります。各ステップについて説明します。

 

  • データ前処理

    学習と推論の前に共通して実行されます。

    1. 元画像をあらかじめ取り決めたパッチ単位で分割します。

    2. パッチ毎に、ImageNetによる事前学習済みモデルの中間層の特徴マップを2通り使って特徴量ベクトルを作成します。

    上記の手順2で説明している特徴ベクトルの抽出方法については、以下の図のように行います。

 

  • 学習時

    1. 全学習データについて、データ前処理で得た特徴量ベクトルを使い、特徴量ベクトル空間を作成します。推論時には近傍法によって距離が近い特徴量を求めるために使用します。

    2. 特徴量ベクトル空間より、推論時の計算量削減のためにデータ点を削減します

 

  • 推論時

    1. 入力画像についてデータ前処理で得た特徴量ベクトルと、学習時に作成した特徴量ベクトル空間中の最も近い特徴量ベクトルから、最短距離を計算します。

    2. パッチの数だけ計算された最短距離から求める異常度の計算方法が、ピクセルレベルで求める場合と画像レベルで求める場合で異なります

      • ピクセルレベルの場合

        パッチ毎に求められた最短距離から、元の画像サイズになるようにバイリニア補間によりアップスケーリングした後に、ガウシアンフィルター( \sigma=4)により、ぼかしを加えることで、ピクセルレベルの異常度が求まります。

      • 画像レベルの場合

        パッチ毎に求められた最短距離のうち、最も遠い距離 s^\starを求めます。
         s^\starを論文中の式(7)により重み付けすることで、画像レベルの異常度が求まります。
        なお、単純に最大値を異常度とするよりも、重み付けした方が、ロバストな結果になったと報告されています。

PatchCoreの手法におけるキーポイントは、PatchCore論文[PatchCore]の3章で紹介されているように、次に示す3つの手法です。

  1. パッチ毎の特徴量抽出(Locally aware patch features)

  2. パッチ特徴量数の削減(Coreset-reduced patch-feature memory bank)

  3. 異常検知 (Anomaly Detection with PatchCore)

各手法は、上記で説明した3ステップである「データ前処理」「学習時」「推論時」と順に概ね対応しています。

 

BTF論文で紹介されている手法

3次元データを扱った異常検知手法は未だ確立されておらず、3次元情報を使用しないPatchCoreが、3次元データを利用するモデルよりも遥かに高い精度である現状でした。

2次元画像を使うPatchCoreと3次元データを使うモデルの精度比較[BTF]
RGB PatchCoreがSOTAを達成したモデル、Voxel (+ RGB) GANやPoint Cloud 3D -ST128は現行の3次元モデルを示します。PROやI-ROCのどちらでも大きな開きがあり、2次元画像のみを使うPatchCoreの方が精度良いことが分かります。

しかし、2022年に3次元データを利用したPatchCoreによる異常検知手法が、従来の手法よりも高精度だと報告するBTF論文[BTF]がarXivに投稿されました。

本稿では、BTF論文で紹介されている手法の説明と、論文の結果が再現できるように公開されているGitHubリポジトリ[BTF GitHub]を使い、結果を再現した結果も共有します。

この論文で精度比較のために使われているデータセットは、3次元データによる異常検知のために作成されたMVTec 3D-ADデータセットです。
MVTec 3D-ADデータセットに関する詳しい説明は別記事で紹介しています。

blog.brainpad.co.jp

 

BTF論文の目標と結果

BTF論文では、異常部分のピクセルレベルでの高精度なセグメンテーションを目指します。
結果として、本論文で報告しているBTFモデルは、ピクセルレベルの2つの指標について、AU ROC: 99.3%PRO: 96.4%を達成しています。
BTF論文で検証されたBTFを除く9種類のモデルと比較しても、かなり良い精度であることが分かります。

メソッド毎のスコアの比較[BTF]
PROはAU PRO、I-ROCは画像レベルのAU ROC、P-ROCはピクセルレベルのAU ROCを表しています。

 

上記の表で紹介されている10種類の手法について、アーキテクチャの違いで分類した表は以下のようになります。
表中のアーキテクチャである「PatchCore拡張版」は、PatchCoreの特徴量生成部分を別の特徴量生成手法に置き換えたものであり、ImageNetによる事前学習モデルを使用しません。

アーキテクチャ

手法名

PatchCore

RGB iNet、Depth iNet

PatchCore拡張版

Depth Raw、Depth HoG、Depth SIFT、PC FPFH、RGB+PC BTF

NSA[NSA]

Depth NSA

PointNeXt[PointNeXt]

PC+RGB PointNeXt

SpinNet[SpinNet]

PC SpinNet

BTF論文ではNSA、PointNeXt、SpinNetでも検証していますが、精度がPatchCoreやPatchCore拡張版によるいくつかのモデルと比べそれほど精度が良くないことと、GitHubリポジトリに結果を再現できるスクリプトがないことを理由に本稿では説明を割愛します。

すなわち、本稿で説明するのは、以下の表で赤枠で囲ったPatchCoreに関連する7種類の特徴量を使った手法になります。

PatchCoreに関連する7種類の特徴量を使った手法。

BTF論文で検証されたPatchCoreに関連する手法は、使用する画像種類と特徴量作成方法が異なります。

 

使用する画像種類は、以下のように3分類あることが分かりました。

  • RGB画像
  • 深度マップ(XYZ画像のZチャネルだけを使った場合と同じ)
  • XYZ画像

 

特徴量の作成方法は、以下のように5分類あることが分かりました。

  • iNet
  • Raw
  • HOG
  • SIFT
  • FPFH

 

上で示した2種類の分類に基づき、7手法を分類した表は次のようになります。

特徴量作成方法

iNet

Raw

HOG

SIFT

FPFH

RGB画像

RGB iNet、
RGB + PC BTF

 

 

 

 

深度マップ

Depth iNet

Depth Raw

Depth HoG

Depth SIFT

 

XYZ画像

 

 

 

 

PC FPFH、
RGB + PC BTF

本論文で提案された最も高精度である「RGB + PC BTF」は、2種類の入力画像種類と特徴量作成方法を使っています。

 

「RGB + PC BTF」を除く6手法のうち、良いスコアを出したのは、「RGB iNet」と「PC FPFH」でした。
これら2つの手法は、それぞれRGB画像とXYZ画像を利用するもので、これら2つの特徴量をうまく使えると精度の向上が期待できます。

そこで、これら2つの特徴量を単純に結合して新たな特徴量とする「RGB + PC BTF」が考案されました。
結果としてBTFは、全ての指標において最高精度を出すことができています。

 

なお、5種類の特徴量作成方法については、別記事で紹介しているので、興味があれば参考にしてください。

blog.brainpad.co.jp

BTF論文の検証結果

BTF論文で説明された7種類のPatchCoreに関連した手法により、テストデータについて異常部分を可視化した結果は、次の図に示す通りです。

ベーグルに対するBTF論文の結果の例[BTF]

上図のBTF論文結果をGitHubリポジトリ[BTF GitHub]を使い、再現したものは以下のようになります

各手法について、異常度で色付けした例。
左から順に、上段ではGT、RGB iNet、Depth iNet、Raw、
下段ではHoG、SIFT、FPFH、RGB + FPFHの結果を表しています。

上図の各手法それぞれの異常度に対して適切な閾値を設定することで、ピクセルレベルでの異常部分を決定できます。
閾値は手動で決定できますが、今回は偽陽性率に基づき自動的に決定しました。

以下の図では、全テストデータに対して偽陽性率が1%になるように可視化しています。

異常度より異常部分を決定する例。
閾値は偽陽性率が1%になるように決定しました。

偽陽性率とPRO及び真陽性率の関係は、PRO曲線とROC曲線を見ればわかるように、トレードオフの関係になっています。
つまり、偽陽性率を下げると間違えて異常であると判定した部分が少なくなりますが、PROや真陽性率の値は減少し真の異常部分を異常であると判定しにくくなってしまいます。

参考までに、次の図は、全テストデータに対して偽陽性率が0.3%になるように可視化したものです。間違えて予測している部分(偽陽性)は減少していますが、正しく異常部分を当てられている部分(真陽性)も減少していることが確認できます。
したがって、PRO曲線やROC曲線等に基づき、どの程度の偽陽性を許容するのかを目的に応じて議論し決定することが重要です。

異常度より異常部分を決定する例。
閾値は偽陽性率が0.3%になるように決定しました。

上図の可視化例に対する、ピクセルレベルのAU ROCスコア及びAU PROは次のようになります。
ROC曲線やPRO曲線をデータ毎に可視化しAU ROCやAU PROを計算することは、どのようなデータであると結果が悪くなるのかを定量的に確かめる意味で非常に重要です。

各手法のピクセルレベルでのROC曲線とAU ROCスコア。

各手法のピクセルレベルでのPRO曲線とAU PROスコア。

今回の例では、RawとHoGの2つの手法の場合で、結果が悪くなっていることが分かります。

 

テストデータに含まれる全てのデータに対して、今回手元で計算したAU PROは、以下のようになりBTF論文で報告されている値と一致しています。

GItHubに公開されているスクリプトで再現したAU PROの一覧。

 

10種類の各カテゴリに対する可視化例を以下の表に示します。
なお、「予測した異常部分の可視化例」については、各カテゴリと手法について偽陽性率が1%になるような閾値を選択しました。
また、偽陽性率が増加するとPROがどのくらい改善するのか示すために「全テストデータに対するPRO曲線」も次に示しています。

カテゴリ

予測した異常部分の可視化例

全テストデータに対するPRO曲線

ベーグル

異常タイプ:combined

ケーブル
グランド

異常タイプ:bent

 

人参

異常タイプ:contamination

クッキー

異常タイプ:contamination

ダボ

異常タイプ:bent

ウレタン
フォーム

異常タイプ:color

異常タイプ:contamination

じゃがいも

異常タイプ:combined

ロープ

異常タイプ:contamination

タイヤ

異常タイプ:contamination

 

まとめ

この記事では、3次元データを扱った場合の異常検知手法について、ご紹介しました。

従来の2次元画像に含まれる色情報に加えて3次元データを使うと、より高い精度でピクセルレベルでの異常検知ができるBTF手法の結果を紹介しました。

2次元画像や3次元データを単体で使う場合には、それぞれに向き不向きなタスクがありますが、BTF手法では双方の苦手な部分を補えるように特徴量生成することができ精度向上に繋がったと考察できます。

さらに、様々なカテゴリについて異常部分を可視化した結果についても共有しました。

 

ブレインパッドでは、3次元データを扱った手法や異常検知技術をビジネスに活用するため、調査や検証を積極的に実施しています。
本記事を通じて、ブレインパッドの取り組みについて、ご興味を持っていただけますと幸いです。

 

<連載記事>

 

参考文献