2023年1月20日

外観検査向け異常検知手法に関する論文紹介: FastFlow

Deep LearningAnomaly Detection

cover

LeapMindの花元です。

異常検知、してますか?

学習済み深層学習モデルを使って外観検査向け異常検知をしたいけど、良い感じの特徴量が得られなくて困ること、長い人生で、たまにはありますよね。今日はそんなときに使える外観検査向け異常検知の手法であるFastFlowのアルゴリズムを紹介したいと思います。

背景

以前の記事で紹介したとおり、近年、外観検査向け異常検知の手法として、画像の特徴を得るために学習済み深層学習モデルを用いる手法が多く提案されています。これらの手法では、訓練データから学習済み深層学習モデルを用いて特徴量を取得し、推論時に対象となる画像から得られた特徴量が、訓練データにおける特徴量の分布からどの程度離れているかを、何らかの基準に基づいて算出します。例えば、PaDiMでは「何らかの基準」としてマハラノビス距離を用いますが、これは訓練データから得られる特徴量の分布が多変量正規分布に従うことを仮定しています。経験的に、多くのデータセットに対してこの仮定を置いて問題ないことが分かっていますが、訓練データの特徴量の分布が多変量正規分布から大きく外れるようなデータセットの場合、うまく動かない場合があります。

うまく動かない可能性があるデータセットの例として、訓練データに複数種類の画像がある場合が挙げられます。例えば訓練データに「赤りんご」と「洋梨」があり、「和梨」を異常として検知したいケースを考えます。この場合、訓練データに「赤りんご」と「洋梨」の2種類があるため、得られる特徴量の分布に多峰性が生じると考えられます。この場合、マハラノビス距離は訓練データの平均と共分散のみを用いて算出されるため、訓練データにほとんど出現しなかったような特徴量(例えば和梨)であったとしても距離が小さい(=正常である)と計算されてしまうことがあります(図1)。

mahalanobis 図1: マハラノビス距離を使った異常検知がうまくいく例(左図)とうまくいかない例(右図)。左図では、トレーニング画像にりんごのみを用いているとする。左図のように訓練データから得られた特徴量の分布が正規分布に近い場合、推定された確率密度関数が訓練データの分布に近い形になるため、高い異常検知性能が得られることが期待できる。一方で、右図のように、訓練データから得られた特徴量の分布に多峰性があるなど、正規分布から離れている場合、推定された確率密度関数が訓練データの分布と離れた形になり、高い異常検知性能が得られない場合がある。

FastFlowでは、この問題に対処するために、Normalizing Flowと呼ばれる技術を用いて、訓練時に訓練データから得られた特徴量の分布を、扱いやすい分布(正規分布)に変換できるようなニューラルネットワークを作っていきます。

アルゴリズム

FastFlow

  • 画像の特徴抽出
  • 2D Flow Model

の2点から構成されます。これらを順に説明していきます。

画像の特徴抽出

FastFlowでは、他の学習済み深層学習モデルを用いる手法と同様に、様々な種類のバックボーンを特徴抽出器として用いることができます。論文中ではViTやResNetを用いて実験を行っています。

2D Flow Model

2D Flowでは画像を特徴抽出器に入力して得られる特徴量の空間から、その分布が扱いやすくなる分布(FastFlowでは正規分布)へ変換する写像ffを学習します。ここで、画像を特徴抽出器に入力して得られる特徴量の空間XX、変換後の空間をZZとすると、これらの確率密度関数には以下の等式が成り立ちます。

pX(x)=pZ(z)det(zx)\begin{equation} p_X(x) = p_Z(z)|\det(\frac{\partial z}{\partial x} )| \end{equation}

上式の対数は以下の通り計算されます。

logpX(x)=logpZ(z)+logdet(zx)=logpZ(fθ(x))+logdet(fθ(x)x)\begin{equation} \begin{split} \log p_X(x) &= \log p_Z(z) + \log |\det(\frac{\partial z}{\partial x} )| \\\\\\ &= \log p_Z(f_\theta(x)) + \log |\det(\frac{\partial f_\theta(x)}{\partial x} )| \end{split} \end{equation}

ここで、θ\thetaは2D Flow Modelのパラメータとします。学習時には、写像fθf_\thetaを用いて得られた分布と目標とする分布(FastFlowでは正規分布)の距離(KL Divergence)を最小化するように学習します。この際、写像fθf_\thetaθ\thetaに関する微分とヤコビアン(det(fθ(x)x)\det(\frac{\partial f_\theta(x)}{\partial x}))を計算する必要が生じます。写像fθf_\thetaθ\thetaに関する微分は、写像fθf_\thetaをニューラルネットワークで構築すれば、自動微分により計算することが可能です。一方で、ヤコビアンを愚直に計算しようとすると、行列の大きさをn×nn \times nとした際にO(n3)O(n^3)の計算量を要してしまいます。これは計算効率が悪くなってしまうため、ヤコビアンが自明になるようにfθf_\thetaの構造を設定したものにNICEと呼ばれるネットワークがあり、FastFlowではこのネットワークを2D Flow Modelに採用しています。ネットワークの構造を以下に示します。

2D Flow Model 図2: 2D Flow Modelの構造(論文より引用)

性能比較

論文中では、MVTec ADを対象とした実験で、バックボーンにWide-ResNet50-2を用いた際の平均AUROCが99.3であり、これまでのSoTAであるPatchCoreを、バックボーンにWide-ResNet50-2を用いて動作させた際のAUROCの99.1を上回っていると主張されています。ANOMALiBによる再実装に基づく実験では、FastFlowの平均AUROCが96.3、PatchCoreの平均AUROCが98.0となっており性能が逆転していますが、SoTAに近い異常検知性能が得られているとは言えそうです。

現在のSoTAとされるPatchCoreと性能の点で大きく異なる点は、トレーニング時間と推論時間です。FastFlowでは、トレーニング時にニューラルネットワークのパラメータを学習させる必要があります。一方で、PatchCoreでは特徴ベクトルを抽出し、貪欲法に基づき特徴ベクトルのサブセットを抽出するだけでトレーニングが終了するため、一般にトレーニング時間はPatchCoreの方が速いと言えます。一方で、推論時においては、FastFlowはニューラルネットワークの計算をすることになるため、実行環境にこの計算を速く行う仕組みがあれば(例えばGPUを搭載している)速く推論することが可能です。一方で、PatchCoreでは推論時に、推論ごとに膨大な特徴ベクトルの中からk個の最近傍を得る必要があり、比較的遅くなります。実際、論文中では、FastFlowは、GPUが搭載されている環境において、特徴抽出後の処理時間が画像1枚あたり100ms程度、PatchCoreより速いと主張されています。従って、トレーニング時間と推論時間のどちらを重視するのか、また、推論する際の実行環境に応じて使い分けるのが良いと考えられます。

まとめ

この記事では、学習済み深層学習モデルを用いた外観検査向け異常検知手法であるFastFlowを紹介しました。この手法では、Normalizing Flowと呼ばれる、解析的に表現することが難しい特徴量の分布を解析的に表現することが容易な分布(FastFlowにおいては正規分布)へと変換するニューラルネットワークを用いることで、正常画像における特徴量の分布が複雑な場合においても異常検知の精度を高めることを図っています。

ところで、LeapMindでは異常検知モデルだったり、異常検知とは全く関係ないモデルだったりを開発する機械学習エンジニアを絶賛募集中です!興味のある方は以下からぜひご応募ください!

https://leapmind.io/careers/