问题背景:
我创建了一个 Azure FaceList,并且正在使用我的网络摄像头来捕获实时源,并且:
- 将流发送到 Azure 人脸检测
- 获取人脸检测返回的人脸矩形
- 使用返回的人脸矩形将从实时视频流中检测到的人脸添加到我的 FaceList。
(我需要创建人脸列表以解决我在Nicolas 回答的另一个问题中解释的问题,这就是我所关注的)
问题详情:
根据https://docs.microsoft.com/en-us/rest/api/cognitiveservices/face/facelist/addfacefromstream上的 Azure FaceList 文档,如果图像中有多个人脸,我们需要指定要添加的目标人脸到 Azure FaceList。
问题是,如果我们需要在人脸列表中添加所有检测到的人脸(多张人脸)怎么办?假设单帧视频中有 2 个或更多人脸,那么如何将这两个人脸添加到人脸列表?
我尝试将Azure 人脸检测返回的人脸矩形添加到 Python 列表中,然后迭代列表索引,以便每个人脸矩形可以一个接一个地传递给 Azure FaceList。但是没有用。
仍然收到错误:
There are more than one faces in the image
我的代码:
face_list_id = "newtest-face-list"
vid = cv2.VideoCapture(0)
count = 0
face_ids_live_Detected = [] #This list will store faceIds from detected faces
list_of_face_rectangles = []
face_rect_counter=0
while True:
ret, frame = vid.read()
check,buffer = cv2.imencode('.jpg', frame)
img = cv2.imencode('.jpg', frame)[1].tobytes()
base64_encoded = base64.b64encode(buffer).decode()
print(type(img))
detected_faces = utils.detect_face_stream(endpoint=ENDPOINT, key=KEY, image=img,face_attributes=attributes,recognition_model='recognition_03')
print('Image num {} face detected {}'.format(count, detected_faces))
count += 1
color = (255, 0, 0)
thickness = 2
for face in detected_faces:
detected_face_id = face['faceId']
face_ids_live_Detected.append(detected_face_id)
detected_face_rectangle = face['faceRectangle']
list_of_face_rectangles.append(detected_face_rectangle)
print("detected rectangle =",detected_face_rectangle)
face_rect_for_facelist = list_of_face_rectangles[face_rect_counter]
face_rect_counter +=1
frame = cv2.rectangle(frame, *utils.get_rectangle(face), color, thickness)
cv2.imshow('frame', frame)
for face_id_live in face_ids_live_Detected:
similar_faces = face_client.face.find_similar(face_id=face_id_live, face_list_id=face_list_id)
if not similar_faces:
print('No similar faces found !')
print('Adding Unknown Face to FaceList...')
facelist_result = utils.facelist_add(endpoint=ENDPOINT, key=KEY, face_list_id=face_list_id,data=img,params=face_rect_for_facelist)
persisted_face_id = facelist_result['persistedFaceId']
else:
print('Similar Face Found!')
for similar_face in similar_faces:
face_id_similar = similar_face.face_id
print("Confidence: "+str(similar_face.confidence))
在我的utils文件中,函数 facelist_add的代码如下:
def facelist_add(endpoint, key, face_list_id, data=None, json=None, headers=None,params=None, targetFace=None):
# pylint: disable=too-many-arguments
"""Universal interface for request."""
method = 'POST'
url = endpoint + '/face/v1.0/facelists/'+face_list_id+'/persistedfaces'
# Make it possible to call only with short name (without BaseUrl).
if not url.startswith('https://'):
url = BaseUrl.get() + url
params={}
# Setup the headers with default Content-Type and Subscription Key.
headers = headers or {}
if 'Content-Type' not in headers:
headers['Content-Type'] = 'application/octet-stream'
headers['Ocp-Apim-Subscription-Key'] = key
params['detectionModel']='detection_03'
response = requests.request(
method,
url,
params=params,
data=data,
json=json,
headers=headers)
if response.text:
result = response.json()
else:
result = {}
return result