UFO ET IT

OpenCV detectMultiScale () 매개 변수에 대한 권장 값

ufoet 2020. 12. 15. 19:35
반응형

OpenCV detectMultiScale () 매개 변수에 대한 권장 값


권장 매개 변수는 무엇이며 CascadeClassifier::detectMultiScale()어떤 요소에 따라 기본 매개 변수를 변경해야합니까?

void CascadeClassifier::detectMultiScale(
    const Mat& image, 
    vector<Rect>& objects, 
    double scaleFactor=1.1,
    int minNeighbors=3, 
    int flags=0, 
    Size minSize=Size(),
    Size maxSize=Size() )

이러한 매개 변수 중 네 가지에 더주의를 기울여야합니다.

  • scaleFactor – 각 이미지 스케일에서 이미지 크기가 얼마나 줄어드는지를 지정하는 매개 변수.

    기본적으로 축척 비율은 축척 피라미드를 만드는 데 사용됩니다. 자세한 설명은 여기에서 확인할 수 있습니다 . 간단히 말해, 여기설명 된대로 모델에는 학습 중에 정의 된 고정 크기가 있으며 xml. 이것은 존재하는 경우 이미지에서이 얼굴 크기가 감지됨을 의미합니다. 그러나 입력 이미지의 크기를 조정하면 더 큰 얼굴을 더 작은 얼굴로 크기를 조정하여 알고리즘에서 감지 할 수 있습니다.

    1.05이는 크기 조정에 작은 단계를 사용한다는 의미입니다. 즉, 크기를 5 % 줄이면 감지 할 모델과 일치하는 크기가 발견 될 가능성이 높아집니다. 이것은 또한 알고리즘이 더 철저하기 때문에 더 느리게 작동 함을 의미합니다. 더 빠른 감지를 위해 1.4까지 늘릴 수 있으며 일부 얼굴이 모두 누락 될 위험이 있습니다.

  • minNeighbors – 각 후보 직사각형이 유지해야하는 이웃 수를 지정하는 매개 변수.

    이 매개 변수는 감지 된 얼굴의 품질에 영향을줍니다. 값이 높을수록 탐지 횟수는 줄어들지 만 품질은 높아집니다. 3~6좋은 가치입니다.

  • minSize– 가능한 최소 개체 크기. 그보다 작은 개체는 무시됩니다.

    이 매개 변수는 감지 할 작은 크기를 결정합니다. 당신이 결정합니다! 일반적으로 [30, 30]얼굴 감지를위한 좋은 시작입니다.

  • maxSize– 가능한 최대 개체 크기. 이보다 큰 개체는 무시됩니다.

    이 매개 변수는 감지 할 크기를 결정합니다. 다시 한 번 결정합니다! 일반적으로 수동으로 설정할 필요가 없습니다 . 기본값은 얼굴 크기에 대한 상한없이 감지하고자한다고 가정합니다.


CPU 및 RAM 성능이 좋거나 그 이상이면 scaleFactor = 1 minNeighbors = 3을 설정할 수 있습니다.

raspberry와 같은 임베디드 시스템에서 작업하는 경우 scaleFactor = 2와 같은 smth를 선택하는 것이 좋습니다. (값이 높을수록 정확도가 낮습니다.) minNeighbors = 1, (값이 높을수록 정확도가 낮지 만 신뢰성이 높습니다) 그렇지 않으면 알고리즘이 훨씬 빠르게 실행됩니다. CPU 성능과 RAM이 충분하지 않으면 멈 춥니 다.

도움이되기를 바랍니다


cl_int err;
    cl_uint numPlatforms;

    err = clGetPlatformIDs(0, NULL, &numPlatforms);
    if (CL_SUCCESS == err)
    printf("\nDetected OpenCL platforms: %d", numPlatforms);
    else
    printf("\nError calling clGetPlatformIDs. Error code: %d", err);

    string str ="haarcascade_frontalface_alt2.xml";
    ocl::OclCascadeClassifier fd;
    fd.load(str);
    ocl::oclMat frame, frameGray;
    Mat frameCpu;


    CvVideoCapture vcap = openVideo("0");
    vcap.set(CV_CAP_PROP_FRAME_WIDTH,320);
    vcap.set(CV_CAP_PROP_FRAME_HEIGHT,240);

    static const cv::Size maxSize;

    for(;;){
    //  // processing loop
        vector<Rect> faces;
    vcap >> frameCpu;
    frame = frameCpu;
    ocl::cvtColor(frame, frameGray, CV_BGR2GRAY);
    //ocl::equalizeHist(frameGray, frameGray);
    //Mat mm(frameGray);
    //cvWaitKey(100);

    fd.detectMultiScale(frameGray,faces,1.05,3,0|CV_HAAR_FIND_BIGGEST_OBJECT ,minSize,maxSize);


      for(int   i=0; i<  faces.size() ; i++)
       {
         if(faces.size())
         //circle(img, Point(palm[i].x+ palm[i].width/2,palm[i].y+palm[i].height/2),palm[i].width,Scalar(255,0,0), 2,8 );       
             cv::rectangle(frameCpu, faces[i],Scalar(255,0,0), 2,8 );       
       }

      imshow("fsfs",frameCpu);

    cvWaitKey(1);

ReferenceURL : https://stackoverflow.com/questions/20801015/recommended-values-for-opencv-detectmultiscale-parameters

반응형