opencv基准学习模型与目标检测

 

opencv中基准学习模型

本章介绍几种应用广泛的现代技术

ML库中的常见例程

ML库中的例程都是在公共基类cv::ml::StatModel的派生类中实现的,这个基类定义了可用于所有算法的通用接口

cv::StatModel方法提供了一种方法可以从磁盘读取和写入训练模型以及清除模型中的数据

训练方法和cv::ml::TrainData的结构

第一种train()方法通过cv::mlTrainData结构体指针获取数据和各种算法依赖的训练参数标志

第二种方法是利用提供的样本和数据标记直接构建与训练数据结构相同的快捷方式

剩下的内容大多是算法调用方式,学习有更好的教材,记住可能性不大,故省略

目标检测

将计算机视觉技术与机器学习技术相结合

基于树的目标检测技术

opencv中检测器有两个,一个是级联分类器,将Viola and Jones在人脸识别的成功算法一般化

第二个是软级联,该算法进一步演化,使用新方法给出以恶搞大多数情况比级联分类器更鲁棒的分类

通常具有刚性结构和强纹理的目标使用这两种方法会得到较好检测效果

级联分类器

基于boosted拒绝级联这一重要概念

最开始Viola-Jones检测器仅支持一个特定序列的特征–Haar小波,后来拓展使用了对角线特征之后被并入opencv实现。

后来级联进一步拓展到局部二值模式或称LBP

opencv的Viola-Jones检测器分为两层,第一层是特征检测器,封装并模块化特征计算,第二层是实际的boosting级联,使用计算得出特征所在矩形区域的和与差,但不知道如何计算特征

类Haar特征

这些特征都含有能从积分图像快速计算出的特征,积分图像从原始灰度图像中得到

(Haar小波是第一个已知的小波基, 关于小波变换的知识, 不过只理解小波的计算方式和特点,对后面阈值选取暂时不是很理解)

目前支持两个不同的特征集,包括原始Haar小波特征和替代特征LBP

Haar基本知识和弱分类器组成强分类器

局部二值模式特征

书上讲的不详细,可能之前章节讲过了?关于LBP的介绍

LBP具有灰度不变性和旋转不变性,应用于纹理识别

训练和预训练器

opencv附带预先训练的目标检测文件,还有一些代码用于训练新目标模型

有监督学习和boosting理论

opencv中的级联分类器是一个有监督的分类器。因此需要向分类器提供直方图和图像补丁,标记为包含(不包含)感兴趣的目标

拒绝级联:级联是一系列节点,每个节点本身是多叉树AdaBoost分类器,级联的基本操作是从图像的子窗口按照特定顺序对所有节点进行顺序测认,并将通过每个分类器的窗口视为正在寻找类的成分

每个节点被设计以低拒绝率下,具有高检测率,丢失人脸的概率低

对于每个节点,级联任何阶段出现不在分类中的结果都将终止计算,声明再该区域不存在人脸

只有通过整个级联分类器才能声明一个真正的类检测,当真正的类比较稀少的时候,拒绝级联可以极大减少整体计算量

Haar级联boosting

对于Viola-Jones拒绝级联,每个节点本身是一个弱分类器的集合,

通过boosting组合,形成强分类器节点

单个弱分类器本身是决策树,只有一层的深度,即决策桩,只有一个决策

之后使用弱分类器的加权和,boosting迭代地建立强分类器节点

70%-80%的非人脸再拒绝级联其的前两个节点就已经被拒绝,快速而早期的“有意识拒绝”极大加快人脸识别的速度,并且正好是Viola-Jones算法实用性的基础

人脸前向视图运行较好,汽车后向、侧向运行较好, 但是人脸的侧向和汽车的斜向运行效果不好

只学习一个人脸轮廓(例如右侧)更高效,第一步运行右侧轮廓检测器,第二步再垂直轴旋转图像左右翻转,再次运行右侧轮廓检测器以检测左脸

基于这些类Haar特征和LBP特征的检测器对块状特征的检测效果较好,但是对树干等物体轮廓形状是其最明显特征时检测效果不好