はじめに
私は現在、メーカーで生産に関する仕事をしています。
AIを外観検査に使ってみたいと思うのですが、その前に気になるのが「学習用の画像をどう集めるか」です。
日本のメーカーといっても製品や工程によるとは思いますが、私の身近な現場では品質が安定していて、NG品がそう何個も出るわけではありません。不良の種類ごとに画像を集めたくても、肝心のNG品がなかなか集まらない。
品質の面ではありがたい話ですが、AIに不良の見た目を覚えさせようとすると困ります。
では、正常品の写真ならいくらでも用意できるかというと、そうでもありません。
製品の機種変更や設計変更もあります。そのたびに同じ条件で何百枚、何千枚と撮影し直すのは大変です。撮影時期が変われば、照明や設置条件をそろえる手間もかかります。
しかも、これは最初の導入だけの話ではありません。一度は自動化できた検査でも、製品が変わって学習し直すとなれば、データを集めている間は人が検査を引き受けることがあります。自動化した後も、変更のたびに対応が必要になる。そこまで含めて、画像を用意する負担を考えたいです。
もちろん、すべてのAI検査に大量の画像が必要なわけではありません。だからこそ、もっと手軽に始められる方法を知りたくて、個人的に調べていました。
そこで気になったのが、SubspaceADという異常検知の手法です。
今回は論文を読んだ範囲で、仕組みをざっくりまとめます。再現実験の結果ではなく、まずは「どうやって異常を見つけているのか」の話です。
SubspaceADとは
SubspaceADは、少数の正常画像から正常な特徴の部分空間を推定し、そこからのずれを使って異常を捉える手法です。画像から特徴量を取り出すのにDINOv2を使い、その特徴量にPCA(主成分分析)を適用します。詳しい手法は原論文のMethod節に記載されています。
ざっくり言えば、NGの種類を覚えさせるのではなく、「正常な特徴から外れているところ」を探します。
正常画像から異常を見つける手法はほかにもあります。SubspaceADで気になったのは、その基準をPCAで作るという点でした。
まずは全体の流れを見る
上の段が正常画像から基準を作る処理、下の段が新しい画像を検査する処理です。

図1:正常モデルを作る処理と、検査時の処理。説明用の模式図です。
1. DINOv2で画像から「特徴量」を取り出す
図1の「特徴を抽出」の部分で使われているのが、DINOv2です。
DINOv2は、Metaが公開している、自己教師あり学習による画像モデルです。大量の画像から事前に学んだ表現を、別の画像処理にも利用できます。DINOv2の公式リポジトリ
SubspaceADでは、この学習済みモデルに画像を入力し、パッチと呼ばれる小さな領域ごとに特徴ベクトルを取り出します。論文ではDINOv2-Gを使い、複数の中間層から得た特徴を平均して利用しています。原論文・特徴抽出
特徴量は、画像を数値で扱うための表現
「特徴ベクトル」というと難しく聞こえますが、ここでは画像の見た目を数値のまとまりにしたもの、と捉えておけば十分です。
例えば、ある領域を [0.12, -0.35, 0.81, …] のような数値の並びで表すイメージです。この数値は説明用の例で、実際の出力ではありません。また、一つ目が傷の深さ、二つ目が汚れの量、といった分かりやすい意味が各数値に付いているわけでもありません。
ここで行っているのは、まだ「傷あり」「傷なし」の判定ではなく、画像を比較・分析できる形に変換することです。正常画像と検査画像の画素を直接引き算する方法とは違います。
DINOv2だけで良否を決めているわけではない
役割を分けると、DINOv2が画像から特徴量を取り出し、PCAが正常な特徴の傾向を表し、その部分空間からのずれを異常スコアにします。DINOv2に製品の合否を直接答えさせているわけではありません。原論文・処理の全体像
私が面白いと思ったのは、画像の特徴を取り出す部分には学習済みのAIを使いつつ、自分の製品の「正常」を表す部分にはPCAを使う、この組み合わせです。
2. 正常な特徴を「部分空間」で表す
次に、正常画像から集めた特徴にPCAを適用し、主な変動を表す方向を求めます。この方向の組み合わせで表される空間が、正常な特徴の部分空間です。原論文・部分空間のモデル化
例えば、正常な特徴を点として並べたとき、ある平面の近くに集まっているとします。それなら、その平面に沿った方向を使えば、正常な特徴の大まかな傾向を表せそうです。
実際にはもっと高次元の空間を扱いますが、次の図では点と平面に置き換えています。
3. 部分空間で表現しきれない「ずれ」を見る
新しい画像の特徴を正常な部分空間へ射影し、元の特徴との差である「再構成残差」を求めます。論文のパッチスコアは、この残差のL2ノルムの二乗です。原論文・異常スコア
図2:高次元の特徴空間を3次元で表した模式図。紫色の平面が部分空間、オレンジの点が検査対象の特徴です。
オレンジの点から平面まで引いた線が、そのずれに当たります。平面に近ければ残差は小さく、離れていれば大きくなります。
ただ、この距離だけで実際の良品・不良品が必ず分かれるわけではありません。基準になるのは、登録した正常画像です。
4. ずれをヒートマップで表示する
パッチごとのスコアを画像上の位置に戻し、拡大・平滑化して可視化します。これにより、画像のどこで正常モデルからのずれが大きいかを確認できます。原論文・可視化
図3:ヒートマップの読み方を示す説明用の合成例。実際の推論結果ではありません。
この図の暖色は、正常モデルからのずれが大きい場所を表しています。「不良である確率」や「傷の種類」を表すものではありません。
現場で見るなら、「この辺りを確認してほしい」という手掛かりとして使い、実物と照らし合わせたいです。
「Training-Free」は、何を学習しないのか
論文タイトルにある「Training-Free」は、少し補足しておきたい言葉です。
DINOv2自体は事前に学習されていますが、SubspaceADではその重みを固定し、自分の製品画像で追加学習はしません。ただし、正常画像を用意してPCAを当てはめる処理はあります。何も登録せず、いきなり検査できるという意味ではありません。著者の公式実装
何を正常として登録するか、どんな条件で撮るか、どの程度の差を要確認にするか。この辺りは使う側で決める必要があります。
自分の現場で試すなら
仕組みは分かっても、そのまま現場で使えるかは別の話です。ここからは論文の結果ではなく、私が試す前に確認しておきたいことを書きます。
正常画像に、どこまでばらつきを含めるか
少ない画像で始められるのはうれしいのですが、よく似た正常品だけを選んでしまわないかは気になります。
例えば、表面の見え方に多少の違いがあっても、検査基準上は良品という場合。その違いを正常画像に含めていないと、良品にも反応してしまうかもしれません。単純に枚数を決めるだけでは済まなさそうです。
製品の違いと、写真の見え方の違い
金属部品なら、照明や角度で反射の見え方が変わります。検出したいのは製品の異常なのに、撮り方の違いばかり拾っては困ります。まずは照明や位置をそろえて、どこまで安定するか確かめたいです。
検出できたかの確認には、NG品も必要
NG画像を集めにくいところから調べ始めた話ですが、実際に不良を検出できるかの確認には、やはりNG品が必要です。
手に入る不良サンプルや、良否の境界に近いサンプルで試したいです。見逃しだけでなく、良品をどれだけ引っ掛けてしまうかも見ておきたいところです。
「自動化できました」で終わらない
「AI検査で自動化できました」といっても、その製品をずっと作り続けるわけではありません。製品も撮影条件も変わらなければ同じ仕組みを使い続けられるかもしれませんが、実際には設計変更や新製品への切り替えがあります。
形状や表面の見た目が少し変わっただけでも、以前のモデルをそのまま使ってよいか確認が必要です。そこで学習し直すことになれば、また画像を集めるところから始まります。
その間も製品は検査しなければなりません。別の検査手段がなければ、せっかく無人化した工程に、再び人が入って検査することになります。少なくとも学習データがそろうまで、さらに新しいモデルで検査してよいと確認できるまでは、人の対応が必要です。
私が少数画像で始められる手法に価値を感じるのは、ここです。初回導入が楽になるだけでなく、製品が変わった後に、自動検査へ戻すまでの準備を短くできるかもしれません。
もちろん、画像が少なく済んでも性能確認は省けません。それでも、何百枚もそろうのを待つ前に新しい基準を作って試せるなら、変更に対応する負担は違ってくると思います。SubspaceADで実際にどこまで短くできるかは、検証してみたいところです。
まとめ
SubspaceADの基本は、画像から特徴を取り出し、正常な特徴をPCAで表し、そこからのずれを見る、という流れでした。
画像を扱うAIにPCAを組み合わせる構成が、個人的には面白かったです。NG画像が集まらず、正常画像も大量には用意しにくい状況で、試してみたい方法の一つになりました。
特に気になるのは、最初に自動化できるかだけでなく、製品が変わった後も運用を続けられるかです。少数画像でのモデル作成が、人の検査に戻る期間や再立ち上げの負担を減らすことにつながるのか、確かめたいです。
まずはiOSアプリを作ってみた
調べているだけでは、実際にどのくらい使えるのか分かりません。試せるものがないと始まらないので、ひとまずiOSアプリとして形にしてみました。それが、外観検査アプリ「TOIVIS」です。
開発は、AIに「こういうものを作りたい」と指示しながら進めました。AIで検査するためのアプリを、AIの力も借りて作った、という形です。
アプリはApp Storeで公開しています。興味があれば、紹介ページとあわせて見ていただけるとうれしいです。
次回は、公開されている検査用の画像を使って、実際にこのアプリで検査のデモをしてみます。正常画像を登録し、学習に使っていない正常画像やNG画像を検査して、どのくらい見分けられるのか確かめたいと思います。
うまく検出できた例だけでなく、見逃しや良品への過検出も含めて、使った画像の出典・利用条件、画像枚数、検査条件と一緒に紹介する予定です。
なお、論文の評価結果がそのままアプリの性能になるわけではありません。まずは公開画像で試した結果としてまとめ、実際の現場で使えるかどうかとは分けて見ていきます。
参考資料
- SubspaceAD: Training-Free Few-Shot Anomaly Detection via Subspace Modeling(arXiv v2)
- 著者による公式実装
- DINOv2の公式リポジトリ
本文の技術説明は上記論文の基本的な仕組みに絞っています。図は理解を助けるためにAI画像生成で制作したオリジナルの模式図・合成例であり、論文からの転載や実測結果ではありません。

