前阵子试用旷视face++,调用的是WebAPI,因为官方给出的代码示例太过复杂,所以进行了一下改写,主要实现了人脸检测到人脸识别的功能。
1.人脸识别detect-API
我这里调用opencv的库来获取本机上的摄像头。
def detect_face( key,secret):
'''
key,secret:face++控制台上自己注册
'''
#人脸检测api的url
http_url = "https://api-cn.faceplusplus.com/facepp/v3/detect"
#return_attributes是要返回的具体属性,我的是头部姿势,模糊,人眼状态,脸部质量,嘴部状态,人眼角度
data = {"api_key": key, "api_secret": secret,
'return_attributes': 'headpose,blur,eyestatus,facequality,mouthstatus,eyegaze'}
try:
#获取本机摄像头,一般情况下是0,有多个摄像头也有可能是其他数字
cap = cv2.VideoCapture(0)
except Exception as e:
print(e,"获取摄像头画面出错")
return
post_num=0
while True:
ret, frame = cap.read()
# 写入摄像头捕捉的画面
cv2.imwrite("./imgResource/segment.jpg", frame)
files = {"image_file": open('./imgResource/segment.jpg', "rb")}
# 发送请求
response = requests.post(http_url, data=data, files=files)
da = json.loads(response.text)
if da['faces']:
if pic_standard(da) == 1:
# 裁剪,获取脸部图片
face_token=da['faces'][0]['face_token']
face_rectangle = da['faces'][0]['face_rectangle']
img = cv2.imread(filepath1, 1)
y1 = face_rectangle['top'] + face_rectangle['height']
y0 = face_rectangle['top']
x0 = face_rectangle['left']
x1 = face_rectangle['width'] + face_rectangle['left']
dst = img[y0:y1, x0:x1]
cv2.imwrite("./imgResource/details.jpg", dst)
cv2.imshow("capture", dst)
# 图像采集成功
return face_token
else:
print(pic_standard(da))
if cv2.waitKey(25) == 27: # 返回键码,esc键退出
break
cv2.destroyAllWindows()
2.Faceset create API
创建一个人脸的集合 FaceSet,用于存储人脸标识 face_token。一个 FaceSet 能够存储10000个 face_token。
试用API Key可以创建1000个FaceSet,正式API Key可以创建10000个FaceSet。
def create_faceset(key,secret,outer_id):
'''
创建一个人脸的集合 FaceSet,用于存储人脸标识 face_token。一个 FaceSet 能够存储10000个 face_token。
'''
http_url = "https://api-cn.faceplusplus.com/facepp/v3/faceset/create"
data = {"api_key": key, "api_secret": secret,
'outer_id': str(outer_id)}
# 发送请求
response = requests.post(http_url, data=data)
da = json.loads(response.text)
return da
3.Faceset Addface API
为一个已经创建的 FaceSet 添加人脸标识 face_token。一个 FaceSet 最多存储1,000个 face_token。
def add_faceToset(self,face_token):
'''
为一个已经创建的 FaceSet 添加人脸标识 face_token。一个 FaceSet 最多存储1,000个 face_token。
:return:
'''
http_url = "https://api-cn.faceplusplus.com/facepp/v3/faceset/addface"
data = {"api_key": key, "api_secret": secret,
'outer_id': str(outer_id),"face_tokens":face_token}
# 发送请求
response = requests.post(http_url, data=data, files=files)
da = json.loads(response.text)
return da
4.人脸识别Search API
在一个已有的 FaceSet 中找出与目标人脸最相似的一张或多张人脸,返回置信度和不同误识率下的阈值。
支持传入图片或 face_token 进行人脸搜索。使用图片进行搜索时会选取图片中检测到人脸尺寸最大的一个人脸。
def search_face(face_token,num_id):
'''
在一个已有的 FaceSet 中找出与目标人脸最相似的一张或多张人脸,返回置信度和不同误识率下的阈值。
这个例子是循环所有的Faceset,寻找目标
param face_token:
num_id:face_token的总数
'''
http_url = "https://api-cn.faceplusplus.com/facepp/v3/search"
num_outer = num_id // 10000 + 1
for i in range(1,num_outer+1):
data = {"api_key": key, "api_secret": secret,
'outer_id':i,"face_token":face_token}
# 发送请求
response = requests.post(http_url, data=data)
da = json.loads(response.text)
if 'results' in da:
return da['results']
else:
return "未检测到人脸"
总结
face++的试用版可以用来测试效果,如需实际部署可以再联系旷视商务定制服务。我测试的效果还是可以的,离线的sdk官网只提供了人脸关键点和身份证信息,其他如想试用也需要申请。但是效果和web api的效果是一样的,只不过可能因为网络等因素会慢一点。