OpenCV Q&A Forum - RSS feedhttp://answers.opencv.org/questions/OpenCV answersenCopyright <a href="http://www.opencv.org">OpenCV foundation</a>, 2012-2018.Mon, 04 Dec 2017 08:38:14 -0600python facedetection detectMultiScalehttp://answers.opencv.org/question/179696/python-facedetection-detectmultiscale/The function `cv2.detectMultiScale` can successfully detect the position of face and by using the fuction `cv2.detectMultiScale3` i can also know the confidence score of each detected face.
My question is the fuction `cv2.detectMultiScale3` only tells confidence scores of the search windows of detected faces,and my thought is when i slowly move the search window,it can tell me the socres for every window(even if they are very small) but not only the detected faces window.
in this program i simply cut 1 image to several parts(using the `cv2.ROI`)
import os
import cv2
from PIL import Image,ImageDraw
image_save_path_head = "H:/OpenCV-demo-master/FaceDetection_python-opencv/cut-pic"
image_save_path_tail = ".jpg"
for i in range(1,49):
img = cv2.imread( "%s%d%s" % (image_save_path_head, i, image_save_path_tail) )
face_cascade = cv2.CascadeClassifier("H:/opencv/sources/data/haarcascades/haarcascade_frontalface_default.xml")
if img.ndim == 3:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
else:
gray = img
faces = face_cascade.detectMultiScale3(gray,flags=1, scaleFactor=1.1, outputRejectLevels=True)
rects = faces[0]
neighbours = faces[1]
weights = faces[2]
print("weight of %d is "%(i),rects,neighbours,weights)
and i get
> weight of 1 is () () () weight of 2
> is () () () weight of 3 is () () ()
> weight of 4 is () () () weight of 5
> is () () () weight of 6 is () () ()
> weight of 7 is () () () weight of 8
> is () () () weight of 9 is () () ()
> weight of 10 is () () () weight of 11
> is () () () weight of 12 is () () ()
> weight of 13 is () () () weight of 14
> is () () () weight of 15 is () () ()
> weight of 16 is () () () weight of 17
> is () () () weight of 18 is () () ()
> weight of 19 is () () () weight of 20
> is () () () weight of 21 is () () ()
> weight of 22 is () () () weight of 23
> is () () () weight of 24 is () () ()
> weight of 25 is () () () weight of 26
> is () () () weight of 27 is () () ()
> weight of 28 is () () () weight of 29
> is () () () weight of 30 is () () ()
> weight of 31 is () () () weight of 32
> is () () () weight of 33 is () () ()
> weight of 34 is () () () weight of 35
> is () () () weight of 36 is () () ()
> weight of 37 is () () () weight of 38
> is () () () weight of 39 is () () ()
> weight of 40 is () () () weight of 41
> is () () () weight of 42 is () () ()
> weight of 43 is () () () weight of 44
> is () () () weight of 45 is () () ()
> weight of 46 is [[ 4 10 37 37]]
> [[25]] [[ 7.2749402]] weight of 47 is
> () () () weight of 48 is [[ 0 13 32
> 32]] [[25]] [[ 8.64948004]]jyunMon, 04 Dec 2017 08:38:14 -0600http://answers.opencv.org/question/179696/Confidence scores for cascade classifiers (revisited)http://answers.opencv.org/question/162166/confidence-scores-for-cascade-classifiers-revisited/ Hi!
I have trained a couple of highly successful local binary pattern (LBP) cascade classifiers for object detection using OpenCV 3.2. So far I have used the classifiers sequentially and used the combined output as a "semi" multi-class classifier. This approach is flawed however, as an area can obviously be detected as multiple objects, which should be impossible. Because of this I am now interested in acquiring a form of confidence score for each detection by the individual cascade classifiers. With such a confidence score I could compare the overlapping regions of interest as proposed by each classifier and remove the regions with the lowest confidence score. I realize that this method is somewhat crude, but it is the best I could think of for the cascade classifiers supplied by OpenCV.
So far I have browsed a bit trying to find something that provides such a score, and I stumbled upon [this](http://answers.opencv.org/question/25493/return-confidence-factor-from-detectmultiscale/) thread that discusses the overloaded version of the detectMultiScale function (as found [here](https://github.com/opencv/opencv/blob/master/modules/objdetect/src/cascadedetect.hpp#L94)). This discussion combined with another [source](http://haoxiang.org/2013/11/opencv-detectmultiscale-output-detection-score/) makes me think that a sort of confidence measure could be calculated for each of the output Rect() objects (after non-maximum suppression) of detectMultiScale. In the last linked source the author quotes a paper that mentions a possible way of doing this:
"In the OpenCV implementation, stage_sum is computed and compared against the i stage_threshold for each stage to accept/reject a candidate window. We define the detection score for a candidate window as `K*stage_when_rejected + stage_sum_for_stage_when_rejected`. If a window is accepted by the cascade, we just `K*last_stage + stage_sum_for_last_stage`. Choosing K as a large value e.g., 1000, we ensure that windows rejected at stage i have higher score than those rejected at stage i-1." from http://vis-www.cs.umass.edu/fddb/faq.html
Does this seem like a possible solution to my problem? If so, how could I go about implementing it?
PS: I know a multi-class SVM is better for this sort of a problem, so I have implemented that too. The reason I want the confidence measure is so I can compare my two implementations.
ThorbjornSomodSat, 24 Jun 2017 17:35:42 -0500http://answers.opencv.org/question/162166/