Files
juzi/reference/facepp-skinanalyze/SKILL.md
T
2026-09-26 16:23:59 +08:00

116 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: facepp-skinanalyze
description: 旷视Face++皮肤分析专业版(skinanalyze_pro)标准调用与报告技能。触发词:跑测肤/皮肤检测/巨子测肤/肤质分析/skinanalyze。覆盖凭据管理、API调用模板、参数坑、三维度×6分类评分公式(2026-09-26版)、AR列真值源、Excel报告生成铁律。适用于任何Agent调用旷视测肤接口或生成肤质报告。
version: 1.1.0
author: lynaimining
---
# facepp-skinanalyze(旷视皮肤分析专业版调用技能)
巨子测肤项目实测验证(2026-09)。禁止现场手写列号脚本——那是「肌肤年龄空列/错位3格」事故根因。
## 1. 凭据(统一管理)
```bash
set -a; source ~/.openclaw/credentials.env; set +a
# FACEPP_API_KEY / FACEPP_API_SECRET / FACEPP_SKINANALYZE_URL
# 新凭据一律存 ~/.openclaw/credentials.env(chmod 600),不散落、不明文入库
# 控制台: https://console.faceplusplus.com.cn —— 必须用「正式」key,试用 key 调不了专业版(见第 2 节坑清单)
```
当前凭据状态(2026-09-26 下午更新):
- `FACEPP_API_KEY` = `EcZi…`(32 位,**正式 key**)✅
- `FACEPP_API_SECRET` = 32 位 ✅(2026-09-26 从微信 ClawBot 2026-09-22 17:51 记录找回)
- `FACEPP_SKINANALYZE_URL` = `https://api-cn.faceplusplus.com/facepp/v1/skinanalyze_pro` ✅
- ✅ pro 端点实测可用(含三视图/下颌线)。正式 key 也有并发窗口:串行 + 间隔 4 秒,偶发 CONCURRENCY_LIMIT_EXCEEDED 自动重试即可
## 2. 标准调用模板(全可选参数,每次都带)
```bash
curl -s "$FACEPP_SKINANALYZE_URL" \
-F api_key=$FACEPP_API_KEY -F api_secret=$FACEPP_API_SECRET -F image_file=@$IMG \
-F "return_maps=water_area,red_area,brown_area,texture_enhanced_pores,texture_enhanced_blackheads,texture_enhanced_oily_area,texture_enhanced_lines,rough_area,roi_outline_map,texture_enhanced_bw" \
-F "return_marks=wrinkle_mark,melanin_mark,dark_circle_outline"
```
一键脚本见 examples/call_skinanalyze.sh(单正脸版)/ examples/call_skinanalyze_3view.sh(三视图版,含重试,2026-09-26 实测通过)。
## 2b. 三视图调用模板(正脸 + 双侧脸 → 下颌线)
```bash
bash examples/call_skinanalyze_3view.sh <正脸图> <左侧脸图> <右侧脸图> [输出json]
```
- 参数:`image_file` + `left_side_image_file` + `right_side_image_file` + `return_side_results=jawline_info`
- 下颌线返回在**顶层** `left_side_result` / `right_side_result`(不在 result 里)
- `jawline_quality` 必须 =1 角度才有效(2=侧脸<20°/3=>120°/4=无人脸/5=无效/6=其它)
- 脚本内置 3 次递增退避重试(10s/20s/30s),应对正式 key 的偶发并发限制
- 示例图片在 examples/images/(1 组三视图:正脸 C3_180.jpg + 左 C3_135.jpg + 右 C3_-135.jpg)
实测坑清单:
- `roi_outline_color` 报 BAD_ARGUMENTS(ff0000/CCOOFF 均拒绝)→ 弃用,用默认色
- `left/right_roi_outline_map` 请求了也不返回(接口行为)
- sensitivity 对象缺返回只发生在不带 return_maps 的调用;带全参数后每次都返回
- jawline_score/cheekbone_mark 需侧脸图(left/right_side_image_file + return_side_results=jawline_info),纯正脸永远拿不到
- **✅ 三视图调用(2026-09-26 实测通)**:正脸 image_file + `left_side_image_file`/`right_side_image_file` + `return_side_results=jawline_info`。下颌线返回在**顶层** `left_side_result`/`right_side_result`(不在 result 里!):`jawline_angle`(标准区间 116–120°,angle_level 0=标准)、`jawline_quality`(=1 才有效,2=侧脸角度<20°/3=>120°/4=无人脸/5=无效/6=其它)。接口不判断左右图是否传反,建议两侧都传
- 正脸/侧脸判定:看 `result.image_quality.face_orientation.yaw`(|yaw|<10° 正脸,±40–50° 侧脸)
- `face_maps` 返回 base64(red_area 是 jpeg 头、其余 png),解码后 openpyxl add_image 嵌入
- 返回图 url 需下载保存,原始 JSON 落盘
- 试用 key 有公用并发限制(CONCURRENCY_LIMIT_EXCEEDED→串行+重试);专业版必须正式 key
- **✅ 2026-09-26 已换正式 key(EcZi…)并验证 pro 可用**。正式 key 也有并发窗口:连续快速调用偶发 CONCURRENCY_LIMIT_EXCEEDED,**串行 + 间隔 4 秒**即可
- **🔴 头号坑:试用 api_key 根本调不了专业版。** 旷视技术顾问 2026-09-22 在「巨子生物肌肤检测专业版技术对接」群明确答复:
- 「所有用户试用 api_key 是公用并发的」→ 密集调用必报 `CONCURRENCY_LIMIT_EXCEEDED`
- 「**试用 api_key 不能调用皮肤分析专业版**」「**专业版只能用正式 api_key 来调用**」
- 2026-09-26 复测:当前 `cAa5…` 调 pro **12/12 次全部 CONCURRENCY_LIMIT_EXCEEDED**(跨 3 分钟、带/不带可选参数、换图均失败)→ **重试无用,不要浪费时间重试**
- **解法**:到 https://console.faceplusplus.com.cn 控制台**创建正式 API Key**(不是试用)后替换 credentials.env。拿到正式 key 前,pro 重跑这条路是堵的
- 同 key 调**标准版 `skinanalyze`(非 pro)可以通**,但只返回老版枚举字段(pores_forehead/eye_pouch/nasolabial_fold/dark_circle/skin_type 等 value 0–2),**没有** water_score / sensitivity_score / sensitivity_area / melanin_score / wrinkle_info 分区分 / pores_type_score / skin_age,算不了现行六分类 → **不能替代 pro**,别拿它凑数
## 3. 三维度 × 6 分类 P/S 计算(2026-09-26 生效,取代旧六维)
> ⚠️ 旧的六维度(衰老/色沉/粗糙/皱纹/水分/敏感)已废弃。现行为 **紧塑力 / 活力感 / 稳定力** 三维度,各辖 2 个分类。用户另有一版拍板:产品分组按**真实年龄**而非 skin_age(见第 4 节)。
| 维度 | 分类 | P 公式 |
|---|---|---|
| 紧塑力 | 轮廓 | eye_pouch 严重度映射:0→100 / 1→90 / 2→79 / 3→74(下颌线、苹果肌需侧脸图,正脸永远拿不到) |
| 紧塑力 | 皱纹 | `100 − max(12 分区 wrinkle_score)`;分区 severity≥2→锁 79,≥3→锁 74 |
| 活力感 | 光滑 | `0.4×min(4 分区 pores_type_score) + 0.3×blackhead_score + 0.3×rough_score(纹理分)`;分区毛孔 severity≥2→锁 79 |
| 活力感 | 肤色水润 | `0.5×(melanin_score − melasma×10 − freckle×5) + 0.5×water_score`;water_severity≥60 且 water_score≥80→按 severity 换算 |
| 稳定力 | 敏感 | `min(sensitivity_score, 100 − sensitivity_area×1.5)`;面积≥15%→79,≥30%→74(面积用**百分比**口径) |
| 稳定力 | 痘痘 | `min(acne_score 分级映射, 100 − 计数扣分)`;分级 ≥95→100 / 85–94→85 / 75–84→70 / <75→55;扣分 = 闭口×1+丘疹×2+脓包×4+结节×6+痘印×1.5,封顶 50。**新增维度,无来源文档背书,待客户确认** |
- 维度 P = `min(旗下两个分类 P)`(木桶口径)
- `S = 7 + 3×P/100`,保留两位;档位 `P<80 预警 / 80–89 改善 / ≥90 良好`
- **判档一律用未四舍五入的原值**(曾因先四舍五入到 9.0 再判档,把 8.9967 错挂 25+ 束紧)
### 3.1 本轮踩过的坑(务必避复)
- **AQ 列 JSON 被 Excel 32767 字符截断 → 不要拿它当重算主数据源**。真值在源表的 **AR「六维公式记录」列**:那是当年用完整 JSON 生成的计算记录,63/63 行含 `min(pores_type_score)`、`max(wrinkle_score)`、`severity`、`water_severity`、`blackhead_score`、`skin_type_score`。**缺真值时先查 AR 列,不要急着重跑接口**
- **不要从旧文案列正则反解字段**,会串字段(实测 water_severity 反解 57/63 取值错误)
- **不要靠「旧 P 恰为某阈值」反推锁值**。曾据此误判 Excel 行 51/52/53 触发锁值,实为 `0.4×100+0.3×100+0.3×肤质分(30)=79` 的自然结果。严谨做法:比对「记录值 vs 自然计算值」,差值才是锁值痕迹(实测触发 0 次)
- **旧表只在 severity≥2(触发锁值)时才记录 severity**,故 AR 里 severity 实际 57/63 可得,缺的行意味着 severity<2
- 毛孔分不可用整脸 `pores_score` 退化(偏高),必须 `min(pores_type_score)`(实测 43 行偏差,最大 7.6 分)
## 4. 产品分组公式
- **当前口径(用户拍板)**:按**真实年龄** —— <32→25+组;32–45→35+组;>45→50+组;肌肤年龄钳制在真实年龄 ±3 内
- **文档口径(V1.2 第四章)**:按接口测出的 `skin_age` 定组,skin_age 本身不得改写,只有落在组边界 ±3 岁模糊带才允许 R1–R4 跨组修正。**当前实现偏离 V1.2,须向客户明示**
- 辅助判据:25+ 看 dark_circle_severity/eye_pouch/fine_line;35+ 看 nasolabial_fold_severity/wrinkle_deep_num;50+ 看 mouth_wrinkle/rough_severity/色素累积
## 5. Excel 报告铁律(必须遵守)
1. 禁止硬编码列号/col 递增。用「表头名→列号」映射:`hdr_col = {ws.cell(2,j).value.split('\n')[0].strip(): j}`,写入 `ws.cell(row, hdr_col['肌肤年龄 skin_age'], v)`
2. 跳过 IMG/NAME/RUN 元数据列时单独处理,指标列只走映射
3. 写完必须自校验:抽查首行逐项断言 `ws.cell(row, hdr_col[表头]).value == 写入值`,不一致立即报错,不许静默保存
4. 结果图直接嵌入表格单元格(openpyxl add_image),不能只给 URL 列
5. **删列/插列与图片锚点(2026-09-26 实测坑)**:
- xlsx 的 `drawing1.xml` 锚点列号是 **0 基**,别当 1 基算(曾因此把 264 张图错位 18 列)
- 原生文件与 openpyxl 保存过的文件 **rid 编号体系不同**(rId0 起始 vs rId1 起始),跨文件按 rid 对锚点会错位
- 大改(删 10+ 列)别在成品上叠补丁:**从干净备份整体重建**,一次性按映射改 sheet1.xml + drawing1.xml 再重打包
- openpyxl 的 insert_cols/delete_cols 在锚点列**之后**操作安全;跨锚点列必错
- 校验锚点看分布:本表应为 {col0:23, col21:88, col22:88, col23:88}(同格多图靠 colOff 侧排是原表设计,不算重复)
## 6. 其他 Agent 调用约定
- 接口调用统一走 examples/call_skinanalyze.sh,凭据只从 ~/.openclaw/credentials.env 读取
- 原始返回 JSON 必须落盘再处理,不要在内存里即调即丢(方便复核)
- 生成 Excel 后:抽查首行自校验 + afplay Glass.aiff + open 打开文件