Как улучшить производительность модели распознавания лиц на базе Caffe в Python? - PullRequest
1 голос
/ 05 июля 2019

Я следую этому уроку (https://www.pyimagesearch.com/2018/02/26/face-detection-with-opencv-and-deep-learning/#post_downloads), чтобы создать программу распознавания лиц с использованием "res10_300x300_ssd_iter_140000.caffemodel". Также я нашел другой пост ( Как улучшить производительность Caffe с OpenCV в Python? ). Из этого поста я обнаружил, что могу изменить размер входного изображения с другим размером, чтобы повысить точность определения лиц. Например, измените размер до 900 на 900, а не на 300 на 300, чтобы получить лучший результат при обнаружении нескольких лицв одном отдельном изображении.

Но есть проблема, размер входного сигнала модели составляет 300 на 300, почему мы можем просто изменить размер входного изображения с другим разрешением? В концепции человеческого зрения, изменить размер доквадратное изображение будет сжимать наше лицо по горизонтали или по вертикали, это как некоторые концепции: «после изменения размера наши лица не сильно изменятся»?

Вот код ниже:

# import the necessary packages
import numpy as np
import argparse
import cv2

# construct the argument parse and parse the arguments
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to input image")
ap.add_argument("-p", "--prototxt", required=True, help="path to Caffe 'deploy' prototxt file")
ap.add_argument("-m", "--model", required=True, help="path to Caffe pre-trained model")
ap.add_argument("-c", "--confidence", type=float, default=0.50, help="minimum probability to filter weak detections")
args = vars(ap.parse_args())

# load our serialized model from disk
print("[INFO] loading model...")
net = cv2.dnn.readNetFromCaffe(args["prototxt"], args["model"])

# load the input image and construct an input blob for the image
# by resizing to a fixed 300x300 pixels and then normalizing it
image = cv2.imread(args["image"])
(h, w) = image.shape[:2]
print(h)
dimension_x =h
dimension_y=h
print(image.shape[:2])
blob = cv2.dnn.blobFromImage(cv2.resize(image, (dimension_x, dimension_y)), 1.0, (dimension_x, dimension_y), (104.0, 177.0, 123.0))
# pass the blob through the network and obtain the detections and
# predictions
print("[INFO] computing object detections...")
net.setInput(blob)
detections = net.forward()

print(detections)

# loop over the detections
for i in range(0, detections.shape[2]):

    # extract the confidence (i.e., probability) associated with the
    # prediction
    confidence = detections[0, 0, i, 2]

    # filter out weak detections by ensuring the `confidence` is
    # greater than the minimum confidence
    if confidence > args["confidence"]:
        # compute the (x, y)-coordinates of the bounding box for the
        # object
        box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
        (startX, startY, endX, endY) = box.astype("int")
        # draw the bounding box of the face along with the associated
        # probability
        text = "{:.2f}%".format(confidence * 100)
        y = startY - 10 if startY - 10 > 10 else startY + 10
        cv2.rectangle(image, (startX, startY), (endX, endY), (0, 0, 255), 2)
        cv2.putText(image, text, (startX, y),cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)

print(type(image))
# show the output image
cv2.imshow("Output", image)
cv2.waitKey(0)
...