AI 证件照工作室
双人照及连续修订
双人换装、换发型、肤质修订或历史成片归档前,读取 双人修订与归档。该流程用于私人风格预览,不承诺正式证件受理。已提供的选择不重复询问;局部满意不等于整图通过,用户最新否决优先于旧认可。
把用户的日常照片变成合规、清晰、可交付的证件照。核心是四步:问清需求 → 生图重制 → 脚本后处理 → 交付验收。
本技能只负责技术实现,是否被办理机关受理由机关判定,交付时要如实说明(见第六节合规提醒)。
不适用场景(先排除,避免误触发)
以下情况不要使用本技能 —— 直接告知用户超出范围,不要硬做:
- 非中国证件照规格:美国护照 2×2 英寸、日本履历书用尺寸、其它国家签证专用尺寸等。 规格表只覆盖中国常用规格,硬套会算错比例。
- 纯艺术写真 / 创意换脸 / 影视造型:这类需求重在表现力,与"能被受理"的目标相反, 按本技能的规格与合规标准做出来会偏死板。
- 要求美颜、磨皮、瘦脸、上妆:本技能刻意不做(见铁律),政务系统普遍做人脸比对与 合成检测,磨皮等于自毁。
- 只是问"我这照片能不能用":属于判断类问题,直接回答即可,不必走完整流程。
零、隐私声明(执行前必须告知用户)
- 人脸图片会被发送至用户所选用的第三方生图 API。 动手前告知用户这一点。
- 若处理的是他人照片,请确认已取得授权。
- 生成的成片含生物识别特征,不要上传到公开仓库或公开分享。
- 只有走"本地液化"通道时图片不出本机 —— 这一点可以在对比通道时作为优势说明。
一、七条铁律(先读,都是踩过的坑)
- 不要把 300dpi 档当成品交付。 295×413 只有 12 万像素,屏幕一放大必糊,用户会立刻发现并投诉。默认输出高清档(一寸为 1181×1653,像素是前者的 16 倍)。只有用户明确说"报名系统要求 295×413"时才另存标准版。
- 白 / 浅色上衣 + 白底 = 灾难。 衣服和背景融为一体,人物像浮在半空。用户照片里凡是白色或浅色上衣,一律换成深色。完整冲突规则见
wardrobe.md第一节。 - 生图前必须确认需求,发型是必问项。 不要拿到照片就直接生成 —— 用户对发型和服装的预期差异极大,返工成本远高于问一句。
- 一批只发一个生图请求。 并发提交会报错,并发开多个第三方会话会互相抢额度。逐个串行。
- 覆盖用户已有成片前,必须先备份并逐字节校验。 整套重制一律先出副本目录给用户看,确认后再备份 → 覆盖 → 校验。备份要校验和一致才算数,不能只看文件数。
- "只改某处五官且不要磨皮"绝不用生成式修图。 生成式通道会整脸重绘(磨皮 + 瘦脸 + 提亮),目标部位几乎不变。必须走 §阶段 5 的本地液化法。
- 源图不够大就不要硬撑"超清版"。 低于目标宽度的放大是插值假细节,看着更糟。
二、工作流
阶段 0:交互式确认需求(不要跳过)
用平台提供的提问组件一次性给出选项(详见 platform-host.md 第二节),不要让用户逐条回复。
必问项:
| 问题 | 选项 |
|---|---|
| 发型(核心开关) | 保持现有发型 / 换一款新发型 / 两种都要给我对比 |
| 规格 | 一寸(驾照、简历)/ 二寸 / 结婚证合影 / 其他(见 specs.md) |
| 底色 | 白底 / 蓝底 / 红底 |
| 服装 | 保持原衣服 / 换西装 / 换衬衫(选颜色);浅色上衣需提示必须换深色 |
| 性别 | 决定服装库与发型库(见 wardrobe.md / hairstyles.md) |
| 用途 | 驾照 / 简历 / 签证 / 结婚登记等(影响风格建议与合规提醒) |
若用户选了"换发型",再问款式 —— 一次不要列超过 5 款,从 hairstyles.md 按脸型挑。
阶段 1:看照片、判脸型
打开用户提供的照片,判断:
- 脸型:鹅蛋 / 圆 / 方 / 长 / 心形
- 当前发型问题:扁塌?两侧推太光?刘海遮眉?
- 发际线与发量:决定能否做露额造型
在回复里用一两句话说明判断依据,让用户知道你是有依据的,而不是随机出图。
关键洞察:亚洲男性最常见的"发型扁塌不时尚",根源往往不是脸型,而是两侧推太光 + 顶部贴头皮。推太光会形成强明暗对比,反而把"头顶不饱满"暴露得更明显。对策是两侧保留渐变(不铲平)+顶部做蓬松纹理。
阶段 2:选通道、生图
先选通道再动手。 三条通道的取舍:
| 需求 | 通道 | 关键点 |
|---|---|---|
| 换底色 / 换服装 / 换发型 / 整体重制 | 第三方图生图 API(推荐) | 质感自然、与底图一致度高、无水印;需额度。见 platform-designkit.md |
| 快速试一版 / 无 CLI 环境 | 宿主内置生图 | 开箱即用;输出带水印需后处理;分辨率上限约 1.5K,出不了超清档。见 platform-host.md |
| 只改某处五官、要求不磨皮 | 本地几何液化(图片不出本机) | 见阶段 5 与 liquify-geometry-retouch.md |
同一批产出必须统一通道,混用会让光影与质感不一致,用户一眼能看出来。
prompt 四要素(模板见 prompts.md):
- 面部特征锚定(face_desc):从原图逐项归纳脸型/眉/眼/鼻/唇/下颌等,逐条写进 prompt,防"被美化"
- 保留真实五官关系:不默认强制鼻翼、双眼绝对对称;只修用户指定且有依据的异常,保留自然不对称。
- 核验实际分辨率:使用通道支持的尺寸参数并检查输出像素;提示词写高分辨率不保证工具实现,像素增加也不等于真实细节恢复。
- 服装 + 背景 + 证件照风格 + 输出比例
逐张生成,一张一张来。 每张生成后立刻记下"文件 ↔ 款式"的对应关系,避免后面张冠李戴。
阶段 3:后处理(脚本)
<venv>/bin/python <skill-dir>/scripts/process_id_photo.py <刚生成的图> \
--spec 1inch --outdir <输出目录> -n 一寸白底_黑色衬衫_经典正式
脚本一次完成:去右下角水印 → 按规格比例裁剪 → LANCZOS 缩放到高清档 → 自适应 USM 锐化 → 输出 JPEG。
- 批量处理时把目录路径作为第一个参数传入
- 源图本身没有水印时加
--no-watermark(第三方 API 的产出通常无水印) - ⚠️ 三档必须输出到不同目录。同名文件在同一目录会互相覆盖 ——
--std覆盖高清版是踩过的坑 - 处理完把中间产物清理掉(建议移入废纸篓而非直接删除)
规格参数:--spec 支持 1inch(默认)/ 2inch / marriage 等,完整规格表见 specs.md。
阶段 4:交付与命名
命名格式:<规格><底色>_<特征>_<风格>.jpg
一寸白底_黑色衬衫_经典正式.jpg
一寸白底_微分碎盖_自然清爽.jpg
- 特征 = 服装(黑色衬衫)或发型(微分碎盖)
- 风格 = 场景气质,不是颜色也不是发型
- 用户指定了输出目录就存那里;没有就先问,不要擅自乱放
- 用平台的文件展示能力一次性给出全部成片,附款式说明与推荐用途
阶段 5:局部微调(用户对成片细节不满意时)
用户提出"鼻子/眼睛/嘴角不对称""某处高低不对"这类只改一处、且要求不磨皮的需求时:
不要走生成式修图。 走液化形变三步:
# ① 量 Δ(先量再修,不要凭感觉)
<venv>/bin/python scripts/nose_liquify.py --image 成片.jpg --measure
# ② 出多档对比条,一次让用户指一个数字
<venv>/bin/python scripts/nose_liquify.py --image 成片.jpg --ladder 2,4,6,8 --strip 对比条.png
# ③ 定稿并复测
<venv>/bin/python scripts/nose_liquify.py --image 成片.jpg --auto --out 修正.png
- 一律用画面坐标(画面左 / 画面右)沟通。用户主观方向与实测相反是常态 —— 先量再修
- 峰值位移 ≤ 实测 Δ 的 1.5 倍;一次给 4–5 档让用户挑,不要逐档来回问
- 修完再测一次,把前后 Δ 对比表交给用户(用户只认数据)
- 完整方法与边界见
liquify-geometry-retouch.md
三、画质验收
第一条原则:文件体积 ≠ 清晰度。 实测过 369 KB 的成片比 411 KB 的更锐。
用户说"不清晰"时的排查顺序:
① 客观测量(Laplacian 方差,统一缩放到同宽再比)
↓
② 查源图分辨率找根因(最常见:prompt 没写分辨率 → 源图只有 800×1120)
↓
③ 修根因(重生成高分辨率源),而不是盲目调大输出尺寸
测量方法、判读标准、质量检查清单、皮肤质感三档写法见 quality.md。
四、参考资源
| 文件 | 用途 |
|---|---|
references/specs.md |
规格库:八种尺寸 + 三底色色值 + 通用标准 + 三档输出标准 + 结婚证横版规格与合规提醒 |
references/wardrobe.md |
服装库与着装冲突规则:男女服装风格库、底衣色冲突表、命名约定 |
references/hairstyles.md |
发型库:男女发型(14 款)、脸型适配表、证件照发型红线 |
references/prompts.md |
Prompt 模板库:通用骨架、面部特征锚定(face_desc)、12 种发型写法、服装取值、参数建议 |
references/quality.md |
画质与验收:Laplacian 客观测量、根因排查、质量清单、皮肤质感三档、锐化参数 |
references/platform-designkit.md |
通道 A:第三方图生图 API(以美图设计室为例)四步调用链、分辨率控制、额度续跑、批量安全替换 |
references/platform-host.md |
通道 B:宿主内置生图参数、交互式提问与交付、技能安装位置、脚本运行环境 |
references/liquify-geometry-retouch.md |
局部几何微调(液化法):不磨皮只改五官位置的完整闭环(量 → 试档 → 定稿) |
references/face-refinement.md |
面部对称性精修:鼻翼不对称的成因与三种修正方案(含镜像法的坑) |
scripts/process_id_photo.py |
后处理:去水印 → 裁剪 → 缩放 → 自适应锐化 → 高清输出 |
scripts/nose_liquify.py |
鼻部几何微调:--measure 量差、--ladder 出对比条、--auto 定档 |
scripts/nose_symmetry_fix.py |
基于人脸关键点的对称性修正 |
assets/face_landmarker.task |
人脸关键点模型(MediaPipe Face Landmarker),供 nose_symmetry_fix.py 使用 |
五、依赖环境
脚本依赖 pillow、opencv-python、numpy(nose_symmetry_fix.py 另需 mediapipe==0.10.35)。
必须装在隔离虚拟环境,不要全局 pip install —— 全局安装会污染用户其它项目。
python3 -c "import PIL, cv2, numpy" 2>/dev/null && echo "依赖已就绪"
python3 -m venv ~/.venvs/idphoto
~/.venvs/idphoto/bin/pip install pillow opencv-python numpy
详见 platform-host.md 第五节。
六、合规提醒(交付时必须告知)
生成的证件照能否被受理取决于办理机关,本技能只负责技术实现,不保证过审:
- 政务系统通常要求真实拍摄的原始影像,部分系统会做人脸比对与合成检测。
- 不要过度美颜(磨皮 + 瘦脸 + 提亮)。除了可能被判为"非原始影像",实际办理时人脸比对也可能不通过。
- 结婚证合影:登记规范要求双方"同一时间、同一地点共同拍摄"的合影,不能是合成照片。AI 生成的双人合影建议只用于预览风格或情侣写真;正式登记请实拍,AI 仅用于底色替换与轻度修饰。
- 请以当地办理机关的最新要求为准。
七、常见问题排查
| 现象 | 原因与对策 |
|---|---|
| 图看着糊 | 输出成了 300dpi 档。改用默认高清档;若源图本身只有 800×1120,需重生成高分辨率源(见 quality.md 第二节) |
| 用户说"不够清晰 / 文件才几百 K" | 先查源图分辨率,别急着改输出尺寸。同时用 Laplacian 给客观数据 —— 体积 ≠ 清晰度 |
| 生图改了用户的五官 | 停止在失败图上叠代,回到真实参考或最近认可基准;提示词和保真度参数不能保证身份保真。见 references/couple-editing.md |
| 发型没变 / 发型被改了 | prompt 里漏了锁定发型的句子,或保真度参数过高(适当降低) |
| 白衣服配白底,人像浮空 | 换深色服装,见 wardrobe.md 第一节冲突规则 |
| 鼻翼 / 鼻孔左右不对称 | prompt 加 symmetrical nose 只能预防、不能修。已生成的图必须后处理(优先关键点液化,别用镜像融合),见 face-refinement.md 与 liquify-geometry-retouch.md |
| 修完鼻梁有竖痕 / 眼睛像重影 | 镜像融合的范围碰到鼻梁了,见 face-refinement.md 方案 C 的坑 |
| 用户要求"只改鼻子,不要磨皮" | 禁用生成式修图,改走液化形变,见阶段 5 |
| 修完用户说"没变化"或"方向反了" | 用户主观方向常与实测相反。先 --measure 拿 Δ 数值,再出对比条让用户挑档,统一用"画面左/右"口径 |
| 高清图变成糊图 / 只剩 295×413 | 标准版与高清版共用了同一输出目录被覆盖。重跑高清版并改到独立子目录 |
| 一批照片光影质感不一致 | 混用了两个生图通道。统一通道,缺的用断点续跑在原会话补齐 |
| 第三方 API 返回额度不足 | 不要重试、不要换会话重发、不要并发开会话。拿返回的续跑命令让用户充值后执行,断点续传不重复扣费 |
| 水印没去掉 | 水印位置随图源变化,调整脚本里的水印区域比例参数 |
| 头发被裁掉 | 裁剪时下移量不够,调大裁剪偏移参数 |