|
# -*- coding: utf-8 -*-
|
|
"""
|
人脸识别
|
"""
|
|
import re
|
import sys
|
import math
|
import time
|
from .base import AipBase
|
from .base import base64
|
from .base import json
|
from .base import urlencode
|
from .base import quote
|
|
class AipFace(AipBase):
|
|
"""
|
人脸识别
|
"""
|
|
__detectUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/detect'
|
|
__searchUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/search'
|
|
__multiSearchUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/multi-search'
|
|
__userAddUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/add'
|
|
__userUpdateUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/update'
|
|
__faceDeleteUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/delete'
|
|
__userGetUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/get'
|
|
__faceGetlistUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/face/getlist'
|
|
__groupGetusersUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getusers'
|
|
__userCopyUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/copy'
|
|
__userDeleteUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/user/delete'
|
|
__groupAddUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/add'
|
|
__groupDeleteUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/delete'
|
|
__groupGetlistUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceset/group/getlist'
|
|
__personVerifyUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/person/verify'
|
|
__videoSessioncodeUrl = 'https://aip.baidubce.com/rest/2.0/face/v1/faceliveness/sessioncode'
|
|
__verifyUrl = "https://aip.baidubce.com/rest/2.0/face/v4/mingjing/verify"
|
|
__faceMatchUrlV4 = 'https://aip.baidubce.com/rest/2.0/face/v4/mingjing/match'
|
|
__onlinePictureLiveV4 = 'https://aip.baidubce.com/rest/2.0/face/v4/faceverify'
|
|
__facelivenessVerifyV1Url = 'https://aip.baidubce.com/rest/2.0/face/v1/faceliveness/verify'
|
__facePersonIdmatchV3Url = 'https://aip.baidubce.com/rest/2.0/face/v3/person/idmatch'
|
__faceMergeV1Url = 'https://aip.baidubce.com/rest/2.0/face/v1/merge'
|
__faceSkinSmoothV1Url = 'https://aip.baidubce.com/rest/2.0/face/v1/editattr'
|
__faceLandmarkV1Url = 'https://aip.baidubce.com/rest/2.0/face/v1/landmark'
|
__faceSceneFacesetUserAddUrl = 'https://aip.baidubce.com/rest/2.0/face/scene/faceset/user/add'
|
__faceSceneFacesetUserUpdateUrl = 'https://aip.baidubce.com/rest/2.0/face/scene/faceset/user/update'
|
__faceSceneFacesetGroupAddUrl = 'https://aip.baidubce.com/rest/2.0/face/scene/faceset/group/add'
|
__faceCaptureSearchUrl = 'https://aip.baidubce.com/rest/2.0/face/capture/search'
|
__faceFaceverifyV4Url = 'https://aip.baidubce.com/rest/2.0/face/v4/faceverify'
|
__faceMingjingVerifyV4Url = 'https://aip.baidubce.com/rest/2.0/face/v4/mingjing/verify'
|
__faceMingjingMatchV4Url = 'https://aip.baidubce.com/rest/2.0/face/v4/mingjing/match'
|
__faceIdmatchDateV4Url = 'https://aip.baidubce.com/rest/2.0/face/v4/idmatch_date'
|
__faceVerifyDateV4Url = 'https://aip.baidubce.com/rest/2.0/face/v4/verify_date'
|
|
|
def detect(self, image, image_type, options=None):
|
"""
|
人脸检测
|
"""
|
options = options or {}
|
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
|
data.update(options)
|
return self._request(self.__detectUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def search(self, image, image_type, group_id_list, options=None):
|
"""
|
人脸搜索
|
"""
|
options = options or {}
|
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['group_id_list'] = group_id_list
|
|
data.update(options)
|
return self._request(self.__searchUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def multiSearch(self, image, image_type, group_id_list, options=None):
|
"""
|
人脸搜索 M:N 识别
|
"""
|
options = options or {}
|
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['group_id_list'] = group_id_list
|
|
data.update(options)
|
return self._request(self.__multiSearchUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def addUser(self, image, image_type, group_id, user_id, options=None):
|
"""
|
人脸注册
|
"""
|
options = options or {}
|
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['group_id'] = group_id
|
data['user_id'] = user_id
|
|
data.update(options)
|
return self._request(self.__userAddUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def updateUser(self, image, image_type, group_id, user_id, options=None):
|
"""
|
人脸更新
|
"""
|
options = options or {}
|
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['group_id'] = group_id
|
data['user_id'] = user_id
|
|
data.update(options)
|
return self._request(self.__userUpdateUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceDelete(self, user_id, group_id, face_token, options=None):
|
"""
|
人脸删除
|
"""
|
options = options or {}
|
|
data = {}
|
data['user_id'] = user_id
|
data['group_id'] = group_id
|
data['face_token'] = face_token
|
|
data.update(options)
|
return self._request(self.__faceDeleteUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def getUser(self, user_id, group_id, options=None):
|
"""
|
用户信息查询
|
"""
|
options = options or {}
|
|
data = {}
|
data['user_id'] = user_id
|
data['group_id'] = group_id
|
|
data.update(options)
|
return self._request(self.__userGetUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceGetlist(self, user_id, group_id, options=None):
|
"""
|
获取用户人脸列表
|
"""
|
options = options or {}
|
|
data = {}
|
data['user_id'] = user_id
|
data['group_id'] = group_id
|
|
data.update(options)
|
return self._request(self.__faceGetlistUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def getGroupUsers(self, group_id, options=None):
|
"""
|
获取用户列表
|
"""
|
options = options or {}
|
|
data = {}
|
data['group_id'] = group_id
|
|
data.update(options)
|
return self._request(self.__groupGetusersUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def userCopy(self, user_id, options=None):
|
"""
|
复制用户
|
"""
|
options = options or {}
|
|
data = {}
|
data['user_id'] = user_id
|
|
data.update(options)
|
return self._request(self.__userCopyUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def deleteUser(self, group_id, user_id, options=None):
|
"""
|
删除用户
|
"""
|
options = options or {}
|
|
data = {}
|
data['group_id'] = group_id
|
data['user_id'] = user_id
|
|
data.update(options)
|
return self._request(self.__userDeleteUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def groupAdd(self, group_id, options=None):
|
"""
|
创建用户组
|
"""
|
options = options or {}
|
|
data = {}
|
data['group_id'] = group_id
|
|
data.update(options)
|
return self._request(self.__groupAddUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def groupDelete(self, group_id, options=None):
|
"""
|
删除用户组
|
"""
|
options = options or {}
|
|
data = {}
|
data['group_id'] = group_id
|
|
data.update(options)
|
return self._request(self.__groupDeleteUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def getGroupList(self, options=None):
|
"""
|
组列表查询
|
"""
|
options = options or {}
|
|
data = {}
|
|
data.update(options)
|
return self._request(self.__groupGetlistUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def personVerify(self, image, image_type, id_card_number, name, options=None):
|
"""
|
身份验证
|
"""
|
options = options or {}
|
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['id_card_number'] = id_card_number
|
data['name'] = name
|
|
data.update(options)
|
return self._request(self.__personVerifyUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def videoSessioncode(self, options=None):
|
"""
|
语音校验码接口
|
"""
|
options = options or {}
|
|
data = {}
|
|
data.update(options)
|
return self._request(self.__videoSessioncodeUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
|
__faceverifyUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/faceverify'
|
|
def faceverify(self, images):
|
"""
|
在线活体检测
|
"""
|
|
return self._request(self.__faceverifyUrl, json.dumps(images, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
__matchUrl = 'https://aip.baidubce.com/rest/2.0/face/v3/match'
|
|
def match(self, images):
|
"""
|
人脸比对
|
"""
|
|
return self._request(self.__matchUrl, json.dumps(images, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceMingJingVerify(self, id_card_number, name, image, options=None):
|
"""
|
人脸 - 人脸实名认证V4
|
"""
|
options = options or {}
|
|
data = {}
|
data['id_card_number'] = id_card_number
|
data['name'] = name
|
data['image'] = image
|
|
data.update(options)
|
return self._request(self.__verifyUrl, json.dumps(data, ensure_ascii=False),
|
{'Content-Type': 'application/json;charset=utf-8'})
|
|
def faceMingJingMatch(self, image, imageType, registerImage, registerImageType, options=None):
|
"""
|
人脸 - 人脸对比V4
|
"""
|
options = options or {}
|
|
data = {}
|
data['image'] = image
|
data['image_type'] = imageType
|
data['register_image'] = registerImage
|
data['register_image_type'] = registerImageType
|
|
data.update(options)
|
return self._request(self.__faceMatchUrlV4, json.dumps(data, ensure_ascii=False),
|
{'Content-Type': 'application/json;charset=utf-8'})
|
|
def onlinePictureLiveV4(self, sdkVersion, options=None):
|
"""
|
人脸 - 在线图片活体V4
|
"""
|
options = options or {}
|
|
data = {}
|
data['sdk_version'] = sdkVersion
|
|
data.update(options)
|
return self._request(self.__onlinePictureLiveV4, json.dumps(data, ensure_ascii=False),
|
{'Content-Type': 'application/json;charset=utf-8'})
|
|
|
def facelivenessVerifyV1(self, video_base64, options=None):
|
"""
|
H5视频活体检测
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/Ikrycq2k2#12-%E8%A7%86%E9%A2%91%E6%B4%BB%E4%BD%93%E6%A3%80%E6%B5%8B%E6%8E%A5%E5%8F%A3
|
"""
|
options = options or {}
|
data = {}
|
data['video_base64'] = video_base64
|
data.update(options)
|
return self._request(self.__facelivenessVerifyV1Url, data)
|
|
def facePersonIdmatchV3(self, id_card_number, name, options=None):
|
"""
|
身份证与名字比对
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/Tkqahnjtk
|
"""
|
options = options or {}
|
data = {}
|
data['id_card_number'] = id_card_number
|
data['name'] = name
|
data.update(options)
|
return self._request(self.__facePersonIdmatchV3Url, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceMergeV1(self, image_template, image_target, options=None):
|
"""
|
人脸融合
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/5k37c1ti0
|
"""
|
options = options or {}
|
data = {}
|
data['image_template'] = image_template
|
data['image_target'] = image_target
|
data.update(options)
|
return self._request(self.__faceMergeV1Url, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceSkinSmoothV1(self, image, image_type, action_type, options=None):
|
"""
|
人脸属性编辑
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/vk6rm5lj5
|
"""
|
options = options or {}
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['action_type'] = action_type
|
data.update(options)
|
return self._request(self.__faceSkinSmoothV1Url, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceLandmarkV1(self, image, image_type, options=None):
|
"""
|
人脸关键点检测
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/sk8a5xewt
|
"""
|
options = options or {}
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data.update(options)
|
return self._request(self.__faceLandmarkV1Url, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceSceneFacesetUserAdd(self, image, image_type, group_id, user_id, scene_type, options=None):
|
"""
|
场景化(人脸注册)
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/Aknhmx6hi#%E4%BA%BA%E8%84%B8%E5%BA%93%E7%AE%A1%E7%90%86%EF%BC%88%E5%9C%BA%E6%99%AF%E5%8C%96%EF%BC%89-%E4%BA%BA%E8%84%B8%E6%B3%A8%E5%86%8C
|
"""
|
options = options or {}
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['group_id'] = group_id
|
data['user_id'] = user_id
|
data['scene_type'] = scene_type
|
data.update(options)
|
return self._request(self.__faceSceneFacesetUserAddUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceSceneFacesetUserUpdate(self, image, image_type, group_id, user_id, scene_type, options=None):
|
"""
|
场景化(人脸更新)
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/Aknhmx6hi#%E4%BA%BA%E8%84%B8%E5%BA%93%E7%AE%A1%E7%90%86%EF%BC%88%E5%9C%BA%E6%99%AF%E5%8C%96%EF%BC%89-%E4%BA%BA%E8%84%B8%E6%9B%B4%E6%96%B0
|
"""
|
options = options or {}
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['group_id'] = group_id
|
data['user_id'] = user_id
|
data['scene_type'] = scene_type
|
data.update(options)
|
return self._request(self.__faceSceneFacesetUserUpdateUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceSceneFacesetGroupAdd(self, group_id, scene_type, options=None):
|
"""
|
场景化(创建用户组)
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/Aknhmx6hi#%E4%BA%BA%E8%84%B8%E5%BA%93%E7%AE%A1%E7%90%86%EF%BC%88%E5%9C%BA%E6%99%AF%E5%8C%96%EF%BC%89-%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E7%BB%84
|
"""
|
options = options or {}
|
data = {}
|
data['group_id'] = group_id
|
data['scene_type'] = scene_type
|
data.update(options)
|
return self._request(self.__faceSceneFacesetGroupAddUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceCaptureSearch(self, image, image_type, group_id_list, options=None):
|
"""
|
场景化(1:N识别)
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/Aknhmx6hi
|
"""
|
options = options or {}
|
data = {}
|
data['image'] = image
|
data['image_type'] = image_type
|
data['group_id_list'] = group_id_list
|
data.update(options)
|
return self._request(self.__faceCaptureSearchUrl, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceIdmatchDateV4(self, name, id_card_number, start_date, end_date, options=None):
|
"""
|
身份证信息及有效期核验接口
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/elav5puig
|
"""
|
options = options or {}
|
data = {}
|
data['name'] = name
|
data['id_card_number'] = id_card_number
|
data['start_date'] = start_date
|
data['end_date'] = end_date
|
data.update(options)
|
return self._request(self.__faceIdmatchDateV4Url, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|
|
def faceVerifyDateV4(self, name, id_card_number, start_date, end_date, image, image_type, options=None):
|
"""
|
人脸实名信息及有效期核验
|
接口使用说明文档: https://ai.baidu.com/ai-doc/FACE/qlav5rwms
|
"""
|
options = options or {}
|
data = {}
|
data['name'] = name
|
data['id_card_number'] = id_card_number
|
data['start_date'] = start_date
|
data['end_date'] = end_date
|
data['image'] = image
|
data['image_type'] = image_type
|
data.update(options)
|
return self._request(self.__faceVerifyDateV4Url, json.dumps(data, ensure_ascii=False), {
|
'Content-Type': 'application/json',
|
})
|