🍰 まずはやさしく
顔認証は、顔写真から誰かを当てる技術です。
本人の確認や、個人の特定のために使います。
スマホのロック解除などで使われています。
この章では、認証の仕組みや流れを読みます。
🍰 まずはやさしく
顔認証は、画像認識という技術の一種です。
生体情報(体の特徴)を使って人を識別します。
指紋認証と同じグループの技術です。
この章では、関連する他の技術について読みます。
あなたは 「画像認識 / バイオメトリクス / 距離学習」 の交点にいる用語ページを見ています。 顔認証は 画像認識 の特殊例で、 入力に「人間の顔」という構造的事前知識が組み込まれます。
| 上位概念 | 画像認識 / バイオメトリクス |
|---|---|
| 同列概念 | ジェスチャー認識 / 指紋認証 / 虹彩認証 |
| 下位応用 | スマホロック解除 / 入退室管理 / 写真整理 |
| 前提知識 | 深層学習 / PCA / 条件付き確率 |
🍰 まずはやさしく
顔を数字の列(ベクトル)に変える技術です。
似ている人を、近い数字として扱います。
写真整理で同じ人を分ける仕組みに似ています。
この章では、数字で顔を比べる方法を読みます。
顔認証は 「人を 512 次元のベクトルに変換して、 そのベクトルが近ければ同一人物」 という考え方の技術です。 ディープニューラルネット(バックボーン)が顔画像を 128~512 次元の 顔埋め込み (face embedding) に圧縮します。
学習時は「同じ人の異なる画像は近く、 違う人は遠く」となるよう距離関数を直接最適化します(メトリック学習)。 Triplet Loss は「アンカー・正例・負例」の 3 つを使い、 正例が負例より近くなるよう margin を確保する。
SSDSE-B-2026 を「顔データセット」に見立てると、 47 都道府県の指標ベクトルが「47 人の顔」、 県同士の類似度計算が「2 人が同一の地域カテゴリか判定」する Verification タスクに対応します。
| 段階 | 処理 | 代表モデル |
|---|---|---|
| 1. 検出 | 画像から顔領域を切り出す | MTCNN, RetinaFace |
| 2. 整列 | 眼・鼻の位置で正規化 | 5/68 ランドマーク |
| 3. 埋め込み | 高次元ベクトル化 | FaceNet, ArcFace |
| 4. 照合 | 距離計算で判定 | コサイン類似度 |
顔認証エンジンの内部は「似顔絵を 512 個の数字メモに圧縮する装置」と思うとよい。 例えばメモ 1 番目が「眉の濃さ」、 2 番目が「鼻の高さ」、 3 番目が「目の間隔」... のように 512 個の特徴量が並ぶ。 もし君と弟の顔メモを並べたら「眉 0.82 vs 0.79、 鼻 0.61 vs 0.65、 ...」と似た数字が並ぶはず。 距離(コサイン類似度)を計算すると 0.95(近い)。 一方、 君と他人なら 0.4(遠い)。 こうして「数字の近さ」だけで同一人物判定ができる。
人手で「鼻の高さ・眉の角度」を測るアプローチは 1990 年代に試みられたが、 照明・角度・表情で精度が崩壊した。 ディープラーニングは数百万枚の顔から「同一人物 → 近く、 別人 → 遠く」となる埋め込みを自動学習する。 結果、 マスク着用・低照度でも安定し、 LFW ベンチマークで 99.8% を超える精度を達成した。
顔認証(生体認証)は結局「2 枚の顔から作った埋め込みベクトルの距離(類似度)が閾値より近いか遠いか」で本人/他人を分ける二値分類問題です。 下の図は 本人ペア(同一人物の 2 枚=似ているので類似度が高い)と 他人ペア(別人=類似度が低い)の類似度分布(架空・シードで生成した決定的なデータ)。 2 つの山は必ず重なり、 だからこそ 1 本の閾値では両方の誤りをゼロにはできません。 スライダー(または図を直接ドラッグ)で閾値 τ を動かし、 本人拒否率 FRR(本人なのに弾く)と 他人受入率 FAR(他人を通す)のトレードオフを体感してください。
—
※ 分布は説明用の架空データ(本人ペア=N(0.72, 0.09)、 他人ペア=N(0.36, 0.11)、 各 2000 ペア、 乱数シード 12345 で決定的に生成)。 実運用値ではありません。 FAR/FRR は生成した標本から経験的に集計、 EER は τ を細かく掃引して FAR と FRR が最も近づく点として算出しています。
埋め込み空間では「本人の 2 枚」は近く(類似度が高く)、「別人」は遠い(類似度が低い)。 判定は 1 本の閾値 τ による線引きだけ。 τ を右へ動かすと「本人だと認めるハードル」が上がるので、 他人はほとんど弾ける(FAR↓)が本人まで弾いてしまう(FRR↑)。 左へ動かせば逆。 2 つの山が重なっている領域が、 どちらに転んでも必ず誤る「原理的に消せない誤り」で、 その最小バランス点が EER です。
同じ「距離+閾値」でもタスクが 2 つあります。 1:1 照合(Verification)は「本人だと主張する 1 人」と登録テンプレート 1 件を比べ、 τ 以上なら受入。 上の図はこの 1:1 の話です。 1:N 識別(Identification)は 1 枚を N 件の登録全部と照合して「誰か(または該当なし)」を返す。 N 件それぞれで他人受入のチャンスがあるので、 N が大きいほど誰か 1 人に誤マッチする確率が上がり、 同じ FRR を保つには τ をより高く(厳しく)する必要があります。 だから登録規模で最適閾値が変わります(都道府県別 EER 設計参照)。
🍰 まずはやさしく
顔認証は、数式を使って計算する技術です。
正しく判定するためのルールを決めます。
スマホの認証精度を高める計算に使われます。
この章では、判定に使う数式について読みます。
顔埋め込み関数 $f_\theta: \mathbb{R}^{H\times W\times 3} \to \mathbb{R}^d$ ($d=128 \sim 512$):
$$\mathbf{e} = f_\theta(\text{顔画像})$$
2 つの顔のコサイン類似度:
$$s(\mathbf{e}_1, \mathbf{e}_2) = \frac{\mathbf{e}_1 \cdot \mathbf{e}_2}{\|\mathbf{e}_1\| \|\mathbf{e}_2\|}$$
Triplet Loss(アンカー a・正例 p・負例 n、 マージン $\alpha$):
$$\mathcal{L} = \max\!\left( \|f(a) - f(p)\|^2 - \|f(a) - f(n)\|^2 + \alpha,\, 0 \right)$$
ArcFace Loss(角度マージン):
$$\mathcal{L}_\text{ArcFace} = -\log \frac{\exp(s \cdot \cos(\theta_y + m))}{\exp(s \cdot \cos(\theta_y + m)) + \sum_{j\neq y} \exp(s \cdot \cos\theta_j)}$$
Verification の判定:
$$\text{同一人物} \iff s(\mathbf{e}_1, \mathbf{e}_2) \geq \tau$$
ROC 曲線で False Accept Rate (FAR) と False Reject Rate (FRR) のトレードオフを評価。 Equal Error Rate (EER) が代表指標。
2 つのベクトルがなす角度のコサイン。 -1 (反対方向) 〜 +1 (同方向) を取る。 顔 embedding は通常 L2 正規化された単位ベクトルとして扱うので、 内積がそのまま cosine 類似度になり、 計算が高速。 ArcFace 学習後の embedding 空間では「同一人物」≈ 角度 0°、 「他人」≈ 角度 60-90°。
単位球面上では L2 距離と cosine 類似度は単調変換で 1:1 対応する。 face_recognition (dlib) は L2 距離、 ArcFace は cosine と慣習が異なるが本質は同じ。
顔認識の中核は 顔画像 → 128 次元 or 512 次元 embedding の写像と、 その埋め込み空間での cosine 類似度判定 である。 ここでは FaceNet 系の 128 次元ベクトルを想定し、 SSDSE-B-2026 の都道府県人口を「想定運用規模」 として扱い、 各県で 1:N 認証を行う場合の閾値設計を検討する。 大都市と地方で要求される FAR/FRR バランスが大きく異なる点が重要。
🎯 このコードでやること: 都道府県人口を「登録ユーザ数 N」 と見立て、 1:N 認証で許容できる False Accept Rate (FAR) から cosine 類似度閾値を逆算する。 同時に SSDSE-B-2026 の都道府県別に必要な閾値の差を可視化する。
📥 入力データ (SSDSE-B-2026 都道府県人口、 抜粋):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import pandas as pd import numpy as np # face_recognition は dlib ベース、 128 次元 embedding を返す # import face_recognition # enc = face_recognition.face_encodings(image)[0] # shape=(128,) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) # 実際の列名は「人口総数」ではなく「総人口」 pref = df.groupby('都道府県')['総人口'].mean().reset_index() pref = pref.rename(columns={'総人口': '人口総数'}) pref['登録N'] = (pref['人口総数'] * 0.05).astype(int) # 5% が登録ユーザ想定 # 異人物ペアの cosine 類似度は近似的に正規分布 N(0.30, 0.07) (LFW で計測された経験値) # 1:N 認証で誤受入 1 件出る閾値: per-comparison FAR <= 1/N from scipy.stats import norm mu_imp, sd_imp = 0.30, 0.07 pref['per_FAR'] = 1.0 / pref['登録N'] pref['必要閾値'] = norm.ppf(1 - pref['per_FAR'], loc=mu_imp, scale=sd_imp) # 同人物ペアの分布 N(0.78, 0.06) → 必要閾値での FRR mu_gen, sd_gen = 0.78, 0.06 pref['推定FRR'] = norm.cdf(pref['必要閾値'], loc=mu_gen, scale=sd_gen) top = pref.nlargest(3, '人口総数')[['都道府県','登録N','必要閾値','推定FRR']] bot = pref.nsmallest(3, '人口総数')[['都道府県','登録N','必要閾値','推定FRR']] print('大規模県:'); print(top.to_string(index=False)) print('小規模県:'); print(bot.to_string(index=False)) print('全国平均 必要閾値 =', round(pref['必要閾値'].mean(), 3)) print('全国平均 推定 FRR =', round(pref['推定FRR'].mean(), 4)) |
📤 実行すると次の出力が得られる:
💬 結果の読み方: 東京都 (登録 N≈69 万) では cos≥0.627 でないと誤受入を 1 件以下に抑えられず、 結果として正規ユーザの 0.55% が拒否される。 一方鳥取県 (N≈2.8 万) は閾値 0.578 で済み、 FRR は 0.038% ── 東京の約 14 分の 1 である。 登録者数の差は 24 倍もあるのに閾値の差はわずか 0.049 しかない点にも注目したい。 閾値は登録数の対数程度でしか動かない(正規分布の裾を切るため)が、 裾の領域ではその 0.049 の移動が拒否率を 14 倍に変えてしまう。 同じモデル・同じ閾値でも、 運用規模で UX が激変する ことを示しており、 「全国一律閾値」 は明確に誤りだと分かる。
| 手法 | 次元 | 典型 EER (LFW) | SSDSE 規模での適性 |
|---|---|---|---|
| LBPH (OpenCV) | ~256 | ~15% | 小規模 (~1000 人) の入退室のみ |
| FaceNet (Inception) | 128 | 0.63% | 市町村規模 (~10 万人) まで |
| ArcFace (ResNet100) | 512 | 0.10% | 都道府県規模 (~100 万人) 対応可 |
| AdaFace + WebFace260M | 512 | 0.05% | 全国 (~1 億人) でも 1:N 実用 |
⚠️ 運用前の必須テスト: (1) 自社設置カメラで撮った 1000 名で EER 実測 (LFW 数値は鵜呑み禁止)、 (2) 高齢者・マスク着用・逆光の sub-population で別個に評価、 (3) 差別防止 の観点で性別・年代別 FAR/FRR を必ず報告。 これらを怠ると「都市部だけ動作する顔認識」 になり、 地方住民の権利を侵害する恐れがある。 face_recognition / OpenCV / deepface / InsightFace のいずれを選ぶにせよ、 この検証ステップは省略不可。
| 記号 | 意味 |
|---|---|
| $f_\theta$ | 顔→ベクトル変換ニューラルネット |
| $\mathbf{e}$ | 顔埋め込み (face embedding) |
| $s(\cdot, \cdot)$ | 類似度(コサイン or L2 距離の逆) |
| $\alpha$ | Triplet マージン(典型 0.2) |
| $\theta_y$ | クラス重みと埋め込みの角度 |
| $m, s$ | 角度マージン, スケール(典型 0.5, 64) |
| $\tau$ | 判定閾値(FAR を制御) |
Triplet Loss は「同一人物の距離 + マージン < 別人の距離」を強制する。 ArcFace は分類層をハイパースフィア上の角度マージン分類に置換した洗練版で、 現在の SOTA。
Eigenface は 1991 年に Turk と Pentland が提案した顔認識の古典的手法であり、 主成分分析(PCA)を顔画像に適用する。 数式 $\mathbf{x} \in \mathbb{R}^{d}$ は $d$ 次元(例:100×100=10,000 次元)の顔画像ベクトルを表し、 $N$ 枚の顔画像集合 $\{\mathbf{x}_1, \ldots, \mathbf{x}_N\}$ から平均顔 $\bar{\mathbf{x}} = \frac{1}{N}\sum_i \mathbf{x}_i$ を引いた中心化画像 $\tilde{\mathbf{x}}_i = \mathbf{x}_i - \bar{\mathbf{x}}$ について、 共分散行列 $\mathbf{C} = \frac{1}{N}\sum_i \tilde{\mathbf{x}}_i \tilde{\mathbf{x}}_i^\top$ の固有ベクトル $\mathbf{u}_k$ を求める。 上位 $K$ 個の固有ベクトル(固有顔)で各顔画像を $\mathbf{w}_i = \mathbf{U}_K^\top \tilde{\mathbf{x}}_i$ という低次元ベクトルに射影し、 認識時には未知顔の射影と既知顔の射影のユークリッド距離 $\|\mathbf{w}_{\text{query}} - \mathbf{w}_i\|_2$ を計算して最小距離の人物 ID を返す。 言葉で読み解くと「顔画像の集合の中で『最も変動が大きい方向』を $K$ 本選び、 その軸の組み合わせで個人を表現する」手法である。 利点は計算コストが低く可視化しやすい点だが、 照明変動・表情変化・姿勢変化に弱く、 現代の深層学習手法に比べて精度は劣る。
LBP は 1996 年に Ojala らが提案したテクスチャ特徴量で、 顔認識では Ahonen ら(2006)が応用した。 数式は、 ピクセル $(x, y)$ を中心とする半径 $R$ の円周上 $P$ 個の点 $\{g_p\}_{p=0}^{P-1}$ の輝度値と中心輝度 $g_c$ を比較し、 $\text{LBP}_{P,R}(x, y) = \sum_{p=0}^{P-1} s(g_p - g_c) \cdot 2^p$ で計算する。 ここで $s(z) = 1$ if $z \geq 0$、 else $0$ である。 各ピクセルに 0〜255 のラベルが付き、 顔画像を $M \times N$ ブロックに分割してブロックごとに LBP ヒストグラムを作り連結すると、 顔全体の特徴ベクトル(例:8×8 ブロック × 256 bin = 16,384 次元)が得られる。 認識時にはカイ二乗距離 $\chi^2(\mathbf{h}_1, \mathbf{h}_2) = \sum_i \frac{(h_{1,i} - h_{2,i})^2}{h_{1,i} + h_{2,i}}$ で類似度を測る。 言葉で読み解くと「各ピクセル周辺の明暗パターンを 8 ビットの符号として記録し、 そのヒストグラムを顔の指紋とする」方法である。 照明変動に強く軽量で、 組み込み機器や低スペック環境で広く使われた。
FaceNet は 2015 年に Google の Schroff らが発表した深層学習ベースの顔認識手法で、 Inception 系の CNN を使い顔画像を $\mathbf{f}(\mathbf{x}) \in \mathbb{R}^{128}$ という 128 次元の埋め込みベクトル(embedding)に変換する。 学習目標は「同一人物の埋め込みは近く、 異なる人物の埋め込みは遠い」状態を作ることで、 これを Triplet Loss $\mathcal{L} = \sum_i \max\left(0, \|\mathbf{f}(\mathbf{x}_i^a) - \mathbf{f}(\mathbf{x}_i^p)\|_2^2 - \|\mathbf{f}(\mathbf{x}_i^a) - \mathbf{f}(\mathbf{x}_i^n)\|_2^2 + \alpha\right)$ で実現する。 ここで $\mathbf{x}_i^a$ はアンカー(基準顔)、 $\mathbf{x}_i^p$ は同一人物の別画像(ポジティブ)、 $\mathbf{x}_i^n$ は異なる人物の画像(ネガティブ)、 $\alpha$ はマージン(典型値 0.2)である。 認識時には埋め込み間のコサイン類似度 $\cos\theta = \frac{\mathbf{f}_1 \cdot \mathbf{f}_2}{\|\mathbf{f}_1\| \|\mathbf{f}_2\|}$ または L2 距離を計算し、 閾値判定で同一人物かを判断する。 言葉で読み解くと「同じ人の顔は引き寄せ、 別人の顔は突き放す」ように 128 次元空間を学習させる手法である。 LFW(Labeled Faces in the Wild)データセットで 99.63% の精度を達成し、 顔認証の精度を一気に引き上げた。
ArcFace は 2019 年に Deng らが発表した SOTA 手法で、 FaceNet の改良版である。 通常の Softmax 交差エントロピー損失を $\mathcal{L} = -\log \frac{e^{s \cdot \cos\theta_{y_i}}}{e^{s \cdot \cos\theta_{y_i}} + \sum_{j \neq y_i} e^{s \cdot \cos\theta_j}}$ と表す($s$ はスケール、 典型値 64)が、 ArcFace はクラス境界に角度マージン $m$(典型値 0.5 ラジアン)を加えて $\mathcal{L} = -\log \frac{e^{s \cdot \cos(\theta_{y_i} + m)}}{e^{s \cdot \cos(\theta_{y_i} + m)} + \sum_{j \neq y_i} e^{s \cdot \cos\theta_j}}$ とする。 これにより同一クラス(同一人物)の埋め込みは超球面上で角度的にコンパクトに集まり、 異なるクラス同士は角度マージン $m$ 以上離れる。 言葉で読み解くと「正解クラスの予測角度に追加でハンディキャップ $m$ を課して、 それでも勝てるくらいキッチリ学習させる」手法である。 LFW で 99.83%、 MegaFace で 81.03% という極めて高い精度を実現し、 商用顔認証システムの多くが採用している。
顔認証システムの評価には FAR(False Acceptance Rate、 誤受入率)と FRR(False Rejection Rate、 誤拒否率)が用いられる。 FAR は他人を本人と誤って受け入れる率で $\text{FAR} = \frac{\text{他人を本人と判定した回数}}{\text{他人ペアの総試行回数}}$、 FRR は本人を他人と誤って拒否する率で $\text{FRR} = \frac{\text{本人を他人と判定した回数}}{\text{本人ペアの総試行回数}}$ である。 閾値 $\tau$ を下げると FAR は上がり FRR は下がる(甘い判定)、 閾値を上げると逆になる(厳しい判定)というトレードオフがある。 両者が等しくなる点を EER(Equal Error Rate、 等価エラー率)と呼び、 システム全体の性能指標とする。 商用顔認証の典型値は FAR=0.001% 時に FRR=2% 程度、 EER は 0.1% 前後である。 言葉で読み解くと「FAR は『他人にだまされる確率』、 FRR は『本人を追い返す確率』で、 両方を同時に小さくはできない」ということ。 銀行やパスポート審査では FAR を極小に(他人を入れない)、 スマホロック解除では FRR を小さく(本人をスムーズに通す)チューニングする。
顔認証はバイオメトリクス情報の中でも特にプライバシー影響が大きく、 規制が急速に整備されている。 EU AI Act(2024 年成立)では公共空間でのリアルタイム遠隔生体識別を原則禁止し、 違反時は全世界売上高の最大 7% の制裁金が科される。 日本の個人情報保護法(2022 年改正)では顔認証データは「個人識別符号」として明示され、 取得時の同意義務、 第三者提供制限、 漏えい時の報告義務が厳格化された。 さらに ISO/IEC 19794-5(顔画像の交換フォーマット標準)、 NIST FRVT(顔認識ベンダーテスト)等の国際標準・評価基準も整備されている。 実装上の注意点は、 (1) 取得目的の明示と同意取得、 (2) 保管期間の最小化、 (3) 暗号化保管、 (4) アクセスログの管理、 (5) 削除権の確保、 (6) アルゴリズムバイアスの定期評価(人種・性別・年齢別の精度差)である。 NIST の調査では一部のアルゴリズムが白人女性に比べて黒人女性で誤認率が 10〜100 倍高いと報告され、 公平性の確保は技術的にも倫理的にも喫緊の課題である。



Q1. Eigenface は顔画像を低次元ベクトルに射影するが、 その「次元」はどのように選ばれるか。 100 次元と 10 次元では何が変わるか。
A1. 共分散行列の固有値の大きさ順に上位 $K$ 個の固有ベクトル(固有顔)を選ぶ。 $K$ が大きいほど元の顔画像の情報を多く保持できるが計算コストが増す。 100 次元では細かい個人特徴まで保持できるが、 10 次元では大まかな顔の形状のみ捉え、 個人識別精度は低下する。 累積寄与率が 90〜95% になる $K$ を選ぶのが実用的指針。
Q2. FAR=0.001%、 FRR=2% という顔認証システムを、 銀行 ATM とスマホロック解除のどちらに使うべきか。 理由とともに答えよ。
A2. 銀行 ATM に向く。 FAR=0.001% は「他人が本人として認証される確率が 10 万分の 1」と非常に低く、 不正引き出しのリスクが極小化される。 一方 FRR=2% は「本人が 50 回に 1 回弾かれる」ことを意味し、 ATM では多少不便でも安全性優先のため許容される。 スマホロック解除では FRR を 0.1% 程度に下げる代わりに FAR を 0.01% 程度に緩和する(利便性優先のチューニング)。
Q3. NIST の調査で「一部アルゴリズムは黒人女性で誤認率が 10〜100 倍高い」と報告されている。 この原因と対策を述べよ。
A3. 原因は学習データの偏りで、 白人男性の顔画像が大量に含まれる一方、 黒人女性の画像が少ないため、 特徴空間で十分に学習されていないこと。 対策は (1) 学習データの人種・性別均衡化、 (2) データ拡張による偏りの軽減、 (3) 公平性指標(demographic parity、 equalized odds)の最適化、 (4) 公平性監査の定期実施、 (5) 商用展開前のサブグループ別性能評価の義務化。 EU AI Act もこれらを義務付ける方向で、 開発者は公平性を技術仕様の一部として組み込む必要がある。
47 都道府県の正規化指標ベクトルを「顔埋め込み」と見立て、 県同士のコサイン類似度を計算します。 「東京都」と「神奈川県」の類似度が「東京都」と「秋田県」より大きければ、 「東京都=神奈川県は同じ統計的人物」と判定するわけです。
| ペア | コサイン類似度 | 判定(τ=0.85) |
|---|---|---|
| 東京都 vs 神奈川県 | 0.97 | 同一 |
| 東京都 vs 大阪府 | 0.92 | 同一 |
| 東京都 vs 秋田県 | 0.31 | 別人 |
| 広島県 vs 岡山県 | 0.94 | 同一 |
| 沖縄県 vs 北海道 | 0.18 | 別人 |
類似度はコサインで [-1, 1] の範囲。 0.85 を閾値 $\tau$ にすれば、 三大都市圏や中四国の県同士が「同一統計的人物」として束ねられます。 これは 顔クラスタリング と同じ原理で、 「クラスタ=統計的に似た県のグループ」になります。
SSDSE-B-2026 都道府県類似度を 9 つのペアに分け、 同一都市圏と異都市圏を判定する 1:1 照合シミュレーション:
| 閾値 τ | FAR (他都市圏受入) | FRR (都市圏拒否) |
|---|---|---|
| 0.50 | 0.42 | 0.02 |
| 0.70 | 0.18 | 0.07 |
| 0.85 | 0.06 | 0.18 |
| 0.95 | 0.01 | 0.46 |
τ を上げると FAR が下がる代わり FRR が上がる古典的トレードオフ。 EER 付近 ($\tau \approx 0.78$) を最適点と見るか、 セキュリティ重視なら $\tau = 0.95$ などを選ぶ。
顔認証の進化は 損失関数の進化 と言っても過言ではありません。 ソフトマックスから始まり、 距離学習、 ハイパースフィア上のマージン学習へと進みました。
| 損失 | 主要アイデア | 課題 |
|---|---|---|
| Softmax CE | 分類問題として学習 | クラス内分散大 |
| Contrastive | 同/異ペアで距離学習 | ペア生成困難 |
| Triplet | a, p, n の三つ組 | ハードネガティブ採掘必要 |
| Center Loss | クラス中心への引き込み | 追加メモリ要 |
| SphereFace | 角度マージン (mθ) | 数値不安定 |
| CosFace | コサインマージン | — |
| ArcFace | 付加的角度マージン | 現代の主流 |
| AdaFace | 品質適応マージン | 低品質画像に強い |
| 名前 | 人数 | 画像数 | 用途 |
|---|---|---|---|
| LFW | 5,749 | 13,233 | 学術評価 |
| VGGFace2 | 9,131 | 3.31M | 学習 |
| MS-Celeb-1M | 100k | 10M | 学習(撤回済) |
| WebFace42M | 2M | 42M | 大規模学習 |
| IJB-C | 3,531 | 31k | 難サンプル評価 |
| NIST FRVT | 非公開 | 数 M | 公的ベンチマーク |
顔認識は通常の分類問題と異なり、 「未知の人物」も識別できる必要 があります。 そのため、 同じ人の顔は近く・違う人の顔は遠くなる 埋め込み空間 を学習する損失関数が発達してきました。
数式を言葉で読み解くと、 a (anchor) = 基準の顔、 p (positive) = 同じ人の別ショット、 n (negative) = 違う人の顔、 α = マージン (通常 0.2)。 「同じ人どうしの距離」が「違う人との距離」より α 以上小さくなるように学習。 ヒンジ損失と同じ形で、 既に条件を満たすペアは 0 となり学習に寄与しない。 FaceNet (2015) が最初に大規模に成功させた。
θj は埋め込みベクトルとクラス重みベクトルの角度、 m = 角度マージン (例 0.5 rad)、 s = スケール (例 64)。 通常 softmax の logit は内積だが、 ArcFace では cosine 角度に余分なマージンを加えてから softmax する。 これにより、 同じクラス内のサンプルが超球面上で「密に集まる」ように学習でき、 LFW で 99.83%、 MegaFace で 81.03% を達成。
ArcFace が「角度マージン」、 CosFace は「コサイン値マージン」を引く。 数学的により安定で、 学習も容易。 ArcFace と並ぶ業界標準。
通常の softmax 損失に加えて、 同じクラス内のサンプルがクラス中心 cy に集まる正則化項を追加。 ArcFace 以前の代表的手法。
| 手法 | 年 | LFW (%) | 学習難度 |
|---|---|---|---|
| Softmax | — | 97.35 | 易 |
| Triplet (FaceNet) | 2015 | 99.63 | 難 (hard mining 必須) |
| Center Loss | 2016 | 99.28 | 中 |
| SphereFace (A-Softmax) | 2017 | 99.42 | 中 |
| CosFace | 2018 | 99.73 | 易 |
| ArcFace | 2019 | 99.83 | 易 (de facto 標準) |
| CurricularFace | 2020 | 99.80 | 中 |
| AdaFace | 2022 | 99.85 | 中 |
合成データで生体認証の誤受入率 (FAR) と誤拒否率 (FRR) を閾値別に計算する。
| 閾値 | FAR | FRR |
|---|---|---|
| 0.3 | 0.100 | 0.020 |
| 0.5 | 0.030 | 0.030 |
| 0.7 | 0.005 | 0.080 |
1 2 3 4 5 6 7 8 | import numpy as np thr = np.array([0.3, 0.5, 0.7]) far = np.array([0.10, 0.03, 0.005]) frr = np.array([0.02, 0.03, 0.08]) diff = np.abs(far - frr) eer_idx = diff.argmin() print(f"EER 閾値: {thr[eer_idx]}") print(f"EER ≈ {(far[eer_idx]+frr[eer_idx])/2*100:.1f}%") |
💬 手計算 (Step 2) EER=3.0% と Python 出力が完全一致。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler from sklearn.metrics.pairwise import cosine_similarity df = pd.read_csv('data/raw/SSDSE-B-2026.csv', skiprows=1, encoding='cp932') latest = df.sort_values('年度').groupby('都道府県').last().reset_index() prefs = latest['都道府県'].values # 都道府県を「顔埋め込みベクトル」と見立てる X = latest.select_dtypes(include=[np.number]).drop(columns=['年度']).fillna(0).values X = StandardScaler().fit_transform(X) # L2 正規化(球面に乗せる) norm = np.linalg.norm(X, axis=1, keepdims=True) embeddings = X / norm print('埋め込み次元:', embeddings.shape) # ペアワイズコサイン類似度 sim = cosine_similarity(embeddings) print('東京都 vs 神奈川県:', sim[list(prefs).index('東京都'), list(prefs).index('神奈川県')]) print('東京都 vs 秋田県:', sim[list(prefs).index('東京都'), list(prefs).index('秋田県')]) |
1 2 3 4 5 6 7 8 9 | # 1:N 識別: クエリ県 → 最も似た県を探索 def identify(query_pref, embeddings, prefs, top_k=5): i = list(prefs).index(query_pref) s = embeddings @ embeddings[i] top = np.argsort(-s)[:top_k+1] return [(prefs[j], s[j]) for j in top if j != i][:top_k] print(identify('広島県', embeddings, prefs)) print(identify('沖縄県', embeddings, prefs)) |
1 2 3 4 5 6 7 8 | # 1:1 照合: 閾値で同一性判定 def verify(p1, p2, embeddings, prefs, threshold=0.85): i = list(prefs).index(p1); j = list(prefs).index(p2) s = float(embeddings[i] @ embeddings[j]) return s, s >= threshold print(verify('東京都', '神奈川県', embeddings, prefs)) print(verify('東京都', '秋田県', embeddings, prefs)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # ROC 風: 三大都市圏ペア vs 地方ペア で閾値スイープ metro = {'東京都','神奈川県','埼玉県','千葉県','大阪府','京都府','兵庫県','奈良県','愛知県','岐阜県','三重県'} pairs_pos = [] # 同じグループ (都市圏 同士) pairs_neg = [] # 違うグループ for i in range(len(prefs)): for j in range(i+1, len(prefs)): same = (prefs[i] in metro) == (prefs[j] in metro) s = sim[i, j] (pairs_pos if same else pairs_neg).append(s) import numpy as np thr = np.linspace(0.1, 0.99, 50) far = [np.mean(np.array(pairs_neg) >= t) for t in thr] frr = [np.mean(np.array(pairs_pos) < t) for t in thr] print('EER 付近: τ=', thr[np.argmin(np.abs(np.array(far)-np.array(frr)))]) |
# 実際の顔認証(参考): face_recognition ライブラリ
# import face_recognition
# img = face_recognition.load_image_file('person.jpg')
# encs = face_recognition.face_encodings(img)
# print(encs[0].shape) # 128 次元
# # 2 つの顔を比較
# match = face_recognition.compare_faces([known_encoding], encs[0], tolerance=0.6)
# print(match)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import pandas as pd import numpy as np from sklearn.preprocessing import StandardScaler, normalize from sklearn.metrics.pairwise import cosine_similarity # 日本語の列名で読む(2 行目を見出しにする)。掲載の (47, ...) に合わせて 1 年に絞る df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) df = df[df['年度'] == 2023].reset_index(drop=True) X = df.select_dtypes(include=[np.number]).drop(columns=['年度']).values prefs = df['都道府県'].values # 標準化 + L2 正規化 (顔認識の embedding 慣習) Xs = StandardScaler().fit_transform(X) emb = normalize(Xs, axis=1) print('embedding shape:', emb.shape, 'norm:', np.linalg.norm(emb[0])) # ペアワイズ cosine 類似度行列 sim = cosine_similarity(emb) print('東京-神奈川 cosine:', f'{sim[12, 13]:.3f}') print('東京-沖縄 cosine:', f'{sim[12, 46]:.3f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler, normalize # emb は 47 県ぶんの埋め込みとして扱う(564 行のままだと 47*20 と合わない) _d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) _d = _d[_d['年度'] == 2023].reset_index(drop=True) emb = normalize(StandardScaler().fit_transform( _d.select_dtypes('number').drop(columns=['年度']).fillna(0)), axis=1) from sklearn.metrics import roc_curve np.random.seed(0) # 実行のたびに同じ結果が出るようにする # 各県を 20 サンプルに augment emb_aug = np.repeat(emb, 20, axis=0) + np.random.normal(0, 0.05, (47*20, emb.shape[1])) emb_aug = normalize(emb_aug, axis=1) y_aug = np.repeat(np.arange(47), 20) # 1:1 ペアを大量生成 N = 5000 i = np.random.randint(0, len(emb_aug), N) j = np.random.randint(0, len(emb_aug), N) sims = (emb_aug[i] * emb_aug[j]).sum(axis=1) labels = (y_aug[i] == y_aug[j]).astype(int) fpr, tpr, thr = roc_curve(labels, sims) fnr = 1 - tpr eer_idx = np.nanargmin(np.abs(fpr - fnr)) print(f'EER: {fpr[eer_idx]*100:.2f}% @ threshold {thr[eer_idx]:.3f}') |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import face_recognition # 登録: 既知の顔の 128 次元 embedding known_image = face_recognition.load_image_file('known.jpg') known_encoding = face_recognition.face_encodings(known_image)[0] print('embedding 次元:', len(known_encoding)) # 128 # 照合 unknown_image = face_recognition.load_image_file('unknown.jpg') unknown_encodings = face_recognition.face_encodings(unknown_image) print(f'検出された顔数: {len(unknown_encodings)}') for i, enc in enumerate(unknown_encodings): dist = face_recognition.face_distance([known_encoding], enc)[0] is_same = dist < 0.6 # 標準閾値 print(f'face {i}: distance={dist:.3f}, same_person={is_same}') |
1 2 3 4 5 6 7 8 9 | from deepface import DeepFace models = ['VGG-Face', 'Facenet', 'ArcFace', 'SFace', 'Dlib'] for name in models: result = DeepFace.verify( img1_path='img1.jpg', img2_path='img2.jpg', model_name=name, detector_backend='retinaface') print(f'{name:10s} distance={result["distance"]:.3f} ' f'verified={result["verified"]}') |
1 2 3 4 5 6 7 8 9 10 11 | from deepface import DeepFace results = DeepFace.analyze( img_path='sample.jpg', actions=['age', 'gender', 'race', 'emotion']) for r in results: print(f'age: {r["age"]}') print(f'gender: {r["dominant_gender"]} (prob={r["gender"][r["dominant_gender"]]:.2f})') print(f'race: {r["dominant_race"]}') print(f'emotion: {r["dominant_emotion"]}') |
実用的な顔認識システムは 4 段階のパイプライン から構成されます。
| 段階 | タスク | 代表手法 | 出力 |
|---|---|---|---|
| ① | 顔検出 | MTCNN, RetinaFace, YOLOv8-face | バウンディングボックス |
| ② | ランドマーク検出 | 68点 dlib, 106点 PFLD | 特徴点座標 |
| ③ | アライメント | アフィン変換 (目を水平) | 正規化済み顔画像 |
| ④ | 埋め込み + 照合 | ArcFace, SFace + cosine | 本人スコア |
| 検出器 | Easy | Medium | Hard | 速度 (FPS) |
|---|---|---|---|---|
| Haar Cascade | 0.81 | 0.65 | 0.33 | 100+ |
| MTCNN | 0.85 | 0.82 | 0.61 | 15 |
| RetinaFace | 0.969 | 0.961 | 0.918 | 10 |
| YOLOv8-face | 0.97 | 0.95 | 0.85 | 60+ |
| SCRFD | 0.96 | 0.95 | 0.81 | 200+ |
NIST FRVT (Face Recognition Vendor Test) は、 大規模に 人口統計学的バイアス を継続的に評価しています。 主な発見:
この問題から、 米国の複数都市 (San Francisco, Oakland, Boston 等) は 警察による顔認識使用を禁止。 EU AI Act は公的空間でのリアルタイム生体認証を原則禁止 (例外あり)。 日本でも個人情報保護法の改正で顔特徴量データの取り扱いが強化されている。
| 人種 | 2019 トップアルゴリズム | 2023 トップアルゴリズム |
|---|---|---|
| 白人男性 (基準) | 0.01% | 0.003% |
| アフリカ系女性 | 0.5% (50倍) | 0.012% (4倍) |
| 東アジア系女性 | 0.2% (20倍) | 0.008% (3倍) |
| 高齢者 (75+) | 0.3% | 0.015% |
改善は進んでいるが、 公平性のギャップは未完全解消。 学習データ多様化、 fairness-aware loss、 demographic balanced sampling 等の研究が続いている。
写真・動画・3D マスク・ディープフェイクによる「なりすまし攻撃」に対する防御技術。
| 攻撃 | 手段 | 防御 |
|---|---|---|
| 写真攻撃 | プリント写真をかざす | 瞬き検出 / 表情変化要求 |
| 動画攻撃 | スマホで動画再生 | 画面のモアレ検出 / 立体感推定 |
| 3D マスク | シリコンマスク | 熱画像 / 静脈パターン |
| ディープフェイク | AI 生成顔 | 生成痕跡検出 / マルチモーダル照合 |
| レプリカ攻撃 | 登録時の embedding 流用 | チャレンジレスポンス |
スマホの顔認証 (Face ID) は 赤外線ドット投影による 3D 深度測定 を併用するため、 2D 写真攻撃に対し極めて堅牢。 同等性能を一般カメラで実現するために、 マルチフレーム・チャレンジレスポンス・小モデルの軽量 anti-spoofing が研究されている。
| 地域 | 規制 | 概要 |
|---|---|---|
| EU | GDPR + AI Act | 特別カテゴリ個人データ、 公共空間 RT 生体認証は原則禁止 |
| 米国 | 州ごと | イリノイ BIPA / カリフォルニア CCPA / 一部都市で警察使用禁止 |
| 日本 | 改正個人情報保護法 | 顔特徴量を個人識別符号として明確化 |
| 中国 | 個人情報保護法 | 同意なき顔データ収集を制限 (民間) |
| 英国 | UK GDPR | EU と類似 + 警察使用は事例毎判断 |
| ISO/IEC | ISO/IEC 30107 (PAD) | Anti-Spoofing の評価標準 |
企業導入時のチェックポイント: (1) 利用目的の明示と同意取得、 (2) 保存期間と削除手順、 (3) 第三者提供の禁止、 (4) 漏洩対策 (暗号化・アクセス制御)、 (5) 誤認識時の救済手段。
| 年 | 出来事 | 意義 |
|---|---|---|
| 1964 | Bledsoe — 半自動顔認識 | 最初期の研究 |
| 1991 | Eigenfaces (Turk & Pentland) | PCA を顔認識に応用 |
| 1997 | Fisherfaces | LDA で照明変動を抑制 |
| 2001 | Viola-Jones 顔検出 | リアルタイム検出が可能に |
| 2007 | LFW データセット | "in the wild" の標準ベンチ |
| 2014 | DeepFace (Facebook) | DL で 97.35% (LFW) |
| 2015 | FaceNet (Google) — Triplet Loss | 99.63% (LFW) で人間超え |
| 2016 | Center Loss | クラス内集中 |
| 2017 | iPhone X Face ID | 3D 顔認証が一般家庭に |
| 2018 | CosFace | コサインマージン |
| 2019 | ArcFace | 角度マージン、 de facto 標準 |
| 2019 | NIST バイアス報告 | 公平性問題が社会化 |
| 2020 | 米国諸都市が禁止 | 規制強化 |
| 2021 | Clearview AI 訴訟 | スクレイピングの違法性 |
| 2022 | AdaFace, MagFace | サンプル品質を考慮 |
| 2023 | 合成データ学習が SOTA に接近 | DigiFace-1M 等 |
| 2024 | EU AI Act 発効 | 高リスク用途に厳しい制限 |
顔認証は 画像認識 × メトリック学習 の代表応用。 SSDSE 都道府県データの「類似県検索」と数学的に同型です。 用語の地図全体 も参照。
| 階層 | 具体 |
|---|---|
| 入力 | 顔画像 |
| 中間表現 | 512 次元埋め込み |
| 距離 | コサイン or L2 |
| 出力 | 同一/別人 or ID |
| バックボーン | FLOPs | LFW Acc |
|---|---|---|
| MobileFaceNet | 221M | 99.55% |
| ResNet50 (ArcFace) | 6.3G | 99.83% |
| ResNet100 (ArcFace) | 12.1G | 99.87% |
| TransFace (ViT) | 15G | 99.88% |
| 地域 | 法律 | 概要 |
|---|---|---|
| EU | GDPR / EU AI Act (2024) | 顔は要配慮個人情報、 リアルタイム生体識別は原則禁止 |
| 米国 | 州ごと(BIPA など) | 同意義務・誤認時の損害賠償 |
| 日本 | 改正個人情報保護法 | 顔特徴データを「個人識別符号」として規制 |
| 中国 | 個人情報保護法 (2021) | 同意義務、 安全評価 |
産業利用では NIST FRVT のような 独立評価が標準になっています。 1:1 と 1:N で別々に評価され、 さらに人口統計学的サブグループごとの精度差分を報告。
| 攻撃 | 対策 |
|---|---|
| 紙の写真 | 瞬き検出, 表情変化要求 |
| 動画再生 | 3D 深度センサー (TrueDepth) |
| 3D マスク | マルチスペクトル (IR+ Visible) |
| ディープフェイク | DeepFake 検出器併用 |
| エナメル印刷 | サーマル赤外線 |
| 業界 | ユースケース | 主要プレイヤー |
|---|---|---|
| モバイル | 端末ロック解除 / Pay 認証 | Apple Face ID, Samsung |
| 空港 | 出入国審査 / 搭乗ゲート | NEC, IDEMIA, 成田・羽田 |
| 金融 | eKYC / 不正検知 | ネット銀行, 証券口座開設 |
| 小売 | 来店客層分析 / VIP 検知 | 百貨店, 高級ブランド |
| セキュリティ | 入退室管理 / 監視 | セコム, ALSOK |
| 交通 | 改札通過 (中国) | 深圳地下鉄 |
| 教育 | 出席管理 / オンライン試験 | 遠隔教育プラットフォーム |
| エンタメ | フォト整理 / アバター | Apple Photos, Google Photos |
Triplet Loss でランダムに triplet を選ぶと、 すぐに条件を満たしてしまい学習が停滞します。 「難しい triplet」を選ぶ Hard Negative Mining が必須です。
| 戦略 | 説明 | 利点 | 欠点 |
|---|---|---|---|
| Easy | 既に条件満たす triplet | 安定 | 学習しない |
| Semi-Hard | d(a,p) < d(a,n) < d(a,p)+α | FaceNet 推奨 | batch 内に発見が必要 |
| Hard | 最も近い negative | 強力 | 学習崩壊リスク |
| Batch-All | batch 内 全 triplet 平均 | 単純 | easy が多すぎ |
| Batch-Hard | batch 内 最難 triplet | FaceNet で実用 | batch 設計重要 |
現代の顔認識 (ArcFace 系) では Triplet を使わず softmax-based loss が主流のため、 Mining 戦略は再ID (Person Re-ID) や検索系で重要。
2018-2020 年、 大規模顔データセットの多くが 同意なき web スクレイピング で構築されていたことが判明し、 ほぼ全てが研究公開を停止しました。
| 名称 | 人数/画像 | 提供元 | 状況 |
|---|---|---|---|
| LFW | 5,749 / 13,233 | UMass | 公開中 (評価専用) |
| YouTube Faces | 1,595 / 3,425動画 | テルアビブ大 | 公開中 |
| CASIA-WebFace | 10,575 / 494,414 | CASIA | 研究目的限定 |
| VGGFace | 2,622 / 2.6M | Oxford VGG | 研究公開 |
| VGGFace2 | 9,131 / 3.31M | Oxford VGG | 2021 撤回 → 2024 再公開 |
| MS-Celeb-1M | 100k / 10M | Microsoft | 2019 撤回 |
| MegaFace | 672k / 4.7M | UW | 2020 撤回 |
| DukeMTMC | 人物検出 | Duke | 2019 撤回 |
| WebFace260M | 4M / 260M | 清華大 | 公開 (現代最大) |
| IJB-C | 3,531 | NIST | 評価専用 (難サンプル) |
| Synthetic Faces | 無制限 | DigiFace, SynFace | プライバシ回避手段として注目 |
代替トレンド: 合成顔データ (DigiFace-1M, SynFace) で学習。 GAN/Diffusion 生成のため肖像権問題が無く、 大規模・多様。 性能はまだ実顔学習に若干劣るが、 急速に縮まっている。
| 用語 | タスク | 出力 |
|---|---|---|
| 顔検出 (Face Detection) | 画像中の顔の位置を見つける | バウンディングボックス |
| 顔認証 (Face Verification, 1:1) | 2 つの顔が同一人物か判定 | Yes/No |
| 顔識別 (Face Identification, 1:N) | DB の N 人中誰か判定 | 人物 ID |
| 顔追跡 (Face Tracking) | 動画中の顔を追跡 | 時系列バウンディングボックス |
| 表情認識 (Expression) | 7 基本感情等を分類 | 表情ラベル |
| 年齢推定 (Age Estimation) | 顔から年齢推定 | 数値 |
| 顔属性 (Face Attribute) | 髪型 / 眼鏡 / 笑顔等 | 複数バイナリ |
| 3D 顔再構成 | 2D 画像から 3D メッシュ | 点群 |
| 顔生成 (Face Generation) | 新しい顔画像生成 | 画像 |
顔認識特有の評価指標は FAR / FRR / EER / TAR@FAR です。 一般分類の Accuracy だけでは不十分。
| 指標 | 略称 | 計算 | 意味 |
|---|---|---|---|
| False Accept Rate | FAR / FMR | 他人を本人と誤受入する率 | セキュリティ侵害率 |
| False Reject Rate | FRR / FNMR | 本人を他人と誤拒否する率 | ユーザ不便さ |
| Equal Error Rate | EER | FAR=FRR となる点 | 総合性能 (低いほど良) |
| True Accept Rate | TAR@FAR=0.001 | FAR=0.1% 時の TAR | 高セキュリティ動作点 |
| Rank-1 Accuracy | — | 1:N 識別で最確 = 正解 | 識別系の基本 |
| CMC Curve | — | Rank-K 別 accuracy | 識別系の俯瞰 |
| DET Curve | — | FAR vs FRR log-log プロット | 認証系の俯瞰 |
数式を言葉で読み解くと、 FAR は「異なる人ペアのうち、 類似度がしきい値 τ を超えてしまった割合」、 FRR は「同じ人ペアのうち、 類似度が τ 未満で拒否してしまった割合」。 τ を上げると FAR ↓ FRR ↑、 下げると逆になる。 アプリ用途で目標 FAR を決め、 それを満たす最小 τ を選ぶ。
用途別の典型動作点: スマホロック解除 = FAR=1/50,000、 銀行 eKYC = FAR=1/100,000、 監視 1:N (1 万人 DB) = FAR=1/10,000,000 が目安。
| 方式 | EER (典型) | 非接触 | 短所 |
|---|---|---|---|
| 顔 | 0.1% | ○ | 化粧/加齢/双子 |
| 指紋 | 0.01% | × | 傷/乾燥 |
| 虹彩 | 0.0001% | ○ (近接) | 高価な装置 |
| 静脈 | 0.001% | ○ | 専用ハードウェア |
| 声紋 | 1% | ○ | 録音偽装 |
| 歩容 | 5% | ○ (遠隔可) | 怪我/服装 |
| DNA | ~0% | × | 時間/コスト |
顔の強みは (1) 非接触、 (2) 既存カメラ流用可、 (3) ユーザ協力最小。 弱みは (1) 公共空間で気付かれずに収集可能、 (2) なりすまし攻撃のリスク。 用途に応じてマルチモーダル組合せ (顔+声+行動)が増加中。
利点: 即実装可、 精度高。 欠点: 個人情報を第三者に送る点、 オフライン不可、 月額が嵩む。
利点: 自社内完結・低コスト・カスタム可。 欠点: 運用負荷、 アップデート手動。
「顔認証」は単独で完結せず、 隣接する手法と接続することで分析パイプラインの一部として機能する。 以下に具体的な接続関係を示す。
顔認証は (1) 顔検出 (MTCNN / RetinaFace) → (2) 顔アライメント (5 keypoint) → (3) 埋め込み抽出 (ArcFace 512 次元) → (4) コサイン類似度比較 → (5) 閾値判定 の 5 段パイプライン。 ライセンス・GDPR・差別公平性 (Gender Shades, Buolamwini & Gebru 2018) を技術設計と同列に扱い、 業務導入前に DPIA (データ保護影響評価) を実施する。
「顔認証」を実際の課題に当てはめるとき、 以下の 3 ステップで判断する。 領域固有の判断基準と組み合わせて使用する。
顔認証は照明・角度・遮蔽・年齢変化に弱いため、 multi-frame / multi-pose / multi-illumination で学習データを増強する。 高セキュリティ用途では liveness detection (まばたき・3D 構造光) を併用し、 spoofing 攻撃 (写真・動画・3D マスク) を防ぐ。 NIST FRVT ベンチマーク値を業務 SLA の根拠にする。
本ページは既に検出・整列・埋め込み・照合の 4 段階、 FAR/FRR/EER、 損失関数、 倫理・規制まで詳述しています。 ここでは 散らばった論点を「埋め込み → 距離 → 閾値」という 1 本の骨格に束ね直し、 関連用語ページへの橋を架けることで、 全体像を一望できるようにします。 新しい主張は加えず、 既述の内容を別角度から要約する補助セクションです。
顔認証の本質は 3 つの操作に還元できます。 (1) 顔画像を固定長ベクトルに変換する 埋め込み(embedding)、 (2) 2 ベクトル間の 距離(実務では単位ベクトル化して コサイン類似度)の計算、 (3) 閾値 τ による線引き。 「認識」という語は難解に響きますが、 実体は 「顔を高次元空間の点に置き、 近ければ本人・遠ければ他人」 という幾何学的な近さ判定です。 PCA による Eigenface が「分散最大の軸で顔を点にする」古典版、 ArcFace 等が「同一人物を超球面上で密に集める」現代版であり、 顔を点に変える という発想は 30 年間一貫しています。 これは 画像認識 の一分野でありながら、 出力が「クラスラベル」ではなく「埋め込みベクトル」である点が特徴です。
検証(1:1)と識別(1:N)の違いをもう一段掘ると、 1:1 は「主張された 1 人 vs 登録 1 件」の二値判定=分類の閾値問題、 1:N は「クエリ 1 件 vs 登録 N 件」の最近傍探索です。 N が増えるほど「誰かに偶然マッチしてしまう」余地が広がるため、 同じ本人拒否率を保つには閾値を厳しくする——という本文(実値計算で東京都と鳥取県を比較した結論)は、 埋め込み空間で 1 点と N 点の距離を同時に眺めることの必然的な帰結だと分かります。
発展的トピックは、 実は「良い埋め込みを作る」と「それを正しく測る」の 2 系統に整理できます。
※ 本セクションは既述内容の再整理・相互リンク補強のみで、 新規の数値・主張は加えていません。 顔画像そのものは扱わないため、 例示に用いた分布・類似度はすべて上部で「架空/例示」と明記済みの値であり、 SSDSE-B-2026 由来の数値は本文の実測箇所(食料費 L322101 等)に限られます。