机器学习与数据挖掘实验一:牛顿法,梯度下降实现对数几率回归【详细原理+python代码】
机器学习与数据挖掘实验二:以信息增益为划分准则构造决策树【例题求解】
机器学习与数据挖掘实验三:基于 CNN (VGG,GoogLeNet)的海面舰船图像分类【详细原理+python代码】
机器学习与数据挖掘实验四:基于特征工程的支持向量机分类实验【详细原理+python代码】
针对纹理数据集,从中任选两类数据放在一起通过基于特征工程的支持向量机实现图片二分类的训练与测试。将其分为 3 个子问题进行实现:
实验在环境为:pycharm,python3.8,主要采用Scikit-learn和numpy库进行实现,依赖库名称、版本与功能如表所示。
依赖库名称 | 依赖库版本 | 依赖库功能 |
---|---|---|
Scikit-learn | 0.23.1 | 涵盖机器学习中数据预处理、模型验证、基本任务模型等环节。 |
Numpy | 1.21.2 | 提供高性能的矩阵运算,实现多维数组计算 |
HOG算法主要是基于各像素点的梯度提取出图像中目标的轮廓,用较少的特征更好地表达图像中目标信息。由于直接将彩色图片的三维矩阵合并成一个向量会出现以下问题:
因此,在进行图像分类之前,使用HOG算法对图像特征进行压缩。
HOG特征描述符可以将 3 通道的彩色图像转换成一定长度的特征向量,在HOG特征描述符中,梯度方向的分布,即梯度方向的直方图被视作特征。其算法流程如图所示。
1 、图片预处理
首先进行色彩变换,对于猜测图像可以先进行灰度处理然后计算梯度或先对三通道颜色值分别计算梯度,然后取梯度最大的那个作为像素的梯度。然后进行伽马矫正调节图像对比度,使过曝或者欠曝的图像恢复正常,更接近人眼看到的图像。其公式为:
f ( x ) = x γ f(x)=x^{\gamma} f(x)=xγ
2 、计算梯度图
为了得到梯度直方图,首先通过内核过滤图计算水平和垂直梯度,然后将其合并得到合梯度的幅值合方向。
g = g x 2 + g y 2 g =\sqrt{g_{x}^{2}+g_{y}^{2}} g=gx2+gy2
θ = arctan g y g x \theta =\arctan \frac{g_{y}}{g_{x}} θ=arctangxgy
3、计算梯度直方图
由于一整张梯度图中的有效特征非常稀疏,因此为表示更紧凑的特征,把整个图像划分为若干个 8 × 8 8\times8 8×8(可以为其他值)的小单元,称为cell。然后,通过长度为9的数组表示每个cell的梯度直方图,使得图像特征更加紧凑,对单个像素值的变化不敏感,抗噪声干扰能力更强。
计算cell中像素的梯度直方图方法如下:先将角度范围分成9份,也就是9 bins,每20°为一个单元,然后按照角度,将像素分为9组。将每一份中所有像素对应的梯度值进行累加,可以得到9个数值。直方图就是由这9个数值组成的数组。
4、block归一化
HOG将 8 × 8 8\times8 8×8的一个区域作为一个cell,再以 2 × 2 2\times2 2×2个cell作为一组,称为block。由于每个cell有9个值,则每个block有36个值,HOG是通过滑动窗口的方式来得到block。
首先将一个block的四个直方图拼接成长度为36的向量,然后对向量进行归一化操作。对于向量 a a a,其归一化公式为:
a ‘ = ( a 0 ∥ a ∥ , … , a n ∥ a ∥ ) a^{‘}=\left(\frac{a_{0}}{\|a\|}, \ldots, \frac{a_{n}}{\|a\|}\right) a‘=(∥a∥a0,…,∥a∥an)
其中 ∥ a ∥ \|a\| ∥a∥满足 ∥ a ∥ = ∑ i = 0 n a i 2 \|a\|=\sqrt{\sum_{i=0}^{n} a_{i}^{2}} ∥a∥=∑i=0nai2。
滑动步长为8个像素,每滑动一次就在这个窗口上进行归一化计算得到长度为36的向量,重复此过程直到结束。
5、计算HOG向量
每滑动一次,一个block就得到一个长度为36的特征向量。将整幅图像划分成cell的个数为 8 × 16 8\times16 8×16,即横向有8个cell,纵向有16个cell。每个block有 2 × 2 2\times2 2×2个cell,则cell的个数为105。即有7个水平block和15个竖直block。再将这105个block合并,得到整个图像的特征描述符,长度为 105 × 36 105\times36 105×36=3780。
LBP(Local Binary Patterns,局部二值模式)是一种简单高效的局部纹理特征描述算子,于 1994 年由T. Ojala, M. Pietikäinen和D. Harwood提出,LBP特征一定程度上消除了光照变化的问题,具有旋转不变性,纹理特征维度低,计算速度快的特点,在机器视觉领域中得到了广泛的应用。
LBP特征描述符可以将 3 通道的彩色图像转换成一定长度的特征向量,接下来以原始LBP算法为例进行分析,其算法流程如图 所示。
对于原始图片,首先,将图片划分成为很多个cell,计算每一个cell中的每一个像素点的LBP值,并计算每一个cell的直方图,然后将直方图进行归一化处理,最后将归一化后的直方图拼接为图像特征向量。其流程与HOG算法大致相同,最大的区别主要是LBP值的计算不同。因此在这里主要对LBP值计算方法进行阐述。
原始的LBP算子定义为3*3的窗口,将中心的像素值作为阈值,将其邻域与阈值比较,若邻域像素值大于等于阈值,则标记为 1 ,否则标记为 0。将窗口左上角的像素点作为起始点,顺时针旋转,与阈值进行比较,得到一串 8 位的二进制数,将该二进制数转化为十进制。算法示意图如图所示。
由此可得LBP值计算公式为:
LBP ( x c , y c ) = ∑ p = 0 p − 1 2 p ⋅ s ⋅ ( i p − i c ) \operatorname{LBP}\left(x_{c}, y_{c}\right)=\sum_{p=0}^{p-1} 2^{p} \cdot s \cdot \left(i_{p}-i_{c}\right) LBP(xc,yc)=p=0∑p−12p⋅s⋅(ip−ic)
其中 ( x c , y c ) \left(x_{c}, y_{c}\right) (xc,yc)为重心像素, i c i_{c} ic是灰度值, i n i_{n} in是 相邻像素的灰度值,S为符号函数,其中s满足:
s ( x ) = { 1 if x ≥ 0 0 else s(x)=\left\{\begin{array}{ll} 1 & \text { if } x \geq 0 \\ 0 & \text { else } \end{array}\right. s(x)={10 if x≥0 else
灰度共生矩阵法是通过计算灰度图像得到它的共生矩阵,然后通过计算该共生矩阵得到矩阵的部分特征值,分别代表图像的某些纹理特征。灰度共生矩阵能反映图像灰度关于方向、相邻间隔、变化幅度等综合信息,是分析图像的局部模式和它们排列规则的基础。
GLCM特征描述符可以将 3 通道的彩色图像转换成灰度共生矩阵,其算法流程如图所示。
1、提取灰度图像
将多通道图片(一般为RGB图像)转换为灰度图像,分别提取出多个通道的灰度图像,可以任选其中一个通道进行提取。
2、灰度等级压缩
一般在一幅图像中的灰度级有256级,从0–255。为简化计算,在计算灰度共生矩阵时将灰度级设置为8或16,在这里以8为例进行说明。当分成8个灰度级时,首先进行灰度级压缩时,将图片进行直方图均衡化处理,增加灰度值的动态范围,然后将像素点的灰度值除以32取整。
3、 计算特征值的参数选择
计算特征值前,首先选择计算过程中的一些参数:
4、纹理特征值的计算与纹理特征影像生成
设定GLCM矩阵的大小与图像的灰度等级数目相同,在这里假设图像灰度等级为3,则GLCM矩阵表示形式如下:
p δ = [ n ( 0 , 0 ) n ( 0 , 1 ) n ( 0 , 2 ) n ( 1 , 0 ) n ( 1 , 1 ) n ( 1 , 2 ) n ( 2 , 0 ) n ( 2 , 1 ) n ( 2 , 2 ) ] p_{\delta}=\left[\begin{array}{lll} n_{(0,0)} & n_{(0,1)} & n_{(0,2)} \\ n_{(1,0)} & n_{(1,1)} & n_{(1,2)} \\ n_{(2,0)} & n_{(2,1)} & n_{(2,2)} \end{array}\right] pδ=⎣⎡n(0,0)n(1,0)n(2,0)n(0,1)n(1,1)n(2,1)n(0,2)n(1,2)n(2,2)⎦⎤
其中$\delta $表示像素对的位置关系,两个像素相对位置关系,分为 0 ∘ 0^\circ 0∘, 4 5 ∘ 45^\circ 45∘, 9 0 ∘ 90^\circ 90∘, 13 5 ∘ 135^\circ 135∘。 n ( i , j ) n_{(i,j)} n(i,j) 表示灰度等级i和j的像素对,在 δ \delta δ定义的位置关系下,出现的次数。
由此公式求出四个方向矩阵的特征值后,可以通过计算四个特征值的平均值作为最终特征值共生矩阵。
对于数据集的选择,随机选择了canvas1-without-rotations和seat1-without-rotations数据作为图像分类的原始数据集。其中两种类别的图片分别包括 160 张图片。由于数据集较小,因此对于训练集和测试集的划分比例我选择了 8 : 2 。其中为选择最优参数,在对超参数进行网格搜索的过程中,选择从训练集中划分20%的数据作为验证集进行交叉验证,因此得到具体的训练集,验证集,测试集比例如表 2 所示。
数据集名称 | 训练集 | 验证集 | 测试集 |
---|---|---|---|
canvas | 128 | 25 | 32 |
seat | 128 | 25 | 32 |
经过测试,以HOG,LBP,GLCM为特征提取方法的SVM分类器的超参数惩罚系数C在1e-5,gamma在1e-5附近时,分类性能较高,因此将网格搜索的参数范围设置为:
C_range = np.logspace(-15, -1, 15) # C: 10^-15,10^-14,...,10^-1
gamma_range = np.logspace(-15, -1, 15) # gamma:10^-15,10^-14,...,10^-1
经过网格搜索可以得到HOG,LBP,GLCM,LBP+GLCM四种特征提取方法与SVM分类器结合的图片分类最优参数,参数如表所示。
方法名称 | 惩罚系数C | gamma |
---|---|---|
HOG+SVM | 1e-10 | 1e-10 |
LBP+SVM | 0.1 | 0.01 |
GLCM+SVM | 0.1 | 0.01 |
GLCM+LBP+SVM | 0.1 | 0.001 |
在最优参数下训练基于不同特征提取方法的分类器,最终可以得到四种特征提取方法的分类性能结果。其分类性能结果对比表如表所示:
分类指标 | GLCM+SVM | LBP+SVM | HOG+SVM | GLCM + LBP+SVM |
---|---|---|---|---|
精确率(Precision) | 1 | 1 | 0.96774 | 1 |
召回率(Recall) | 1 | 1 | 0.9375 | 1 |
F1-score | 1 | 1 | 0.95238 | 1 |
准确率(accuracy) | 1 | 1 | 0.953125 | 1 |
测试时间 (s) | 3.08 | 6.841 | 20.791 | 7.558 |
测试集上每张图像消耗时间 (ms) | 48.125 | 106.891 | 324.859 | 118.094 |
通过对比结果分析可以得出以下结论:
通过上表可以得到,在综合考虑分类时间和分类效果的条件下,GLCM特征+SVM分类器的耗时最短,性能最好。在不考虑分类时间的条件下,LBP和LBP+GLCM特征的分类效果也较为优越。HOG不论是分类时间还是分类效果均是最差的。
代码+数据集下载
[1] Dalal N. Histograms of oriented gradients for human detection[J]. Proc of Cvpr, 2005.
[2] Ojala T , Pietikainen M , Maenpaa T. Multiresolution Gray-Scale and Rotation Invariant
Texture Classification with Local Binary Patterns[C]// IEEE. IEEE, 2002:971-987.