目标检测2——传统典型方法:Viola-Jones


知识和例子

1 传统目标检测方法基本流程
在这里插入图片描述
1.1输入:图片

1.2候选框:通过滑动窗口生成(提取)候选框

1.3特征提取:对窗口局部图像信息进行特征抽取
特征提取的三大类
1.3.1 底层特征 颜色 纹理 形状 (手工设计的特征)
例如:HOG特征
1.3.22 中层特征 基于底层特征进行机器学习方法,进行特征学习、挖掘得到的特征,更具有鲁棒性(机器学习后特征)
例如:PCA特征 LDA特征(优化理论)
1.3.3 高层特征 对底层和中层特征进一步挖掘、表示。
例如人物目标(是否戴帽子、眼镜,头发长短、服装样式等语义高层特征)
特征提取应具有的性质:
容易提取计算代价不能太大;
可区分:不同图像区域提取出来的特征肯定得不一样;
适应性:光照变化不变、尺度变化不变、旋转尺度不变。

1.4 分类器判定或背景:对候选区域提取出的特征进行分类判定
分类器:需要通过事先的学习和训练得到
单类别问题:只要区分当前窗口中包含对象是目标还是背景的二分类问题
多分类:区分当前窗口是不是背景,不是背景那是哪一类目标

1.5 NMS:非极大抑制算法
存在原因:分类器对候选框判定,得到多个可能为目标的候选框,它们之间可能存在重叠,通过 NMS进行候选框的合并、过滤
目的:消除多余,寻找最佳物体检测位置
思想:选取领域中高分窗口,同时抑制低分窗口
步骤:
1、对所有检测到的候选框得分进行排序,得分是利用分类器进行分类时候得到的时候为检测目标的概率值(置信值)。
2、选出得分最高的候选框,计算每一个候选框与最大得分值的iou值,大于设定的阈值就进行删除。(意思就是删除重复率高的)
3、对于没有处理过的框,再进行1~2操作。
4、不断迭代这个筛选过程,直到没有候选框,输出结果。
效果如图:
在这里插入图片描述
升级啦:Soft-NMS
原因:通过阈值进行删除的手法太粗暴了
区别:对于超过阈值(Nt)的没有直接删除,而是进行调整.提高了高检索率下的准确率,且在低检索率时对物体检测性能有明显提升。
区别如图:
在这里插入图片描述
符号解释:
Si:表示第i个候选框
M:最大候选框的位置区域
bi:第i个候选框的位置区域
iou(交并比):
在这里插入图片描述
1.6 输出:目标检测结果

2 代表性的传统方法(参照以上步骤,每种方法在每个过程中采用的方法不一样罢了)

2.1 Viola-Jones
应用场景:人脸检测(正面检测,侧面不稳定)
提出:在2001年,Viola和Jones两位大牛在CVPR上发表了经典的《Rapid Object Detection using a Boosted Cascade of Simple Features》和《Robust Real-Time Face Detection》
特征提取:使用Haar-like特征(纹理特征的一种)
Haar-like特征原型种类:边缘、线性、中间、对角线特征
在这里插入图片描述
Haar-like特征的局限:只对一些简单图形结构,如边缘、线段较敏感,因此,只能描述特定结构(水平、垂直、对角)。
认清两个概念:特征原型在图像子窗口中扩展(平移伸缩)得到的特征称为“矩形特征”;矩形特征的值称为“特征值”。
Haar-like特征值的3个相关自变量:特征检测框的种类、特征检测框的大小、特征检测框的位置
Haar-like特征值=白色矩形像素总和减去黑色矩形像素总和,反映了图像的灰度变化情况
Haar-like特征值的计算方法:积分图法(只遍历一次图像就可以求出图像中所有区域像素和的快速算法)
积分图法的输入与输出:
输入:一张图片 输出:一个数组,数组中保存图像从起点开始到各个点所形成的矩形区域像素之和,当要计算某个区域的像素和时直接索引数组的元素,不用再重新计算这个区域的像素和。
积分图法怎么构造的:
定义:积分图像中的任何一点,该点的积分图像值等于位于该点左上角所有像素之和
公式:在这里插入图片描述

例子:
在这里插入图片描述
步骤:推导例子在后面
所以计算Haar-like特征值就是将白色区域的像素和在减去黑色区域像素和就可以了,SO-EASY! ,特征值取决于积分图法计算出来的像素差,因而特征值与图像所在的坐标是没有关系的。
根据图像的卷积原理,得到的新图像有多少个像素点,原图就有多少个m*n的矩形。
求出的特征值范围过大,可进行归一化,通过与阈值进行对比,判断求出的特征值,是否可以判定为人脸部的某一个特征。
为什么有的特征可以识别人脸,而有的不可以,例子:
在这里插入图片描述
意思就是我用第一个特征进行有人脸图片进行检测时,通常情况下,他计算出的积分图特征值都是大于1的,不过我觉得应该再拿没有人脸图片进行对比才能说明这个特征对于有咩有人脸具有区分意义。这个例子应该只能说明,对于正样本有人脸的图片而言,第一个特征可以区分出来,而第二个特征不能区分出来。

训练分类器:Adaboost级联分类器等
Adaboost:是一种集成算法,通过训练多个不同弱的分类器,通过集成策略,结合强的分类器(团结就是力量,三个臭皮匠顶一个诸葛亮)。
来源:集成学习,
集成学习概述一:按照个体是否有依赖关系,分为串行方式(代表算法boost)和并行方式(代表算法baggi);
集成学习概述二:结合弱分类器的策略:平均法(直接平均、加权平均),投票法(最高票、过半数)、学习法(层级学习,把多个弱 分类器的输出作为新的输入,训练2层级分类器)
Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题
boosting算法一般组合形式:
在这里插入图片描述
h(x;γk) 就是一个个的弱分类器,γk是弱分类器学习到的最优参数,βk 就是弱学习在强分类器中所占比重,P 是所有γk和βk 的组合。
boosting关键步骤简述:1、如何计算分类误差率:一个概率=预测值与实际值不同的样本概率之和;
2、如何更新分类器权重:根据分类误差率,误差率高权重低,后面集成时对最终结果影响就小了,误差率低权重高,后面集成时对最终结果影响就大了;
3、如何更新样本权重:通过每一个样本的上一轮预测分类情况进行更新,上一轮分对了,本轮权重就小,上一轮分错了,本轮权重就大,这样在新的弱分类器中,上一轮分错的样本可以受到重视。
4、如何集成:进行线性加和,如图
在这里插入图片描述
算法基本步骤:
在这里插入图片描述

这里是引用

Adaboost 计算过程的例子:
在这里插入图片描述
在这里插入图片描述
Adaboost级联分类器模型图:
在这里插入图片描述
adaboost 级联分类器说明:只有通过所有的的stage才可以被判定为正,过关斩将不容易啊。每一个stage内部都是弱分类器构成的强分类器。

候选框:滑动窗口方式(滑动窗口大小和步长)产生冗余候选框,速度和效率是瓶颈
补充:
1、每个弱分类器可以包含一个或者两个HARR特征;
2、特征是什么?特征是指对于harr原型的移动、缩放,就是矩形框。所以才会说20*20大小的图片有块8万个特征。每个特征就是一个弱分类器,特征在每一个样本上求特征值,然后找一个阈值使得分类误差最小,使其有效区分正负样本。 将8万个特征产生的分类误差率进行排序,选取我们取药的T个特征(弱分类器)
在这里插入图片描述

全程推公式:
1、训练集的准备:例如有人脸图片和无人脸图片;
2、计算每张图片的积分图,然后把它们存储到数组里面;
在这里插入图片描述

3、计算每张图片不同矩形的特征值,计算的特征值是通过积分图存储的数组得到,相当于不同种类、大小的滑动窗口遍历整个图片;

特征值的计算就是对白色区域求和-黑色区域求和,在积分图中,计算区域的特征值如下:
在这里插入图片描述
在这里插入图片描述
经过以上的步骤就得到了图片所有区域的值了,当我们要计算图片上任何一个区域的像素和时,就可以利用公式去数组索引直接计算,公式如下:在这里插入图片描述
4、每一个特征对一张图片都会有一个特征值,遍历所有正负样本,就可以得到一个特征对正样本的特征平均值和对负样本的特征平均值。
通过比较平均值,找到一个阈值使得分类的误差最低,有很多的特征,通过正确率选取自己需要的T个特征。

5、筛选出T个分类误差最低的、可以有效比较有效地区分出人脸的特征,也就是T个分类器;利用这些特征的特征值,进行判定有没有人脸;
6、假设要进行N次级联,把则T/N个数的弱分类器,利用adaboost进行训练,形成强分类器;

7、把每一个强分类器进行级联,adaboost级联分类器。

代码实践

备注:这是学习笔记,侵权删除
来源:
1 B站目标检测原理
2 VJ算法——博客园博主:大奥特曼打小怪兽 的一系列文章