今天撇去不同目标追踪算法的框架,比如KCF、TLD、Mean Shift等,忽略它们繁琐的公式,看了对目标检测的基本理解。这里做一个简单的总结,目标检测的框架一般是下图这样的:
目标检测分为以下几个步骤:
1、 训练分类器所需样本的创建
训练样本一般包括正样本和负样本,正样本是指第一帧图中框定的待检测的目标,负样本是指其它不包含目标的任意图片(比如背景),所有的样本图片都被归一化同样的尺寸大小(比如20C20)。
2、 特征提取
我们一般通过图像、视频或者波形获得的数据量是很巨大的,比如一个简单的文字图像或者一个心电图波形也可能要有几千个数据。为了对这些数据进行有效的识别、分类,就需要我们对原始数据进行变换,从而来得到最能反映分类本质的特征。这就是特征选择与提取的过程。
一般来说,我们把原始数据组成的空间叫测量空间,把分类识别赖以进行的空间叫做特征空间,通过变换,我们可把在维数较高的测量空间中表示的模式转变为在维数较低的特征空间中表示的模式。(这部分和我目前正在看的SVM和核函数联系极大,公式比较繁琐,定义也比较多,目前暂未全部罗列消化,虽然最近看了一部分,大部人说用的不一定需要懂,可是感觉不懂根本无法用好,最近正在致力于消化的小目标,准备从这里开始入手machine learning)
3、 用训练样本来训练分类器
这部分首先得先明白分类器是什么?wikipedia上的解释是:在机器学习领域,分类的目标是指将具有相似特征的对象聚集,通过特征的线性组合来做出分类决定,以达到此种目的。在这里,对象的特征通常被描述为特征值,在向量中被描述为特征向量。
比如,人脑本身也算一个分类器(强大到超乎想象),人对事物的识别就是一个分类的过程,人在成长和学习过程中,会通过观察A类事物的多个具体事例来得到对A类事物性质和特点的认识,以后遇到一个新物体的时候,人脑会根据这个事物的特征去判断是否符合A类事物的性质和特点,然后将其分为A类或者B类(这里是一个简单的二分类问题)。
在这里,训练分类器(大脑)可以通过对正样本和负样本的观察(学习),是其具有对该目标的检测能力,从而遇到该目标时可以检测出来。
从数学来表达,分类器就是一个函数y=f(x),x是某个事物的特征,y是类别,通俗的说就是例如,你输入张三的特征x1,分类器就给你认出来这个是张三y1,你输入李四的特征x2,它就给你认出来这个是李四y2。那么分类器是个函数,它的数学模型是什么呢?一次函数y=kx+b?高次函数?等等好复杂的都有,我们需要先确定它的模型;确定了模型后,模型是不是由很多参数呢?例如上面的一次函数y=kx+b的k和b,高斯函数的均值和方差等等。这个就可以通过什么最小化分类误差、最小化惩罚啊等等方法来确定,其实训练分类器好像就是找这些参数,使得达到最好的分类效果。
此外,为了使分类器检测准确率较好,训练样本一般都是成千上万,然后每个样本提取出很多个特征,这样就产生了很多的训练数据,所以训练的过程一般也都是很耗时的。
4、 利用训练好的进行目标检测
得到了分类器后,我们就可以用来对输入的图像进行分类了,也就是在图像中检测是否存在我们想要检测的目标。一般的检测过程是这样的:用一个扫描子窗口在待检测的图像中不断的移位滑动,子窗口每到一个位置,就会计算出该区域的特征,然后用我们训练好的分类器对该特征进行筛选,判定该区域是否为目标。有时候可能因为目标图像的大小和你训练分类器时使用的样本图片大小不一样,所以就需要对这个扫描的子窗口变大或者变小(或者将图像变小),再在图像中滑动,重新进行匹配一遍。
5、 学习和改进分类器
现在如果样本数较多,特征选取和分类器算法都比较好的情况下,分类器的检测准确度都挺高的了。但也会有误检的时候。所以更高级点的话就是加入了学习或者自适应,也就是说你把这张图分类错误了,我就把这张图拿出来,标上其正确的类别,再放到样本库中去训练分类器,让分类器更新、醒悟,下次别再再弄错了。我们怎么知道他弄错了呢?我的理解是:(1)、可能是靠先验知识来判定(例如目标本身存在着结构啊或者什么的约束)(2)、根据跟踪速度来判定(目标一般不会运动得太快)(3)、比较在初始图片帧采集的样本集得到的残差函数值的大小来判定(比如说我们得到的目标函数使得残差值过大)(4)、也可能根据以上这些情况来综合来判断的。
6、 小总结
上面模式分类的过程适合很多领域,例如图像、语音识别等等,它的关键点在于两个方面。
(1) 特征选取:比如说目前比较盛行的有: Haar特征、LBP特征、HOG特征和Shif特征等;他们各有千秋,视要检测的目标情况而定,例如:拳头:纹理特征明显:Haar、LBP(目前有将其和HOG结合);手掌:轮廓特征明显:HOG特征(行人检测一般用这个)
(2) 分类器算法
感觉目前比较盛行的有:SVM支持向量机、AdaBoost算法等;其中检测行人的一般是HOG特征+SVM,OpenCV中检测人脸的一般是Haar+AdaBoost,OpenCV中检测拳头一般是LBP+ AdaBoost;
目标识别与追踪真心涉及到很多很多算法和machine learning的基础知识,并且有不断地涌现的大牛提出各种算法,简单的哲学,复杂的数学!!感觉身体被掏空,在此勉励自己,希望自己能在机器视觉领域更上一层楼!