利用老师发的感应电机红外图像数据集,通过卷积神经网络实现图像的分类,同时运行出效果图
python
版本:3.11
pip install -r requirements.txt
python cnn.py
-
在机器学习中有两种主要的方法,一种是监督学习,一种是无监督学习
-
本次实验中我们分别采用这两种方法来实现图像的多分类问题,无监督学习方面采用
K-Means
聚类分析,而监督学习采用卷积神经网络CNN
以及支持向量机SVM
来进行
-
将图片转换成张量,放到高纬度坐标系里求笛卡尔距离,不断更新每个簇(
cluster
)的中心,最终分好的类就是给定的cluster
的数量 -
其属于无监督学习,朴素的
K-Means
不引入网络,分好的;类效果如图:
- 可以明显地看出分的类并没有理想中的这么好,但是整体是把11个类别都分出来了
-
首先划分好不同训练集测试集比例的数据集,然后通过
export_train_label.py
和export_test_label.py
打上标签,形成需要的txt文件,做好数据的预处理 -
利用方向梯度直方图
HOG
来提取特征,由于该测试集主要是依据颜色判别,所以灰度处理的效果不好,所以我们采用了rgb格式的处理 -
依照相应流程,特区特征、训练模型,然后做模型的评估,保存相关结果进
results
文件夹中,计算损失、准确率、精确率和召回率,相关情况如图:
- 可以看出,效果比无监督学习要好,且在训练集和测试集之比为8:2的时候效果最好
-
本项目主要是基于
Pytorch
框架进行卷积神经网络训练模型,版本为2.3.0 -
首先进行数据处理,打上相应的标签。将369张图像进行测试训练二八分,分别存在
Dataset/train
和Dataset/test
下,然后根据类别各自命名,通过名字来实现手动分类,以下是分类的一些说明图:
-
然后由于图像数量较少,这里做了一些数据增强,在
load_data
中对图像做了随机的水平和垂直翻转,同时对三个颜色通道都做了归一化处理,然后将处理好的数据导入神经网络中 -
卷积神经网络的核心部分主要分为三个,我们设计了三个卷积层和三个全连接层,同时池化层的规格是2x2,每次实现的时候都用激活函数
relu
做激活,最后一层全连接函数不用激活 -
另外,我们也设置了随机种子,来保证结果的可重复性;设置的
device
变量也可以自动检测运行机器有没有合适的GPU,如果有则使用GPU运行,否则使用CPU -
可以看到整体曲线非常符合曲线函数,同时到最后,损失趋近于0,且准确率趋近于100%
-
一些反思:根据我们现有对模型训练的理解,损失接近0和准确率达到100%是非常非常少见的事情,然后我们下来查阅了相关资料发现我们所用的数据集数量确实太少,所以是有可能达到这种非常理想的情况的
-
由于一般模型训练都是对训练集和测试集八二分,所以在保证学习率和训练轮次的情况下,我们做了一个训练集测试集分别是五五分、六四分、七三分、八二分、九一分的实现,进行改进升级
-
同时,由上述的训练和测试结果可以看到,曲线虽然有整体趋势,但是并不光滑,中间有几次比较大的跳动,所以我们也对曲线的绘制进行了平滑处理,也给图像上的曲线不同颜色打上标签,进行损失和准确率的对比,平滑处理我们主要采用了五种方法,分别对比一下:
-
我们也增加性能指标来评估模型,主要包括 “轮次-损失值 / 准确率 / 精确率 / 召回率” 的图像,以及 “召回率 / 精确率” 的图像
最后根据图像分析,结合平滑程度和整体趋势,可以看出高斯滤波平滑的效果最好
最后根据数据集的样本数量以及训练集与测试集比例的不同,综合可视化的图像及其性能来分析,可以明显看出训练测试比例为9:1的时候效果最好,和7:3的最后的精确率、准确率和召回率都收敛于1,8:2次之,而5:5和6:4效果偏弱一些,但是整体都是呈现出曲线函数的趋势,且最后收敛
另外,我们也给出不同训练集测试集比例下的 Recall-Precision
图像:
Recall-Precision
图像围成的面积越大,表示这个类别分类效果越好
通过分别使用 K-Means
, SVM
和 CNN
三种方式来实现该多分类问题,我们可以清楚看到监督学习的效果要好于无监督学习;而传统的监督学习算法 SVM
的效果,比不上深度学习的卷积神经网络
Lin Xiaoyi, Tang Jiajun, Wang Zhen, Chen Guanrui, Wang Jing