66

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

3 に答える 3

158

これらのパラメーターの中で、4 つのパラメーターにさらに注意を払う必要があります。

  • scaleFactor– 各画像スケールで画像サイズをどれだけ縮小するかを指定するパラメーター。

    基本的に、スケール ファクターは、スケール ピラミッドを作成するために使用されます。詳細については、こちらを参照してください。つまり、ここで説明したように、モデルにはトレーニング中に定義された固定サイズがあり、xml. これは、このサイズの顔が画像内に存在する場合に検出されることを意味します。ただし、入力画像を再スケーリングすることにより、大きな顔を小さな顔にサイズ変更して、アルゴリズムで検出できるようにすることができます。

    1.05これは、サイズ変更に小さなステップを使用することを意味します。つまり、サイズを 5% 縮小すると、検出用のモデルと一致するサイズが見つかる可能性が高くなります。これは、アルゴリズムがより完全であるため、アルゴリズムの動作が遅くなることも意味します。検出を高速化するために 1.4 まで増やすことができますが、一部の顔を完全に見逃すリスクがあります。

  • minNeighbors– 各候補長方形を保持するために必要な近傍数を指定するパラメーター。

    このパラメーターは、検出された顔の品質に影響します。値が大きいほど、検出数は少なくなりますが、品質は高くなります。3~6それには良い値です。

  • minSize– 可能な最小オブジェクト サイズ。それより小さいオブジェクトは無視されます。

    このパラメーターは、検出するサイズを決定します。あなたが決めてください!通常、[30, 30]顔検出の良い開始点です。

  • maxSize– 可能な最大オブジェクト サイズ。これより大きいオブジェクトは無視されます。

    このパラメーターは、検出するサイズを決定します。繰り返しますが、あなたが決めてください!通常、手動で設定する必要はありません。デフォルト値は、顔のサイズに上限を設けずに検出することを前提としています。

于 2013-12-27T17:36:09.327 に答える
-6

CPU と RAM のパフォーマンスが良好またはそれ以上の場合は、scaleFactor=1 minNeighbors=3 を設定できます。

ラズベリーのような組み込みシステムで作業している場合は、scaleFactor= 2 などの smth を選択することをお勧めします (値が高いほど精度が低くなります) minNeighbors = 1 (値が高いほど精度は低くなりますが、信頼性が高くなります) そうしないと、アルゴリズムははるかに高速に実行されますCPU のパフォーマンスと RAM が十分でない場合、フリーズします。

それが役に立てば幸い

于 2015-07-26T11:25:36.213 に答える
-7
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);
于 2017-01-09T08:11:59.150 に答える