人脸APIPythonSDK"Image Size too Small"(PersonGroupPersonadd_face_from_stream)

Face API Python SDK "Image Size too Small" (PersonGroupPerson add_face_from_stream)

首先,文档 here 说 "JPEG, PNG, GIF (the first frame), and BMP format are supported. The allowed image file size is from 1KB to 6MB."

我正在发送一个 .jpg 文件,大约 1.4 MB 在我的搜索中,遇到此问题的其他人是自定义形成数据包和 运行 问题块 t运行sfering 图像。 然而,与 others 不同的是,我没有形成自己的 API 调用,只是将 jpg 传递给 python sdk。 怎么回事wrong/what我错过了吗?

错误是:

getting image, start time
opening image:  2019_11_30_18_40_21.jpg
time elapsed for capturing image: 8.007975816726685
time elapsed for detecting image: 0.0017137527465820312
appending face found in image
identifying face
time elapsed for identifying image: 0.8008027076721191
Person for face ID e7b2c3fe-6a62-471f-8371-8c1e96608362 is identified in 2019_11_30_18_40_21.jpg with a confidence of 0.68515.
Traceback (most recent call last):
File "./GreeterCam_V0.1 - testing.py", line 116, in <module>
face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, face.candidates[0].person_id, image)
File "/home/pi/.local/lib/python3.7/site-packages/azure/cognitiveservices/vision/face/operations/_person_group_person_operations.py", line 785, in add_face_from_stream
raise models.APIErrorException(self._deserialize, response)
azure.cognitiveservices.vision.face.models._models_py3.APIErrorException: (InvalidImageSize) Image size is too small.  

我的源代码是:

if __name__ == '__main__':
    FRAMES_PER_SECOND = 0.13
    ENDPOINT = os.environ['COGNITIVE_SERVICE_ENDPOINT']
    KEY = os.environ['COGNITIVE_SERVICE_KEY']
    face_client = FaceClient(ENDPOINT, CognitiveServicesCredentials(KEY))
    PERSON_GROUP_ID = 'my-unique-person-group'
    #IMAGES_FOLDER = os.path.join(os.path.dirname(os.path.realpath(__file__)))
    #camera = PiCamera()
    #camera.start_preview()
    test_images = [file for file in glob.glob('*.jpg')]
    #webcam = cv2.VideoCapture(0)
    while(True):
        start_time = time.time()
        print('getting image, start time')
        for image_name in test_images:
            image = open(image_name, 'r+b')
            print("opening image: ", image_name)
            time.sleep(5)
            faces = face_client.face.detect_with_stream(image)     
            #image = open(os.path.join(IMAGES_FOLDER, imageName), 'r+b')
            face_ids = []
            time1 = time.time()
            print('time elapsed for capturing image: ' + str(time1-start_time))
            # detect faces in image

            time2 = time.time()
            print('time elapsed for detecting image: ' + str(time2-time1))
            for face in faces:
                print('appending face found in image')
                face_ids.append(face.face_id)
            if face_ids:
                print('identifying face')
                # if there are faces, identify person matching face
                results = face_client.face.identify(face_ids, PERSON_GROUP_ID)
                time3 = time.time()
                print('time elapsed for identifying image: ' + str(time3-time2))
                name = 'person-created-' + str(time.strftime("%Y_%m_%d_%H_%M_%S"))
                if not results:
                    #if there are no matching persons, make a new person and add face
                    print('No person in the person group for faces from {}.'.format(imageName))
                    new_person = face_client.person_group_person.create(PERSON_GROUP_ID, name)
                    face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, new_person.person_id, image)
                    time4 = time.time()
                    print('time elapsed for creating new person: ' + str(time4-time3))
                    print('New Person Created: {}'.format(new_person.person_id))
                for face in results:
                    if not face.candidates:
                        new_person = face_client.person_group_person.create(PERSON_GROUP_ID, name)
                        face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, new_person.person_id, image)
                    else:
                        #add face to person if match was found
                        print('Person for face ID {} is identified in {} with a confidence of {}.'.format(face.face_id, os.path.basename(image.name), face.candidates[0].confidence)) # Get topmost confidence score
                        face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, face.candidates[0].person_id, image)
                        time4 = time.time()
                        print('time elapsed for creating new person: ' + str(time4-time3))   

这也是在 Raspbian 上的 pi 3B(+?)

我 运行 你的代码在我这边,但得到了同样的错误。代码中的 image 参数似乎有问题:

face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, face.candidates[0].person_id, image)

在阶段:

#add face to person if match was found

当我将此行代码更改为:

face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, face.candidates[0].person_id, open(image_name,"r+b"))

问题已解决,已成功添加人脸(此人之前有1张脸):

希望对您有所帮助。

我运行也喜欢这个。这是因为当你在 detect_with_stream

中使用它时,流已经被读取了

您可以去 image.seek(0) 或关闭图像并重新打开它 - 但寻求是更好的解决方案。

我遇到了同样的错误,因为我在识别之前打开了照片。所以我删除了打开并且代码有效。