stable-diffusion.cpp 中 PuLID-Flux 人脸身份保持(Face Identity Preservation)完整指南

发布时间:2026/9/28 8:22:28

stable-diffusion.cpp 中 PuLID-Flux 人脸身份保持(Face Identity Preservation)完整指南 人工智能大模型本地部署推理引擎媒体生成【免费下载链接】stable-diffusion.cppDiffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp点击查看免费下载导读本文基于 stable-diffusion.cpp 的 PuLID-Flux 身份保持文档 展开完整讲解如何在纯 C/C 推理栈上为 Flux.1schnell / dev叠加 PuLID-Flux 人脸身份注入技术从架构原理20 个PerceiverAttentionCA交叉注意力钩子、身份嵌入.pulidembd的预计算与 gguf 容器格式到三个--pulid-*命令行参数的组合规则、内存预算、后端选型与 SHA-256 验证方法。读完本文你将能独立完成“单张人像 → 任意场景/姿态/提示词下保持同一人脸”的 Flux 生成流水线搭建并规避已知的 SLG 冲突、v1.1 权重不兼容、1024 分辨率显存不足等坑。1. PuLID-Flux 是什么stable-diffusion.cpp 如何支持它PuLID-FluxPuLID: Pure and Lightning ID Customization via Contrastive Alignment是一种在 Flux.1 扩散模型之上工作的身份注入identity-injection技术给定一张源人像后续生成的新图可以保留该人物的脸部特征同时自由改变场景、姿态和提示词。在 stable-diffusion.cpp 中该功能面向 Flux.1schnell与dev两个变体实现。它与同为身份保持方案的 PhotoMaker 存在关键区别对比维度PhotoMakerPuLID-Flux本实现身份提取时机在推理过程中从一批图像中提取一次性离线预计算得到固定 embedding身份提取栈推理期较轻较重insightface ArcFace EVA-CLIP-L IDFormer 编码器C 端负担需处理多图输入只消费一个预计算张量跨后端能力—提取之后全部是 C/ggml 计算从源码结构看src/extensions/pulid_extension.cpp中PuLIDExtension是一个标准的GenerationExtension扩展组件它把预计算的id_embedding与id_weight写入FluxDiffusionExtra见 src/model/diffusion/model.hpp再由 Flux 图构建阶段真正注入。由于身份提取栈ArcFace、EVA-CLIP-L、IDFormer过于庞大难以移植到 C/ggml因此本实现刻意选择了**“消费外部预计算身份嵌入”**的跨厂商cross-vendor方案一次人像只需离线提取一次之后所有生成环节都运行在纯 C 推理栈上可跑在 Vulkan、CUDA、Metal、ROCm、CPU 等任意后端。2. 架构20 个交叉注意力钩子如何注入 Flux 去噪循环PuLID-Flux 对 Flux 去噪循环的改造本质上是在 Flux transformer 块之间插入一层小型交叉注意力模块栈——PerceiverAttentionCA。stable-diffusion.cpp 的实现与其对齐19 个 double-stream 块每 2 个块插入 1 个钩子共 10 个注入点pulid_double_interval 238 个 single-stream 块每 4 个块插入 1 个钩子共 10 个注入点pulid_single_interval 4合计 20 个交叉注意力层对应源码 src/model/diffusion/flux.hpp 中的pulid_enabled、pulid_double_interval、pulid_single_interval配置权重按pulid_ca.i命名加载见 flux.hpp 与 flux.hpp。每个交叉注意力层的数据流为取当前图像 tokenimage tokens作为 Query取32 token × 2048 维的身份嵌入作为 Key Value输出经id_weight典型值 1.0缩放后加回图像 tokenimg img scale(ca_out, pulid_id_weight)上述加回操作在 flux.hppdouble-stream 分支与 flux.hppsingle-stream 分支中均有体现并伴随ggml_graph_cut标记以配合自动图切分。单层模块PuLIDPerceiverAttentionCA的定义位于 src/model/adapter/pulid.hpp内部为 norm →to_q2048 维→to_kv3072 维→ attention →to_out的结构即一个轻量的感知机式交叉注意力单元。关键设计当pulid_id nullptr或权重为空时pulid_active为 false整条路径被跳过见 flux.hpp即 PuLID 完全可裁剪、不改变非 PuLID 运行的行为。3. 所需权重在三件套之外还需要什么在标准 Flux 权重集transformer VAE clip_l t5xxl配置方式与 docs/flux.md 完全一致之外PuLID 还需要三个文件Flux 基础权重transformer、VAE、CLIP-L、T5-XXL与普通 Flux 生成完全相同PuLID 权重pulid_flux_v0.9.0.safetensors或pulid_flux_v0.9.1.safetensors。本实现针对 v0.9.1 验证通过推荐使用 v0.9.1身份嵌入.pulidembd由下面的预计算工具生成一次人像只需一份。⚠️重要兼容性提示pulid_v1.1.safetensorsv1.1暂不支持。v1.1 使用了重命名后的键id_adapter_attn_layers.*而非pulid_ca.*模块结构也可能不同属于待实现的未来工作Future PR。下载时请务必选择 v0.9.x 版本。从加载路径看PuLID 权重路径通过上下文参数pulid_weights_path传入见 include/stable-diffusion.h该参数在 CLI 侧由--pulid-weights解析见 examples/common/common.cpp。4. 预计算身份嵌入一次性离线提取由于身份提取栈无法移植进 Cstable-diffusion.cpp 采用“每个源人像运行一次外部 Python 工具”的方式把提取结果固化成一个(32, 2048)的嵌入张量并写入.pulidembd二进制文件fp16 存储约 131 KB。同一个文件可被任意次生成复用。仓库在 scripts/pulid_extract_id.py 提供了参考 Python 脚本其运行环境要求可用的 CUDA / CPU PyTorch 栈insightface、facexlib、eva-clip、torchvision、opencv-python、huggingface_hub、gguf等依赖ToTheBeginning/PuLID 仓库中的pulid/包含pulid/pipeline_flux.py与eva_clip/包需加入PYTHONPATHflux/包不需要——因为get_id_embedding()不会真正运行 Flux 去噪脚本内部用SimpleNamespace()构造了一个 dummy Flux 对象见 pulid_extract_id.py从而避免引入整套 Flux 骨架。运行方式python pulid_extract_id.py \ --portrait /path/to/source-photo.jpg \ --pulid-weights /path/to/pulid_flux_v0.9.1.safetensors \ --out /path/to/source.pulidembd脚本逻辑可对照 pulid_extract_id.py 阅读自动探测 CUDA选择device cuda/ ONNX providergpu否则回退 CPU用PuLIDPipeline(ditdummy, device, weight_dtypebfloat16, onnx_provider)构造管线并以versionv0.9.1加载 PuLID 权重读取人像自动转 RGB调用get_id_embedding(face_img)得到身份嵌入若结果带有 batch 维shape[1, num_tokens, token_dim]会去掉该维校验形状为二维(num_tokens, token_dim)后写入 gguf。可选参数--dtype支持fp16默认约 131 KB、bf16、fp32三种存储精度对应脚本write_embd()中的三个分支见 pulid_extract_id.py。注意人像必须包含清晰可见的人脸。insightface 的antelopev2检测器在首次运行时会被自动下载。5. 身份嵌入的文件格式gguf 容器.pulidembd是一个标准gguf容器仅含单个张量tensor name : pulid_id shape : [token_dim, num_tokens] (ggml 顺序典型 [2048, 32]) type : F16 (也接受 F32 / BF16) metadata : general.architecture pulid, pulid.version 1C 端加载逻辑见 src/extensions/pulid_extension.cpp使用标准 gguf 读取器gguf_init_from_file打开没有定制解析器查找名为pulid_id的张量校验形状合理性token_dim在 1~65536、num_tokens在 1~1024 且ne[2] ne[3] 1支持 F32直接 memcpy、F16 / BF16逐元素转换为 fp32三种类型其他类型拒绝加载加载时统一转为 fp32供后续 ggml 图使用。写入侧则由 scripts/pulid_extract_id.py 的GGUFWriter完成archpulid、pulid.version1、张量名pulid_id与读取端完全对应。6. 命令行用法让 Flux 生成保持指定人脸以 Windows 下的sd-cli.exe为例Linux/macOS 将路径与可执行名替换即可.\bin\Release\sd-cli.exe \ --diffusion-model models\flux1-schnell-Q4_K_S.gguf \ --vae models\ae.safetensors \ --clip_l models\clip_l.safetensors \ --t5xxl models\t5xxl_fp16.safetensors \ --pulid-weights models\pulid_flux_v0.9.1.safetensors \ --pulid-id-embedding source.pulidembd \ --pulid-id-weight 1.0 \ -p candid photograph of a young woman on a beach at sunset \ --cfg-scale 1.0 --sampling-method euler --steps 4 -W 512 -H 512 \ --seed 42 --clip-on-cpu \ -o out.png若使用 Flux Dev而非 Schnell追加--guidance 3.5并把步数提到--steps 20。参数解析位于 examples/common/common.cpp--pulid-weights见 L530-L534--pulid-id-embedding见 L1116-L1119--pulid-id-weight见 L1286最终汇入sd_pulid_params_t见 include/stable-diffusion.h再经 src/pipeline/request.cpp 拷贝到扩展上下文。6.1 三个参数必须同时出现Flag作用默认值/取值范围--pulid-weights pathpulid_flux_v0.9.x.safetensors的路径随模型一起加载无--pulid-id-embedding p预计算工具产出的.pulidembd二进制路径无--pulid-id-weight f身份注入强度典型 0.7–1.2默认 1.0三条规则务必理解三个 flag 必须同时设置才会激活 PuLID只设--pulid-weights而不设 embedding权重被加载但运行时不注入PuLIDExtension以pulid_weights_path非空作为enabled条件而prepare_condition在 embedding 为空时不会写入flux_extra见 pulid_extension.cpp设--pulid-id-weight 0注入贡献被置零——这正是官方推荐的“证伪测试falsification test”手段相同 seed 下输出应与完全不带 PuLID 的跑法逐字节一致。7. 内存预算与 1024 分辨率下的显存处理官方在 512×512、4 步Schnell、12 GB 消费级显卡Flux Schnell Q4 GGUF CPU 卸载的 clip_l / t5xxl GPU 常驻 VAE上实测20 个交叉注意力层对去噪时间的影响约10%峰值显存几乎不增加——因为交叉注意力只在 token 序列上做轻量投影不引入大的中间缓存。但在1024×1024 Flux Dev Q4 20 步 PuLID场景下VAE 解码的计算缓冲区在 12 GB 卡上放不下即使加了--vae-on-cpu也不行。原因在于--vae-on-cpu只是把 VAE 权重卸载到 CPU计算图仍留在默认后端这是 stable-diffusion.cpp 的既有行为并非 PuLID 专属问题。正确解法是把 VAE 的计算也显式路由到 CPU 后端--backend diffusionvulkan0,vaecpu8. 后端选择随主扩散模型走PuLID 交叉注意力层与主扩散模型运行在同一后端因此复用标准的--backend参数。常见组合# AMD Vulkan --backend diffusionvulkan0,vaecpu # NVIDIA Vulkan --backend diffusionvulkan1,vaecpu # CUDA --backend diffusioncuda0,vaecpu需要说明的边界该实现是纯 ggml 图构建理论上可在 CUDA、ROCm、Metal 上工作但截至文档写作时仅 Vulkan 与 CPU 后端经过原作者实测其余后端欢迎用户验证。9. 验证方法三路 SHA-256 对照测试在新组合模型 后端 硬件首次跑通时官方推荐用三路 SHA-256 对照作为健康检查跑法预期哈希关系A不带任何--pulid-*flag基线baselineB带 PuLID flag但--pulid-id-weight 0.0与 A 逐字节一致C带 PuLID flag--pulid-id-weight 1.0与 A、B 均不同且输出保持源人脸判定逻辑如果 A 与 C 不同但 A 与 B 也不同说明注入路径在权重为 0 时仍在分配或计算某些东西——很可能是个 bug。这一约定与第 6.1 节的“置零即无注入”语义互相印证是排查实现正确性的有力手段。10. 限制与暂不支持的功能务必提前知晓--skip-layersskip-layer-guidance / SLG与 PuLID 不可同用。pulid_ca的索引按“未被跳过的块”推进一旦有块被跳过交叉注意力权重的分配就会相对训练区间静默错位参考 PyTorch 实现本身也没有 SLG不存在可模拟的既定行为。源码层面同样明确skip_layers非空时pulid_run会被置为 false见 flux.hpp。请二者择一使用。PuLID v1.1 权重pulid_v1.1.safetensors键名已重排暂不支持请使用 v0.9.x。多张 ID 图参考 PyTorch 实现可将多张人像融合为更强的单一嵌入本实现接受的是外部预计算工具从一张或多张图产出的单个嵌入文件。CFG 的 negative-prompt 分支PuLID 仅在正条件positive conditioning路径注入与已发布参考实现一致。Flux 的蒸馏式引导distilled guidance正常使用时不跑独立的 uncond 分支因此该限制只影响--true-cfg这类非 Flux 标准工作流。后端覆盖除 Vulkan 与 CPU 外未经原作者实测其他后端依赖用户验证。11. 快速上手指南从零到首张保脸图汇总全文搭建 PuLID-Flux 生成的最小路径准备 Flux 基础权重transformer GGUF如flux1-schnell-Q4_K_S.gguf、VAE、CLIP-L、T5-XXL参考 docs/flux.md下载 PuLID 权重pulid_flux_v0.9.1.safetensors勿用 v1.1搭建 Python 预计算环境安装 PyTorch 与insightface、facexlib、eva-clip等依赖将 ToTheBeginning/PuLID 的pulid/与eva_clip/包加入PYTHONPATH生成.pulidembd运行python scripts/pulid_extract_id.py --portrait xxx.jpg --pulid-weights pulid_flux_v0.9.1.safetensors --out source.pulidembd一次完成、永久复用运行sd-cli三个--pulid-*flag 同时给出Schnell 用 4 步、Dev 追加--guidance 3.5与 20 步验证按第 9 节做三路 SHA-256 对照确认注入真实生效且零权重路径干净。整个 PuLID 链路中只有第 3、4 步是 Python/PyTorch 一次性工作从 embedding 文件加载到去噪注入、再到出图全部由 src/extensions/pulid_extension.cpp 与 src/model/diffusion/flux.hpp 中的 C/ggml 实现完成因而可以自由跑在 Vulkan、CUDA、Metal、ROCm 与纯 CPU 环境下。赞分享人工智能大模型本地部署推理引擎媒体生成【免费下载链接】stable-diffusion.cppDiffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp点击查看免费下载相关推荐智能地址解析实战3大核心技巧提升数据处理效率智能地址解析实战3大核心技巧提升数据处理效率 中文地址智能解析工具chinese_province_city_area_mapper简称cpca是一个强大NLPTestableMock快速入门从零开始编写第一个Mock测试TestableMock快速入门从零开始编写第一个Mock测试 什么是TestableMock TestableMock是一款特立独行的轻量Mock工具它YOLOv8-face人脸检测技术完整指南YOLOv8 face人脸检测技术完整指南 YOLOv8 face是基于Ultralytics YOLOv8框架专门优化的人脸检测模型提供高效准确的人脸识别能人工智能计算机视觉深度学习上一篇为什么你的ComfyUI-Impact-Pack安装不完整完整安装指南与功能解析下一篇Irony Mod ManagerParadox游戏模组管理的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/28 8:22:28

优惠券网站要怎么做推广与网站刚建好怎么做能让百度收录对比

优惠券网站推广避坑指南:安全加固需多少钱 模板网站太丑且功能残缺,直接导致用户流失,更致命的是其内置的安全漏洞,让推广费打水漂。很多老板问做安全加固要多少钱,这取决于你的业务量级,但基础防护成本并不高,关键在于别让攻击者白嫖你的流量。…

2026/9/28 8:17:27

零代码用Codex:普通人任务翻译实战指南

1. 项目概述:一个非程序员的真实Codex使用手记“不会编程的人,到底能不能用 Codex?”——这个问题我问了自己整整三天。不是因为犹豫要不要试,而是因为身边太多人一听到“Codex”就自动划归到“程序员专属工具”的认知牢笼里&…

2026/9/28 8:17:27

众车网是哪家公司网站?一文搞懂备案避坑指南

众车网是哪家公司网站?一文搞懂备案避坑指南 很多刚入行的朋友或者准备上线新站点的老板,一听到“ICP备案”这四个字,心里就犯嘀咕:流程到底多复杂?会不会被卡住?其实, 备案流程一头雾水…

2026/9/28 9:07:31

大厂Java面试考察新趋势:技术栈广度与业务场景拆解实战

金三银四又到了,群里讨论Java面试的频率明显高了起来。前两天有位读者把一份面试复盘发给我,内容很典型:技术栈写了一大串,八股文背得滚瓜烂熟,但面试官往业务场景上一追问,整个节奏就乱了。他问我&#xf…

2026/9/28 9:07:31

DCDC带载异常本质与COT架构实战诊断指南

1. 项目概述:为什么带载异常是DCDC设计里最让人头疼的“幽灵问题”“DCDC设计中的带载异常问题分析与解决”——这个标题背后,藏着电源工程师职业生涯里最常被深夜电话叫醒、最常在产线被拉着蹲在示波器前反复抓波形、也最容易被误判为“软件bug”或“PC…

2026/9/28 9:07:31

Linux基础I/O全解析:文件描述符、缓冲区与重定向底层原理

说实话,每次面试问到Linux I/O,我看到太多候选人背了一堆概念名词,什么epoll、io_uring、零拷贝,说得头头是道。但你让他讲讲Linux下一个进程启动时默认打开哪几个文件描述符,程序调用printf之后数据到底经过了几层才落…

2026/9/28 9:07:31

逆变器时域阻抗辨识:从PRBS注入到特征值稳定性分析

1. 从频域扫频转向时域辨识:一次实验解决三个问题1.1 一小时扫完的Bode图,为什么还是不敢信做并网逆变器稳定性的工程师,几乎都经历过这种场面:仪器架好,阻抗分析仪或者自写的扫频脚本开始跑,一个频率点一个…

2026/9/28 9:07:31

AVRCP 1.6 协议解析:解决车载蓝牙不显示封面和歌词问题

每次开车连上蓝牙放歌,屏幕上要是一直显示一串“未知曲目”,或者连歌手名和专辑封面都没有,那种感觉懂的都懂。明明手机里歌词、封面、进度条都齐整,车机上却什么都看不到。这个问题十有八九出在 AVRCP 协议版本上。这里说的 AVRC…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑