ユーザーの「いつもと違う」を検知し、最適な一歩を先回りして提案するレコメンデーションエンジン。
本レポジトリは時系列や画像に異常検知を行い、いつもと違うことからユーザーにレコメンデーションを行うシステム構築を行います。
従来のレコメンドシステムは「過去の嗜好」に依存しますが、本システムはユーザーの行動パターンの「急激な変化(異常)」を検知します。これにより、ユーザーの潜在的なニーズの変化や、緊急性の高い需要を捉えたパーソナライズを実現します。

異常検知に関する詳細です。
画像内の異常検知(Visual Anomaly Detection)には、先ほどのオートエンコーダ(AE)以外にも、データの性質や精度に合わせていくつかの代表的なアプローチがあります。
大きく分けて以下の4つのカテゴリーに分類できます。
「正常を学習し、復元できないものを異常とする」手法です。
最新の主流手法です。学習済みのAI(ResNetなど)を使って画像の特徴を数値化し、正常データの分布から外れたものを探します。
画像に意図的なノイズや加工を加え、それを元に戻す訓練を通して「正常」を深く理解させる手法です。
「正常」を囲う境界線を作る手法です。
| 手法 | 得意なこと | 苦手なこと |
|---|---|---|
| AE / VAE | 概念がシンプルで実装が容易 | 微細な傷(ボケるため) |
| PatchCore | 圧倒的な精度、少量のデータ | メモリ使用量が多い |
| CutPaste | 異物混入の検知 | 形状の歪みや色の変化 |
| Deep SVDD | データの中心からの逸脱検知 | 複雑なテクスチャの変化 |
AutoencoderPatchCore や PaDiMPaDiM や PatchCoreもし特定の業界(工場の外観検査、医療画像、防犯カメラなど)での利用を想定されているのであれば、その用途に最適な手法をより詳しく解説できます。
ニューラルネットワーク(ディープラーニング)を使わない手法は、計算負荷が低く、少量のデータでも動作する点や、 「なぜ異常と判定されたか」の根拠が数学的に説明しやすい (説明責任を果たしやすい)というメリットがあります。
主な手法を4つのアプローチに分けてリストアップします。
データが特定の確率分布(正規分布など)に従うと仮定し、そこから大きく外れる値を異常とする手法です。
データ同士の距離や、周囲にどれだけデータが集まっているか(密度)に注目する手法です。
データを条件分岐で切り分けていく手法です。
正常データを取り囲む「境界線」を引く手法です。
行列分解(Matrix Factorization)を用いた異常検知手法は、特に 「低ランク行列復元(Low-Rank Matrix Recovery)」 という枠組みで非常に強力な力を発揮します。
画像における基本的な考え方は、 「正常な背景(共通パターン)」は低ランクな行列 で表現でき、 「異常(動体や欠陥)」はまばらな(Sparse)な行列 で表現できるという性質を利用するものです。
代表的な手法を2つ紹介します。
行列分解を用いた異常検知の中で、最も有名かつエレガントな手法です。
仕組み
入力画像行列 を、以下の2つの行列の和に分解します。
画像検知での使われ方
監視カメラの映像から「動いている不審者」だけを抽出したり、製品の表面画像から「突発的なキズ」を抽出したりするのに非常に有効です。
データの要素がすべて正(0以上)であることを利用した手法です。画像データ(輝度値)は負の値をとらないため、非常に相性が良いです。
仕組み
画像行列 を、2つの小さな行列 (基底)と (重み)に分解します。
異常検知のやり方
| 特徴 | メリット | デメリット |
|---|---|---|
| 透明性 | 数学的に分解されるため、結果が明快。 | 線形な関係しか捉えられないことが多い。 |
| 解釈性 | 行列を見れば、異常の形がそのまま現れる。 | 計算コスト(特異値分解など)が高め。 |
| 学習データ | 正常データが少なくても動作しやすい。 | 複雑なテクスチャの変化に弱い。 |
Pythonの numpy を使って、SVD(特異値分解)を利用した簡易的な低ランク近似による異常抽出の考え方を示します。
import numpy as np
# M: 画像をベクトル化して並べた行列
# U, S, Vh: 特異値分解
U, s, Vh = np.linalg.svd(M, full_matrices=False)
# 上位k個の特異値だけ残して「正常(低ランク)」を復元
k = 5
L = U[:, :k] @ np.diag(s[:k]) @ Vh[:k, :]
# 元の画像から「正常」を引き算すると「異常(Sparse)」が残る
Anomaly_Sparse = M - L
coming soon
coming soon
coming soon
ブログをしています。 ニューラルネットワークや異常検知関係の記事を書いています。
是非ご覧ください。