diff --git a/evaluation/eval_azure.py b/evaluation/eval_azure.py new file mode 100644 index 0000000..77998aa --- /dev/null +++ b/evaluation/eval_azure.py @@ -0,0 +1,114 @@ +import glob +import sys +import time + +import azure +from azure.cognitiveservices.vision.face import FaceClient +from azure.cognitiveservices.vision.face.models import TrainingStatusType +from msrest.authentication import CognitiveServicesCredentials + +test_dir = '/Users/sixiongshan/Desktop/kash_private/' +cloak_mode = "mid" + +f = open('api_key.txt', 'r') +data = f.read().split("\n") +KEY = data[0] +ENDPOINT = "https://shawn.cognitiveservices.azure.com/" + + +def main(): + face_client = FaceClient(ENDPOINT, CognitiveServicesCredentials(KEY)) + + PERSON_GROUP_ID = 'testing' + + try: + face_client.person_group.create(person_group_id=PERSON_GROUP_ID, name=PERSON_GROUP_ID) + except azure.cognitiveservices.vision.face.models._models_py3.APIErrorException: + pass + + # dummy = face_client.person_group_person.create(PERSON_GROUP_ID, "dummy") + # m = open("foo.png", 'r+b') + # face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, dummy.person_id, m) + + test_person = face_client.person_group_person.create(PERSON_GROUP_ID, "test") + try: + test_images = [file for file in glob.glob(test_dir + '*')] + test_images = [i for i in test_images if "cloak" not in i] + l = len(test_images) + if l == 1: + raise Exception("Must have 2 images...") + print("{} test images".format(l)) + + training_images = test_images[:l // 2] + testing_images = test_images[l // 2:] + print(training_images, test_images) + + for image in training_images: + format = 'png' + name = ".".join(image.split(".")[:-1]) + image = name + "_{}_cloaked.".format(cloak_mode) + format + print(image) + m = open(image, 'r+b') + face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, test_person.person_id, m) + + print('Training the person group...') + # Train the person group + face_client.person_group.train(PERSON_GROUP_ID) + + while (True): + training_status = face_client.person_group.get_training_status(PERSON_GROUP_ID) + print("Training status: {}.".format(training_status.status)) + print() + if (training_status.status is TrainingStatusType.succeeded): + break + elif (training_status.status is TrainingStatusType.failed): + sys.exit('Training the person group has failed.') + time.sleep(2) + + # Detect faces + face_ids = [] + for img in testing_images: + print(img) + img = open(img, 'r+b') + faces = face_client.face.detect_with_stream(img) + for face in faces: + face_ids.append(face.face_id) + + print("Detect {} Faces out of {} images".format(len(face_ids), len(testing_images))) + + results = face_client.face.identify(face_ids, PERSON_GROUP_ID) + + correct = 0 + for person in results: + if len(person.candidates) == 0: + continue + detected_person = person.candidates[0] + p_id = detected_person.person_id + conf = detected_person.confidence + if p_id == test_person.person_id: + correct += 1 + print("correctly matched with conf {}".format(conf)) + + print("Final match success rate: {}".format(float(correct / len(face_ids)))) + except Exception as e: + print(e) + + face_client.person_group_person.delete(PERSON_GROUP_ID, test_person.person_id) + + +# def add_other_people(): +# for idx_person in range(0, 5000): +# personId = create_personId(personGroupId, str(idx_person)) +# print("Created personId: {}".format(idx_person)) +# for idx_image in range(10): +# image_url = "http://sandlab.cs.uchicago.edu/fawkes/files/target_data/{}/{}.jpg".format( +# idx_person, idx_image) +# r = add_persistedFaceId(personGroupId, personId, image_url) +# if r is not None: +# print("Added {}".format(idx_image)) +# else: +# print("Unable to add {}-th image".format(idx_image)) + + +if __name__ == '__main__': + main()