save
This commit is contained in:
@@ -0,0 +1,17 @@
|
||||
#!/usr/bin/env bash
|
||||
# Face++ skinanalyze_pro 标准调用
|
||||
# 用法: call_skinanalyze.sh <图片路径> [输出json路径]
|
||||
set -euo pipefail
|
||||
set -a; source "${CREDENTIALS_ENV:-$HOME/.openclaw/credentials.env}"; set +a
|
||||
IMG=${1:?用法: call_skinanalyze.sh <图片路径> [输出json]}
|
||||
OUT=${2:-/tmp/skinanalyze_result.json}
|
||||
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=@"$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" | tee "$OUT"
|
||||
python3 - "$OUT" <<'PY'
|
||||
import json,sys
|
||||
d=json.load(open(sys.argv[1]))
|
||||
assert 'error_message' not in d, d.get('error_message')
|
||||
print('OK, top keys:', ', '.join(sorted(d.keys())[:10]))
|
||||
PY
|
||||
@@ -0,0 +1,50 @@
|
||||
#!/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
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 809 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 790 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 736 KiB |
Reference in New Issue
Block a user