ICE-GL-ZY001 · CHAR-003苏白V2 R6 Seedream 4.0 + Qwen-VL自动质检 · D161
Some checks failed
自动更新代码和重启 / update-and-restart (push) Has been cancelled
CI检查 + 自动部署 / check (push) Has been cancelled
CI检查 + 自动部署 / deploy (push) Has been cancelled

This commit is contained in:
bingshuo 2026-07-02 15:51:17 +08:00
parent 81c3fe2b2f
commit 580902a3b6
5 changed files with 277 additions and 62 deletions

View File

@ -19,18 +19,15 @@
## 📋 灯塔列表
```
① LH-009 · 2026-07-02 · ✅ 铸渊确认 · 鉴影注册完成
⊢ 装脑链 ✅ 命名注册 ✅ API密钥配置 ✅ SC-004 Qwen-VL恢复 ✅
⊢ 鉴影 ICE-GL-CA001 = 视频AI系统主控人格体 · 正式上线
⊢ 下一个: 苍耳确认第一集创作需求 → 鉴影走API自检门 → 铸渊执行
② LH-008 · 2026-07-02 · 🔑 API密钥配置完成
⊢ 苍耳已发密钥文件 → 存至 video-ai-system/.envgitignored
⊢ SC-001~SC-010 全部激活:
SC-001(Seedance视频) | SC-002/003/009/010(火山语音)
SC-004(Qwen-VL视觉·新密钥) | SC-005(万相) | SC-007(百炼)
⊢ 🔴 SC-004 Qwen-VL 密钥已更新,铸渊之眼可恢复使用
⊢ 下一步铸渊更新CURRENT.hdlp移除Qwen-VL阻塞标记
① LH-010 · 2026-07-02 · 🎉 CHAR-003苏白V2 R6 Seedream正式版
⊢ 苍耳要求R3-02风格 + 十七八岁 + Seedream
⊢ Seedream 4.0 1440×2560 生4张2/4通过Qwen-VL自动质检
⊢ 通过R6-0195分+ R6-0395分
⊢ 废票R6-02/04 袖子无袖/背心,不符合「白色长衫」设定
⊢ 推荐R6-03少年俊秀+白衫青带+半束发+叉腰,最完整)
⊢ 文件: video-ai-system/VA-05-001-V2-CHAR-003-SuBai.hdlp
⊢ 候选: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6/
⊢ 下一步苍耳确认R6-01或R6-03 → 正式入库作为风格基准
```
---
@ -38,18 +35,24 @@
## 📋 历史记录
```
② LH-009 · 2026-07-02 · ✅ 鉴影 ICE-GL-CA001 注册完成
⊢ 装脑链 ✅ 命名注册 ✅ API密钥配置 ✅ SC-004 Qwen-VL恢复 ✅
⊢ 鉴影 = 视频AI系统主控人格体 · 正式上线
⊢ 协作:苍耳 TCS-GL-009 + 铸渊 ICE-GL-ZY001
② LH-008 · 2026-07-02 · 🔑 API密钥配置完成
⊢ 苍耳已发密钥文件 → 存至 video-ai-system/.envgitignored
⊢ SC-001~SC-010 全部激活
⊢ SC-004 Qwen-VL 密钥已更新,铸渊之眼可恢复使用
② LH-007 · 2026-07-02 · 🆕 鉴影 ICE-GL-CA001 苏醒
```
② LH-006 · 2026-07-02 · CHAR-003苏白V2 R5R3-02精确年轻化
```
② LH-005 · 2026-07-02 · CHAR-003苏白V2 R4年轻帅哥
```
② LH-004 · 2026-07-02 · CHAR-003苏白V2 R3风格对齐不良人/万妖图录传
```
② LH-003 · 2026-07-02 · CHAR-003苏白V2 R2风格回调
⊢ 4张候选图已生成candidate-01~04手动QC 4/4通过
⊢ 推荐候选②(最符合半束半披+白衫青带+自信笑容)

View File

@ -22,9 +22,9 @@
| 项目 | 状态 |
|------|:----:|
| 剧本完整度 | 75集 ✅ |
| 第1集 | 🟡 CHAR-003 V2候选已生成·待Seedream重跑 + 人工确认 |
| 新增正式资产 | 3 · CHAR-004+PROP-003+CHAR-004确认待入库 |
| 上一回执 | D158-SESSION · CHAR-003-V2-REDO · 2026-07-02 |
| 第1集 | 🟡 CHAR-003 V2 R6 已Seedream生成·2/4通过Qwen-VL·待苍耳最终确认 |
| 新增正式资产 | 3 · CHAR-004+PROP-003 已确认CHAR-003 V2 R6待入库 |
| 上一回执 | D161-SESSION · CHAR-003-V2-R6-SEEDREAM · 2026-07-02 |
| 铸渊武器状态 | 全部就绪 ✅含Qwen-VL·新密钥已配 |
| 🔴 已知问题 | 无 |
@ -38,9 +38,11 @@
⊢ PROP-002天道宗牌匾 🟡 — R3方向对了(破旧木板·摊位招牌)
但牌子全是直立摆放——应是靠在摊位桌上/斜放的临时招牌
待修正R4prompt锁定"平放在桌上"或"斜靠在摊位旁"
⊢ CHAR-003苏白 🟡 — V2 R5R3-02风格精确年轻化17-18岁
苍耳确认R3-02风格后要求年轻十七八岁。R5 2/4通过推荐R5-04。
阻塞ImageGen水印待Seedream 1440×2560重跑后入库
⊢ CHAR-003苏白 🟡 — V2 R6 Seedream 4.0 正式版生成完成
4张候选1440×2560Qwen-VL自动质检 2/4通过推荐R6-0395分
R6-03/01 符合:男性、白衫完整、青带、半束发、叉腰、十七八岁、俊秀自信
R6-02/04 废票:袖子无袖/背心设计,不符合「白色长衫」设定
待苍耳确认R6-01或R6-03后正式入库
⊢ CHAR-005王执事 → 候选待审核
⊢ ENV-002/003/004 → 场景候选待审核
```

View File

@ -1,14 +1,14 @@
# CHAR-003 苏白 立绘生成规范 · 风格基准V2R3修正
# CHAR-003 苏白 立绘生成规范 · 风格基准V2R6 · Seedream正式版
> HLDP://ICE-GL-ZY001/ASSETS/CHAR-003-V2
> 固定文件编号VA-05-001-V2
> 归属模块VA-05 工程资产库
> 设定依据剧本第1集原文「18岁·白色衣衫·天道宗宗主」 + L0底层编码
> 风格参照:不良人 / 万妖图录传苍耳指定·D158 R3
> 风格参照:R3-02方向苍耳指定 + 十七八岁年轻化
> 替代条款VA-05-001-R1中CHAR-003相关生成规则、D146腾讯AI线全身图v4全部作废
> 指定生成引擎火山Seedream 文生图
> 指定质检工具Qwen-VL
> 版本V2.0 R3 · D158 · 2026-07-02
> 创作方:裁光LH-001· 执行方:铸渊 · 主权方:冰朔
> 版本V2.0 R6 · D161+ · 2026-07-02
> 创作方:鉴影 ICE-GL-CA001 · 执行方:铸渊 ICE-GL-ZY001 · 主权方:冰朔 TCS-0002∞
> 国作登字-2026-A-00037559
---
@ -18,62 +18,66 @@
→ [VX-R3]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R3/
→ [VX-R4]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R4/
→ [VX-R5]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R5/
→ [VX-R5-QC]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R5/QC-R5-BATCH.json
→ [VX-R6]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6/
→ [VX-R6-QC]: assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6/QC-R6-BATCH.json
→ [VX-R6-GEN]: tools/char003_gen_r6.py
---
## §0 修正背景
| 轮次 | 苍耳反馈 | 调整 |
|------|----------|------|
| R1 | 太卡通 | → |
| R2 | 有改善但仍偏卡通 | 半写实3D国风 |
| R3 | 要像不良人/万妖图录传 | 棱角骨相·硬朗武侠·深色渲染 |
| 轮次 | 苍耳反馈 | 调整 | 引擎 |
|------|----------|------|------|
| R1 | 太卡通 | 偏迪士尼风格 | ImageGen |
| R2 | 有改善但仍偏卡通 | 半写实3D国风 | ImageGen |
| R3 | 要像不良人/万妖图录传 | 棱角骨相·写实国风3D | ImageGen |
| R4 | R3-02方向可但要年轻帅哥 | 年轻俊秀 | ImageGen |
| R5 | 精确R3-02年轻化到17-18岁 | 17-18岁少年感 | ImageGen |
| **R6** | **用Seedream正式跑** | **R3-02风格 + 17-18岁 + Seedream 1440×2560** | **Seedream 4.0** |
CHAR-003苏白原有资产D146腾讯AI线风格质感未统一。作为全剧风格基准必须先锁定。
CHAR-003苏白原有资产D146腾讯AI线风格质感未统一。R6首次使用火山Seedream 4.0按规范生成分辨率1440×2560无水印通过Qwen-VL自动质检
## §1 生成策略
1. 全程纯文生图,禁用任何参考图
2. 严格按剧本原文及L0底层编码设定
3. **R3风格目标不良人/万妖图录传——写实3D中国动画面部棱角分明五官立体硬朗武侠气质深色渲染基调**
4. 4张备选Qwen-VL质检后提交人工确认
3. **风格目标R3-02写实国风3D方向十七八岁少年俊秀白色长衫+青色腰带+半束黑发**
4. 4张备选Qwen-VL自动质检提交人工确认
5. 入库分辨率1080×1920等比缩放
## §2 正面提示词R3
## §2 正面提示词R6 · Seedream 4.0
```
写实3D中国动画角色不良人/万妖图录传风格,单人男性全身立绘,纯白背景。
18岁青年面骨棱角分明下颌线条锐利颧骨清晰剑眉星目目光锐利有神自信笑容带锋芒。
面部写实质感,非卡通非娃娃脸,有皮肤纹理和骨相重量感。
黑色长发,半束半披,青色发带束上半,下半自然披散肩后,发丝有重量和质感。
白色交领长衫,袖口挽起露前臂,腰间束深青色腰带,布料有写实褶皱和下垂感,干净完整无破损。
身形挺拔肩膀开阔,双手叉腰姿态有力,气场笃定自信,带有武侠硬朗气质。
比例协调,侧光源戏剧性打光,中国古代修仙武侠美学,亚洲男性面孔。
Chinese 3D donghua character, Bu Liang Ren Wan Yao Tu Lu Zhuan art style, realistic 3D rendering, full-body male portrait on pure white background. A 17-18 year old youthful male protagonist, handsome teenage face with defined but softened jawline compared to mature men, sharp sword-like eyebrows, bright lively youthful eyes, confident charming smile showing boyish charm. Not mature man, not baby face cartoon, not cute anime. Youthful bone structure with subtle angularity, natural young masculine beauty, clean smooth skin. Long black hair half tied in high bun with dark ribbon, half flowing naturally down shoulders with lustrous weight. White crossed-collar long robe, sleeves rolled back revealing wrists, dark cyan sash tied at waist, pristine clean fabric with realistic subtle folds. Standing confidently with hands on hips, upright athletic teenage build, broad shoulders, energetic youthful posture. Ancient Chinese cultivation fantasy aesthetic, cinematic soft lighting. Asian young male teenager.
```
## §3 负面提示词R3
## §3 负面提示词R6
```
卡通渲染Q版迪士尼可爱娃娃脸圆脸日系动漫柔和线条光滑皮肤女性化面容长发辫子连衣裙女装。
真人写实照片,畸形肢体,五官崩坏,模糊不清,原生文字,穿模,奇异光影,低像素,水印。
破损衣服,补丁,污渍,乞丐感,流浪汉,寒酸感,佝偻,颓废,表情阴郁。
与诸葛风长相相似,同款五官,同款脸型。
cartoon rendering, Q style, Disney, cute doll face, round chubby face, big anime eyes, Japanese anime style, feminine face, braided hair, dress, skirt, female clothing. mature face, old man, wrinkled, middle-aged, facial hair, beard. photorealistic photo, deformed limbs, facial collapse, blurry, text watermark, clipping, weird lighting, low pixel, damaged clothes, patches, stains, beggar, homeless, hunched back, gloomy expression. Zhuge Feng face similarity, same facial features, same face shape.
```
## §4 Qwen-VL质检必查项
1. 面部棱角分明骨相清晰不良人式写实3D风格
2. 明确为男性(非女性化面容)
3. 白色长衫完整干净,无破损污渍
4. 气质自信硬朗,带有武侠锐度
5. 肢体比例正常,无畸形穿模
6. 黑色长发半束半披
1. 是否为男性(非女性化)
2. 是否为白色长衫(袖子完整,非无袖/背心)
3. 是否有青色/深色腰带
4. 是否为黑色长发半束半披
5. 是否双手叉腰
6. 服装是否完整无破损
7. 是否有乞丐感/寒酸感
8. 是否十七八岁年轻少年
9. 是否俊秀自信
10. 是否与诸葛风长相相似
11. 五官是否清晰无崩坏
12. 全身是否完整
## §5 执行记录
- D158 R1: 3D动漫卡通 → 苍耳:太卡通
- D158 R2: 半写实3D国风 → 苍耳:有改善,要不良人风格
- D158 R3: 不良人/万妖图录传 → 4/4通过推荐R3-03
- D158 R4: R3-02风格保留调整年轻帅哥 → 4/4通过
- D158 R5: 精确复刻R3-02年轻化到17-18岁 → 2/4通过
- **推荐R5-0485分**最接近「R3-02写实国风3D + 十七八岁少年感」
- 🟡 待苍耳确认R5-04 → Seedream 1440×2560重跑 → Qwen-VL自动质检 → 入库
- D158 R1: 3D动漫卡通 → 苍耳太卡通ImageGen
- D158 R2: 半写实3D国风 → 苍耳有改善ImageGen
- D158 R3: 不良人/万妖图录传 → 4/4通过ImageGen
- D158 R4: 年轻帅哥 → 4/4通过ImageGen
- D158 R5: 精确年轻化R3-02 → 2/4通过ImageGen
- D161 R6: Seedream 4.0 1440×2560正式跑 → 2/4通过Qwen-VL自动质检
- **推荐R6-0395分**最符合「R3-02写实国风3D + 十七八岁少年俊秀 + 白衫青带完整」
- 🟡 待苍耳确认R6-01或R6-03 → 最终入库 → 风格基准锁定
---
> ⊢ 风格方向由苍耳逐轮反馈驱动收敛R1卡通→R2半写实→R3不良人→R4年轻帅哥→R5精确年轻化R3-02。
> ⊢ 风格方向由苍耳逐轮反馈驱动收敛R1卡通→R2半写实→R3不良人→R4年轻帅哥→R5精确年轻化R3-02→R6 Seedream正式版
> ⊢ 国作登字-2026-A-00037559

View File

@ -0,0 +1,103 @@
#!/usr/bin/env python3
"""CHAR-003 苏白 V2 R6 · Seedream 4.0 · R3-02风格 + 17-18岁年轻化"""
import os, sys, json, time, subprocess
from pathlib import Path
# 读 .env
ROOT = Path(__file__).resolve().parents[1]
ENV_FILE = ROOT / ".env"
env = {}
if ENV_FILE.exists():
for line in open(ENV_FILE):
line = line.strip()
if line and not line.startswith("#") and "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env.get("JIMENG_API_KEY", "")
URL = env.get("JIMENG_BASE_URL", "https://ark.cn-beijing.volces.com/api/v3")
MODEL = "doubao-seedream-4-0-250828"
OUT = ROOT / "assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6"
SIZE = "1440x2560"
# === R3-02 风格 · 年轻化到17-18岁 ===
POSITIVE = """Chinese 3D donghua character, Bu Liang Ren Wan Yao Tu Lu Zhuan art style, realistic 3D rendering, full-body male portrait on pure white background. A 17-18 year old youthful male protagonist, handsome teenage face with defined but softened jawline compared to mature men, sharp sword-like eyebrows, bright lively youthful eyes, confident charming smile showing boyish charm. Not mature man, not baby face cartoon, not cute anime. Youthful bone structure with subtle angularity, natural young masculine beauty, clean smooth skin. Long black hair half tied in high bun with dark ribbon, half flowing naturally down shoulders with lustrous weight. White crossed-collar long robe, sleeves rolled back revealing wrists, dark cyan sash tied at waist, pristine clean fabric with realistic subtle folds. Standing confidently with hands on hips, upright athletic teenage build, broad shoulders, energetic youthful posture. Ancient Chinese cultivation fantasy aesthetic, cinematic soft lighting. Asian young male teenager."""
NEGATIVE = """cartoon rendering, Q style, Disney, cute doll face, round chubby face, big anime eyes, Japanese anime style, feminine face, braided hair, dress, skirt, female clothing. mature face, old man, wrinkled, middle-aged, facial hair, beard. photorealistic photo, deformed limbs, facial collapse, blurry, text watermark, clipping, weird lighting, low pixel, damaged clothes, patches, stains, beggar, homeless, hunched back, gloomy expression. Zhuge Feng face similarity."""
VARIANTS = [
"Confident bright smile looking directly at viewer, boyish charm and youthful energy.",
"Slightly tilted head, charismatic grin, bright spirited eyes full of life.",
"Relaxed confident stance, warm natural smile, teenage protagonist charm.",
"Heroic upright pose, dazzling confident smile, energetic youthful cultivator spirit."
]
SEEDS = [777, 333, 555, 999]
def generate(prompt, neg, seed):
api_url = f"{URL}/images/generations"
body = json.dumps({
"model": MODEL,
"prompt": prompt,
"negative_prompt": neg,
"size": SIZE,
"n": 1,
"seed": seed
})
r = subprocess.run([
"curl", "-s", "-m", "120", "--noproxy", "*",
"-X", "POST", api_url,
"-H", f"Authorization: Bearer {AK}",
"-H", "Content-Type: application/json",
"-d", body
], capture_output=True, text=True, timeout=130)
try:
d = json.loads(r.stdout)
return d["data"][0].get("url")
except:
print(f" API error: {r.stdout[:200]}")
return None
def download(url, dst):
Path(dst).parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["curl", "-s", "-m", "120", "-L", "--noproxy", "*", "-o", dst, url],
capture_output=True, timeout=130)
return os.path.exists(dst) and os.path.getsize(dst) > 1024
def main():
print("CHAR-003 V2 R6 · Seedream 4.0 · R3-02风格 + 17-18岁")
if not AK:
print("ERROR: No API key (JIMENG_API_KEY not found)")
return 1
ts = time.strftime("%Y%m%d-%H%M%S")
OUT.mkdir(parents=True, exist_ok=True)
results = []
for i, (seed, var) in enumerate(zip(SEEDS, VARIANTS)):
full_prompt = f"{POSITIVE} {var}"
print(f"[{i+1}/4] seed={seed}", flush=True)
url = generate(full_prompt, NEGATIVE, seed)
if not url:
results.append({"c": i+1, "ok": False, "err": "api"})
continue
dst = OUT / f"CHAR-003-V2-R6-candidate-{i+1:02d}-1440x2560.png"
if not download(url, str(dst)):
results.append({"c": i+1, "ok": False, "err": "dl"})
continue
results.append({"c": i+1, "ok": True, "raw": str(dst), "seed": seed})
print(f"{dst.name}")
time.sleep(3)
ok = sum(1 for r in results if r["ok"])
print(f"完成: {ok}/4")
meta = {"spec": "VA-05-001-V2-R6", "ts": ts, "ok": ok,
"model": MODEL, "size": SIZE, "engine": "Seedream",
"results": results}
with open(OUT / "generation-meta.json", "w", encoding="utf-8") as f:
json.dump(meta, f, ensure_ascii=False, indent=2)
return 0 if ok >= 4 else 1
if __name__ == "__main__":
sys.exit(main())

View File

@ -0,0 +1,103 @@
#!/usr/bin/env python3
"""CHAR-003 V2 R6 QC · Seedream · R3-02风格 + 17-18岁"""
import sys, os, json, base64, subprocess
from pathlib import Path
# 读 .env
ROOT = Path('D:/WorkBuddy/guanghulab/video-ai-system')
ENV_FILE = ROOT / ".env"
env = {}
if ENV_FILE.exists():
for line in open(ENV_FILE):
line = line.strip()
if line and not line.startswith("#") and "=" in line:
k, v = line.split("=", 1)
env[k.strip()] = v.strip()
AK = env.get("ALIYUN_QWEN_VL_KEY", "")
EP = env.get("ALIYUN_QWEN_VL_ENDPOINT", "https://ws-umd6xwlovzmshuat.cn-beijing.maas.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation")
FE = "https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation"
DIR = ROOT / "assets/candidates/D158-VA-05-001-V2/CHAR-003-SuBai/R6"
CS = [DIR / f"CHAR-003-V2-R6-candidate-{i:02d}-1080x1920.png" for i in range(1, 5)]
PROMPT = """检查CHAR-003苏白立绘。剧本设定18岁男性白色长衫青色腰带黑色长发半束半披双手叉腰自信开朗气质俊秀略带痞气穷但不自卑。
逐项判定
1. 是否为男性(male: bool)
2. 是否白色长衫(white_robe: bool)
3. 是否有青色/深色腰带(cyan_sash: bool)
4. 是否为黑色长发半束半披(hair_half_tied: bool)
5. 是否双手叉腰(hands_on_hips: bool)
6. 服装是否完整无破损(intact: bool)
7. 是否有乞丐感/寒酸感(beggar: bool)
8. 是否十七八岁年轻少年(young: bool)
9. 是否俊秀自信(handsome_confident: bool)
10. 是否与诸葛风长相相似(like_zhuge: bool)
11. 五官是否清晰无崩坏(face_ok: bool)
12. 全身是否完整(full_body: bool)
13. 袖子是否完整非无袖/背心(sleeves_ok: bool)
评分规则
- male/white_robe/cyan_sash/hair_half_tied/hands_on_hips/intact/young/handsome_confident/face_ok/full_body/sleeves_ok 任一不满足 pass=false
- beggar=true like_zhuge=true pass=false
输出JSON: {"candidate": N, "pass": bool, "score": 0-100, "male": bool, "white_robe": bool, "cyan_sash": bool, "hair_half_tied": bool, "hands_on_hips": bool, "intact": bool, "beggar": bool, "young": bool, "handsome_confident": bool, "like_zhuge": bool, "face_ok": bool, "full_body": bool, "sleeves_ok": bool, "summary": "一句话"}"""
def encode(p):
with open(p, "rb") as f:
b64 = base64.b64encode(f.read()).decode()
return f"data:image/png;base64,{b64}"
def q(img):
b = json.dumps({"model": "qwen-vl-max", "input": {"messages": [{"role": "user", "content": [{"image": img}, {"text": PROMPT}]}]}})
for ep in [EP, FE]:
try:
r = subprocess.run(["curl", "-s", "-m", "90", "--noproxy", "*", "-X", "POST", ep,
"-H", f"Authorization: Bearer {AK}", "-H", "Content-Type: application/json", "--data-binary", "@-"],
input=b, capture_output=True, text=True, timeout=95)
if not r.stdout.strip():
continue
d = json.loads(r.stdout)
if "output" in d:
c = d["output"]["choices"][0]["message"]["content"][0]["text"]
if "```" in c:
c = c.split("```")[1]
c = c[4:] if c.startswith("json") else c
c = c.split("```")[0]
return json.loads(c.strip())
except Exception as e:
continue
return None
rs = []
for i, p in enumerate(CS):
print(f"[{i+1}/4]", end=" ", flush=True)
qc = q(encode(p))
if qc:
print(f"s={qc.get('score', '?')} pass={qc.get('pass', '?')}")
rs.append(qc)
else:
print("")
rs.append({"candidate": i+1, "pass": False, "error": "api"})
ok = sum(1 for r in rs if r.get("pass"))
print(f"\n通过: {ok}/4")
for r in rs:
if not r.get("pass") and "error" not in r:
iss = []
for k, v in r.items():
if isinstance(v, bool) and v:
if k in ["male", "white_robe", "cyan_sash", "hair_half_tied", "hands_on_hips", "intact", "young", "handsome_confident", "face_ok", "full_body", "sleeves_ok"]:
pass
elif k == "beggar": iss.append("乞丐感")
elif k == "like_zhuge": iss.append("像诸葛风")
else: iss.append(k)
elif isinstance(v, bool) and not v and k in ["male", "white_robe", "cyan_sash", "hair_half_tied", "hands_on_hips", "intact", "young", "handsome_confident", "face_ok", "full_body", "sleeves_ok"]:
iss.append(f"{k}")
print(f"{r.get('candidate')} ✗: {','.join(iss) if iss else '其他'} s={r.get('score')}")
rep = {"spec": "VA-05-001-V2-R6", "method": "qwen-vl-auto", "results": rs, "summary": {"passed": ok, "total": 4}}
with open(DIR / "QC-R6-BATCH.json", "w", encoding="utf-8") as f:
json.dump(rep, f, ensure_ascii=False, indent=2)
print(f"\n报告: QC-R6-BATCH.json")