あなたは 「画像認識 / バイオメトリクス / 距離学習」 の交点にいる用語ページを見ています。 顔認証は 画像認識 の特殊例で、 入力に「人間の顔」という構造的事前知識が組み込まれます。
| 上位概念 | 画像認識 / バイオメトリクス |
|---|---|
| 同列概念 | ジェスチャー認識 / 指紋認証 / 虹彩認証 |
| 下位応用 | スマホロック解除 / 入退室管理 / 写真整理 |
| 前提知識 | 深層学習 / 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. 照合 | 距離計算で判定 | コサイン類似度 |
顔埋め込み関数 $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) が代表指標。
| 記号 | 意味 |
|---|---|
| $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。
47 都道府県の正規化指標ベクトルを「顔埋め込み」と見立て、 県同士のコサイン類似度を計算します。 「東京都」と「神奈川県」の類似度が「東京都」と「秋田県」より大きければ、 「東京都=神奈川県は同じ統計的人物」と判定するわけです。
| ペア | コサイン類似度 | 判定(τ=0.85) |
|---|---|---|
| 東京都 vs 神奈川県 | 0.97 | 同一 |
| 東京都 vs 大阪府 | 0.92 | 同一 |
| 東京都 vs 秋田県 | 0.31 | 別人 |
| 広島県 vs 岡山県 | 0.94 | 同一 |
| 沖縄県 vs 北海道 | 0.18 | 別人 |
類似度はコサインで [-1, 1] の範囲。 0.85 を閾値 $\tau$ にすれば、 三大都市圏や中四国の県同士が「同一統計的人物」として束ねられます。 これは 顔クラスタリング と同じ原理で、 「クラスタ=統計的に似た県のグループ」になります。
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: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: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))
# 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)
| 指標 | 定義 |
|---|---|
| FAR | 他人受入率 |
| FRR | 本人拒否率 |
| EER | FAR = FRR の交点 |
| TAR@FAR | 特定 FAR での本人受入率 |
| Rank-1 Accuracy | 1:N 識別の上位 1 件正答率 |
| FPIR / FNIR | 識別での誤検出/未検出率 |
短期的には便利だが、 漏洩したら変更不可なので長期的には課題あり。 多要素認証の 1 要素として使うのが安全。
一卵性双生児は最先端モデルでも誤認率が高い。 NIST 評価で 99.9% の精度を誇るモデルでも双子検証では精度が大幅低下。 多モーダル(虹彩+顔)が現実解。
マスク有りに特化した学習 (Masked Face Recognition) で対応可能だが、 通常モデルでは数 % 〜数十 % 精度低下。 COVID-19 時代の重要な研究テーマ。
大規模事前学習(VGGFace2, MS-Celeb-1M, WebFace42M)が前提。 fine-tune には組織固有データ 1 人 5 枚 × 100 人〜が目安。
直接の用途ではないが、 「ベクトル化 → コサイン類似度 → 閾値判定」というパラダイムは都道府県プロファイル比較や類似県検索とまったく同じ数学構造。 統計データを 顔っぽく 扱う知見が転用可能。
顔認証は 画像認識 × メトリック学習 の代表応用。 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 検出器併用 |
| エナメル印刷 | サーマル赤外線 |
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 | 公的ベンチマーク |