You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Azure Face API批量裁剪人脸遇403/UnsupportedFeature错误求排查

问题描述

编写了一个Python函数,通过OpenCV加载图片,调用Microsoft Azure Cognitive Services Face API检测人脸并裁剪保存。处理Google Drive中525张图片时,调用API出现错误:

"code": "InvalidRequest",
"message": "Invalid request has been sent.",
"innererror": {
  "code": "UnsupportedFeature",
  "message": "Feature is not supported, missing approval for one or more of the following features: Identification, Verification."
}

仅需一次性批量裁剪人脸,无需部署应用,不想申请审批,怀疑代码配置有误,附上函数代码:

def detect_face(image_path):
    # Load image using OpenCV
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    # Convert image to binary data
    _, img_encoded = cv2.imencode('.jpg', image)

    # Set API endpoint and subscription key
    url = private_API_endpoint_value 
    subscription_key = private_key_value

    # Set headers and parameters for API call
    headers = {
        'Content-Type': 'application/octet-stream',
        'Ocp-Apim-Subscription-Key': subscription_key
    }
    params = {
        'returnFaceId': 'true',
        'returnFaceLandmarks': 'false',
        'returnFaceAttributes': 'age,gender,emotion,facialHair,glasses,hair,makeup,occlusion,smile',

    }

    # Send API call with image data
    response = requests.post(url, headers=headers, params=params, data=img_encoded.tobytes())
    if response.status_code != 200:
      print(f"Error: {response.status_code} - {response.text}")

    # Check if API call was successful
    if response.status_code == 200:
        # Parse response and get face rectangle coordinates
        data = json.loads(response.text)
        if data:
            face_rect = data[0]['faceRectangle']
            x, y, w, h = face_rect['left'], face_rect['top'], face_rect['width'], face_rect['height']

            # Crop image to just the face and save as new file
            face_image = image[y:y+h, x:x+w]
            face_path = os.path.splitext(image_path)[0] + "_face.jpg"
            cv2.imwrite(face_path, face_image)

            # Return path to new face image
            return face_path

    # If API call was unsuccessful, return None
    return None
问题排查与解决方案

核心问题

错误是因为请求中包含了需要审批的识别类功能(returnFaceId=true),或使用了错误的API端点(识别/验证端点而非纯检测端点)。人脸检测(获取人脸框)属于基础功能,无需审批。

具体修复步骤

  1. 确认API端点正确性
    确保url是人脸检测专用端点,格式为:

    https://<你的区域>.api.cognitive.microsoft.com/face/v1.0/detect
    

    不要使用identify/verify等需要审批的端点。

  2. 调整请求参数
    将returnFaceId设为'false',去掉识别类依赖:

    params = {
        'returnFaceId': 'false',
        'returnFaceLandmarks': 'false',
        'returnFaceAttributes': 'age,gender,emotion,facialHair,glasses,hair,makeup,occlusion,smile',
    }
    

    人脸属性检测属于基础功能,无需审批,可以保留。

  3. 验证修改
    重新调用函数,此时API仅返回人脸框和属性,不会触发审批要求。

替代方案(本地人脸检测,无需API)

如果不想依赖Azure API,直接用OpenCV本地人脸检测,完全无需申请任何权限,适合批量处理:

import cv2
import os

def detect_face_local(image_path):
    # 加载Haar级联分类器
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    image = cv2.imread(image_path)
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 检测人脸
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
    
    if len(faces) > 0:
        x, y, w, h = faces[0]
        face_image = image[y:y+h, x:x+w]
        face_path = os.path.splitext(image_path)[0] + "_face.jpg"
        cv2.imwrite(face_path, face_image)
        return face_path
    return None

该方案无需网络,处理速度更快,适合一次性批量任务。

内容的提问来源于stack exchange,提问作者Spencer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 05:53:15