51 lines
2.1 KiB
Bash
51 lines
2.1 KiB
Bash
#!/usr/bin/env bash
|
||
# Face++ skinanalyze_pro 三视图调用(正脸 + 左右侧脸 → 下颌线)
|
||
# 用法: call_skinanalyze_3view.sh <正脸图> <左侧脸图> <右侧脸图> [输出json]
|
||
set -euo pipefail
|
||
set -a; source "${CREDENTIALS_ENV:-$HOME/.openclaw/credentials.env}"; set +a
|
||
|
||
FRONT=${1:?用法: call_skinanalyze_3view.sh <正脸图> <左侧脸图> <右侧脸图> [输出json]}
|
||
LEFT=${2:?缺左侧脸图}
|
||
RIGHT=${3:?缺右侧脸图}
|
||
OUT=${4:-/tmp/skinanalyze_3view_result.json}
|
||
|
||
retry() {
|
||
local n=0
|
||
until [ "$n" -ge 3 ]; do
|
||
RESP=$(curl -s "${FACEPP_SKINANALYZE_URL:-https://api-cn.faceplusplus.com/facepp/v1/skinanalyze_pro}" \
|
||
-F api_key=$FACEPP_API_KEY -F api_secret=$FACEPP_API_SECRET \
|
||
-F image_file=@"$FRONT" \
|
||
-F left_side_image_file=@"$LEFT" \
|
||
-F right_side_image_file=@"$RIGHT" \
|
||
-F "return_side_results=jawline_info" \
|
||
-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")
|
||
if ! echo "$RESP" | grep -q 'error_message'; then
|
||
echo "$RESP" > "$OUT"
|
||
return 0
|
||
fi
|
||
n=$((n+1))
|
||
echo "第${n}次失败: $(echo "$RESP" | head -c 120),${n}0秒后重试..." >&2
|
||
sleep $((n*10))
|
||
done
|
||
echo "$RESP" > "$OUT"
|
||
return 1
|
||
}
|
||
|
||
retry || { echo "三次重试均失败" >&2; exit 1; }
|
||
|
||
python3 - "$OUT" <<'PY'
|
||
import json, sys
|
||
d = json.load(open(sys.argv[1]))
|
||
assert 'error_message' not in d, d.get('error_message')
|
||
r = d['result']; si = r['score_info']
|
||
ls = d.get('left_side_result', {}).get('left_jawline_info', {})
|
||
rs = d.get('right_side_result', {}).get('right_jawline_info', {})
|
||
print('OK skin_age:', r['skin_age']['value'],
|
||
'| total:', si['total_score'],
|
||
'| 左下颌线:', ls.get('left_jawline_angle'), '°(q%s)' % ls.get('left_jawline_quality'),
|
||
'| 右下颌线:', rs.get('right_jawline_angle'), '°(q%s)' % rs.get('right_jawline_quality'),
|
||
'| 标准区间 116-120°')
|
||
print('完整结果已存', sys.argv[1])
|
||
PY
|