Identity Preservation
アイデンティティ保持では、生成画像、動画フレーム、トラッキングIDを通じて、特定の人物や物体を同一の対象として認識できる状態に保ちます。
アイデンティティ保持とは、モデルの出力を通して特定の被写体を同一人物または同一物として認識できる状態に保つ能力です。たとえば、生成された一連のポートレートで同じ顔を保つこと、生成動画の最初から最後まで同じキャラクターを保つこと、バスの後ろを歩いて再び現れた歩行者に同じトラッキングIDを割り当てることです。この用語は2つのコミュニティで使われています。生成AIでは、人物や製品の同一性を変えずに新しいシーンに登場させるパーソナライゼーション手法を指します。マルチオブジェクトトラッキング(MOT)では、オクルージョンや交差、カメラの切り替わりがあっても、各オブジェクトのIDを安定して維持することを指します。どちらの場合も、同一人物には近く、別人には遠くなる特徴ベクトルであるアイデンティティ埋め込みを使って評価します。
画像・動画生成におけるアイデンティティ保持#
テキスト画像生成モデルは「女性」や「犬」の見た目は知っていますが、特定の女性や犬の見た目は知りません。そのため、パーソナライゼーション手法でその知識を追加します。ファインチューニング手法は、少数の写真から知識を学習します。GoogleのDreamBooth(2022)は、被写体の3~5枚の画像とまれなトークンを結び付け、拡散モデル全体をファインチューニングします。クラス固有の事前分布保持損失により、モデルが他の犬を通常どおり生成できる状態を保ちます。LoRAアダプターを使うと、同じ考え方を人物ごとに低コストで学習できます。
エンコーダーベースの手法では、被写体ごとの学習を省略できます。TencentのIP-Adapter(2023)は、独立したクロスアテンション層を通じて画像埋め込みを拡散モデルに入力します。InstantID(2024年1月)は、顔認識ネットワークから得た埋め込みと、5つの顔ランドマークを条件とするControlNetであるIdentityNetを組み合わせ、1枚の写真から顔を保持します。アイデンティティ条件付けを強めると出力は参照画像に似ますが、参照画像のポーズや表情、照明もより多く引き継ぎます。そのため、これらのツールには、類似度とプロンプトによるシーン変更の自由度とのバランスを調整する強度設定があります。
生成された顔は、参照写真と出力のArcFace埋め込み間のコサイン類似度で評価します。Jiankang Deng氏らがCVPR 2019で発表したArcFaceは、角度マージンを使って顔埋め込みを学習し、単位超球面上でアイデンティティを明確に分離します。動画では、フレーム間で被写体の一貫性を維持するという2つ目の要件が加わります。VBenchはフレーム間のDINO特徴を比較し、被写体の一貫性として測定します。動画生成では、各フレームが個別にはリアルに見えても、数秒の間にキャラクターの顔が変化すれば、このテストに失敗します。
トラッキングにおけるアイデンティティ保持#
トラッカーは、各フレームの検出結果を既存のトラックに対応付けてIDを割り当てます。各ボックスの位置を予測するカルマンフィルターとIntersection over Union(IoU)によるマッチングだけでは、2人がすれ違ったり、1人が障害物の陰に隠れたりしたときに対応できません。その場合、トラッカーがIDを入れ替えたり、新しいIDを割り当てたりします。このエラーはIDスイッチとして数えられます。外観特徴を使うと、この問題の多くを解決できます。Nicolai Wojke氏、Alex Bewley氏、Dietrich Paulus氏のDeepSORT(2017)は、人物再識別データセットで学習したネットワークの埋め込みを、動きだけを使うSORTトラッカーに追加し、IDスイッチを45%削減しました。Ergys Ristani氏らが2016年に提案したIDF1指標は、検出結果のうち正しいIDが割り当てられた割合として、アイデンティティ保持を直接評価します。
Ultralytics YOLOのトラッキングは、デフォルトでTrackTrack(Shim氏ら、CVPR 2025)を使用します。TrackTrackは、消失したトラックを30フレーム保持し(track_buffer)、再び現れたオブジェクトが同じIDを取り戻せるようにするとともに、新しいIDを作成する前に重複するIDを抑制します。トラッカーのYAMLでwith_reid: Trueを設定すると、外観照合が追加されます。デフォルトでは検出器独自の特徴を使い、必要に応じて280万パラメーターのYOLO26n-reidモデルなどの専用エンコーダーも使用できます。このコード例では、サンプル動画内の人物をReIDの有効・無効の両方で追跡し、各実行で割り当てられた個別ID数を数えます。
from ultralytics import YOLO
from ultralytics.utils import ROOT, YAML
# Copy the default TrackTrack config and turn on appearance re-identification
cfg = YAML.load(ROOT / "cfg/trackers/tracktrack.yaml")
cfg.update(with_reid=True, model="yolo26n-reid.onnx")
YAML.save("tracktrack_reid.yaml", cfg)
video = "https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov"
for tracker in ["tracktrack.yaml", "tracktrack_reid.yaml"]:
model = YOLO("yolo26n.pt") # fresh model so each run starts with no tracks
ids = set()
for result in model.track(video, tracker=tracker, classes=[0], stream=True, verbose=False):
if result.boxes.is_track:
ids.update(result.boxes.id.int().tolist())
print(f"{tracker}: {len(ids)} person IDs")この短いクリップでは、どちらの実行でも3つの人物IDが割り当てられるため、外観照合による違いはありません。この機能が役立つのは、人が画面外に出て戻ってくる長い映像です。同じ人物に対する個別ID数が少ないほど、IDスイッチは少なくなります。後続の集計はこの結果に依存します。人数カウントシステムが戻ってきた買い物客に新しいIDを割り当てると、その買い物客を2回数えてしまいます。










