К сожалению, этот вопрос сводится к нахождению максимальной клики , что является известной сложной проблемой. Стандартные алгоритмы для этой задачи будут работать лучше, если вы предварительно обработаете график сопоставимости путем объединения наборов узлов с точно такой же моделью наблюдения. Возможно, есть другие эвристики, которые могли бы работать на вашем графике.
Чтобы пойти другим путем, возможно, вы могли бы применить алгоритм SVD, который обрабатывает недостающие данные.
В качестве альтернативы , с MTCNN и OpenCV (также требуются другие зависимости, включая TensorFlow), вы можете:
1 Выполнить обнаружение лица (ввести изображение, вывести все поля обнаруженные лица):
from mtcnn.mtcnn import MTCNN
import cv2
face_detector = MTCNN()
img = cv2.imread("Anthony_Hopkins_0001.jpg")
detect_boxes = face_detector.detect_faces(img)
print(detect_boxes)
[{'box': [73, 69, 98, 123], 'trust': 0.9996458292007446, 'keypoints': {'left_eye': (102, 116), 'right_eye': (150, 114), 'nose': (129, 142), 'mouth_left': (112, 168), 'mouth_right': (146, 167)}}]
2 сохранить все обнаруженные лица в отдельных файлах :
for i in range(len(detect_boxes)):
face_img = img[detect_boxes[i]["box"][1]:detect_boxes[i]["box"][1] + detect_boxes[i]["box"][3], detect_boxes[i]["box"][0]:detect_boxes[i]["box"][0] + detect_boxes[i]["box"][2]]
cv2.imwrite("face-%.3d.jpg" % (i+1), face_img)
3 или Рисовать прямоугольники всех обнаруженных лиц:
for box in detect_boxes:
pt1 = (box["box"][0], box["box"][1]) # top left
pt2 = (box["box"][0] + box["box"][2], box["box"][1] + box["box"][3]) # bottom right
cv2.rectangle(img, pt1, pt2, (0,255,0), 2)
cv2.imwrite("detected-boxes.jpg", img)