15

Pythonでopencvのharカスケード顔検出器(cv.HaarDetectObjects)を使用しています。

例えば:

    faces = cv.HaarDetectObjects(grayscale, cascade, storage, 1.2, 2,
    cv.CV_HAAR_DO_CANNY_PRUNING, (50,50))

       for f in faces:
           print(f)

これにより、検出のリストが次の形式で出力されます。

 ((174, 54, 114, 114), 53)
 ((22, 51, 121, 121), 36)
 ((321, 56, 114, 114), 21)
 ((173, 263, 125, 125), 51)
 ((323, 272, 114, 114), 20)
 ((26, 271, 121, 121), 36)

各行は検出を表します。最初の 4 つの数値は、左上のポイントの x、y 位置、およびバウンディング ボックスの高さ、幅です。最後の数字は (openCV のドキュメントから引用) ネイバーの数です。

私は2つの質問があると思います:

1) 最後の数字は何を意味しますか? グーグルで調べたとき、それへの参照は見つかりませんでした。

2) (より重要) 各検出の信頼スコアを取得する方法はありますか? 顔分類器は、検出が実際の顔に対応することをどの程度確信していますか?

ありがとう

4

2 に答える 2

7

1) 検出コードは、オブジェクトに対して複数の検出を生成します。たとえば、異なるスケール、わずかにシフトなどです。その後、検出はグループ化され、そのようなグループ内の近傍の数が返される数になります。Viola Jones の論文、パラグラフ 5.6 ( http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_IJCV.pdf ) および OpenCV ソースも参照してください。

2) 近隣の数を信頼度の尺度として使用できる可能性があります。

于 2011-10-31T09:31:39.877 に答える
0

質問と回答をありがとうございます。私は、信頼スコアを備えたopencv顔検出を1日探していました。あなたの質問と回答は、問題を解決するための指針を与えてくれます。

Palmstrom が言ったように、最後の数字はそのクラスター内のオブジェクトの位置の数を意味します。これを信頼スコアとして使用できます

私の知る限り、古いpython APIにはそのような種類のAPIしかありません。新しい API には、この値 (クラスター内のオブジェクトの数) がありません。

他の人に役立つ場合に備えて、ここにコードを配置します。これは、チュートリアルが見つけにくい古い python API です。

import sys
import cv

def detect_face(image):
    image_size = cv.GetSize(image)
    # # create grayscale version
    grayscale = cv.CreateImage(image_size, 8, 1)
    cv.CvtColor(image, grayscale, cv.CV_BGR2GRAY)
    # # equalize histogram
    cv.EqualizeHist( grayscale,grayscale )

    #parameters to the detection function    
    cascade = cv.Load('haarcascade_frontalface_alt.xml')
    haar_scale = 1.1
    min_neighbors = 3
    haar_flags = cv.CV_HAAR_DO_CANNY_PRUNING
    min_size = (30,30)

    faces = cv.HaarDetectObjects(grayscale, cascade, cv.CreateMemStorage(0),
                                haar_scale, min_neighbors, haar_flags, min_size)

    print faces

    if len(faces) > 0:
        print '=> ' +  str(len(faces)) + ' face detected!'
        for ((x,y,width,height), n) in faces:
            pt1 = (x,y)
            pt2 = (x + width, y + height)
            cv.Rectangle(image, pt1, pt2, cv.RGB(255, 0, 0), 3, 8, 0) 


if __name__ == '__main__':

    filename = sys.argv[1]
    image = cv.LoadImage(filename,cv.CV_LOAD_IMAGE_COLOR);
    detect_face(image)

    cv.ShowImage("cam", image)
    cv.WaitKey(0)
于 2016-05-14T05:43:16.947 に答える