opencv多人脸检测,大幅降低误检、漏检解决一脸多框问题 (方法一)

上一段时间参加了某个比赛,其中有一环节需要用多人脸检测;由于其他队伍好多采用的商用SDK,竞争激烈,又不能误检更不能漏检测,而且保证框的数量只能和人脸数量对应,不能一个人脸上有多个框。
而我还是喜欢自己写,所以想出了几个方案实现了一下,实现都比较简单而且准确率都得到了保证。
比赛结束,最终因为性别检测出现了错误,与冠军失之交臂,我的方案好在是自己写的,顺便把源码也给大家

因为是在嵌入式上应用的,所以代码是用 C++实现

1.预读

为了方便后面大家理解,我在这里把我的思路县说一下,顺便把一些参数必要的部分说一下。

1.1思路

基础是使用的是Haar级联分类器,但是直接使用Haar级联分类器,单纯的调参都不能达到很好的效果。
所以是先用低阈值的人脸检测初步筛选出人脸框(因为是低阈值所以框总是比),然后在初筛的人脸框部分再进行人眼睛检测,只有同时存在人眼的部分才会做成人脸输出。

1.2Haar级联分类器使用心得

Haar级联分类器速度快,容易调用,是很好的工具。基础的使用教程,我放在这里
opencv 官网object模块使用例子
https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html

其中创建检测器的参数在这里说明一下,
cv::CascadeClassifier::detectMultiScale ( InputArray image,
std::vector< Rect >
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0,
Size minSize = Size(),
Size maxSize = Size()
)
第一个参数是图像矩阵,即输入一个Mat即可;
第二个参数是输出口,输出一个 Rect型的容器,一个Rect存放的是四个整型值(x,y,w,h)xy为矩形框左上角的像素坐标,wh分别代表着矩形框的宽和高;
第三个参数是每次搜索框缩小的比例,看一下官网例子前的算法解析就知道,级联分类器是从大框开始搜索,大框搜索完一遍,再用小一级的框集进行重新搜索。而这个两级之间的大小比例就是这个参数。
第四个参数是重复确定框,比如默认是3,一块人脸只有被重复扫描到3次是人脸才会放在输出里面,可以想到,当数值增大的时候,判断的要求就会变高,误检率会变低,但漏检率会随之升高;当数值更小比如2时,会向相反变化。经过我的测试,单纯靠改变这个参数,无法达到自己的期望
第五个参数如果是使用opencv3可以忽略,没有区别,默认0就可以。
第六个参数和第七个参数是一个道理,也就是之前说的第三个参数里面大小框的关系。第三个参数是两个级别框的比例,而最后这两个参数是最大框和最小框的设定。如果在使用的过程中,确定不会出现大脸或者特别小的脸,可以通过设置这两个参数加快检测速度。

1.3去掉重叠度高的人脸框

考虑到嵌入式计算能力,我们为了达到实时的效果所以要把数值计算尽量变成逻辑运算。
从最简单的情况推理,假设有两个框(x1,y1,w1,h1) ,(x2,y2,w2,h2)如果要保证完全不重叠,则有以下关系:(在纸上画一下就看得出来)
x1+w1<x2
y1+h1<y2

但是当我们要求允许部分重叠时候,就可以添加一个参数:
重叠度 thr ,thr取值为0~1;
x1+(w1 x thr)<x2
y1+(h1 x thr)<y2

2.代码实现(封装成类,可以直接调用)

头文件.h

//
// Created by peilin on 2019/10/2.
//

#ifndef OPERATOR_CASCADE_CLASSIFER_H
#define OPERATOR_CASCADE_CLASSIFER_H

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

class cascade_classifer {
   
public:

    cascade_classifer();
   
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值