"未来职业照" "长大后我想成为" "学生照变职业照" "长大后的自己" "未来职业图鉴" "成长对比卡" "职业体验活动物料"。
干:单张学生照 → 目标职业的成年形象照(保脸 + 年龄推进 + 职业化);批量多职业;证件照规格;对比卡/九宫格成品图。
不干:
hsf-future-career-photo/
├── SKILL.md
├── assets/careers.json 26 个职业配方 + 年龄档 + 画幅 + 学段映射
├── scripts/build_prompt.py 职业 + 年龄 + 画幅 → 完整提示词(可批量)
├── scripts/id_photo.py 证件照规格裁剪 + 5寸相纸拼版 + 底色检测
├── scripts/compose_growth_card.py 成长对比卡(3:4 / 16:9)+ 多职业九宫格
├── scripts/strip_ai_watermark.py 裁除底部 AI 水印
├── scripts/compare_variants.py 多变体并排对比图(视觉校验用)
├── scripts/selfcheck.py 自检:数据完整性 + 合规风险词 + CLI 边界 + 硬校验
└── examples/ 示例与实测记录
依赖:python -m pip install Pillow(脚本只用到 PIL,没别的依赖)。
改完任何东西先跑自检(零积分,能在出图前挡住配错职业/参数冲突/合规漏网):
python scripts/selfcheck.py # 全部:数据层 + 命令行层
python scripts/selfcheck.py --data # 只查 careers.json
python scripts/selfcheck.py --cli # 只查参数边界与硬校验
python scripts/selfcheck.py --data --file 旧版careers.json # 对改动前后两个版本跑同一套检查做对比
✓ 通过 · ! 需人工判断(例如"某个职业的配方里有会招徽标的词")· ✗ 必须修(别名撞车、硬校验漏网等)。有 ✗ 时退出码为 1。
| 项 | 说明 |
|---|---|
| 原照片 | 尽量正脸、无遮挡、光线均匀。侧脸/糊图/多人合影先处理(见踩坑) |
| 目标职业 | 1 个或多个;从 careers.json 里挑,或按学段/活动主题推荐 |
| 目标年龄档 | 青年(26) / 成熟(34) / 中年(46);也可用 --age 指定数字 |
| 用途 | 个人纪念 / 学校活动 / 对外传播——决定要不要走合规流程 |
| 产出形态 | 单张职业照 / 证件照 / 对比卡 / 九宫格 |
积分提醒:ImageGen 约 5-10 积分/张。必须先出 1 张样图给用户确认,再批量。 这是本 skill 最省钱的一条规矩。
出图前先看原照片能不能用:
| 情况 | 处理 |
|---|---|
| 正脸、清晰、单人 | 直接用 |
| 分辨率低 | 先超分(可用 ixhlink-skills-image-upscale 或 buddy 图像处理) |
| 有划痕/噪点/泛黄 | 先修复(old-photo-restorer 或 buddy 图像处理) |
| 侧脸、遮眼、戴帽子 | 保脸会明显变差,先说明预期再决定做不做 |
| 多人合影 | 必须裁成单人再喂模型,否则模型不知道该以哪张脸为准 |
| 逆光/过曝 | 先调亮度对比度,模型对过曝人脸识别差 |
cd ~/.workbuddy/skills/hsf-future-career-photo
python scripts/build_prompt.py --list # 看全部职业配方
python scripts/build_prompt.py -c 医生 -g 小学 # 小学学段 → 自动选「青年」档
python scripts/build_prompt.py -c 医生,老师,飞行员 -s 青年 --out prompts.txt
python scripts/build_prompt.py -c 白衣天使 -f id --id-bg blue # 别名匹配 + 证件照规格
python scripts/build_prompt.py -c 宇航员 --extra "戴一副细框眼镜,马尾辫" --json
python scripts/build_prompt.py -c 老师 --identity-mode loose --age 33 # 要成熟感 → 放开脸型
python scripts/build_prompt.py --prep --identity-mode loose --age 34 --gender 女 \
--extra "只锁额头那颗痣,其余面部全放开" --out prompt_第一段.txt # 两段式第一段
两段式怎么用(脸总是不够成熟时的推荐路径,见下方「关键认知」):
# 第一段:出「成年版的同一个人」,不带职业、纯色背景。只锁「痣」,其余全放开。
python scripts/build_prompt.py --prep --identity-mode loose --age 34 \
--extra "只锁额头那颗痣,其余面部全放开" --out p1.txt
# → 出图,确认是成年脸(不是童脸)。第一段过不了,后面换职业都白搭。
# 第二段:拿第一段的成年脸当 image1,只做「换装换场景」。
python scripts/build_prompt.py -c 警察 --stage2 --age 34 --out p2.txt
--stage2 的作用:把任务段换成「以这位成年人为原型换装」,身份段改为禁止画回童脸(男/女各有一套文案,按 --gender 分支)。第二段绝不能沿用第一段的「以这个孩子为原型」——那会让模型重新回溯童照,把童脸比例带回来。
⚠️ --prep / --stage2 必须显式给 --gender。脚本的造型段与身份段分男女两套文案,不传就默认走女性版(发型写"侧分、齐肩锁骨长度",代词写"她")——男性素材直接用会得到一份自相矛盾的提示词。不传时脚本会在 stderr 给提示,别忽略。 两段式的边界现在有硬校验:--prep 与 --stage2 互斥;--prep 不能带 -c;--stage2 必须带 -c。以前这些组合是静默通过的,会拼出「第二段任务段 + 第一段造型段」这种打架的提示词。
⚠️ 眼镜别在第一段就锁成童款。如果原照戴正圆透明塑料框,第一段若写「保留原本那副眼镜」就会把儿童款原样放大;正确做法是第一段只锁痣,第二段统一把眼镜换成成人款(方圆细金属 / 深色板材 / 上框眉线框),见「眼镜的年龄语义」。
--identity-mode 是本 skill 第二个核心开关(另一个是 input_fidelity):
| 模式 | 锁定范围 | 什么时候用 |
|---|---|---|
strict(默认) | 锁五官 + 脸型轮廓 + 体态,不许年龄推进改变骨骼 | 用户说"要像本人"、年龄跨度小 |
loose | 只锁对年龄零成本的认人锚点(脸上的痣/疤、戴眼镜这件事),脸型/骨骼/体态/鼻型/眼型全部放开给年龄推进 | 用户说"太嫩/不够成熟/身材单薄" |
strict 和"我要更成熟"是指令打架:提示词一边写"严格保留脸型轮廓",一边写"脸要长开",模型会优先执行前者 → 结果永远是童脸。要成熟,先切 loose。
提示词的固定段(写在脚本里,全局统一口径,改一次全网生效):
| 段 | 作用 |
|---|---|
| 【任务】 | 交代原型是"输入照片里的孩子" |
| 【身份保持 · 最高优先级】 | 点名要保留哪些面部特征,明确禁止换脸 |
| 【年龄推进】 | 目标年龄 + 该年龄的成熟化描述 |
| 【职业设定】 | 服装 / 场景 / 道具 / 景别与姿态 / 气质(来自 careers.json) |
| 【本职业需避免】 | 该职业的专属坑(如老师→黑板不能有字) |
| 【构图】 | 来自画幅设定 |
| 【画面风格】 | 写实摄影,压住模型的插画/3D 倾向 |
| 【禁止项】 | 文字、水印、logo、第二个人、手指畸形、塑料感 |
调 ImageGen,参数这样给:
| 参数 | 值 | 说明 |
|---|---|---|
prompt | build_prompt.py 的输出 | 整段照抄 |
image1 | 学生照片(裁好的单人图) | 图生图必给 |
size | 提示词里带的推荐尺寸 | 半身/证件照 1024x1536,胸像 1024x1024 |
quality | high | 人像别省 |
input_fidelity | 见下方决策树 | 保脸与变老的核心旋钮 |
保脸调参决策树(本 skill 最容易翻车的地方):
input_fidelity | 表现 | 什么时候用 |
|---|---|---|
| 高 | 最像本人,但年龄推进弱,可能"只是换了衣服没长大" | 正脸清晰 + 年龄跨度小(小学→青年) |
| 中 | 平衡,通常首选 | 默认起点 |
| 低 | 职业感和年龄感强,但容易换脸 | 年龄跨度大,且用户接受"神似即可" |
按「中 → 满意就停」起步,逐级调:
--extra 里逐条点名不要改哪一处,例如: --extra "严格锁定以下面部特征,不得美化改动:保留原本较低的山根与圆润鼻头,
不要垫高鼻子、不要缩小鼻翼;保留原本的内双眼型(无明显外露的双眼皮褶皱),
不要添加双眼皮;保留原本圆润偏鹅蛋的脸型与脸颊饱满感,不要削尖下巴、
不要拉长脸型、不要瘦脸。整体不要网红滤镜感、不要过度精修。"
先看原照,把最"有辨识度"的 2-3 处特征(鼻型、眼型、脸型、痣、牙、耳)逐条写死。实测:不锁 → 鼻子垫高、双眼皮出现、脸变窄;锁了之后脸型与鼻型明显回正。
input_fidelity → 更像本人(年龄感变弱)--extra跨 9 个职业请逐张单独出图,每张都以原始学生照为 image1。不要拿上一张的产出当下一次的输入,会累积漂移。
关键认知:像本人 ↔ 年龄感是真冲突,但 loose 模式能把它掰回来(实测结论)
孩子的"幼态"来源就是圆脸、饱满脸颊、低鼻梁——而这些恰恰是最重要的认人特征。锁死它们就等于锁死了年轻感,模型再怎么写"33 岁"也长不出来。
实测证据(同一张 ~10 岁学生照 → 老师,共 5 版):
| 版本 | 做法 | 结果 |
|---|---|---|
| v1 | 默认提示词 | 精修漂移:鼻梁垫高、出双眼皮、脸削窄,不像本人 |
| v2 | 逐条反向锁五官 | 像本人 ✅ 但停在"刚毕业" |
| v3 | 锁五官 + 年龄 32 + 画面质感 | 像 + 顺眼,用户认可,但仍是圆脸学生气 |
| v4 | 年龄 35 + 放开脸型锁 | 年龄感只上来一点点,还丢了微笑 ❌ |
| v5 | --identity-mode loose + 年龄 33 | 脸拉长、下颌线出来、颧骨眼窝成形,成熟度明显到位 ✅ |
为什么 v4 失败而 v5 成功:v4 只是"把年龄数字写大",其它段落还在要求保住脸型,等于让模型自相矛盾;v5 是逐条解除脸型/骨骼/体态锁定,并显式给出允许推进的清单(脸型拉长、下颌线、颧骨、眉骨、眼窝、婴儿肥消退、成年女性肩宽与上身厚度)。
⚠️ 补记(v1.0.4 起的更正):v5 当时把「鼻型、眼型」也列为锚点,这一步后来证明是错的——鼻型与眼型本身就是幼态来源,锁住它们会把脸往回拉。现行 IDENTITY_LOOSE 已改为只锁对年龄不敏感的个体特征,并点名禁止保留低山根/圆鼻头/饱满脸颊/偏下眼位。v5 能过关,靠的是造型成熟化(发型换轮廓 + 正装 + 妆容),不是靠锁鼻型眼型。详见下方「幼态真凶排序」与「眼镜的年龄语义」。
loose 模式的代价必须提前跟用户讲清:脸型放开后,与原照的相似度会下降——原照是圆脸,成片是鹅蛋/长脸。这是要成熟感必须付的价。判断标准应从"脸型是否一样"改成"一眼能不能认出是同一个人"(痣、眼镜、眼型、唇形这些锚点还在就成立)。
三个零成本增熟手段(不动脸,纯改外部符号,建议在 loose 基础上叠加):
| 手段 | 效果 |
|---|---|
| 眼镜:保留"戴着眼镜"这个事实,但换成人款——正圆透明塑料 → 方圆形细金属框 / 深色板材框 | 眼镜是最强的认人锚点,但正圆+透明塑料是儿童/学生款,整款照搬会显小(实测踩过) |
| 服装换深色正装(藏青/深灰西装,而非卡其/米白) | 立刻资深 |
| 发型换「轮廓」,不是换「扎法」:童照若是中分贴头皮扎起,就改成侧分 + 蓬松度 + 齐肩/锁骨发(或带体积的发髻),露出耳朵与颈线 | 性价比最高的增熟手段。⚠️ 童照本来就扎起来的,再写"扎起/盘发"等于没变——轮廓一模一样,用户一眼就看出"发型没变"(实测踩过) |
| 妆容:眉形利落有眉峰 + 自然唇色 + 轻度修容 | 去掉素颜学生感 |
| 收掉露齿笑,改沉稳表情 | 去掉青涩感 |
| 场景换成讲台正面 / 办公室书架 | 用环境背书资历 |
| 体态:显式写"肩背挺拔、上身有厚度、不要单薄纸片感" | 解决"身材单薄"(模型默认把人画瘦) |
「婴儿肥 / 幼态」的真凶排序(实测,按对年龄感的影响从大到小)
| 面部特征 | 影响 | 该不该当认人锚点锁死 |
|---|---|---|
| 脸颊软组织饱满度(苹果肌/颊脂垫) | 最大 | ❌ 绝对不能锁 |
| 下巴长度 + 下颌角清晰度 | 大 | ❌ 不能锁 |
| 鼻梁高度(低山根 / 圆鼻头) | 大 | ⚠️ 别锁——锁它是幼态的大头,很多人第一反应会锁"鼻型",实际最伤成熟度 |
| 眼位高低 + 眼睛占脸比例 | 中 | ❌ 不能锁 |
| 眉骨与眼窝深度 | 中 | ❌ 不能锁 |
| 内双眼型 / 单眼皮 | 小到中 | ⚠️ 锁了会拉低成熟度 |
| 脸上的痣 / 疤 | 无 | ✅ 最该锁 |
| 戴不戴眼镜(这件事本身) | 无 | ✅ 该保留 |
| 眼镜的框型款式 | ⚠️ 有 | 见下方「眼镜的年龄语义」——别整款照搬童照 |
结论:只有「痣 + 眼镜」这两类是零年龄成本的锚点。 其余每锁一项,都是在往幼态拉。常见的错误做法是把「鼻型 + 眼型 + 脸型」一起锁——那套组合正好构成童脸的全部要素,结果一定是"像本尊的小孩版"。
眼镜的年龄语义(自我纠错 · 实测)
之前把「眼镜(框型与材质)」归为"零年龄成本锚点",这个判断只对一半:
| 框型 | 年龄语义 |
|---|---|
| 正圆形 + 透明塑料(较粗边框) | 儿童 / 学生 / 文艺清新 —— 照搬童照就是这一款,成人脸上立刻显小 |
| 方圆过渡(方圆形)+ 细金属框 | 成年 / 职业 / 干练 |
| 方圆 + 深色板材(黑 / 玳瑁) | 成年 / 稳重 |
| 上框半框(眉线框) | 成年 / 专业 |
正确做法:锁「戴着眼镜」这个事实,同时把款式改成成人款——保留"有镜框、浅色/细框"的家族相似感,把正圆形改成方圆形、把粗透明塑料改成细金属或深色板材。这样认人线索还在,年龄感不再被往下拉。不要写「照原样保留那副眼镜」。
能并进后续步骤就别单独重跑:如果本来就要做第二段换装,把「眼镜换成人款」写进第二段的提示词即可,不必为眼镜单独重跑一次第一段。
所以「认人锚点」应该这样选:先挑对年龄零影响的(痣、疤、牙、戴眼镜这件事),不够再补影响小的,绝不为"更像"去锁脸颊、下巴、山根、眼位;带款式语义的东西(眼镜框型、发型)要保留"有它"、换掉"它的款式"。
「两段式」是绕开这个死结的最优路径(推荐优先试):
image1,只做「换装换场景」——此时模型不再回溯童照,也就不会把童脸比例一起带过来。第一段的身份约束可以放得很松(只锁痣+眼镜),第二段基本不涉及年龄问题,所以两段各管一件事,比一段里同时要求"像 + 长大 + 换职业"要可靠得多。
一句话:成熟感靠造型和骨骼推进,不是靠皱纹;但脸型必须让路,否则永远童脸。
⚠️ 无锚点脸:先讲预期,再出图(实测结论)
出图前先扫一眼原照有没有锚点(痣、疤、牙套、眼镜、发型辨识度)。如果一样都没有——只有普通五官和骨骼——那么跨年龄推进时 identity 必然衰减,这是模型的固有特性,不是提示词能修好的。
实测(同一张男孩照,短寸头、无痣无眼镜):
input_fidelity=medium → 明显换人input_fidelity=high + 逐条锁五官 → 眉眼接近,但仍非严格同一人话术要对:这种情况下诚实告诉用户结果只能到「神似 / 一看就是他家孩子」,做不到「一眼确定就是本人」。别等出了图再解释。 若必须做到严格同一人,只能换更强的引擎(Nano Banana Pro、Seedream 4、即梦)重跑第一段。
两段式的价值在这里更明显:衰减只发生在第一段(童→成),第二段(成→换装)identity 保持非常稳——实测成人版换消防员的成片,脸与第一段几乎完全一致。所以第一段值得多跑两版挑一张,后面所有职业都能复用这张脸。
生图模型常在右下角烙「AI生成 WORKBUDDY」水印。成品任何位置不得出现平台/AI 标识。
python scripts/strip_ai_watermark.py 出图目录/ # 整目录裁底部 7%
python scripts/strip_ai_watermark.py a.png --out 干净/ # 另存不覆盖(推荐)
python scripts/strip_ai_watermark.py 出图目录/ --dry # 先预览改后尺寸
⚠️ 别把输出目录当第二个位置参数。strip_ai_watermark.py 的 targets 是 nargs="+",第二个位置参数是另一个输入文件,不是输出。写 a.png 干净/a.png 会得到"跳过(不存在):干净\a.png"并原地覆盖 a.png(不可逆)。要另存只能用 --out 目录。
多版本迭代时先拼一张对比图再判断——单张看容易"越看越顺眼",并排看差异才显:
python scripts/compare_variants.py 对比_原照_v3_v5.jpg \
"原照=输入_头肩.jpg" "v3 偏嫩=净图/v3.png" "v5 放开脸型=净图/v5.png" -H 880
(标签=路径,标签里不要带 =;默认 3:4 居中等比裁切,同一高度好横向比。)
输出前对每一张过一遍:
不合格的局部重出,不要整批重来。
# 成长对比卡(3:4 封面版式:未来照主视觉 + 左上角学生照小圆徽章)
python scripts/compose_growth_card.py compare --before 学生照.jpg --after 医生照.png \
--name "小明" --career 医生 --caption "我在诊室里,等你长大" --out 对比卡.jpg
# 成长对比卡(16:9 并排版式:两图左右对照 + 中间箭头)
python scripts/compose_growth_card.py compare --before 学生照.jpg --after 医生照.png \
--ratio 16:9 --name "小明" --career 医生 --out 对比卡_横.jpg
# 多职业九宫格
python scripts/compose_growth_card.py grid --before 学生照.jpg --after 出图目录/ \
--labels "医生,老师,飞行员,科学家,厨师,画家" --name "小明的未来职业图鉴" --out 九宫格.jpg
# 证件照规格(+ 可选拼版到 5 寸相纸)
python scripts/id_photo.py 医生照.png --spec 1inch --check-bg --expect-bg white --sheet
两种比例是两套版式,不是同一套缩放:3:4 用封面版式(未来照为主、学生照缩成左上角徽章);16:9 用并排版式(两张等大 + 箭头)。别指望一个布局通吃,横版放竖图必然切脸。
未来职业照——知莫三沉淀的实战方法论工具,覆盖从诊断、判断到内容生产与推广的全链路
需要做未来职业照的运营、产品与内容团队,基于知莫三 15 年全链路实战框架,按步骤填内容即可产出。
不需要。未来职业照面向业务与内容同学,方法已固化成可复用的流水线,跟着步骤走就能产出结果。