Reputation: 1060
I am following this tutorial Face detection with OpenCV and deep learning to create and face detection software using OpenCV3, Caffe and Python3. This is the used code:
# USAGE
# python detect_faces.py --image rooster.jpg --prototxt deploy.prototxt.txt --model res10_300x300_ssd_iter_140000.caffemodel
# 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.40,
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")
print(confidence, startX, startY, endX, endY )
print(box)
# 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)
When I run the the code from the command line using this command:
python detect_faces.py --prototxt deploy.prototxt.txt --model res10_300x300_ssd_iter_140000.caffemodel --confidence=0.45 --image 14.jpg
I get this result 2:
* Source*
The result is quite good, but we notice at the most lower-left location on the picture where I drew a blue circle that the program has detected the face of the girl twice. The first detection is good, but the second one isn't! I have searched online for a method to give the model/program feedback so that it will learn that the detected object (surrounded by blue circle and has 51.11% accuracy isn't a face. So it can avoid giving it back as face!
So my question is, how can I finetune the used Caffe model to exclude non-face objects which are detected as faces for the future face detection tasks?
My question is not only about this specific situation, but in general for all object which are detected as faces while they are not. The used image is just an example.
Upvotes: 1
Views: 4617
Reputation: 833
@Peshmerge, For a specific image you can vary input blob dimensions to achieve the best results.
In example, 900x900
:
python object_detection.py --model opencv_face_detector.caffemodel --config opencv_face_detector.prototxt --mean 104 177 123 --thr 0.4 --input P1280471.JPG --width 900 --height 900
a script: https://github.com/opencv/opencv/blob/master/samples/dnn/object_detection.py
Upvotes: 2