OpenCV detectMultiScale()参数的建议值

tor*_*eff 58 c++ opencv cascade-classifier

推荐的参数是什么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() )
Run Code Online (Sandbox Code Playgroud)

her*_*tao 133

在这些参数中,您需要更加关注其中的四个:

  • scaleFactor - 参数指定在每个图像比例下图像尺寸减少的程度.

    基本上,比例因子用于创建比例金字塔.可以在这里找到更多解释.总之,作为描述在这里,你的模型训练过程中定义一个固定的大小,也就是在可见光xml.这意味着如果存在,则在图像中检测到这种尺寸的面部.但是,通过重新缩放输入图像,您可以将较大的面调整为较小的面,使其可被算法检测到.

    1.05这是一个很好的可能值,这意味着你使用一小步调整大小,即减小5%的大小,你增加了与检测模型匹配大小的机会.这也意味着算法运行得更慢,因为它更彻底.您可以将其增加到1.4以便更快地检测,并且可能会完全丢失一些面孔.

  • minNeighbors - 参数指定每个候选矩形应保留多少个邻居.

    此参数将影响检测到的面部的质量.值越高,检测越少,但质量越高.3~6对它来说是一个很好的价值.

  • minSize - 尽可能小的对象大小.小于该值的对象将被忽略.

    此参数确定您要检测的小尺寸.你决定了!通常,[30, 30]是人脸检测的良好开端.

  • maxSize - 最大可能的对象大小.大于此值的对象将被忽略.

    此参数确定要检测的大小.再一次,你决定了!通常,您不需要手动设置它,默认值假定您要检测没有面部大小的上限.

  • 什么是"minNeighbors"指的是什么?是关于修剪同一张脸周围过多的检测? (4认同)
  • @Micka不要100%同意`scaleFactor`.事实上,你希望它尽可能高,同时仍然获得"好"的结果,这必须在某种程度上凭经验确定.它严重依赖于待检测的目标,级联的类型和训练; 对于"24x24"FD级联来说,偶数和高达1.1的值在过去对我有用."scaleFactor"或"minSize"的值太低会导致巨大的计算成本,因为需要生成更多的金字塔层.系数"1.05"需要大约两倍的层数(> 2倍的时间)比"1.1"要大. (4认同)
  • @ user961627是的,正在使用图像金字塔和滑动窗口技术.如果使用以不同比例和不同大小扫描图像的滑动窗口,则不再需要使用图像金字塔作为图像金字塔,只需在处理时上/下采样图像.对于"minNeighbors",是的,它是关于修剪同一张脸周围的过多检测.请参阅答案以获取说明. (3认同)
  • @IwillnotexistIdonotexist显然是真的,抱歉我没有提到它.我只是想说,有可能让探测器选择窗口大小以满足某些人的确切需求,并且可以计算scaleFactor以满足这些需求.但是如果不知道训练窗口的大小和最小/最大尺寸以及计算时间和检测灵敏度/特性的约束,很难推荐一个值:) (2认同)