為什麼要做這篇
想把一張照片裡的人換成另一個人,ComfyUI 裡的做法多到很難選:有從 2023 年就很紅的 ReActor,有 InstantID、PuLID 這類「帶著身份資訊重畫臉」的節點,今年又多了一批搭配圖像編輯模型的換頭 LoRA,其中 BFS(Best Face Swap)一個月就有十幾萬次下載。
開始之前我查了一輪網路上的比較文,發現大多只比同一類(例如只比 ReActor 和它的替代模型,或只比 InstantID 和 PuLID),而且多半停在 2024、2025 年的 SDXL 時代。所以這次照前幾篇評比的方法,把找得到的做法全部接進同一張工作流,24 張目標圖每張都跑過一輪,排在一起比。好壞由我自己判斷。
快速結論
- 先分清楚你要「換臉」還是「換頭」:換臉只換五官,目標原本的頭髮、臉型、光影都留著;換頭連頭髮和臉型一起換成來源那個人。兩者目標不同,不適合互相比較,這篇也分開下結論
- 換頭:Qwen-Image-2.1 加 BFS LoRA 普遍最好,BFS 的 v1.1 和 v1.1 alternative 兩個版本不相上下;其他編輯模型加 BFS 也能用,但比較常出錯
- 換臉:InstantID 和 PuLID-Flux 加 FaceDetailer 最好,兩者互有勝負,每張圖哪個好不一定,兩個都試是最實際的做法
- InstantID、PuLID 重繪幅度設太大,換上去的臉就像一張貼紙:我第一次跑時重繪幅度設 0.9、沒做顏色匹配,結果光影對不上、像是另外貼上去的;降到 0.5~0.65、加上顏色匹配重跑,就變得自然
- 兩人合照只想換其中一人時要小心:有幾個換頭組合會把兩個人的頭都換掉
- ReActor 這類傳統換臉工具最快,但側臉容易畫壞,口罩、鬍子邊緣也常出現模糊或馬賽克

先分清楚:換臉和換頭
上面這張最能說明兩者的差別。來源是一位留著長卷髮的女性,目標是一位剃平頭的女性。
- 換臉(上排右邊三張):只換眼睛、鼻子、嘴巴這些五官,平頭、臉型、耳朵、光線都還是目標原本的樣子。看起來像「目標那個人長了來源的五官」。
- 換頭(下排右邊三張):連長卷髮、臉型、膚色一起換過去,只留下目標的身體、衣服、姿勢和背景。看起來就是「來源那個人穿上目標的衣服,站在目標的位置」。
所以選哪一種,要看你想要的結果:想保留原照片的髮型和整體感覺,選換臉;想讓照片裡的人整個變成另一個人,選換頭。這也是為什麼這篇不把兩者排在同一張排行榜上。
四種做法
這次測的 12 種做法,按照原理分成四類:
1. 傳統換臉工具:ReActor 節點裡的 inswapper、HyperSwap、ReSwapper。它們先找出兩張臉的五官位置,再直接把來源的臉「貼合」到目標臉上。速度最快,不需要大模型,但解析度只有 128 或 256 像素,所以常搭配修臉模型(例如 CodeFormer)讓臉變清楚。
2. 帶身份重畫臉:InstantID 和 PuLID。先把目標的臉部區域裁出來,再用生圖模型重畫這一塊,重畫時把來源的「身份特徵」(臉型、五官比例)一起餵給模型,畫完貼回原圖。只動臉部,其他地方一個像素都不變。這次 InstantID 用 SDXL,PuLID 用 Flux.1 dev 搭配 FaceDetailer(一個自動找臉、放大重畫再貼回的節點)。
3. 編輯模型加換頭 LoRA:BFS 是一組專門訓練來換頭的 LoRA,有 Qwen-Image-2.1、Qwen-Image-Edit-2511、Flux.2 Klein 9B、Krea2 等不同版本。用法是給編輯模型兩張圖(目標圖、來源臉)和一句固定的指令,模型會把整張圖重新畫一次,把頭換掉。
4. 只給一句話的編輯模型:不加任何 LoRA,直接跟 Qwen-Image-2.1 說「把第一張圖裡那個人的臉換成第二張圖的人,頭髮、表情、衣服、背景都不要動」。指令先經過官方的 Prompt Enhancer 改寫得更完整,Qwen-Image-2.1 進階用法實測已經確認這一步有幫助。
測試方法
來源臉:6 個 AI 生成的虛構人物。 這篇所有的臉都是用 Krea2 生成的虛構人物,沒有任何真人照片。6 個人涵蓋不同性別、年齡與膚色,都是正面、光線均勻的大頭照。
目標圖:24 張,分 7 類。
| 類別 | 題目 |
|---|---|
| 基本 | 正面半身、全身(臉很小)、室內暖光、戶外大太陽 |
| 角度 | 四分之三側臉、90 度側臉、抬頭看天空 |
| 表情 | 大笑露齒、驚訝張嘴、閉眼 |
| 遮擋 | 粗框眼鏡、手摸臉、瀏海蓋住眉毛、口罩拉到下巴 |
| 光影 | 強烈側光(半臉在暗處)、夕陽逆光 |
| 差異 | 膚色差很多、年齡差很多、性別不同、髮型差很多 |
| 情境 | 兩人合照只換左邊的人、老照片、插畫風、模糊的小圖 |
12 種做法:
| 類別 | 做法 | 換什麼 |
|---|---|---|
| 傳統換臉工具 | inswapper、inswapper+CodeFormer 修臉、HyperSwap、ReSwapper(都在 ReActor 節點裡) | 五官 |
| 帶身份重畫臉 | InstantID(SDXL)、PuLID-Flux+FaceDetailer(Flux.1 dev) | 五官 |
| 編輯模型+BFS | Qwen-Image-2.1(BFS v1.1、v1.1 alternative 兩個版本)、Qwen-Image-Edit-2511、Klein 9B、Krea2 | 整個頭 |
| 只給一句話 | Qwen-Image-2.1+Prompt Enhancer | 五官 |
幾個要誠實揭露的地方:
- 目標圖也是 AI 生成的,真實照片的雜訊、壓縮痕跡會讓結果更難。每張只跑一次(同一個隨機種子),換一個種子結果可能不同。
- 好壞是我一張一張看的,屬於主觀判斷。換頭和換臉分開判斷,同一類裡我只給出整體印象,沒有逐題計分——用虛構人物比「像不像」本來就比較難,對陌生的臉,人很難分辨細微的差異。
- InstantID 和 PuLID 我第一次跑時重繪幅度設太大(0.9),結果很差。後來降到 0.5~0.65、加上顏色匹配重跑,正文用的是重跑後的結果;0.9 的版本放在後面「重繪幅度太大就像貼紙」那一段當對照。
- 另外試過 PuLID 的 Flux.2 Klein 版本(PuLID-Flux2),它目前只支援從零生圖,還不能拿來換已經存在的照片裡的臉,所以沒有列進來。
兩人合照:只換一個人

這題的目標是兩位並肩站著的男性,只要把左邊那位換成來源的中年男性。
- Qwen-Image-2.1 加 BFS、Qwen-Image-2.1 只給一句話:都只換了左邊那位,右邊的人完全沒變。換頭指令裡我加了一句「只換左邊的人,右邊的人保持不變」,它聽得懂。
- Klein 9B 加 BFS(還有沒放進圖裡的 Qwen-Image-Edit-2511、Krea2 加 BFS):兩個人的頭都換成了來源那個人,加了同樣那句指令也沒用。
- InstantID、PuLID:只換左邊。不過這是因為我在測試時只把左邊那個人的臉部範圍貼回去;它們本身遇到幾張臉就會處理幾張,實際使用時要先把圖裁小,或手動限定範圍。
- inswapper:只換左邊(ReActor 可以指定要換第幾張臉,我設成從左數第一張),但臉的變化不大,看得出原本的人。
也看得出換臉和換頭的另一個差別:InstantID、PuLID 換完之後,左邊那位的五官往來源靠近了,但膚色、鬍子、年輕的輪廓大多還是原本的樣子,比較像「兩個人的融合」;換頭則是直接變成來源那位中年男性。
重繪幅度太大就像貼紙:InstantID 和 PuLID 的設定

這是這次最大的收穫。第一次跑 InstantID 和 PuLID 時,結果很差:換上去的臉顏色、光線都跟原圖對不上,像是另外貼上去的一張貼紙,PuLID 甚至常常換成一個完全不像來源的人。
我一度以為是方法本身不行,後來翻出自己以前用過、效果很好的 InstantID 和 PuLID 工作流逐項比對,才發現是設定的問題,其中影響最大的是重繪幅度。上面這張是最明顯的例子:目標的臉一半在暗處,重繪幅度 0.9 的兩張都把整張臉打亮,看起來就是貼上去的;重繪幅度降到 0.5、0.65 的兩張保留了半臉在暗處的光影。
差別在這幾個地方:
| 項目 | 第一次(太大) | 重跑(降低後) | 為什麼重要 |
|---|---|---|---|
| 重繪幅度(denoise) | 0.9 | InstantID 0.5、PuLID 0.65 | 數字越大,原本的臉保留越少。0.9 幾乎是整張臉重畫,原本的光影和輪廓都沒了;0.5 保留原本的結構,只把五官往來源靠 |
| 顏色匹配 | 沒有 | 重畫完用 adain 把臉的顏色調成原圖的色調 | 膚色、色溫對不上是「貼紙感」最大的來源 |
| 遮罩邊緣 | 很硬,只模糊 6 個像素 | 往外擴一圈,再模糊 16 個像素 | 邊緣太硬,臉和脖子的交界會看到一圈接縫 |
| PuLID 用的模型 | SDXL 版 | Flux.1 dev 版,加 FaceDetailer | Flux 版畫出來的皮膚和光線更自然 |
有趣的是,用 AI 辨識模型算「像不像來源」,重繪幅度 0.9 的 InstantID 分數反而比 0.5 的高(0.68 對 0.60)——整張臉幾乎都重畫成來源的樣子,當然比較像。但照片看起來不自然,這種「像」沒有用。重繪幅度 0.5~0.65 的版本跟原圖融合得好,我判斷它們不輸給換頭的做法。
如果你的 InstantID、PuLID 結果也像貼紙,先檢查這三件事:重繪幅度是不是太大、有沒有做顏色匹配、遮罩邊緣有沒有模糊。 完整設定放在文末附錄。
側臉:傳統換臉工具最容易畫壞

完全側面的臉,對傳統換臉工具很難:它們要先找到兩張臉的五官位置才能對齊,側臉只看得到一隻眼睛,對齊就容易出錯。HyperSwap 和 ReSwapper 在這題把眼睛、鼻子畫成兩層疊在一起;inswapper 好一些,但臉看起來有點扁。
InstantID 和 PuLID 是重畫,側臉沒有問題,而且耳朵、髮際線都是目標原本的。Qwen-Image-2.1 加 BFS 把整個頭換掉,連頭髮都變成來源的黑色捲髮,側臉的角度也對。
表情:誰保留了大笑

目標正在張嘴大笑,來源是一張沒有表情的大頭照。換完之後,表情應該跟著目標,而不是變回來源的面無表情。
- 保留大笑的:inswapper、InstantID、PuLID、Qwen-Image-2.1 加 BFS v1.1。
- 把嘴巴閉起來的:Qwen-Image-2.1 加 BFS v1.1 alternative、Klein 9B 加 BFS,都變成微笑。BFS 的說明寫 alternative 版本「表情轉移比較好」,這題剛好相反,所以兩個版本我判斷不相上下,換不好時換另一個版本試。
- inswapper 雖然保留了表情,但鬍子邊緣糊成一片,看得出是貼上去的。
另外,在「驚訝張嘴」那題,PuLID 把嘴巴閉起來了,InstantID 保留了張嘴。所以 InstantID 和 PuLID 也是互有勝負。
遮擋:口罩拉到下巴

口罩、眼鏡、手這類擋在臉前面的東西,換完之後應該保持原樣。
- InstantID、PuLID:口罩完全沒動,因為它們只重畫遮罩裡的臉部,口罩在範圍外。
- inswapper:口罩邊緣變成一格一格的馬賽克——它的解析度只有 128 像素,下巴附近被放大後就看得出來。
- Qwen-Image-2.1 加 BFS、只給一句話的 Qwen-Image-2.1:口罩保留得很好。
- Klein 9B 加 BFS:這題失敗,它把來源照片的灰色背景和連帽外套整塊搬了過來,目標原本的地鐵車廂不見了。
老照片:InstantID 最協調

目標是一張褪色、偏黃、有點模糊的 1970 年代照片。
InstantID 換得最協調:臉換成來源的五官,模糊程度也跟目標圖一致,看起來就是同一張老照片裡的人。PuLID 的臉比照片清晰一些,五官比較像來源臉,但放在這張模糊的老照片裡就顯得突出。換頭的做法同樣有這個問題,而且更明顯:換上去的臉和頭髮比照片本身清楚,Krea2 加 BFS 最明顯,看起來像一張現代照片裡的人被放進老照片。Qwen-Image-2.1 只給一句話的版本保留了原本的髮型,臉也有跟著褪色。
自動指標只能參考
我用兩個人臉辨識模型(buffalo_l、antelopev2),算換完的臉跟來源臉有多像,0 是完全不像、1 是同一個人。換之前,目標臉跟來源臉的相似度平均是 0.25。
| 做法 | 換什麼 | 相似度 | 臉以外的地方 |
|---|---|---|---|
| Qwen-Image-2.1+BFS v1.1 alternative | 整個頭 | 0.79 | 整張重畫,背景有細微變化 |
| Qwen-Image-2.1+BFS v1.1 | 整個頭 | 0.75 | 整張重畫 |
| Qwen-Image-2.1+Prompt Enhancer | 五官 | 0.73 | 整張重畫 |
| inswapper | 五官 | 0.73 | 幾乎沒動 |
| Klein 9B+BFS | 整個頭 | 0.69 | 整張重畫 |
| Krea2+BFS | 整個頭 | 0.66 | 整張重畫 |
| HyperSwap | 五官 | 0.63 | 幾乎沒動 |
| Qwen-Image-Edit-2511+BFS | 整個頭 | 0.62 | 整張重畫 |
| inswapper+CodeFormer | 五官 | 0.62 | 幾乎沒動 |
| InstantID | 五官 | 0.60 | 完全沒動 |
| PuLID-Flux+FaceDetailer | 五官 | 0.57 | 完全沒動 |
| ReSwapper | 五官 | 0.53 | 幾乎沒動 |
看這張表要注意三件事:
- 換頭本來就會比換臉像:連頭髮、臉型都換掉了,辨識模型當然覺得更像。這也是兩者不該放在同一張排行榜的原因。
- inswapper 的分數天生佔便宜:它就是用同一類辨識模型訓練出來的,分數高不代表肉眼看起來最像。
- InstantID、PuLID 分數最低,但我判斷它們是換臉裡最好的:它們刻意只把五官往來源靠,保留目標原本的光影和輪廓,所以看起來自然,分數卻不高。另外,CodeFormer 修臉會讓臉變清楚,但相似度從 0.73 降到 0.62——修臉模型會把臉修成它心目中「好看的臉」,跟放大與修臉評比的觀察一樣。
情境推薦
| 你要做的事 | 用這個 | 備註 |
|---|---|---|
| 讓照片裡的人整個變成另一個人,髮型也換 | Qwen-Image-2.1+BFS | v1.1 和 v1.1 alternative 不相上下,表情跑掉就換另一個版本試 |
| 保留原照片的髮型和光影,只換五官 | InstantID 或 PuLID-Flux+FaceDetailer | 互有勝負,兩個都試;重繪幅度別設太大,一定要做顏色匹配 |
| 合照只換一個人 | Qwen-Image-2.1+BFS(指令寫明只換哪一位) | Klein、Krea2、Qwen-Image-Edit-2511 加 BFS 會全部換掉;InstantID、PuLID 要先裁圖 |
| 老照片 | InstantID | 臉的模糊程度跟照片一致;PuLID 比較像來源臉但偏清晰,換頭的做法會讓臉比照片清楚 |
| 想要最快、正面的臉 | ReActor(inswapper) | 側臉、鬍子、口罩邊緣容易出問題 |
授權與使用提醒
授權:這次用到的不少東西限非商業用途,要拿來接案前請先確認:
- inswapper 與 InsightFace 系列的人臉模型(ReActor、InstantID、PuLID 都會用到):非商業研究用途
- Qwen-Image-2.1:Qwen Research License,非商業用途
- Flux.1 dev、Flux.2 Klein 9B:FLUX 非商業授權
- BFS LoRA 本身是 MIT 授權,但要搭配的底模各有各的授權
使用提醒:換臉的技術很容易被拿來冒用別人的身份。這篇所有的人臉都是 AI 生成的虛構人物。請只用在自己的照片,或已經取得當事人同意的照片上,不要拿真人的臉去做對方沒有同意的圖。
附錄:這次用的設定與指令
Qwen-Image-2.1+BFS 的換頭指令(BFS 官方範本;第一張圖放目標、第二張圖放來源臉,順序反了會換成另一個人;LoRA 強度 1.0):
head_swap: start with <image1> as the base image, keeping its lighting, environment, and background. remove the head from <image1> completely and replace it with the head from <image2>, strictly preserving the hair, eye color, nose structure from <image2>. copy the direction of the eye, head rotation, micro expressions from <image1>, high quality, sharp details, 4k
Klein 9B、Qwen-Image-Edit-2511+BFS 的換頭指令(同樣是官方範本,Picture 1 是目標、Picture 2 是來源臉):
head_swap: start with Picture 1 as the base image, keeping its lighting, environment, and background. remove the head from Picture 1 completely and replace it with the head from Picture 2, strictly preserving the hair, eye color, and nose structure of Picture 2. copy the eye direction, head rotation, and micro-expressions from Picture 1. Keep the body, clothing, pose, framing, and background intact.
Krea2+BFS 的換頭指令(官方範本很短):
head_swap: replace the head with the reference head.
只給一句話的換臉指令(交給 Qwen-Image-2.1 的 Prompt Enhancer 改寫前的原句):
Replace the face of the person in <image1> with the face of the person in <image2>. Keep the hairstyle, head pose, facial expression, clothing, lighting and background of <image1> unchanged.
InstantID 的設定(SDXL,Juggernaut XL):
- 先自動找出目標的臉、往外多裁一圈,放大到 1024 像素再重畫
- 重繪幅度(denoise)0.5、8 步、CFG 1、取樣器 euler_ancestral、排程 sgm_uniform
- InstantID 強度 1.0;再加一個 Tile ControlNet,強度 0.1、只在前半段作用,用來穩住輪廓
- 遮罩往外擴 24 像素、模糊 16 像素
- 重畫完用 adain 顏色匹配,把臉調成原圖的色調,再貼回原圖
PuLID-Flux+FaceDetailer 的設定(Flux.1 dev):
- PuLID 強度 1.0,作用在整段生成過程
- FaceDetailer 用 face_yolov8m 找臉,重繪幅度 0.65、25 步、CFG 1、取樣器 euler
- 正向提示詞:
high quality photography, raw photo, a person, natural skin, film grain
模型與節點下載
| 項目 | 來源 | 放置位置 | 備註 |
|---|---|---|---|
| BFS 換頭 LoRA | Alissonerdx/BFS-Best-Face-Swap | loras/ | 每個底模有對應的檔案,官方附工作流 |
| Qwen-Image-2.1 | ComfyUI 範本庫「Qwen-Image-2.1 Image Edit」內附連結 | diffusion_models/ 等 | 核心節點 TextEncodeQwenImage21,兩張圖接 image_1、image_2 |
| ReActor | Gourieff/ComfyUI-ReActor | custom_nodes/ | inswapper 放 models/insightface/,HyperSwap 放 models/hyperswap/,ReSwapper 放 models/reswapper/ |
| InstantID | cubiq/ComfyUI_InstantID | custom_nodes/ | 另需 antelopev2 人臉模型與 InstantID 專用 ControlNet |
| PuLID-Flux | lldacing/ComfyUI_PuLID_Flux_ll | custom_nodes/ | 模型 pulid_flux_v0.9.1 放 models/pulid/;需要 facenet-pytorch |
| FaceDetailer | ComfyUI Impact Pack | custom_nodes/ | 找臉模型 face_yolov8m.pt |
| Tile ControlNet | TTPlanet/TTPLanet_SDXL_Controlnet_Tile_Realistic | controlnet/ | InstantID 設定裡用來穩住輪廓 |
一個安裝時會碰到的問題:PuLID-Flux 節點包(ComfyUI_PuLID_Flux_ll)跟新版 ComfyUI 有一處不相容,執行時會出現 timestep_zero_index 的錯誤,要等作者更新,或在它的程式裡補上這個參數。
相關文章
- ComfyUI 物件移除大評比:12 條路線同圖實測 — 同一套「同圖對照」的評比方法
- ComfyUI 放大與修臉大評比 — 修臉模型為什麼會讓臉變得不像本人
- Qwen-Image-2.1 進階用法實測 — Prompt Enhancer 是什麼



