def test__given_diff_face_images__when_scanned__then_returns_diff_embeddings( scanner_cls): scanner: FaceScanner = scanner_cls() img1 = read_img(IMG_DIR / PERSON_B.img_names[0]) img2 = read_img(IMG_DIR / PERSON_C.img_names[0]) emb1 = first_and_only(scanner.scan(img1)).embedding emb2 = first_and_only(scanner.scan(img2)).embedding assert not embeddings_are_equal(emb1, emb2, scanner.difference_threshold)
def test__given_img__when_scanned__then_1_to_1_relationship_between_all_returned_boxes_and_faces(scanner_cls, row): scanner: FaceScanner = scanner_cls() img = read_img(IMG_DIR / row.img_name) scanned_faces = scanner.scan(img) assert calculate_errors(boxes=[face.box for face in scanned_faces], noses=row.noses) == 0
def test__given_threshold_set_to_1__when_scanned__then_returns_no_faces(scanner_cls): scanner: FaceScanner = scanner_cls() img = read_img(IMG_DIR / '000_5.jpg') result = scanner.scan(img, det_prob_threshold=1) assert len(result) == 0
def test__given_no_faces_img__when_scanned__then_returns_no_faces(scanner_cls): scanner: FaceScanner = scanner_cls() img = read_img(IMG_DIR / '017_0.jpg') result = scanner.scan(img) assert len(result) == 0
def test_landmarks(plugin: mixins.LandmarksDetectorMixin, row): img = read_img(IMG_DIR / row.img_name) faces = plugin_manager.detector(img=img, face_plugins=[plugin]) sorted_faces = sorted(faces, key=lambda x: x._plugins_dto[0].nose) for face, excepted_nose in zip(sorted_faces, sorted(row.noses)): landmarks = face._plugins_dto[0] tolerance = face.box.height * 0.07 assert euclidean(landmarks.nose, excepted_nose) < tolerance
def test__given_5face_img__when_scanned__then_returns_5_correct_bounding_boxes_sorted_by_probability(scanner_cls): correct_boxes = [BoundingBoxDTO(544, 222, 661, 361, 1), BoundingBoxDTO(421, 236, 530, 369, 1), BoundingBoxDTO(161, 36, 266, 160, 1), BoundingBoxDTO(342, 160, 437, 268, 1), BoundingBoxDTO(243, 174, 352, 309, 1)] scanner: FaceScanner = scanner_cls() img = read_img(IMG_DIR / '000_5.jpg') faces = scanner.scan(img) for face in faces: assert face.box.similar_to_any(correct_boxes, tolerance=20) assert is_sorted([face.box.probability for face in faces])
def test_getting_age_and_gender(img_name: str): img = read_img(IMG_DIR / img_name) person = annotations.name_2_person[img_name] face = plugin_manager.detector(img)[0] if age_detector: age_range = age_detector(face).age assert age_range[0] <= person.age <= age_range[1], \ f'{img_name}: Age mismatched: {person.age} not in {age_range}' if gender_detector: gender = gender_detector(face).gender assert gender is not None assert (gender == 'male') == person.is_male, \ f'{img_name}: Wrong gender - {gender}'
def test__size_of_embeddings(scanner_cls): scanner: FaceScanner = scanner_cls() img = read_img(IMG_DIR / PERSON_B.img_names[0]) emb = first_and_only(scanner.scan(img)).embedding assert len(emb) == 512