15

Tôi đang sử dụng bộ dò tìm khuôn mặt tầng của opencv (cv.HaarDetectObjects) trong python.Độ tin cậy của máy phân loại trong thiết bị dò khuôn mặt opencv

ví dụ:

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

     for f in faces: 
      print(f) 

này sẽ in một danh sách các phát hiện trong mẫu đơn này:

((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) 

đâu mỗi dòng đại diện cho một phát hiện. 4 số đầu tiên là vị trí x, y của điểm trên cùng bên trái và chiều cao, chiều rộng của hộp giới hạn. Số cuối cùng là (trích dẫn từ tài liệu openCV) số lượng hàng xóm.

Tôi đoán tôi có hai câu hỏi:

1) Số cuối có nghĩa là gì? Tôi không thể tìm thấy bất kỳ tham chiếu đến điều đó khi googling.

2) (quan trọng hơn) Có cách nào để nhận điểm tin cậy cho mỗi lần phát hiện không? Phân loại khuôn mặt chắc chắn rằng phát hiện tương ứng với một khuôn mặt thật?

Cảm ơn

+2

có thể hữu ích: http://haoxiang.org/2013/11/opencv-detectmultiscale-output-detection-score/ – Shai

Trả lời

7

1) Mã phát hiện tạo ra nhiều lần phát hiện đối tượng - ví dụ: ở các tỷ lệ khác nhau, hơi dịch chuyển, vv Các phát hiện sau đó được nhóm lại và số lượng hàng xóm trong một nhóm như vậy là số được trả về. Xem thêm giấy Viola Jones, đoạn 5.6 (http://research.microsoft.com/en-us/um/people/viola/Pubs/Detect/violaJones_IJCV.pdf) và nguồn OpenCV.

2) Bạn có thể sử dụng số lượng hàng xóm như một số biện pháp tin cậy.

0

Cảm ơn rất nhiều câu hỏi và câu trả lời của bạn, tôi đã tìm kiếm một phát hiện khuôn mặt opencv với điểm số tin cậy trong một ngày. Câu hỏi và câu trả lời của bạn cho tôi một số hướng dẫn để giải quyết vấn đề.

Giống như Palmstrom đã nói, số cuối cùng có nghĩa là số lượng vị trí đối tượng trong cụm đó. và bạn có thể sử dụng nó làm điểm tin cậy.

Theo như tôi biết, chỉ có loại API như vậy trong API python cũ. API mới không có giá trị này (số lượng đối tượng trong cụm).

Tôi đặt mã của mình ở đây trong trường hợp nó sẽ giúp một số người khác. Đây là một API python cũ có hướng dẫn khó tìm.

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)