Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Why face index 2 is not a stable ID across detectors

2026年10月22日に「Dev.to」が公開したITニュース「Why face index 2 is not a stable ID across detectors」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

複数の顔検出器を使うと、写真で選んだ顔を別の環境で正確に特定するのは難しい。これは、検出器ごとに検出結果が異なるためだ。解決策として、顔の座標を画像全体に対して正規化し、IoU(重なり具合)で比較することで、最も近い顔を確実にマッチングする方法がある。

ITニュース解説

グループ写真編集アプリを開発する際、ユーザーが写真に写っている特定の顔を選択し、「この顔を編集してほしい」と指示する場面を想像してみよう。一見シンプルな機能に見えるが、システム内部では多くの複雑な課題が潜んでいる。この記事は、その課題の一つである「ユーザーが選択した顔を、異なるシステム間で正確に特定する方法」について解説する。

まず、この問題の背景を理解する必要がある。一般的なWebアプリケーションでは、ユーザーが使うブラウザ側と、画像処理などの重いタスクをこなすサーバー側の「ワーカー」という二つの場所で、それぞれ顔検出処理が行われることがある。例えば、ブラウザ側で顔の位置をプレビュー表示し、ワーカー側で実際に編集処理を行う、といった流れだ。しかし、このブラウザとワーカーがそれぞれ独立した「顔検出器」を使っている場合、検出結果が完全に一致するとは限らない。

ブラウザが3つの顔を検出したのに対し、ワーカーが4つの顔を検出するかもしれない。あるいは、同じ写真でも、検出器Aは顔を左から順に「顔1、顔2、顔3」と認識するが、検出器Bは「顔1、顔3、顔2」という順序で認識したり、検出漏れや誤検出によって検出数が異なったりする可能性がある。このような状況で、ユーザーがブラウザで「2番目の顔」を選択したとしても、ワーカー側でその「2番目の顔」がどれを指すのかを正確に判断するのは非常に困難となる。単に「何番目の顔か」という情報を送るだけでは、検出器の違いによって全く別の顔を編集してしまうリスクがあるのだ。

この問題は、顔を認識して個人を特定したり、本人であることを確認したりする「顔認識」の問題ではない。選ばれた「顔そのもの」が誰であるかではなく、「画像上のどの位置にある顔が選ばれたのか」という「座標対応問題」である。この課題を解決するためには、ユーザーが選択した顔を、どの検出器の結果にも依存しない普遍的な方法で表現し、ワーカー側でそれに最も近い顔を探し出す必要がある。

一つの解決策は、ユーザーが選択した顔の位置とサイズを、画像の「住所」として正確に記録する方法である。具体的には、選択された顔のボックス(四角形)の中心座標と幅・高さを、画像全体の幅・高さを基準にして0から1の範囲で正規化された値で表現する。例えば、画像の左上端を(0,0)、右下端を(1,1)とする座標系で、顔の中心がどこにあり、どれくらいの大きさかを示す。この正規化された座標を使うことで、画像が比例的にリサイズされても、選択された顔の位置関係が崩れることなく維持される。

ここで重要なのは、サムネイル画像などの表示用に加工された情報ではなく、顔検出器が検出した生のボックス情報を使うことだ。サムネイルはパディング(余白)が追加されたり、特定の形にトリミングされたりすることがあり、それは表示のためのデータであって、顔の正確な幾何学的情報ではない。また、画像の回転、クロップの変更、ミラーリング、EXIF情報(画像の向きなどのメタデータ)の解釈の違いといった要因も、座標の一貫性を損なう可能性があるため、ブラウザとワーカーの両方のシステムが同じ画像座標系で処理を行うように統一する必要がある。さらに、ユーザーの選択情報は、その元となる画像の「リビジョン(変更履歴)」と関連付け、画像自体が変更された場合には選択情報を破棄することで、古い情報に基づいた誤った処理を防ぐことができる。ブラウザから送られるこの座標情報も、不正な操作を防ぐためにサーバー側で常に検証が必要となる。

次に、この「画像の住所」を使って、ワーカー側で検出された顔の中から、ユーザーが選択した顔と最も一致するものを探し出す方法を考える。ここで役立つのが、「Intersection over Union(IoU)」という指標だ。IoUは、二つの四角形がどれくらい重なり合っているかを数値で表すもので、0から1の間の値を取る。具体的には、二つの四角形が重なる部分の面積を、二つの四角形を合わせた全体の面積から重なる部分の面積を引いた値で割ることで計算される。完全に重なっていれば1、全く重なっていなければ0となる。

このIoUを使って、ワーカー側で検出されたすべての顔のボックスと、ユーザーがブラウザで選択した顔のボックスとの重なり具合を評価する。検出された各顔のIoUスコアを計算し、そのスコアが高い順に並べ替えることで、どの顔が最も選択された顔に近いかを判断できる。

この一致度を基に、システムは以下のいずれかの状態を判断する。

  • not-found(見つからない): 最もIoUスコアが高い顔でも、ある基準値(例えば0.35)を下回る場合、一致する顔は見つからなかったと判断する。これは、ユーザーの選択がワーカー側で検出されなかったか、検出精度が非常に低い場合に起こりうる。
  • ambiguous(曖昧): 最もIoUスコアが高い顔と、二番目にIoUスコアが高い顔の差が小さい場合(例えば0.15未満)、選択が曖昧であると判断する。これは、ユーザーが選択した顔の近くに、非常によく似た位置にもう一つ別の顔がある場合などに発生する。システムが勝手に判断せずに、ユーザーに再選択を促したり、より明確な画像を使うよう促したりするべき状況である。
  • matched(一致した): 上記のいずれにも当てはまらない場合、最もIoUスコアが高い顔が、ユーザーが意図した顔であると判断する。そして、その顔がワーカー側の検出結果の何番目にあるかを示すインデックスを返す。

これらのIoUの基準値(しきい値)は、実際に使用する顔検出器のペアと、代表的なテスト画像を使って調整する必要がある。異なる検出器間でボックスの表現方法が微妙に異なるだけでもIoU値は変化するため、開発段階で適切な値を設定することが重要だ。また、この方法で得られるワーカー側のインデックスは、あくまでその時点での検出結果内での一時的なものと認識すべきであり、再度顔検出を実行した場合には無効になる可能性がある。繰り返しになるが、ブラウザから送信された正規化されたボックス情報は、信頼できない入力として扱い、常にサーバー側で適切な認証と検証を行う必要がある。

このようなシステムを開発する上で、テストは非常に重要である。単に「うまくいった場合」だけでなく、様々な失敗ケースを想定してテストを行う必要がある。例えば、選択した顔がワーカー側で検出されなかった場合、複数の顔が選択された顔と似たような位置にあるために曖昧になる場合、あるいは無効な座標値が入力された場合、サイズがゼロのボックス、画像外のボックス、画像の向きが変わった場合、クロップが変更された場合、さらには検出処理中に画像が置き換えられた場合など、あらゆるシナリオを網羅するテストを実施することで、システムの信頼性を高めることができる。

この解説で示されたアプローチは、静止画の単一の選択領域に焦点を当てたものだ。複数の顔が選択された場合、あるいは動画中の顔を追跡する場合には、さらなる複雑なロジックが必要となる。例えば、複数の選択に対しては、ワーカー側の検出結果と一対一で対応させるようなマッチングロジックが必要となり、解決できない割り当ては拒否する必要がある。動画の場合は、時間的な連続性も考慮した追跡システムが不可欠となるだろう。

そして最も重要な注意点として、この座標マッチング技術は、あくまで「画像上の位置」を特定するものであり、その人物の「身元」を確立したり、編集に対する「同意」を得たことを証明したりするものではない。個人情報やプライバシーに関わる要件は、技術的なマッチングとは独立した、別のセキュリティ要件として扱う必要がある。ユーザーインターフェース(UI)は、編集の前に選択された領域をユーザーが確認できるようにする機能や、編集に対する明確な許可を得る仕組みを提供することが求められる。この技術は、あくまでユーザーの意図を正確にシステムに伝えるためのツールであり、倫理的な側面や法的要件は別途考慮しなければならない。

関連コンテンツ

関連IT用語

関連ITニュース