Размер изображения SDK Python API Face слишком мал (PersonGroupPerson add_face_from_stream)

Перво-наперво, документация здесь говорится:« Поддерживаются форматы JPEG, PNG, GIF (первый кадр) и BMP. Допустимый размер файла изображения составляет от 1 КБ до 6 МБ ».

Я отправляю .jpg размером ~ 1,4 МБ. В моем поиске другие, у кого была эта проблема, были настраиваемыми пакетами формирования и столкнулись с проблемами при передаче изображений. однако, в отличие от других, я не формирую собственный вызов API, просто передача jpg в python sdk. Что происходит не так / что мне не хватает?

Ошибка:

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 (+?)


person davidt    schedule 16.12.2019    source источник
comment
возможно, он слишком мал в WIDTH x HEIGHT, а не в MB.   -  person furas    schedule 16.12.2019
comment
@furas может быть теоретически, но я сомневаюсь, что проблема здесь, так как я использую изображение нормального размера с нормальным соотношением сторон   -  person davidt    schedule 16.12.2019
comment
возможно. В другом вопросе с распознаванием в решении PyTesseract было изменить размер изображения на 120%. Но я бы отобразил имя файла, чтобы проверить изображение, которое создает проблему. Возможно, случайно этот файл отличается от другого.   -  person furas    schedule 16.12.2019
comment
@davidt, этот пример кода завершен? Я только что работал с другим пользователем, который получал слишком маленькую ошибку изображения, и оказалось, что шаги по созданию группы людей были неполными. Я пробую ваш образец и не вижу, чтобы вы создали группу людей. Или, может быть, эта группа людей уже существует? Я хотел решить эту проблему, поскольку код, реализованный в правильном порядке, не нуждался бы в операторе ввода-вывода файла в качестве параметра, поскольку я вижу обходной путь, как показал ответ. У меня также есть рабочие образцы вызова API идентификации, если это то, что вам нужно.   -  person Azurespot    schedule 22.02.2020
comment
@Azurespot Да, я уже создал группу людей, и принятое решение устранило мою проблему. Вы хотите сказать, что мне вообще не нужно предоставлять изображение из файла при использовании функции person_group_person.add_face_from_stream (...)? Или есть лучший способ справиться с созданием нового человека, если face.identify (...) не работает? Хотелось бы увидеть ваши рабочие образцы.   -  person davidt    schedule 24.02.2020
comment
@davidt, я немного изменил ваш образец, чтобы разделить вызовы API для ясности. В этом примере вы увидите, что для функции add_face_from_stream не требуется никаких изменений. Я обнаружил, что в вашем примере это была проблема с областью действия, которая вызывала эту ошибку. Надеюсь, это поможет. У меня сейчас нет места для загрузки своих изображений, но я постараюсь сделать это в ближайшее время, если вы захотите скачать и протестировать. github.com/Azure- Примеры / когнитивные-услуги-краткий-код / ​​   -  person Azurespot    schedule 27.02.2020
comment
@davidt вот изображения. github.com/Azure-Samples/ когнитивные услуги образцы файлов данных /   -  person Azurespot    schedule 28.02.2020


Ответы (2)


Я запустил ваш код на своей стороне и получил ту же ошибку. Кажется, что-то не так с параметром image в коде:

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

на этапе:

# добавить лицом к лицу, если совпадение найдено

Когда я изменил этот линейный код на:

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

Проблема решена, лица успешно добавлены к человеку (у этого человека раньше было 1 лицо):

! [введите здесь описание изображения

Надеюсь, это поможет.

person Stanley Gong    schedule 17.12.2019
comment
Спасибо за помощь! Я попробую это исправить сегодня вечером. - person davidt; 17.12.2019
comment
Привет @davidt, как дела? Ваша проблема решена? - person Stanley Gong; 18.12.2019
comment
Решено! очень странно, что в аргументе должно быть открытие изображения. Я бы подумал, что мой код будет эквивалентным. Спасибо за помощь!!!!!! - person davidt; 18.12.2019
comment
Это сработало, потому что переменная изображения была потеряна в области видимости, поэтому ее открытие внутри параметра устранило проблему области видимости. Но обратная сторона - то, что изображение больше нигде не доступно. Я добавил образец ссылки в комментариях к вопросу для альтернативного макета кода, который сохраняет изображение как в области видимости, так и в качестве переменной для других процессов. - person Azurespot; 28.02.2020

Я тоже столкнулся с этим. Это потому, что поток уже был прочитан, когда вы используете его в detect_with_stream

Вы можете пойти image.seek(0) или закрыть изображение и снова открыть его, но поиск - лучшее решение.

person JDHannan    schedule 17.06.2021
comment
Не помещайте в ответ еще один вопрос. Опубликуйте это как комментарий к вопросу или опубликуйте другой вопрос - person Willy satrio nugroho; 17.06.2021
comment
Я не задавал никаких вопросов. - person JDHannan; 18.06.2021
comment
Перед тем, как вы отредактируете свое сообщение, я вижу формулировку вопроса. Но нет проблем, сейчас это в приемлемой форме. - person Willy satrio nugroho; 19.06.2021
comment
Не все, что помечено вопросительным знаком, на самом деле является вопросом, но я думаю, спасибо за то, что вы тщательно следили за ответами. - person JDHannan; 20.06.2021