人臉搜尋不比對圖片。它把每一張臉換算成一串長度固定的數字 —— 一個向量 —— 然後比對這些向量。同一個人相隔多年、在不同房間拍的兩張照片,就算幾乎沒有共通的像素,算出來的向量仍然會靠得很近。

搞懂這四個階段,你就會確切明白為什麼有些截圖一放上去就中,有些不管重試幾次都沒用。

第一階段的偵測發生了什麼事?

偵測回答的問題比一般人以為的要窄:這張圖裡哪裡有臉,它的五個關鍵點在哪裡?

偵測器掃過整張圖,對它找到的每一張臉回傳一個邊界框,外加五個特徵點座標 —— 左眼、右眼、鼻尖、左嘴角、右嘴角。這個階段我們用 YuNet。到這裡跟身分還完全無關;這純粹是幾何。

偵測一旦失敗,後面所有環節都跟著失敗。而偵測失敗的原因,往往和一般意義上的畫質毫無關係:一隻手擋在嘴前、一個很硬的側臉、一張小於偵測器最小尺寸的臉。

第二階段的對齊發生了什麼事?

對齊會用那五個特徵點,把臉扭正到一個標準位置 —— 雙眼落在同一條水平線上、位於固定座標、縮放到固定比例。

這一步就是為什麼歪著的頭和正對鏡頭的頭可以拿來比。每一張進入編碼器的臉,姿勢一樣、大小一樣、裁切的區域也一樣。注意這個裁切丟掉了什麼:大部分頭髮、衣服、背景、房間。那些都不屬於身分訊號的一部分。

它也解釋了一種常見的挫折感。如果特徵點稍微抓錯 —— 比方說一隻眼睛被擋住 —— 對齊就會把臉扭錯,而算出來的向量錯得像是一個很有把握的答案。

第三階段的編碼發生了什麼事?

編碼器網路把對齊後的臉變成一個 512 個數字的向量。這一步我們用 ArcFace。這個向量就是這張臉的數學描述。

真正讓它有用的是訓練目標:這個網路被訓練成讓同一個身分的向量緊緊聚在一起、不同身分的向量互相推開。它不是被訓練來描述一張臉長什麼樣子,而是被訓練來描述它是誰

階段 輸入 輸出 什麼時候會失敗
偵測(YuNet) 完整影像 邊界框 + 5 個特徵點 臉被遮住、太小、角度太極端
對齊 邊界框 + 特徵點 標準化的臉部裁切 特徵點抓得不準
編碼(ArcFace) 對齊後的裁切 512 個數字的向量 裁切畫質差、模糊或被重度壓縮
比對 向量 帶分數的排名清單 不會失敗 —— 它永遠會回傳東西

最後一列才是重點,值得自己一個章節。

第四階段的比對發生了什麼事?

比對會計算你的向量與索引裡每一個向量之間的餘弦相似度,然後依序回傳最接近的那些。

餘弦相似度的範圍是 0 到 1,描述的是兩個向量之間的夾角。在我們的資料上,針對影片截圖校準出來的門檻是 0.40。高於它,這一對就被當成可能是同一個人;低於它,這個結果只是剛好最接近的雜訊。

最後這一點是向量搜尋最常被誤解的地方:**它永遠不會回傳空的。**你跟它要最接近的十張臉,它就給你十張,就算對的人根本不在索引裡也一樣。分數是唯一能區分「真正的答案」與「最接近的陌生人」的東西。沒有分數的排名清單是讀不懂的。

為什麼是索引在決定什麼找得到?

因為比對只能替已經編碼過的東西排名。索引不是在搜尋整個網路,它是一組事先算好的、固定的向量。

我們的索引裡有 241,792 張臉,其中 2,333 張連得上具名女優,取自 106 個站台上的封面圖與截圖(我們的索引,2026-08 快照)。由此直接得出兩個後果:

  • 一張存在於索引裡、但從來沒有連上名字的臉,會以未具名身分的形式回傳。這很常見 —— 光是我們的相似女優資料裡就有 7,004 筆參照指向沒有附上名字的身分
  • 一張根本沒被索引過的臉,在任何分數之下都不可能被回傳。工具仍然會把它最接近的猜測秀給你看。

**值得講明的邊界:**我們的來源很集中。2,333 位具名女優裡有 2,246 位,代表圖來自同一個站台。所以覆蓋反映的是那些來源發布了什麼,不是這個產業的全部產出。

這和以圖搜圖有什麼不同?

以圖搜圖找的是你整張圖片的副本。人臉搜尋找的是同一個身分出現在不同圖片裡。它們成功與失敗的條件正好相反。

以圖搜圖 人臉搜尋
比對的是 整張影像的指紋 臉部向量
需要那張圖本身存在於網路上嗎 需要 不需要
裁切到臉部有幫助嗎 沒有 —— 反而更糟 有 —— 那正是它要的輸入
撐得住不同光線與姿勢嗎 很差 設計上就是為此
對自己截下來的畫面有效嗎 無效 有效

如果一個工具在你裁切到臉部之後表現變得更差,那它做的就不是人臉搜尋。這是一個很可靠的一次性判斷法。

相關問題


要理解這條流程,最快的方式是看它跑一次。在這裡上傳一格畫面:偵測與對齊都在你的瀏覽器裡完成,只有裁切下來的臉部區域與五個特徵點會被送出去比對,原圖不會離開你的裝置。