ラベルなし画像から強い表現を学ぶ:DINOを軸に自己教師あり学習を実務目線で整理
DINOとは、同一画像の異なるビューを教師ネットワークと生徒ネットワークで整合させ、ラベルなしで汎用的な特徴表現を学習する手法である。
いま自己教師あり学習(SSL)が効く理由
- 画像認識の多くの現場では、アノテーションのコストがモデル運用のボトルネックになりがち。
- SSLはラベルを使わずに表現(embedding)を学ぶため、データを「集める→すぐ活かす」が可能。
- DINO系はViT(Visual Transformer)と相性がよく、微調整せずともk-NNや線形分類で強いベースラインを出せる。
- 異常検知でも、パッチ特徴の距離ベース手法と自然に接続でき、従来の手作り特徴より頑健になりやすい。
DINOのコアアイデア(ざっくり)
- 自己蒸留(Self-Distillation): 同一画像から生成した複数ビュー(強・弱オーグメント、マルチクロップ)に対し、教師(teacher) の出力分布に 生徒(student) が一致するよう学習。教師は生徒の指数移動平均(EMA)で更新し、崩壊を抑制。
- 出力空間: クラスタ原型(prototypes)に対する確率分布(ソフトマックス)。特徴を直接揃えるのではなく、分布として整合。
- 安定化の工夫: センタリングとシャープニングで、表現の崩壊(全サンプルが同一点に潰れる)を回避。
- バックボーン: ViTを用いることでグローバルな関係を捉えやすく、パッチレベルの表現も自然に得られる。
- 学習後の使い方: 凍結したエンコーダから埋め込みを抽出し、k-NN、線形分類、クラスタリング、距離ベースの異常スコアなどに活用。
従来手法との違い(画像ベース)
同じ階層の比較は表でまとめます。
観点 | エンコード/CNN(教師あり分類の中間層を流用) | PaDiM | PatchCore | DINO(SSL) |
---|---|---|---|---|
主目的 | クラス分類のための特徴 | 正常分布のモデリング | メモリバンクの近傍探索 | ラベルなしで汎用表現 |
監督信号 | 有り(ラベル必須) | なし(正常のみ) | なし(正常中心) | なし(自己蒸留) |
特徴の粒度 | 画像/チャネル中心 | パッチごとのガウス分布 | コアセット化したパッチ | 画像・パッチ両方強い |
データ要件 | 十分なラベル | 正常画像多数 | 正常画像多数+メモリ制御 | 未ラベル多数(雑多でOK) |
推論コスト | 低〜中 | 中(分布参照) | 中(近傍探索) | 低〜中(埋め込み→軽量分類/距離) |
異常検知 | 流用可だが目的外 | 強い(設定依存) | 強い(実務実績多) | 強い(特徴の一般性) |
ドメイン移行 | 再学習必要 | 再学習必要 | 再学習必要 | 特徴流用が効きやすい |
スケール/継続学習 | ラベル準備が律速 | データ拡張で対応 | メモリ設計がボトルネック | 追加未ラベルで継続学習しやすい |
要点: DINOはラベル不要で強い表現を作り、従来の距離ベース異常検知(例: PatchCore)の下地としても使える。CNNの中間特徴流用よりも、ドメインが変わっても性能が落ちにくい傾向。
DINOと拡散モデルの違い
観点 | DINO(SSL) | 拡散モデル(DDPM/Scoreなど) |
---|---|---|
学習目標 | ビュー一致(自己蒸留)で表現学習 | ノイズ付与と復元でデータ分布を生成的に学習 |
主要アウトプット | 汎用埋め込み・プロトタイプ分布 | サンプル生成器(生成確率流) |
適性タスク | 事前特徴抽出、下流分類・検出、異常検知 | 生成、編集、インペインティング、合成データ |
異常検知 | 埋め込み距離や密度推定が王道 | 生成困難性を用いるがコスト高・設計難 |
推論コスト | 低(一回前向き) | 高(多数ステップ) |
微調整のしやすさ | 軽量(線形層やk-NNでOK) | 目的次第で重め(LoRA等活用) |
要点: 拡散は「作る」能力が強み、DINOは「分かる」能力が強み。認識系・検査系での素早い高精度化ならDINOの方が扱いやすい場面が多い。
実務導入パターン(最短で強いベースライン)
- 特徴固定+k-NN/線形
- 事前学習済みDINO-ViTを読み込み → 埋め込み抽出 → 学習データの特徴をインデックス化 → 推論時はk-NNや線形分類。
- ラベル少数なら線形層のみ学習でOK。多数クラスでもデータ拡張で対応しやすい。
- Few-shot微調整
- 小さなヘッドを付けて数エポック微調整。過学習しやすいので凍結層を多めに、早期停止推奨。
- 異常検知(距離ベース)
- 正常データの埋め込みをメモリバンク化(必要ならコアセット縮約)。
- 入力をパッチ分割→各パッチ埋め込み→最も近い正常パッチまでの距離でスコア化→ヒートマップ合成。
- 推論を速くしたい場合は、特徴次元圧縮(PCA/ランダム射影)や近似最近傍(FAISS)を併用。
学習と推論のベストプラクティス
-
入力解像度: ViTは解像度依存。検査系は細部が効くので、学習・推論で同等のスケール感を維持。
-
オーグメント: カラー抑えめ、幾何変換は強めが無難(過度な色変換は検査系で逆効果)。
-
正規化: 埋め込みはL2正規化して距離・類似度を安定化。
-
バッチと温度: 温度(softmax温度)やプロトタイプ数は表現の粒度に効く。小規模データではプロトタイプ少なめから。
-
メモリ設計: 異常検知のメモリはクラスター代表だけ保持(コアセット)。速度と精度のトレードオフを明示的に管理。
-
評価:
- 分類: 線形プローブとk-NNの両方を確認。ドメインシフト時はk-NNが安定しがち。
- 異常検知: 画像レベルAUROCとピクセルレベルAUPROを両方見る。スコア分布のキャリブレーションも忘れずに。
よくある落とし穴
- 崩壊: 学習初期の不安定化で特徴が単一モードに潰れる。センタリング・温度・EMA率の見直しで回避。
- 過強オーグメント: タスク本質を壊してしまい、下流性能が伸びない。ユースケースに合わせ調整。
- メモリ過多: PatchCore系の最近傍探索がボトルネックに。コアセットや近似NN、解像度制御で現実解を。
- 評価の取り違え: 検査系で分類精度だけ見て満足しがち。局所異常の再現性(AUPRO)を必ず見る。
どれを選ぶ?ユースケース指針
- ラベルが乏しい分類・検査: DINO特徴+線形 or k-NNからスタート。
- ピクセル単位の欠陥検出: DINO特徴+距離ベースのヒートマップ。既存PaDiM/PatchCoreを置換・強化しやすい。
- 生成や編集が主題: 拡散モデル。認識はDINO特徴と併用すると良い。
- 長期運用: 未ラベル追加で表現を更新しやすいDINO系が保守コスト低。
まとめ(実務Tipsの再掲)
- ラベルなし大量データがあるなら、まずDINO埋め込みを作り、k-NNと線形の二刀流で指標(精度・AUROC・AUPRO)をチェック。
- 検査・異常検知は、パッチ埋め込みの近傍距離とコアセットで速度と精度を両立。
- 拡散は生成、DINOは表現。目的から逆算して組み合わせるのが吉。