返回技能总览
● 视觉 · 海报

未来职业照

"把一张学生照片,做成他/她长大后的职业形象照,并可一键合成成长对比卡与多职业九宫格。触发词:未来职业照、长大后我想成为、学生照变职业照、长大后的自己、职业体验活动物料、未来职业图鉴、成长对比卡。核心能力:1) 数据驱动——26 个职业配方写进 assets/careers.json(服装/场景/道具/景别/气质/禁忌),一条命令出提示词,换职业只改参数不动模板;2) 一条命令拼提示词 build_prompt.py,支持职业 id/中文名/别名匹配、批量多职业、年龄档(青年/成熟/中年)、学段自动匹配年龄、四种画幅(半身/胸像/全身/证件照)、证件照底色,以及 strict(保脸)/loose(要成熟感,放开脸型骨骼)双身份模式,并用 `--prep` / `--stage2` 支持「先出成年脸、再换职业装」的两段式;3) 四个图像脚本——证件照规格裁剪+5寸相纸拼版(id_photo.

触发词

"未来职业照" "长大后我想成为" "学生照变职业照" "长大后的自己" "未来职业图鉴" "成长对比卡" "职业体验活动物料"。

这个 skill 干什么、不干什么

干:单张学生照 → 目标职业的成年形象照(保脸 + 年龄推进 + 职业化);批量多职业;证件照规格;对比卡/九宫格成品图。

不干:

目录

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,参数这样给:

参数值说明
promptbuild_prompt.py 的输出整段照抄
image1学生照片(裁好的单人图)图生图必给
size提示词里带的推荐尺寸半身/证件照 1024x1536,胸像 1024x1024
qualityhigh人像别省
input_fidelity见下方决策树保脸与变老的核心旋钮

保脸调参决策树(本 skill 最容易翻车的地方):

input_fidelity表现什么时候用
高最像本人,但年龄推进弱,可能"只是换了衣服没长大"正脸清晰 + 年龄跨度小(小学→青年)
中平衡,通常首选默认起点
低职业感和年龄感强,但容易换脸年龄跨度大,且用户接受"神似即可"

按「中 → 满意就停」起步,逐级调:

   --extra "严格锁定以下面部特征,不得美化改动:保留原本较低的山根与圆润鼻头,
   不要垫高鼻子、不要缩小鼻翼;保留原本的内双眼型(无明显外露的双眼皮褶皱),
   不要添加双眼皮;保留原本圆润偏鹅蛋的脸型与脸颊饱满感,不要削尖下巴、
   不要拉长脸型、不要瘦脸。整体不要网红滤镜感、不要过度精修。"

先看原照,把最"有辨识度"的 2-3 处特征(鼻型、眼型、脸型、痣、牙、耳)逐条写死。实测:不锁 → 鼻子垫高、双眼皮出现、脸变窄;锁了之后脸型与鼻型明显回正。

跨 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 基础上叠加):

手段效果
眼镜:保留"戴着眼镜"这个事实,但换成人款——正圆透明塑料 → 方圆形细金属框 / 深色板材框眼镜是最强的认人锚点,但正圆+透明塑料是儿童/学生款,整款照搬会显小(实测踩过)
服装换深色正装(藏青/深灰西装,而非卡其/米白)立刻资深
发型换「轮廓」,不是换「扎法」:童照若是中分贴头皮扎起,就改成侧分 + 蓬松度 + 齐肩/锁骨发(或带体积的发髻),露出耳朵与颈线性价比最高的增熟手段。⚠️ 童照本来就扎起来的,再写"扎起/盘发"等于没变——轮廓一模一样,用户一眼就看出"发型没变"(实测踩过)
妆容:眉形利落有眉峰 + 自然唇色 + 轻度修容去掉素颜学生感
收掉露齿笑,改沉稳表情去掉青涩感
场景换成讲台正面 / 办公室书架用环境背书资历
体态:显式写"肩背挺拔、上身有厚度、不要单薄纸片感"解决"身材单薄"(模型默认把人画瘦)

「婴儿肥 / 幼态」的真凶排序(实测,按对年龄感的影响从大到小)

面部特征影响该不该当认人锚点锁死
脸颊软组织饱满度(苹果肌/颊脂垫)最大❌ 绝对不能锁
下巴长度 + 下颌角清晰度大❌ 不能锁
鼻梁高度(低山根 / 圆鼻头)大⚠️ 别锁——锁它是幼态的大头,很多人第一反应会锁"鼻型",实际最伤成熟度
眼位高低 + 眼睛占脸比例中❌ 不能锁
眉骨与眼窝深度中❌ 不能锁
内双眼型 / 单眼皮小到中⚠️ 锁了会拉低成熟度
脸上的痣 / 疤无✅ 最该锁
戴不戴眼镜(这件事本身)无✅ 该保留
眼镜的框型款式⚠️ 有见下方「眼镜的年龄语义」——别整款照搬童照

结论:只有「痣 + 眼镜」这两类是零年龄成本的锚点。 其余每锁一项,都是在往幼态拉。常见的错误做法是把「鼻型 + 眼型 + 脸型」一起锁——那套组合正好构成童脸的全部要素,结果一定是"像本尊的小孩版"。

眼镜的年龄语义(自我纠错 · 实测)

之前把「眼镜(框型与材质)」归为"零年龄成本锚点",这个判断只对一半:

框型年龄语义
正圆形 + 透明塑料(较粗边框)儿童 / 学生 / 文艺清新 —— 照搬童照就是这一款,成人脸上立刻显小
方圆过渡(方圆形)+ 细金属框成年 / 职业 / 干练
方圆 + 深色板材(黑 / 玳瑁)成年 / 稳重
上框半框(眉线框)成年 / 专业

正确做法:锁「戴着眼镜」这个事实,同时把款式改成成人款——保留"有镜框、浅色/细框"的家族相似感,把正圆形改成方圆形、把粗透明塑料改成细金属或深色板材。这样认人线索还在,年龄感不再被往下拉。不要写「照原样保留那副眼镜」。

能并进后续步骤就别单独重跑:如果本来就要做第二段换装,把「眼镜换成人款」写进第二段的提示词即可,不必为眼镜单独重跑一次第一段。

所以「认人锚点」应该这样选:先挑对年龄零影响的(痣、疤、牙、戴眼镜这件事),不够再补影响小的,绝不为"更像"去锁脸颊、下巴、山根、眼位;带款式语义的东西(眼镜框型、发型)要保留"有它"、换掉"它的款式"。

「两段式」是绕开这个死结的最优路径(推荐优先试):

第一段的身份约束可以放得很松(只锁痣+眼镜),第二段基本不涉及年龄问题,所以两段各管一件事,比一段里同时要求"像 + 长大 + 换职业"要可靠得多。

一句话:成熟感靠造型和骨骼推进,不是靠皱纹;但脸型必须让路,否则永远童脸。

⚠️ 无锚点脸:先讲预期,再出图(实测结论)

出图前先扫一眼原照有没有锚点(痣、疤、牙套、眼镜、发型辨识度)。如果一样都没有——只有普通五官和骨骼——那么跨年龄推进时 identity 必然衰减,这是模型的固有特性,不是提示词能修好的。

实测(同一张男孩照,短寸头、无痣无眼镜):

话术要对:这种情况下诚实告诉用户结果只能到「神似 / 一看就是他家孩子」,做不到「一眼确定就是本人」。别等出了图再解释。 若必须做到严格同一人,只能换更强的引擎(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 目录。

⑥ 逐张 QC(这一步不能省)

多版本迭代时先拼一张对比图再判断——单张看容易"越看越顺眼",并排看差异才显:

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 用并排版式(两张等大 + 箭头)。别指望一个布局通吃,横版放竖图必然切脸。

常见问题

Q:未来职业照是做什么的?

未来职业照——知莫三沉淀的实战方法论工具,覆盖从诊断、判断到内容生产与推广的全链路

Q:知莫三的未来职业照适合谁用?

需要做未来职业照的运营、产品与内容团队,基于知莫三 15 年全链路实战框架,按步骤填内容即可产出。

Q:使用未来职业照需要技术基础吗?

不需要。未来职业照面向业务与内容同学,方法已固化成可复用的流水线,跟着步骤走就能产出结果。