def verify_in_large_person_group(subscription_key):
    """VerifyInLargePersonGroup.

    This will verify whether faces detected as similar in a large group are of the same person.
    """

    face_base_url = "https://{}.api.cognitive.microsoft.com".format(
        FACE_LOCATION)
    face_client = FaceClient(
        endpoint=face_base_url,
        credentials=CognitiveServicesCredentials(subscription_key))

    image_url_prefix = "https://csdx.blob.core.windows.net/resources/Face/Images/"
    target_image_file_names = ["Family1-Dad1.jpg", "Family1-Dad2.jpg"]
    source_image_file_name1 = "Family1-Dad3.jpg"

    # Create a large person group.
    large_person_group_id = str(uuid.uuid4())
    print("Create a large person group {}.".format(large_person_group_id))
    face_client.large_person_group.create(
        large_person_group_id=large_person_group_id,
        name=large_person_group_id)

    person_id = face_client.large_person_group_person.create(
        large_person_group_id=large_person_group_id, name="Dad").person_id

    # Create a large person group person.
    p = Person(name="Dad", user_data="Person for sample", person_id=person_id)
    print("Create a large person group person {}.".format(p.name))

    for target_image_file_name in target_image_file_names:
        # Add face to the large person group.
        print("Add face to the large person group person {} from image {}.".
              format(p.name, target_image_file_name))
        faces = face_client.large_person_group_person.add_face_from_url(
            large_person_group_id=large_person_group_id,
            person_id=p.person_id,
            url=image_url_prefix + target_image_file_name,
            user_data=target_image_file_name)

        if not faces:
            raise Exception("No persisted face from image {}.".format(
                target_image_file_name))

    # Verification example for faces of the same person.
    verify_result = face_client.face.verify_face_to_person(
        face_id=_detect_faces_helper(face_client=face_client,
                                     image_url=image_url_prefix +
                                     source_image_file_name1)[0].face_id,
        person_id=p.person_id,
        large_person_group_id=large_person_group_id)
    if verify_result.is_identical:
        print(
            "Faces from {} & {} are of the same (Positive) person, similarity confidence: {}."
            .format(source_image_file_name1, p.name, verify_result.confidence))
    else:
        print(
            "Faces from {} & {} are of different (Negative) persons, similarity confidence: {}."
            .format(source_image_file_name1, p.name, verify_result.confidence))

    # Delete the person group.
    print("Delete the large person group {}.\n".format(large_person_group_id))
    face_client.large_person_group.delete(
        large_person_group_id=large_person_group_id)
def identify_in_large_person_group(subscription_key):
    """IdentifyInLargePersonGroup.

    This will identify faces in a large person group.
    """

    face_base_url = "https://{}.api.cognitive.microsoft.com".format(
        FACE_LOCATION)
    face_client = FaceClient(
        endpoint=face_base_url,
        credentials=CognitiveServicesCredentials(subscription_key))
    image_url_prefix = "https://csdx.blob.core.windows.net/resources/Face/Images/"
    target_image_file_dictionary = {
        "Family1-Dad": ["Family1-Dad1.jpg", "Family1-Dad2.jpg"],
        "Family1-Mom": ["Family1-Mom1.jpg", "Family1-Mom2.jpg"],
        "Family1-Son": ["Family1-Son1.jpg", "Family1-Son2.jpg"],
        "Family1-Daughter": ["Family1-Daughter1.jpg", "Family1-Daughter2.jpg"],
        "Family2-Lady": ["Family2-Lady1.jpg", "Family2-Lady2.jpg"],
        "Family2-Man": ["Family2-Man1.jpg", "Family2-Man2.jpg"]
    }
    source_image_file_name = "identification1.jpg"

    # Create a large person group.
    large_person_group_id = str(uuid.uuid4())
    print("Create a large person group {}.".format(large_person_group_id))
    face_client.large_person_group.create(
        large_person_group_id=large_person_group_id,
        name=large_person_group_id)

    for target_image_file_dictionary_name in target_image_file_dictionary.keys(
    ):
        person_id = face_client.large_person_group_person.create(
            large_person_group_id=large_person_group_id,
            name=target_image_file_dictionary_name).person_id

        # Create a person group person.
        person = Person(name=target_image_file_dictionary_name,
                        user_data="Person for sample",
                        person_id=person_id)

        print("Create a large person group person {}.".format(person.name))

        for target_image_file_name in target_image_file_dictionary[
                target_image_file_dictionary_name]:
            # Add face to the person group person
            print("Add face to the large person group person {} from image.".
                  format(target_image_file_dictionary_name,
                         target_image_file_name))
            face = face_client.large_person_group_person.add_face_from_url(
                large_person_group_id=large_person_group_id,
                person_id=person.person_id,
                url=image_url_prefix + target_image_file_name,
                user_data=target_image_file_name)
            if not face:
                raise Exception("No persisted face from image {}".format(
                    target_image_file_name))

    # Start to train the large person group.
    print("Train large person group {}.".format(large_person_group_id))
    face_client.large_person_group.train(
        large_person_group_id=large_person_group_id)
    training_status = face_client.large_person_group.get_training_status(
        large_person_group_id=large_person_group_id)
    print("Training status is {}".format(training_status.status))
    if training_status.status == TrainingStatusType.failed:
        raise Exception("Training failed with message {}.".format(
            training_status.message))

    # Detect faces from source image url and add detected face ids to source_face_ids
    source_face_ids = [
        detected_face.face_id
        for detected_face in _detect_faces_helper(face_client=face_client,
                                                  image_url=image_url_prefix +
                                                  source_image_file_name)
    ]

    # Identify example of identifying faces towards large person group.
    identify_results = face_client.face.identify(
        face_ids=source_face_ids, large_person_group_id=large_person_group_id)
    if not identify_results:
        print(
            "No person identified in the large person group for faces from the {}."
            .format(source_image_file_name))
        return

    for identify_result in identify_results:
        person = face_client.large_person_group_person.get(
            large_person_group_id=large_person_group_id,
            person_id=identify_result.candidates[0].person_id)
        print("Person {} is identified for face: {} - {}, confidence: {}.".
              format(person.name, source_image_file_name,
                     identify_result.face_id,
                     identify_result.candidates[0].confidence))

    # Delete the person group.
    face_client.large_person_group.delete(
        large_person_group_id=large_person_group_id)
    print("Delete the large person group {}.\n".format(large_person_group_id))