通过腾讯接口人脸识别本地照片人的年龄。

所有开通腾讯云人脸识别服务的客户,每月每种服务均有10000次的免费调用额度,以资源包的形式发放到您的腾讯云账号中,优先扣除。您可以在 控制台-资源包管理 中查看免费资源包的消耗情况。离线 SDK 默认免费绑定3台设备测试60天。

只保留成年人图片

import os
import base64
from PIL import Image
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.iai.v20200303 import iai_client, models

# 获取当前文件夹下的所有jpg文件
jpg_files = [f for f in os.listdir('.') if f.endswith('.jpg')]

try:
    # 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
    # 代码泄露可能会导致 SecretId 和 SecretKey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305
    # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
    cred = credential.Credential("AKID*", "Z*")

    # 实例化一个http选项,可选的,没有特殊需求可以跳过
    httpProfile = HttpProfile()
    httpProfile.endpoint = "iai.tencentcloudapi.com"

    # 实例化一个client选项,可选的,没有特殊需求可以跳过
    clientProfile = ClientProfile()
    clientProfile.httpProfile = httpProfile

    # 实例化要请求产品的client对象,clientProfile是可选的
    client = iai_client.IaiClient(cred, "ap-beijing", clientProfile)

    # 遍历所有jpg文件,逐一检测人脸
    for filename in jpg_files:
        f = open(filename, 'rb')
        imagebytes = str(base64.b64encode(f.read()))[2:-1]
        f.close()

        req = models.DetectFaceAttributesRequest()
        params = {
            "MaxFaceNum": 1,
            "Image": imagebytes,
            "FaceAttributesType": "Age"
        }
        req.from_json_string(json.dumps(params))

        try:
            resp = client.DetectFaceAttributes(req)
            resp_dict = json.loads(resp.to_json_string())
            face_info = resp_dict["FaceDetailInfos"][0]
            age = face_info["FaceDetailAttributesInfo"]["Age"]
            if age < 18:
                print(f"图片:{filename} 人脸年龄小于:18岁 年龄为:{age}岁")
                os.remove(filename)
            else:
                print(f"图片:{filename} 人脸年龄大于等于:18岁 年龄为:{age}岁")
        except TencentCloudSDKException as err:
            print(f"图片:{filename} 检测人脸失败,错误信息:{err}")
            os.remove(filename)

except TencentCloudSDKException as err:
    print(err)

显示人脸图片的年龄

import os
import base64
from PIL import Image
import json
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.iai.v20200303 import iai_client, models

# 需要传入腾讯云账户 SecretId 和 SecretKey,此处还需注意密钥对的保密
###  密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
cred = credential.Credential("AKID*", "Z*")
httpProfile = HttpProfile()
httpProfile.endpoint = "iai.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
client = iai_client.IaiClient(cred, "ap-beijing", clientProfile)

# 定义要搜索的图像文件扩展名列表
img_exts = ['.jpg', '.jpeg', '.png', '.bmp']

# 循环当前目录中的文件并检测图像文件中的人脸年龄
for filename in os.listdir('.'):
    if os.path.isfile(filename) and os.path.splitext(filename)[1].lower() in img_exts:
        print(f"文件名: {filename}...")
        with open(filename, 'rb') as f:
            imagebytes = str(base64.b64encode(f.read()))[2:-1] # 图片转换成二进制
        req = models.DetectFaceAttributesRequest()
        params = {
            "MaxFaceNum": 1,
            "Image": imagebytes, # 图片二进制赋值给腾讯接口
            "FaceAttributesType": "Age"
        }
        req.from_json_string(json.dumps(params))
        try:
            resp = client.DetectFaceAttributes(req)
            resp_dict = json.loads(resp.to_json_string())
            age = resp_dict["FaceDetailInfos"][0]["FaceDetailAttributesInfo"]["Age"]
            if age > 18:
                print(f" (这张照片年龄是: {age} 岁,大于 18 岁).")
            else:
                print(f" (这张照片年龄是: {age} 岁,小于 18 岁).")
        except TencentCloudSDKException as err:
            print(f"  Error detecting age: {err}.")

腾讯云人脸识别提供在线 API 调用和离线识别 SDK 使用两种服务方式,您可以单独使用其中一种,也可以二者结合形成端与云方案使用。

  • 针对在线 API 调用服务方式,提供按 QPS 计费和按调用次数计费两种计费模式。
  • 针对离线识别 SDK 服务方式,提供按设备永久授权方式(50台起购)。

调用次数计费(资源包)

资源包当前不支持退款和剩余次数冻结。如需购买,请单击 购买资源包

资源包规格10万次100万次1000万次5000万次1亿次
人脸检测与分析48元450元4100元17500元25000元
五官定位198元1900元18200元82500元135000元
人脸比对318元3100元30400元142500元255000元
人脸验证318元3100元30400元142500元255000元
人脸搜索318元3100元30400元142500元255000元
人员库管理318元3100元30400元142500元255000元
资源包规格1万次10万次100万次
人脸静态活体检测(高精度版)1200元11500元100000元

调用次数计费(后付费)

月接口调用总量0 < 调用量 ≤ 300万300万<调用量 ≤ 1500万调用量 > 1500万
人脸检测与分析0.0005元/次0.0004元/次0.0003元/次
五官定位0.002元/次0.0018元/次0.0015元/次
人脸比对0.0032元/次0.003元/次0.0027元/次
人脸验证0.0032元/次0.003元/次0.0027元/次
人脸搜索0.0032元/次0.003元/次0.0027元/次
人员库管理0.0032元/次0.003元/次0.0027元/次
人脸静态活体检测(高精度版)0.15元/次0.15元/次0.15元/次

调用次数计费(资源包)

  • 示例一
    用户预计一年内调用人脸比对接口3000万次,可购买3个1000万次规格的人脸对比资源包,所需支付的费用计算如下:

30400 * 3 = 91200(元)

  • 示例二
    用户当月累计调用人脸搜索接口3200万次,调用人员搜索接口2000万次,且已购买了1个5000万次规格的人脸搜索资源包。按照资源包次数耗尽后超额使用转入后付费模式的计算方式,且人脸搜索和人员搜索接口同属于 人脸搜索相关接口 合并计算调用量,所需支付的费用计算如下:

(32000000 + 20000000 – 50000000-10000) * 0.0032 + 142500 = 148868(元)

调用次数计费(后付费)

  • 示例一
    用户当月累计调用五官定位接口 100 万次,按照阶梯到达的计算方式,所需支付的费用计算如下:

(1000000 – 10000) * 0.002 = 1980(元)

  • 示例二
    用户当月累计调用人脸比对接口350万次,按照阶梯到达的计算方式,所需支付的费用计算如下:

(3500000 – 10000) * 0.003 = 10470(元)

  • 示例三
    用户当月累计调用创建人员接口300万次、增加人脸接口200万次、获取人员库列表10万次、获取人员列表100万次,因为创建人员、增加人脸、获取人员库列表、获取人员列表四个接口同属 人员库管理相关接口,且仅创建人员和增加人脸两个子接口收费并合并计入人员库管理,按照阶梯到达的计算方式,所需支付的费用计算如下:

(3000000 + 2000000 – 10000) * 0.003 = 14970(元)

QPS 计费

  • 示例
    用户需要购买1个月 + 5天的10个 QPS,可以按照包月 + 按天的搭配模式购买,所需支付的费用计算如下:

(240 * 1 + 16 * 5) * 10 = 3200元

离线识别 SDK

按设备授权方式购买

  • 示例
    用户购买了1000台设备的离线人脸识别 SDK,按照阶梯到达的计算方式,所需支付的费用计算如下:

1000 * 118 = 118000元

公共库识别人脸代码

import os
from PIL import Image
import face_recognition

# https://github.com/Silufer/dlib-python
# setx CMAKE_C_COMPILER "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64\cl.exe"
# setx CMAKE_CXX_COMPILER "C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64\cl.exe"
# pip install face_recognition CMake Boost
# pip install cmake
# pip install dlib==19.8.1
# pip install face_recognition
# pip install opencv-contrib-python==4.1.0.25
# pip install twisted

def is_human_face(image_path):
    image = face_recognition.load_image_file(image_path)
    face_locations = face_recognition.face_locations(image)
    if len(face_locations) == 0:
        return False
    
    top, right, bottom, left = face_locations[0]
    face_width = right - left
    face_height = bottom - top
    face_area = face_width * face_height
    
    # 如果面积小于 70,视为非人脸
    if face_area < 70:
        return False
    
    return True

should_crop = input("是否需要裁剪人脸?(y/n)")
if should_crop == "y":
    should_crop = True
elif should_crop == "n":
    should_crop = False
else:
    print("无效输入,程序结束。")
    exit()

if not os.path.exists('face'):
    os.makedirs('face')

num_of_faces_detected = 0  # 统计检测到人脸的照片数量
x = 30 # 上下左右裁剪人脸间隔像素

for file_name in os.listdir('.'):
    if file_name.endswith('.jpg') or file_name.endswith('.png'):
        image_path = os.path.join('.', file_name)

        if is_human_face(image_path):
            
            # 移动原始人脸
            face_image_path = os.path.join('face', file_name)
            if os.path.exists(face_image_path):
                os.remove(face_image_path)
            os.rename(image_path, face_image_path)
            
            # 裁剪人脸区域并保存
            if should_crop:
                image = face_recognition.load_image_file(face_image_path)
                face_locations = face_recognition.face_locations(image)
                top, right, bottom, left = face_locations[0]
                top = max(0, top - x)
                bottom = min(image.shape[0], bottom + x)
                left = max(0, left - x)
                right = min(image.shape[1], right + x)
                face_image = Image.fromarray(image[top:bottom, left:right])
                face_image_path = os.path.join('face', file_name[:-4] + '_cut.jpg')
                face_image.save(face_image_path)
            
            num_of_faces_detected += 1

print("共检测到{}张人脸照片,已保存至 face 文件夹。".format(num_of_faces_detected))

if should_crop:
    print("已裁剪所有检测到的人脸,人脸上下左右各加" + str(x) + "像素,并保存至 face 文件夹中。")
最后修改:2024 年 10 月 07 日
如果觉得我的文章对你有用,请随意赞赏