title : 目标检测②传统检测算法
目标检测实验报告
检测所用软硬件+云服务器:
硬件:macOS或者windows电脑
软件:pycharm+生成的测试集
云服务器:滴滴云(https://www.didiyun.com/activity.html)输入博主的大师码:8996 ,可以和博主一样9折享受服务
什么是传统目标检测?
首先我们先来了解一下什么是目标检测?简单来说就是把存在的目标从图片中找到并识别出来。我们发现这对于我们人来说十分简单,但对于计算机而言,它是怎么做到的呢?
传统目标检测方法分为三部分:区域选择 → 特征提取 → 分类器
即首先在给定的图像上选择一些候选的区域,然后对这些区域提取特征,最后使用训练的分类器进行分类。下面我们对这三个阶段分别进行介绍
2.2.1区域选取
这一步是为了对目标的位置进行定位。由于目标可能出现在图像的任何位置,而且目标的大小、长宽比例也不确定,所以最初采用滑动窗口的策略对整幅图像进行遍历,而且需要设置不同的尺度,不同的长宽比。这种穷举的策略虽然包含了目标所有可能出现的位置,但是缺点也是显而易见的:时间复杂度太高,产生冗余窗口太多,这也严重影响后续特征提取和分类的速度和性能。(实际上由于受到时间复杂度的问题,滑动窗口的长宽比一般都是固定的设置几个,所以对于长宽比浮动较大的多类别目标检测,即便是滑动窗口遍历也不能得到很好的区域)
2.2.2特征的设计
传统检测方法的特征提取算法主要有两种:HOG特征和lbp算法
HOG:方向梯度直方图(Histogram of Oriented Gradient, HOG)。使用梯度直方图来描述的形状特征。主要在行人检测方面。从名字可知,主要将图像中的pixel的方向变化作为特征。因为梯度变化主要是发生在物体边缘,这样就可以知道物体的大致形状。可以进行物体分类或者检测。经典的特征提取一般需要一些超参,比如窗口大小等。
提取方法:讲一个image灰度化—>颜色空间的标准化—>计算图像每个像素的梯度 —>将图像划分成小cells—>统计每个cell的梯度直方图 —> 将每几个cell组成一个block—>将图像image内的所有block的HOG特征descriptor串联起来。 Lbp算法:LBP(Local Binary Pattern,局部二值模式),反映了局部的纹理特征,跟一个像素的邻域有关。对每个像素的邻域做减法,大于用1表示,否则用0表示则产生了一个二进制数来表示这个像素的局部纹理。这个邻域其实也相当于一个window,window的形状也是可以改变的。
2.2.3分类器的设计
一、利用AdaBoost算法进行训练
并不是所有特征都是有用的,AdaBoost特征分类器具有特征选择的能力。
AdaBoost 将一系列的弱分类器通过线性组合,构成一个强分类器,
如下所示:
是一个强分类器。
是一个弱分类器,其为一个简单的阈值函数
为阈值,
,
为系数。
二、训练弱分类器
计算所有训练样本的特征值,并将其从小到大排序,随机选取一个特征值作为阈值,把所有元素分为两部分,小于阈值的一部分分类为人脸,大于阈值的一部分分类为非人脸。如下图所示,红色表示人脸,蓝色表示非人脸。
假如有5个样本,前两个为人脸,后三个为非人脸,用11000表示。如果阈值在第一个之前,通过弱分类器判定为:00000,有两个误差,如果阈值在第一个和第二个之间,通过弱分类器判定为:10000,有1个误差,如果阈值在第二个和第三个之间,通过弱分类器判定为:11000,有0个误差,依次类推,这样共有6个误差,然后从中找到一个误差最小的当成阈值,这样就训练好了一个最优的弱分类器。
三、训练强分类器
假设有N个训练样本
,其中有M个正样本,L个负样本,如果
是人脸图像,则
, 否则
其步骤如下:
每一级分类器使用的训练集中的负样本,都是上一级被错分的,即false positive,误检率或假阳性。这使得下一级分类器更加关注那些更难的(容易被错分的)样本。
2、2、4 总结:
传统检测历史久远,然而一直以来存在着两个主要问题:
1)基于滑动窗口的区域选择策略没有针对性,时间复杂度高,窗口冗余
2)手工设计的特征对于多样性的变化没有很好的鲁棒性