新增功能: - inpaint_mask.py: mask区域重绘服务(enhance/pure_inpaint两种模式) 严格只在mask区做SD inpainting,发丝自然化 - /inpaint 页面 + /api/inpaint 接口:画板手绘mask + 提示词编辑 + denoising可调 - enhance_hair.webui_img2img: 新增denoising_strength参数(原硬编码0.35) 羽化贴回优化(hair_swap_manual.py 步骤⑥): - feather_px(羽化范围)+ feather_alpha(羽化强度)拆分为两个独立参数 - 改为只羽化边缘(mask内部保持硬切,仅边缘带渐变) - 新增黑底羽化对比图(纯黑背景凸显边缘过渡) 其他改动: - OSS/COS密钥脱敏:改为可选import,未设环境变量时不崩溃 - manual页面:发型列表改为本次训练的8个(含hair_flow) - enhance二次增强:重绘区改为「原图头发∪手绘mask」并外扩10%+减发际线带3cm - 发型清单文档更新:179→180个可用发型(+hair_flow) 涉及文件: - 新增: inpaint_mask.py, inpaint.html - 修改: app.py, manual.html, hair_swap_manual.py, enhance_hair.py - 修改: oss_module.py, upload_oss.py, cos_module.py(密钥脱敏) - 文档: HAIRSTYLES_AVAILABLE.md, hairstyles_available.csv
4.8 KiB
可用发型清单
当前共 180 个发型可用于换发型功能。 数据来源:
/api/hairstyles接口实时返回,要求发型同时具备「LoRA权重 + ref材质 + config.json」三件齐全。 全量清单见同目录hairstyles_available.csv。
概览
| 类别 | 数量 | 说明 |
|---|---|---|
| 总可用发型 | 180 | 三件齐全,可直接换发型 |
| ├ 男款 (boy) | 93 | 适合男性脸型 |
| ├ 女款 (girl) | 87 | 适合女性脸型(+hair_flow) |
| ├ 中文名命名 | 7 | 按脸型训练的新发型 |
| ├ 英文名命名 | 16 | 历史测试发型 + hair_flow |
| └ 数字ID命名 | 157 | 生产环境发型(雪花算法ID) |
性别说明:gender 字段决定发型被分到"男款/女款",但换发型时男女发型都能用(只是预览图用对应性别的标准脸)。
LoRA 权重文件位置
每个发型的 LoRA 权重(约 144MB/个,共约 26GB):
/home/xsl/change_hair/data/train_material/<hair_id>/model/hairstyle_hd_lora.safetensors
换发型时 photo_service 会从该路径动态加载 LoRA。
一、本次训练的新发型(中文名,按脸型适配)
这 7 个是本次会话按 <脸型>-<发型> 规则训练的,可在 hair_type_images/ 找到原图:
| hair_id | 脸型 | 发型 | gender | 预览图 |
|---|---|---|---|---|
| 圆-心形 | 圆脸 | 心形刘海 | girl | ✓ |
| 圆-椭圆 | 圆脸 | 椭圆 | girl | ✓ |
| 圆-波浪 | 圆脸 | 波浪卷 | girl | ✓ |
| 圆-直线 | 圆脸 | 直发 | girl | ✓ |
| 圆-花瓣 | 圆脸 | 花瓣剪 | girl | ✓ |
| 心形-心形 | 心形脸 | 心形刘海 | girl | ✓ |
| 心形-椭圆 | 心形脸 | 椭圆 | girl | ✓ |
⏳ 还有 23 个同类发型(方脸/椭圆/菱形/长脸系列)尚未训练完成,可用
batch_train_hairstyles.py继续训练。
二、历史测试发型(英文名)
| hair_id | gender | 备注 |
|---|---|---|
| hair_flow | girl | 波浪卷发,最新训练(2026-07-07) |
| huaban1 | girl | 画板1 |
| huaban2 | girl | 画板2 |
| new_test_001 | boy | 测试 |
| newf_1214 / 12141 / 12314 / 1235314 | girl | 测试系列 |
| newf_121445553 | boy | 测试 |
| newf_204 / 216 | girl | 测试 |
| test001 | boy | 测试 |
| test002 | girl | 测试 |
| test003 / 0036 | boy | 测试 |
| test888 | boy | 测试 |
三、生产发型(数字ID,157个)
这部分是生产环境训练的发型,使用雪花算法生成的纯数字 ID(如 1935356131338985473)。
男款 76 个,女款 81 个(具体清单见 hairstyles_available.csv)。
部分 ID 段对应的训练批次(推测):
1905xxx/1906xxx:早期批次1907xxx:第2批1929xxx:第3批1935xxx:第4批(数量最多)1938xxx/1939xxx/1940xxx/1941xxx:补充批次1953xxx/1954xxx:扩展批次1980xxx:最新批次
四、未完成训练的发型
| 状态 | 数量 | 说明 |
|---|---|---|
| 有 LoRA 但缺 ref 材质 | 135 | 训练了 LoRA 但没生成换发型材质,不能用于换发型 |
| 有 ref 材质但缺 LoRA | 14 | 材质在但 LoRA 丢失 |
| 训练目录但两样都没有 | 34 | 训练中断或失败 |
如需让这 135 个"有 LoRA 缺材质"的发型可用,可对它们单独跑
train_hairstyle_full.py的 step3/step4(生成 ref 材质),无需重新训练 LoRA。
五、如何测试这些发型
1. 简易测试页
访问 http://localhost:8888/test_new(本次新发型)或 http://localhost:8888/swap(全部 179 个发型)。
2. 调试页(带可视化)
http://localhost:8888/debug— 全参数调试台http://localhost:8888/manual— 手绘 mask 换发型(含 enhance 二次增强 + 羽化贴回)http://localhost:8888/inpaint— mask区域重绘(发丝自然化,enhance/pure_inpaint两种模式)http://localhost:8888/hairline— 发际线 mask 实验(4种方案对比)
3. API 调用
# 列出所有可用发型
curl http://127.0.0.1:8888/api/hairstyles
# 换发型(hair_id 替换为上面的任意发型)
curl -X POST http://127.0.0.1:8888/api/swap \
-H "Content-Type: application/json" \
-d '{"img":"<base64图片>","hair_id":"1935356131338985473"}'
六、训练新发型
参考 docs/ 和项目根的 README.md,使用:
# 单个发型训练
python batch_train_hairstyles.py --src <发型图目录> --gender girl --only <hair_id>
# 批量训练
python batch_train_hairstyles.py --src hair_type_images --gender girl
训练完成会自动生成 LoRA + ref材质 + 模板材质 + 预览图,发型立即可用。
文档生成时间:2026-07-07
发型数据可随时通过 /api/hairstyles 接口获取最新状态。