Facial Recognition
顔認識は、顔の埋め込み表現を比較して人物を識別または検証します。処理パイプラインの仕組み、検証と識別の違い、バイアス、プライバシーについて解説します。
顔認識は、顔画像を登録済みの顔と比較して人物を識別または認証する生体認証技術です。最新のシステムではディープラーニングを使って各顔を埋め込み表現に変換します。これは一般にフェイスプリントと呼ばれる数値ベクトルで、2つの顔の埋め込み表現の類似度から、同一人物かどうかを判定します。スマートフォンのロック解除、空港ゲートでの旅客の通過迅速化、オンラインで銀行口座を開設する顧客の本人確認などに使われます。また、本人に知られずに顔を撮影できるため、コンピュータービジョンの中でも最も規制の厳しい用途の1つです。
顔認識の仕組み#
顔認識システムは画像ごとに4つの段階を実行します。
- 検出:顔検出器が各顔を見つけ、バウンディングボックスといくつかの顔ランドマークを返します。
- 位置合わせ:目、鼻、口の位置が一定になるように顔を回転、拡大縮小、切り抜きします。これにより、頭の向きや距離による変動の大部分を取り除きます。
- CNNによるエンコード:ネットワークが位置合わせ済みの切り抜き画像を固定長の埋め込み表現に変換します。
- コサイン類似度による照合:新しい埋め込み表現を登録済みの埋め込み表現と比較し、しきい値に基づいて一致を判定します。大規模な導入では、登録済みのフェイスプリントをベクトルデータベースに保存して高速検索を実現します。
顔検出は物体検出の問題です。WIDER FACEなどの顔データセットでファインチューニングしたUltralyticsのYOLO26モデルは、エッジカメラ上でリアルタイムに実行でき、後続段階に顔ボックスを渡せます。ディープラーニング以前のシステムでは、顔のランドマーク間の距離からEigenfaces、局所二値パターンまで、人手で設計した特徴に依存していました。照明、表情、年齢が変わっても学習済み埋め込みのほうがはるかに安定するため、こうした特徴は置き換えられました。2015年のFaceNetは、トリプレット損失を使ってコンパクトな128次元の埋め込みを直接学習しました。現在はArcFaceなどのマージンベースの損失によって、異なる人物の埋め込みをさらに離します。照合段階では、次の2種類の問いに対応します。
認証(1:1)では、スマートフォンが所有者を確認する場合のように、顔が申告された本人のものかどうかを判定します。識別(1:N)では、アクセス制御システムが登録済みの全従業員と顔を照合する場合のように、ギャラリー全体を検索します。OpenCV Zooのモデルを使えば、数行のコードでパイプライン全体を実行できます。このコードでは画像内の顔を登録した後、反転コピー内の顔をそのギャラリーと照合して識別します。
import urllib.request
import cv2
# Download OpenCV Zoo's face detector (YuNet), face recognizer (SFace), and a test image
zoo = "https://github.com/opencv/opencv_zoo/raw/main/models"
urllib.request.urlretrieve(f"{zoo}/face_detection_yunet/face_detection_yunet_2023mar.onnx", "yunet.onnx")
urllib.request.urlretrieve(f"{zoo}/face_recognition_sface/face_recognition_sface_2021dec.onnx", "sface.onnx")
urllib.request.urlretrieve("https://ultralytics.com/images/bus.jpg", "bus.jpg")
img = cv2.imread("bus.jpg")
detector = cv2.FaceDetectorYN.create("yunet.onnx", "", (img.shape[1], img.shape[0]))
recognizer = cv2.FaceRecognizerSF.create("sface.onnx", "")
# Enroll each detected face as an aligned 128-D embedding
gallery = [recognizer.feature(recognizer.alignCrop(img, face)) for face in detector.detect(img)[1]]
# Identify the faces of a mirrored copy against the gallery (SFace match: cosine >= 0.363)
mirror = cv2.flip(img, 1)
for face in detector.detect(mirror)[1]:
probe = recognizer.feature(recognizer.alignCrop(mirror, face))
print([round(recognizer.match(probe, g, cv2.FaceRecognizerSF_FR_COSINE), 2) for g in gallery])[0.87, 0.06]と[0.09, 0.89]が出力されます。反転した各顔は、自分自身の登録済み埋め込み表現との類似度がしきい値0.363を大幅に上回り、もう一方の人物との類似度は大幅に下回ります。
顔認識と関連用語の比較#
- 顔検出: 画像内の顔の位置を検出しますが、誰の顔かは特定しません。顔認識の最初の段階であり、カメラのオートフォーカスや顔のぼかしにも利用されます。
- 顔分析とアフェクティブコンピューティング:本人確認は行わず、表情、頭の向き、年齢などの属性を推定します。
- 人物再識別(Re-ID):服装などの全身の外見を使ってカメラ間で人物を照合します。後ろ向きや低解像度でも機能しますが、短い時間範囲でのみ利用できます。
実際のアプリケーション#
- デバイスのロック解除:スマートフォンは一瞬で所有者を認証します。AppleのFace IDは3万個を超える赤外線ドットを投影して深度マップを作成するため、印刷した写真では模倣できません。
- 旅行と国境管理:自動ゲートは、旅行者のライブ写真と電子パスポートのICチップに保存された写真を照合します。
- 本人確認:銀行やオンラインサービスは、口座開設時にセルフィーを公的身分証明書の写真と照合し、ライブネスチェックも組み合わせます。
- 写真の整理:写真アプリは個人のライブラリ全体から顔をクラスタリングし、家族の写真をすべて見つけられるようにします。
精度、バイアス、なりすまし#
すべてのシステムでは、2種類の誤りのトレードオフが生じます。誤一致では別人を受け入れ、誤不一致では本人を拒否します。このバランスは類似度のしきい値で決まります。NIST顔認識技術評価(FRTE)は、以前はFRVTと呼ばれ、数百万枚の画像を使って商用アルゴリズムをベンチマークします。99の開発元による189のアルゴリズムを対象とした2019年の調査では、その大半で偽陽性率に人口統計学的な差が見られ、これはアルゴリズムバイアスの代表例となりました。顔認識は写真、画面の再生、マスクでも欺けるため、本番システムでは深度センサー、赤外線、微細な動きの分析を使ったプレゼンテーション攻撃検知(ライブネス検知とも呼ばれます)を追加します。
プライバシーと規制#
フェイスプリントは生体データであるため、法律では極めてセンシティブな個人データとして扱われます。GDPRでは、人物の識別に使われる生体データは特別なカテゴリーに属し、明示的な法的根拠を必要とします。また、イリノイ州の生体情報プライバシー法は、企業がフェイスプリントを収集する前に書面による同意を求めています。EU AI法はさらに踏み込み、2025年2月2日以降、インターネットやCCTVの画像を無差別にスクレイピングして顔認識データベースを構築すること、および法執行機関が限定的に定められた少数のケースを除き、公共空間でリアルタイムの遠隔生体識別を行うことを禁止しています。










