论文出处:《基于OpenCV的机械零件局部特征的识别与检测》— 孙新军
粗减版:
1.openCV操作:
·图像高斯滤波
cvSmooth(0
·OTSU二值化
cvThreshold()
·图像膨胀处理
cvDilate(0
2.图像特征提取
·轮廓长度:cvArcLength
·轮廓面积: cvContourArea
·7个HU矩: cvGetHuMoments
·平均功率谱:cvDFT
·熵:
·能量
·对比度
·一致性
·行列式的值:cvDet
·条件数得倒数:cvInvert+CV_SVD(参数)
·范数:cvNorm
·0阶空间矩:cvGetSpatialMoment
3.图像特征识别与检测
随机森林学习算法:
bool CvRTrees::train()//训练
double CvRTrees::predict()//测试
//特征信息以行向量方式输入,80%样本进行训练
//具体参数看详细版
详细版:
0.open CV 补充知识
·opencv 数据访问方式
访问方式有四种:间接访问,直接访问,指针访问,用C66外壳访问。
·指针访问:
·单字节单通道的图像访问:
IplImage* img = cvCreateImage(cvSize(512,512),IPL_DEPTH_8U,1);
int height = img->height;
int width = img->.width;
int step = img->widthStep/sizeof(uchar);
uchar* data = (uchar*) img->imageData;
data[i*step+j] = 111;
·对单字节多通道图像访问:
IplImage* img = cvCreateImage(cvSize(512,512),IPL_DEPTH_8U,3);
int height = img->height;
int width = img->width;
int step = img->widthStep/sizeof(uchar);
int channels = img->nChannels;
uchar* data = (uchar*) img->imageData;
data[i*step+j*channels+k] = 111;
·openCV数据结构:
CvMat--矩阵类
IplImage--图像类
CvHistogram--多维柱状图混合类
CvSeq,CvSet--可变集合类
CvArr*--通用数组形式
1.图像目标区域提取
cvGetRectSubPix
提取规则:dst(x,y) = src(x+center.x-(width(dst)-1)X0.5,y+center.y-(height(dst)-1)X0.5)
函数对应的三个参数分别是:输入图像,提取的像素矩形,提取的像素矩形的中心。
2.图像滤波
文中选择了使用高斯滤波进行突破的平滑操作
·高斯滤波:
采用加权求均值的方法实现平滑滤波的效果。
·高斯滤波的五个重要性质:
1.旋转对称性: 滤波器再各个方向上的作用效果是一样的。
2.单值函数:高斯滤波器中目标点的像素值等于邻域像素值的加权值。
而权值是对应点与中心点之间按距离的单调函数。
3.高斯函数具有单瓣的傅立叶变换频谱:
因为高斯函数傅立叶变换等于高斯函数本身。图像含有高频信号和低频信号,
通常情况下,高频信号往往是不需要的信号(噪声,细纹理),在滤波时要将它去除。
但是图像的特征,边缘即含有高频,也有低频信号。
而这一特征表明滤波时可以去除掉不需要的高频信号,留下有用的特征。
4.高斯滤波器宽度由参数σ决定,且成正比,且平滑程度越好,
但是当参数值过大时又会出现过平滑现象,反之又会欠平滑,因此根据实际情况调整
5.高斯函数具有可分离性,可实现较大尺寸的高斯滤波器。
·高斯滤波器设计:
均值为0的一维高斯函数为:
其中σ决定了高斯滤波器的宽度。图像的高斯滤波常用均值为0的二维离散高斯函数实现:
因此,设计高斯滤波器的关键在于计算高斯核,高斯核的计算可以通过二维高斯函数实现
图像的高斯滤波需要用离散的模板,连续高斯分布经过采样,量化处理后,可以得到离散的模板且模板需要做归一化处理。离散高斯卷积核的维数为H:(2k+1)X(2k+1)
在openCV中,高斯滤波可以通过cvSmooth实现,且在论文中,对于参数param1和param2的值均设置为5,param3和param4则为0
·图像二值化:
论文中使用的是OTSU阈值分割法。
·本节小结:
该节主要是使用opencv实现图像处理功能,包括目标区域的提取,图像滤波,图像二值化和图像膨胀
3.图像特征提取
通常图像识别中,主要提取图像的以下四类特征:
1.直观性特征。特点是容易提取,物理意义明确,如图像轮廓,边沿,区域和纹理等
2.灰度统计特征。把图像看作二维随机过程,对其进行统计分析。如图像的七个HU不变矩
3.变换域特征。可对图像进行Huohg变换,曲波变换,离散余弦变换等各种数学变换,将变换域系数看作图像的特征
4.代数特征。是图像内在属性的一种反映。图像可看作矩阵,可对其进行各种矩阵分解过代数变换。从而获得参数分析
论文中主要研究图像的直观性特征,灰度统计特征和代数特征
3.1 图像直观性特征提取
·轮廓长度和面积计算
opencv的库函数FindContours在二值图像中寻找轮廓。
在提取轮廓后,使用cvArcLength计算轮廓的周长或曲线的长度,使用cvContourArea计算轮廓所围区域面积
·纹理的特征提取
纹理特征作为一种统计特征,可以有效抵抗噪声干扰,且具有旋转不变性。它的统计实在图像的某个区域中进行的,而不是某个像素点上,所以不会因为局部的差异匹配失败。
虽然会受到光线等环境因素影响,但是当图像纹理相差较大时,能取得比较好的效果
论文中主要用统计法中的灰度共生矩阵的纹理特征分析方法分析图像的纹理。
灰度共生矩阵是一个对称矩阵,反映了相同的灰度级像素之间的位置分布特征以及图像灰度在相邻方向,间隔以及变化幅度的综合信息。
设大小为MXN的图像,灰度等级为Ng,其元素用f(x,y)表示,可以得到灰度共生矩阵:
由于灰度共生矩阵是高维数的,使用起来不方便,可以以它为基础,计算图像的纹理特征。比如通过灰度共生矩阵计算图像的对比度,相关性,熵,能量等特征量。
1.对比度:又称为反差,反映了图像的纹理的沟纹深浅和清晰度。对比度越大,纹理的沟纹越深,图像越清晰,反之亦然。
Con=ΣiΣj(i-j)^2·P(i,j)
2.能量:描述图像纹理的灰度变化稳定程度,是对图像纹理的粗细度和灰度分布均匀程度的反映。能量值越小表明纹理的变化越不规则,越不稳定
Asm = ΣiΣj·P(i,j)^2
3.熵:表示图像像素值的随机性,熵值越小,图像越简单,反之亦然。熵值最大说明像素值出现最大的随机性或共生矩阵中所有元素想等
Ent = -ΣiΣj·P(i,j)·logP(i,j)
4.相关性:又称为同质性,表示图像灰度级在列或行方向上的相似程度
Corr = [ΣiΣj·((ij)·P(i,j))-uxuy]/(σxσy)
3.2 图像灰度统计特征的提取
典型的灰度统计特征是图像的几何矩。其具有平移,旋转和尺度不变性等特征
2.对于数字图像,离散化,f(x,y)的(p+q)阶空间矩和中心矩定义为:
3.归一化中心矩
其具有平移和比例不变性4.HU矩定义
Hu矩在图像时连续的条件下,具有平移,缩放和旋转不变性,它通过二阶和三阶中心距构造而成,共有7个。
在论文中,主要提取图像pho(膨胀处理后的图像)的七个HU矩和0阶空间矩,x方向一阶空间矩和y方向一阶空间矩。
Hu矩用函数cvGetHuMoments提取,空间矩用函数cvGetSpatialMoment提取
3.3 图像代数特征的提取
图像可以看作矩阵,可对其进行各种矩阵分解或进行各种代数变换,从而获得一些参数,作为图像的特征。
文中主要提取图像的以下特征:
1.图像中非零元素的个数:
图像经过二值化和膨胀处理后,非零像素的数量不同,因此可以统计膨胀后图像中非零像素的个数。openCV中对应的函数时cvCountNonZero
2.像素平均值
图像的像素存在差异,因此像素均值可作为特征值,在openCV中,可以用cvAvgSdv计算数组元素的平均值和标准差
3.计算图像的范数
图像可以看作矩阵,矩阵可以计算范数。设Rnxn表示所有nXn阶实矩阵,| |·| |为Rn上的任一向量范数
在openCV中,可以使用函数cvNorm计算图像的范数,函数的类型通过norm_type设置,在论文中,参数范数类型设置为CV_C
4.行列式的值
在论文中,主要计算滤波之前图像的行列式的值,通过cvDet来计算。
5.条件数的倒数
即是矩阵的范数与其逆矩阵的范数的乘积。可通过cvInvert计算图像的条件数。,该步骤对象时滤波前的图像。
在使用时,将参数求逆的方法设置为CV_SVD(奇异值分析法),当输入矩阵的元素不全为0时,函数返回值为条件值的倒数
6.图像主特征值
在论文中,使用奇异值分解的方法计算图像的主特征值。对应函数为cvSVD.提取的时膨胀后图像的值。
7.图像平均功率谱
在求功率谱前首先要进行傅里叶变换,在opencv中用cvDFT执行一维或二维浮点数组的离散傅里叶正变换或逆变换。
论文中,对膨胀后的图像进行变换,然后求其平均功率图谱
8.平均梯度
梯度定义是,函数f(x,y)在x方向和y方向可微,即为grad f。
图像在像素变换的地方存在梯度,即边缘的梯度最大。由于计算机不能对图像进行微分,因此用差分来代替,即cvSobel计算图像的差分
在cvSobel中的一个重要参数为aperture_size,大小必须是1,3,5,6,表示扩展Sobel核的大小
再计算梯度时,需要使用Sobel函数对图像做两次处理,分别计算图像在x,y方向的差分,将aperture_size设为3,然后再计算图像梯度模的平均值
9.图像的峰值信噪比
用来对图像质量进行评价的客观标准,在论文中,计算的是膨胀处理后图像的峰值信噪比。主要分为三个步骤:
1.计算像素的平均值。2,计算像素的标准差。3.计算峰值信噪比
·像素平均值核标准差
·图像范数计算
·傅里叶变换
·平均梯度:
·图像差分
·图像峰值信噪比
3.4 数据处理
经过上述一些列操作,总共提取了图像的25个特征,在实验时分别验证在不同特征组合下分类器的效率,从而选择分类效率最高的特征组合核分类器模型进行检测。
25个特征值分别是:轮廓长度,轮廓面积,7个Hu矩,平均功率谱,熵,能量,对比度,一致性,行列式的值,条件数的倒数,范数,0阶空间矩,x方向一阶空间矩,y方向一阶空间矩,主特征值,非零像素点个数,像素平均值,梯度模的平均值,峰值信噪比
每幅图像的25个特征组成一个行向量,共110张图像,所以得到一个110X25的矩阵。然后对每一个图像事先设定属性,如加工或未加工(全监督学习)。将标签放在矩阵第一列
4.1 零件局部特征的识别与检测
·识别过程:
识别过程分为训练过程和识别过程。
训练过程是将,训练样本x和类别信息y同时输入分类器中训练
识别过程是将x当作分类器的输入量,从而的到信息y的过程,从而找出映射关系Y = f(X)
后处理主要是对识别结果进行评估和改进,如比卖你overfitting等。
·图像识别方法分类
1.统计识别方法:
在模式空间中,相似的样本互相接近,并形成一个几何,可看作是根据模式之间的某种距离函数判定分类
2.句法识别方法:
又称为语言学方法或结构方法。将一个模式分为几个简单的子模式,子模式再分,最后的到一个树状的结构。位于最底层的最简单的子模式称为模式基元
论文中使用统计方法进行识别。
统计识别算法有很多种,如贝叶斯算法,人工神经网络,支持向量机,EM算法,决策树,随机森林等
文中选用了贝叶斯算法和随机森林算法对图像进行识别分类
4.1 贝叶斯学习算法
该算法分类原理是利用贝叶斯公式根据对象的先验概率计算出属于某一类的概率,称为该对象的后验概率。则该对象所属的类为具有最大后验概率的类。
·贝叶斯分类算法的特点:
1.需要知道先验概率:
先验概率通过对置信度的主观判定得到。
2.可以按照获得的信息修正先验概率:
在得到与样本特征相关的大量信息后,可以以贝叶斯公式为依据,通过修正先验概率获得后验概率,提高决策的置信度和准确性
3.分类决策存在错误率:
由于样本属于某类的概率是由贝叶斯分类器推测的,这会导致错误率的产生,即便是在低错误率的情况下,也会发生错误分类的情况。
·贝叶斯网络:
P(a|b) = P(ab)/P(b)
贝叶斯网络分类器主要通过两个步骤实现。第一步是学习的过程,一样本数据为基础构造分类器(包含CPT学习和结构学习)。第二步是推理过程,即计算节点的条件概率,对分类数据进行分类。
·朴素贝叶斯(NBC)
在实际问题中,由于要减少以上两个步骤的时间复杂度,往往需要对贝叶斯网络分类器进行简化。
NBC算法假设各属性之间是相互独立的,因此误差率非常小。但是当实际问题中各属性之间相关性较大或属性数量较多时,NBC模型的分类效率较差。
Vmap = arg max P(Vj | a1,a2,...,an)
其中,Vmap--根据给定的例子得到的最可能的目标值,即计算得出概率最大的值;
a1,a2...,an---盖顶例子里面的属性
Vj --- 属于V集合
将贝叶斯公式带入上式得:
因为朴素贝叶斯假设a1,a2…,an是相互独立得,所以P(a1,a2,…,an)对结果没有用处。因为P(a1,a2,…,an)恒定,对结果没有影响,因此式子可写成
又因为a1,a2…an相互条件独立,所以它们得联合概率为各个单独属性的概率的乘积,即:
所以朴素贝叶斯分类器最终写为:
4.4 随机森林学习算法
随机森林是由一系列的单颗树决策器组成的分类器,在分类过程中,对于输入样本x,每一棵决策树都会给它认为最合适的类投一票,最后根据各棵树输出类别的中枢决定输出类别。
随机森林又根节点,中间结点和叶子节点组成。其分裂步骤具体如下:
1.假设训练样本集用T表示
2.从T中选择一个最能区分样本的属性
3.创建一个值为所选属性的树结点,然后再创建该节点的子节点,
树结点与子节点之间通过链连接,每条链都有唯一的值表示所选的属性,
使用该值将样本进一步细分为子类
对于第三点用两种情况:
1.如果子类的样本与预定义的规则相符合,过没有属性集可供树的这条路径选择,则会为这条路径的新的样本指定类别(叶子节点)
2.如果子类的样本与预定义的标准不相符,或者数的路径可被一个或以上的属性细分,则返回步骤2(中间结点)
随机森林由许多以上的决策树组成,且每一棵决策树都是独立的,互不关联。对于每一个输入的新样本,每一棵决策树都会独立判断,并给出自己的预测结果,然后森林对每棵树的判断结果进行统计,被选择最多的哪一类就是随机森林的预测结果。
· 随机森林算法的特点
1.随机森林算法精度较高
2.可对泛化误差进行内部无偏估计,且估计值的误差较小
3.可处理变量的数目很大
4.可以计算实样本之间的相似度,进行聚类分析。通过缩放比例确定异常点,然后对数据集进行诠释
5.可以在不平衡的数据集的类别总图中平衡误差
6.可以有效的处理大的数据集,并且有效的对缺失数据进行估计,当数据集中丢失大量数据时仍可以保持精度不变
7.可以计算各属性之间的相关性以及分类的信息
8.对数据集的类型没有限制,既可以处理连续性数据,也可以处理离散型数据,且不需要对数据集进行规范化处理
9.会将生成的森林保存起来,以备其他的数据使用
10.不会产生过度拟合且运行速度快
· 随机森林的理论基础
1.大数定理
大数定理的定义是:自然界中有些随即事件是没有规律的,但也有不少随机事件是遵循一定规律的,
而这些随机事件在大量重复出现的情况下,常表现出几乎必然的统计特征
简单来说,就是在试验条件不变的情况下,重复进行多次实验,随机事件发生的概率就非常接近于它的概率
在随机森林中:
当随机森林由大量决策树构成时,他会遵循大数定律,因此随着分类树数目的增加。对于所有序列,泛化误差几乎处处收敛到:
·泛化误差的内部估计
定义随机森林的边际函数为:
定义分类器{h(x,θ)}的分类效能为:S = Ex,y mr(x,y)(mr(x,y)的期望)。切比雪夫不等式定义为:对任意一个随机变量X,若E(X)和方差D(X)都存在,则对于任意的a>0,恒有P{|X-E(X)|>=a}<=D(X)/a2 或 P{|X-E(X)|<a}>=1-D(x)/a2.从上式可以看出,方差D(X)越小,P{X-E(X)<a}越大。也就是说,随机变量X的取值基本集中在均值E(X)附近
对于固定的θ,θ‘,P(θ,θ’)是rmr(θ,x,y)与rmr(θ’,x,y)之间的相关系数,sd(θ)为rmr(θ,x,y)的偏差水平,于是:
从上述公式可得到泛化误差的上界为
式5-21界定了森林的泛化误差下限,这只是一个内部估计值,精确的误差随不同的数据集界定
·随机森林的构建
随机森林的构建方法有很多种,可以根据实际问题需要构建
1.袋装法:
·是一种以数据融合技术和步步为营法为基础的统计重采样的组合技术。
·利用步步为营法从原始数据集中重采样获得一串新的训练集,且采集过程是随机进行的。
·新的训练集只包含2/3的样本,这使得样本集合中不包含可能的”异常点“
·袋装法将生成的多个单一分类器组合成一个分类器,比起单个分类器有更好的分类能力。
·袋装法创建随机森林的步骤如下:
(1).利用步步为营法对给定的一个训练样本进行采样,采样时随机的,重复进行n次,(x1,y1)...(xn,yn)-->(x1*,y1*),...,(xn*,yn*)
(2).以每个步步为营样本为基础,创建一颗决策树
(3).重复,1,2步骤,得到多棵决策树
(4).没课决策树都按照分类算法对输入的xi进行投票,做出预测
(5).统计所有的投票数,xi的分类标签就是得票数最高的那个
(6).随机森林的错误分类率就是所得分类标签与正确的分类标签不一样的比例(P分类结果/P正确分类)
2.更新权重算法
通常有三种:Adaboost算法,加弧法,Arc--x4算法:
Adaboost的目的是在前面分类器错误分类的基础上为下一个分类器的输入选择训练集上的权重,利用训练集和加权训练集来改进每个分类器
Adaboost算法结构简单,运行速度快,需要的参数少等优点
但是如果在弱的弱假设或者复杂的弱假设集上所给的数据不够充分,表现会变差,且容易受到噪声干扰
3.基于输入构建随机森林
·Forester-RI:
·先将给定的特征随机分成若干组,每组所含特征数量是一个定值;
·然后利用CART方法对每组进行分裂,重复进行该过程,直到所有节点都不能分裂为止;
·优点是能够得到较高精度的随机森林分类器
·Forestes-RC:
·将给定的变量随机进行线性组合,然后再将其作为分类器的输入量来构建随机森林
·该方法构建的随机森林精度较高,且可以处理不同量纲的变量数据集
4.基于输出构建随机森林:
·拖尾法:
指在随机森林分类器的输出过程中加入高斯噪声
·浮动法:
指用一个参数来度量某一个或若干个输出的分类标签的改变程度,该参数称为浮动率
以上两个方法都可以用于解决分类和回归问题,效果不错,且能够计算每个特征的重要性
5.根据随机选择的特征子空间构建随机森林:
·是指从给定的特征集合中选择少量的特征组成特征子空间,作为随机森林的输入。
·选择特征子集的过程是随机地,自主的,且所选择的子空间是固定的。
·在每个节点的分裂过程中都进行一次选择。
·在没有选择的特征中都有一个数值与特征子空间中的点对应。
·所有的样本都被添加到同一子空间中,并利用相应的树进行分类。
与单一的分类器相比,该方法有更好的分类能力,且可以在低维空间上正常工作。该方法在单颗树上的精度较低,但是对于多棵树来说,该方法精度最高。
在实际应用中,往往将袋装法和随即特征选择法同时使用
使用袋装法主要有两方面原因:
1.在使用随机特征时,利用袋装法可以提高随机森林的精度;
2.袋装法可以估计数据集的总体泛化误差,且估计比较精确
·以给定一个特殊训练集T为基础,运用步步为营的方法构建训练集Tk以及分类器h(X,Tk),由投票创建松弛的预测器。
对于训练集T中的每一个变量y,x将不包含y,累计x的分类器Tk上得到的票数,得到袋外数据分类器。
泛化误差的袋外数据估计就是训练集上的袋外数据分类器的误差率
步步为营法从原训练集中去除大约1/3的样本,使样本集合中不包含这些可能的“异常点”,有利于提高分类器的精度
随机森林的重要性使计算单个属性的重要性。具体做法如下:
1.用袋外数据来测试以生成的随机森林的性能,得到一个袋外准确率;
2.在袋外数据集中加入噪声(如随机改变某个特征值),然后用加入噪声的袋外数据再对随机森林进行性能测试,得到一个新的袋外数据准确率;
3.所选特征的重要性用原始的袋外数据准确率与加入噪声后的准确率只差来度量。所选特征越重要,这个值越大(噪声影响越大)
4.5 零件局部特征的图像识别实验
文中采用110张图像进行实验。从总样本中随机选取80%作为训练样本。
将第三章所获得的特征值作为贝叶斯和随机森林分类器的输入,分别验证再不同数量特征值使贝叶斯和随机森林分类器的识别率,从而选取识别率最高的分类器和特征值的组合,来对图像进行检测。
训练时采用有监督学习方法,将图像的特征值和对应的类别同时输入分类器中。分类器经过学习后形成可以用于分类的分类器模型。进行测试时,将特征值输入已经训练好的分类器模型中,然后输出图像所属的类别,将分类器输出的图像类vi额与图像的真实类别进行比较,计算出分类器的识别率。
实验结果表明,随机森林算法比贝叶斯算法有更高的识别率
·贝叶斯算法的实验验证
在openCV的机器学习库(ML)中包含朴素贝叶斯类,可直接调用。
在实验中,var_idx和sample_idx都设置为零,即使用所有特征和数据样本,update值设置为false;
从上图可看出在特征值数量为18个时,贝叶斯分类器识别率只有48.2%
· 随机森林算法的实验验证
openCV中包含森林类,它是根据Leo Breiman的随机森林方法执行的。
在解决回归问题时,通过计算森林中所有子节点上值的平均值解决。在建立决策树时会一直继续下去直到数据纯净。因此,虽然每棵树都很好学习了训练数据,但是各棵树之间仍有很大不同,因此平均能解决这样的问题。
如果所有树都很相似,随机森林的作用会大幅减小。因此,随机森林在树的建立过程中随机选择特征子集来让各棵树都不相同。随机子集的规模一般是特征数量的开方。
为了提高鲁棒性,随机森林使用袋外方法来检验分裂。给定任何节点,训练发生在一个随机选择然后替换的数据子集上进行,没有选到的数据叫做OOB数据,用于估计分裂的性能,OOB数据一般为所有数据的1/3
测试方法如下:
在训练随机森林分类器时,有两个关键参数:每棵树选取特征子集的大小和森林内树的数目上限,特征子集的大小设置为特征总数的平方根,森林内树的数目上限限制为100。在训练时将变量重要性是否计算设置为true,则可通过函数
Const CvMat* CvRTrees::get_var_importance() const
计算每一个特征的相对重要性。通过函数
int get_tree_count() const
获得树的总数
测试时,输入变量sample为图像的特征值;missing设置为0,即sample中无数据丢失。函数返回图像的类别
在实验中,数据以行向量输入;类别标签为设置的图像的标签。
从上图中,看到识别率为99.1,且决策树数目为22课,结果中还可以看到各个特征值的作用·实验结果分析
从上图可以看出,该实验中,随机森林分类器的性能明显由于贝叶斯分类器。
·实际检测:
从上一届实验中可得:在特征值为18个(轮廓长度,轮廓面积,7个HU矩,平均功率谱,熵,能量,对比度,一致性,行列式得值,条件数得倒数,范数,0阶空间矩)时,随机森林分类器识别率最高。因此用这18个特征值训练随机森林分类器,检测时,直接调用训练好的分类器模型
5.改进方向
1.从图像上看,在实验中,可以设计更加全面的特征值作为随机森林得输入
2.从算法本身上看,可以改进随机森林得方法。