Как преобразовать координаты ограничивающего прямоугольника, обнаруженные в opencv, в координаты ограничивающего прямоугольника, обнаруженного в dlib? - PullRequest
0 голосов
/ 24 января 2019

Я запустил код распознавания лиц в прямом эфире, используя предварительно обученную модель opencv dnn и модель борова dlib.Я получил обнаружение от нескольких камер, и код выводит координаты ограничивающего прямоугольника для opencv и dlib.Я ожидал таких же результатов, но у меня очень разные результаты.Есть ли способ преобразовать координаты opencv в dlib?

Я пытался найти математическую (линейную) модель для соединения их двух, но это не сработало.

import numpy as np
import argparse
import imutils
import pickle
import time
import cv2
import os
import align
import dlib
import time
import datetime

face_detector = dlib.get_frontal_face_detector()
predictor_model = "shape_predictor_68_face_landmarks.dat"
face_aligner = align.AlignDlib(predictor_model)

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--detector", required=True,
    help="path to OpenCV's deep learning face detector")
ap.add_argument("-m", "--embedding-model", required=True,
    help="path to OpenCV's deep learning face embedding model")
ap.add_argument("-r", "--recognizer", required=True,
    help="path to model trained to recognize faces")
ap.add_argument("-l", "--le", required=True,
    help="path to label encoder")
ap.add_argument("-c", "--confidence", type=float, default=0.8,
    help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

print("[INFO] loading face detector...")
protoPath = os.path.sep.join([args["detector"], "deploy.prototxt"])
modelPath = os.path.sep.join([args["detector"],
    "res10_300x300_ssd_iter_140000.caffemodel"])
detector = cv2.dnn.readNetFromCaffe(protoPath, modelPath)
print("[INFO] starting video stream...")
vs = cv2.VideoCapture(0)
time.sleep(2.0)

while True:
    ret, frame = vs.read()
    frame = imutils.resize(frame, width=600)
    (h, w) = frame.shape[:2]
    imageBlob = cv2.dnn.blobFromImage(
        cv2.resize(frame, (300, 300)), 1.0, (300, 300),
        (104.0, 177.0, 123.0), swapRB=False, crop=False)
    detector.setInput(imageBlob)
    detections = detector.forward()
    for i in range(0, detections.shape[2]):
        confidence = detections[0, 0, i, 2]
        if confidence > args["confidence"]:
            box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
            (startX, startY, endX, endY) = box.astype("int")
            face = frame[startY:endY, startX:endX]
            (fH, fW) = face.shape[:2]
            if fW < 20 or fH < 20:
                continue
            rgb = cv2.cvtColor(face, cv2.COLOR_BGR2RGB)
            detected_faces_dlib = face_detector(rgb, 1)
            detected_faces = dlib.rectangle(left=startX, top=startY, right=endX, bottom=endY)
            print(detected_faces)
            print(detected_faces_dlib)

Вот результаты:

[(333, 191) (490, 414)]
rectangles[[(-22, 47) (150, 202)]]
[(333, 190) (490, 413)]
rectangles[[(-22, 47) (150, 202)]]
[(333, 190) (491, 414)]
rectangles[[(-22, 47) (150, 202)]]
[(334, 191) (491, 416)]
rectangles[[(-22, 47) (150, 202)]]
[(334, 196) (493, 416)]
rectangles[[(-22, 47) (150, 202)]]

1 Ответ

0 голосов
/ 27 января 2019

Я только что потратил кучу времени, занимаясь этим, и если ваша цель состоит в том, чтобы обнаружить лицевые ориентиры на лице, которое было обнаружено детектором dnn, лучше всего переучить shape_predictor_68_face_landmarks.dat с помощью прямоугольников из детектора dnn.

Следуя этой статье в качестве руководства, я написал скрипт на python, который прошел обучающий набор ibug300, заново обнаружил ограничивающие рамки лица, переписал xml-файл обучающего набора и затем запустил train_shape_predictor скрипт для получения нового файла .dat.

Результаты были очень хорошими по сравнению с попыткой изменить форму "dnn rect", чтобы приблизить "коробку свиньи".

Один совет, прежде чем погрузиться в переподготовку: функция обнаружения лица возвращает прямоугольники, а их ширина и высота сильно различаются. Это плохо работает для обучения предиктору формы. Лучше использовать квадрат со сторонами, равными ~1.35 * dnn_rect.width. Похоже на магическое число, но это среднее отношение высоты к ширине dnn ритов обнаружения лица.

...