深度学习实践——卷积神经网络实践:裂缝识别
深度学习实践——卷积神经网络实践:裂缝识别
系列实验
深度学习实践——卷积神经网络实践:裂缝识别
深度学习实践——循环神经网络实践
深度学习实践——模型部署优化实践
深度学习实践——模型推理优化练习
深度学习实践——卷积神经网络实践:裂缝识别
- 深度学习实践——卷积神经网络实践:裂缝识别
- 0 概况
- 1 AlexNet分类
- 1.1 数据集选取
- 1.2 模型构建
- 1.3 超参数调整
- 2 RestNet50分类
- 2.1 模型构建
- 2.2 超参数调整
- 2.3 AlexNet与RestNet50的比较
- 3. 模型可视化诊断——grad_cam算法
- 实验结论:
代码位于可见于https://download.csdn.net/download/weixin_51735061/88131376?spm=1001.2014.3001.5503
0 概况
方法: 实验主要通过python中的pytorch环境进行,利用了pycharm与jupyter notebook来编写代码。对于数据集,我选择了墙面裂缝数据集。基本模型选择了AlexNet,而高一级模型选择了RestNet50。模型的可视化诊断选择了CAM算法。实验主要通过调整参数的方法来进行。
步骤:
- 编辑训练代码与下载数据集
- 利用AlexNet模型进行训练并调整参数以取得较好结果
- 利用RestNet50模型进行训练并调整参数以取得较好结果
- 使用CAM算法进行可视化诊断
1 AlexNet分类
1.1 数据集选取
裂缝是一个建筑物中必有的现象,有些裂缝十分地小,需要放大很多倍才能观看到,而有些裂缝却是十分大以至于肉眼可见。一般来说大裂缝是建筑物损坏的体现,研究建筑物的裂缝具有一定的意义。传统的裂缝发现方法是通过目测进行的,而如今进入了机器学习飞速发展的时代,那么是否可以将裂缝识别交给机器呢?因此此次实验的数据集我选择了与本专业相关的裂缝数据集,数据集文件结构如下图所示。

基本上此分类问题为二分类问题,数据集总共提供了5.6万张桥面、墙面、路面带裂缝与不带裂缝的数据集。由于计算机资源有限,我选择了墙面的数据集并对数据进行了平衡处理最后使用了7000张图片进行训练,墙面的部分数据如下图所示。

数据集引用:
https://www.sciencedirect.com/science/article/pii/S2352340918314082
1.2 模型构建
在这里我选择了12年的AlexNet作为卷积神经网络的架构,AlexNet是对LeNet的延伸,如下图为两者的网络架构图。AlexNet相比于LeNet对图片的尺寸进行了提高,同时加多了三个卷积层,同时网络复杂度均有所提高。

对于AlexNet我直接选择了pytorch里的AlexNet模型,开始时我选择了带有pretrained权重的模型,但是后面发现pretrained对训练出来的结果不利所以将pretrained改为了False其导入方式如下:
import torchvision.models as modelsmy_alexnet = models.alexnet(pretrained=False)
由于alexnet默认输出的有1000个种类,而裂缝数据集只有两个类别,所以需要首先更改alexnet的输出类别,其更改方式如下:
由于alexnet默认输出的有1000个种类,而裂缝数据集只有两个类别,所以需要首先更改alexnet的输出类别,其更改方式如下:
# 定位输出层位置
n_inputs = my_alexnet.classifier[6].in_features
# 输出两个种类
last_layer = nn.Linear(n_inputs, 2)
my_alexnet.classifier[6] = last_layer
微调好alexnet后,对图像进行预处理首先先修改图像的尺寸以符合模型要求,然后对图像进行裁剪进行标准化处理等。在预处理完后,剩下的就是参数调整,包括学习率、迭代次数、优化器、损失函数等等,以及结果可视化。为了更好地调整参数与可视化结果,我在本人上学期大作业的代码基础上进行了调整,得到的程序的功能图如下。

程序的构成主要如下类图所示

1.3 超参数调整
1 基础超参数
epochs为50,batch_size为32,学习率为0.1,优化器为SGD优化器,损失函数为交叉熵。基础参数训练出来的结果如下:
-
损失曲线
损失曲线指的是在不同epochs次数时对应的损失指,这里的损失值是训练集的损失值。下图为损失曲线图。

-
准确率、精确率、召回率、F1值
这里的准确率、精确率、召回率、F1值指的是测试集的值,这里的测试集从7000张数据集中产生。一开始时将完整的数据集以4:1的比例分为了两份,占比为4的为训练集,为1的是测试集。测试集不参与训练的过程,所以训练出来的模型对测试集进行预测的结果具有一定的评价意义,而下面即是结果图。

-
部分预测图像
部分预测图像是指训练出来的模型对测试集进行预测后打上标签的图像,这里取了20张进行展示,其中标红的表示识别错误,标绿的表示识别正确。
2 改变Epoch次数
查阅资料后发现,epoch次数与训练的结果具有很大的联系,因为epoch的次数越大梯度下降的次数也就越多那么权重更新地幅度也应该越大。一般来说epoch次数越大其拟合效果会越好,但是同时epoch若超过一定的范围会照成过拟合。由于epoch对结果的影响较大,所以此处选择了epoch次数作为调整的超参数之一,以下为epoch次数分别为25、50、75、100的调整结果:
-
损失曲线

对比不同epoch次数的曲线图可以知道,随着epoch次数的增加其损失值也会随之减小,但是其减小的速率也随着次数的增加而减小。 -
准确率、精确率、召回率、F1值

从上图可知在epoch次数为25时准确率是比较小的,而在50及以上时准确率得到了一定的提升。这说明epoch次数在一定范围内越大会使得准确率越高。然而当次数达到50以后准确率的提高不大,甚至出现了降低的现象,个人认为这可能与模型以及其他参数存在关系。而可能是这些关系阻止了准确率再次得到较大的提升。
3 改变batch size
batch_size对模型的稳定性具有一定的影响,batch_size越大其稳定性会越好训练时间也会较短,但是如果超出一定范围会使得模型的泛化能力下降。而如果batch_size较小那么就会使得梯度下降的稳定性较差让随机性越大,模型效果也会较差。由于batch_size对模型有一定的影响,所以这里我选择了batch_size作为调整的超参数之一。将batch_size分为16、32、48、64四组进行调整,其结果如下:
- 损失曲线

由图像可知随着batch size的增加,损失值也会跟着减小。这可能是由于一批的数量再不断变大而使得训练的效果更好。而图中出现批数大小越大使得曲线越不稳定的现象其实是因为刻度范围的问题,而这也可以看出batch size越大那么其一开始的损失值就会越小。 - 准确率、精确率、召回率、F1值

由上图结果可知,效果最好的出现再batsize为16的时候,而按照理论上说应该batch size较大的效果会比较好,然而这里却出现了相反的现象,当batch size达到64时其效果是最差的。这可能与batch size较大时的泛化能力较差有关。
4 改变学习率
学习率对模型的收敛具有一定的影响,一般来说学习率越大模型收敛就会越快。然而如果学习率过大,那么也会造成不利的影响,因为过大会使得下降得过快而使得模型走歪路而很难找到正确的道路。现在将学习率分为1、0.1、0.01、0.001四组进行调整,其结果如下:
-
损失曲线
从上图可以看出,当学习率较大时比如上面的1,那么训练时埋得步长也越大,其损失值下降也越快,但是同时也会因为这样而走错了道路,使得不断折返而不断在一个损失值范围内,而无法再往低处走。而当学习率较小时,其曲线会较为平缓,但同时速度也会较慢。 -
准确率、精确率、召回率、F1值

从上面的结果可以看出学习率过大与过小都是不好的,只有再一定范围内才是较好的选择。
2 RestNet50分类
2.1 模型构建
鉴于RestNet50的网络结构更复杂,深度更深,其效果理论上会越好,所以我选择了RestNet50作为高一级的模型于AlexNet进行比较。对于RestNet我直接使用了Pytorch进行调取,下面为调取的代码,
my_resnet50 = models.resnet50(pretrained=True)# 将resnet50最后一层输出的类别数,改为ant-bee数据集的类别数,修改后改成梯度计算会恢复为默认的True
fc_inputs = my_resnet50.fc.in_features
my_resnet50.fc = nn.Sequential(nn.Linear(fc_inputs, len(self.classes)))
# 以上操作相当于固定网络全连接层之前的参数,只训练全连接层的参数
其中对其输出层进行了修改以符合数据集的特征。
2.2 超参数调整
为了与alexnet形成对比,所以超参数的调整也与alexnet的一致。
1 基础超参数:
epochs为50,batch_size为32,学习率为0.1,优化器为SGD优化器,损失函数为交叉熵。基础参数训练出来的结果如下:
-
损失曲线

-
准确率、精确率、召回率、F1值

-
部分预测图像

2 改变Epoch次数
- 损失曲线

从上面的损失曲线图可知,随着Epoch次数的增加其损失值也会越小,其结果基本与AlexNet一致。 - 准确率、精确率、召回率、F1值

由上面结果可知,随着epoch的增加其准确率也会越高,但是当到达一定值后准确率却会降低。
3 改变Batchsize
-
损失曲线

-
准确率、精确率、召回率、F1值

4 改变学习率
-
损失曲线

-
准确率、精确率、召回率、F1值

2.3 AlexNet与RestNet50的比较
在基础超参数的情况下,将resnet-50与alexnet进行比较,其结果如下:
- 损失曲线

可以看到AlexNet所对应的损失值较小,都是收敛未完全,而RestNet损失值却很大,收敛较快但是稳定性较差。 - 准确率、精确率、召回率、F1值

可以看到作为高级模型的resnet与alexnet对比相差不多,甚至resnet还差于alexnet。而除去基础超参数,在epoch为75时存在restnet准确率为0.8的,这也可能是基础超参数情况下resnet的参数并不太好照成了这种现象。然而观察两个模型的结果可以发现,其准确率一直都是很低的,当一开始使用alexnet时认为这可能与alexnet模型有关,但是当使用restnet这个更高级的神经网络时其结果变化不大还是很低,那么其原因可能出现与其他原因。首先应该可以排除基本的参数原因,因为参数都以不同的数值进行调试,但是其结果均不是很好。因此我从数据集中寻找原因,观察预测的数据如下所示,

可以发现判断错误的一般都是将裂缝墙体判断为无裂缝的,而仔细观察图像可以发现,判断无裂缝错误的裂缝图像的裂缝都是十分小的。甚至人眼判别都难以判别,而对于机器可能这也是其难度之一,因此造成了准确率整体偏低的现象。在发现此问题后,我观察了路面裂缝的数据集,发现其比墙面裂缝数据集较为好识别,所以我将两者在基础参数的前提下重新进行了训练,得到以下的结果:


可以看到道路裂缝的准确率可以达到90%,确实比墙面的高很多,而这也证明了墙面数据集存在一定的问题。
3. 模型可视化诊断——grad_cam算法
对于模型的可视化诊断我选择了梯度权重激活图算法grad-cam,此算法能够反映出模型内部主要是靠识别哪个位置来进行分类的,也就是其注重点是如何。为了检测模型是否注意正确,现了选取三张图片,分别用前面的基本超参数下的AlexNet与ResNet对其进行预测然后对其使用Grad_CAM算法生成类激活图。下面为算法生成的结果:

理论上来说若要识别裂缝,那么注重点肯定是在裂缝处的。而从上图可以看到,restnet50模型的CAM图明显优于alexnet的,restnet的集中位置更靠近于裂缝中,而alexnet却只是在裂缝中徘徊并未完全地对准裂缝。虽然得到的模型中两者的准确率基本差不多,但是restnet的精确性更加地好。
实验结论:
本次实验中构建了AlexNet和RestNet网络模型对裂缝数据集进行训练,并调整超参数以达到较好效果。两个网络模型的测试结果表明其在调整一系列参数如学习率、epoch次数、batchsize后准确率依然在0.7到0.8中徘徊,效果并不佳。而在比较参数为不同值的调整时,发现其规律基本与理论相符合,比如说学习率在某个范围内才是最优的。最后在利用grad_cam算法对模型进行可视化诊断时发现restnet50对裂缝的注意程度优于alexnet的,restnet50的注意点集中于裂缝处,而alexnet却只是在裂缝附近。
对于模型训练出来的效果较差,个人认为这可能与数据集有关。在观察数据集后发现,墙面裂缝的数据集的裂缝并不明显甚至人眼也难以观测出来。于是我选用了较为明显的道路裂缝数据集以检验我的想发是否正确。在经过测试后,发现路面裂缝数据集训练出来的模型准确率可以达到0.85-0.9之间,而这也说明了这确实与数据集有一定关系。
相关文章:
深度学习实践——卷积神经网络实践:裂缝识别
深度学习实践——卷积神经网络实践:裂缝识别 系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 深度学习实践——卷积神经网络实践ÿ…...
linux | vscode | makefile | c++编译和调试
简单介绍环境: vscode 、centos、 gcc、g、makefile 简单来说就是,写好项目然后再自己写makefile脚本实现编译。所以看这篇博客的用户需要了解gcc编译的一些常用命令以及makefile语法。在网上看了很多教程,以及官网也看了很多次,最…...
Spring | Bean 作用域和生命周期
一、通过一个案例来看 Bean 作用域的问题 Spring 是用来读取和存储 Bean,因此在 Spring 中 Bean 是最核心的操作资源,所以接下来我们深入学习⼀下 Bean 对象 假设现在有⼀个公共的 Bean,提供给 A 用户和 B 用户使用,然而在使用的…...
培训(c++题解)
题目描述 某培训机构的学员有如下信息: 姓名(字符串)年龄(周岁,整数)去年 NOIP 成绩(整数,且保证是 5 的倍数) 经过为期一年的培训,所有同学的成绩都有所提…...
ansible-playbook编写 lnmp 剧本
ansible-playbook编写 lnmp 剧本 vim /opt/lnmp/lnmp.yaml执行剧本 ansible-playbook lnmp.yaml...
需求太多处理不过来?MoSCoW模型帮你
一、MoSCoW模型是什么 MoSCoW模型 是在项目管理、软件开发中使用的一种排序优先级的方法,以便开发人员、产品经理、客户对每个需求交付的重要性达成共识。 MoSCoW是一个首字母缩略词,代表: M(Must have):…...
Vue 3:玩一下web前端技术(六)
前言 本章内容为VUE请求后端技术与相关技术讨论。 上一篇文章地址: Vue 3:玩一下web前端技术(五)_Lion King的博客-CSDN博客 下一篇文章地址: Vue 3:玩一下web前端技术(七)_Lio…...
【点云处理教程】00计算机视觉的Open3D简介
一、说明 Open3D 是一个开源库,使开发人员能够处理 3D 数据。它提供了一组用于 3D 数据处理、可视化和机器学习任务的工具。该库支持各种数据格式,例如 .ply、.obj、.stl 和 .xyz,并允许用户创建自定义数据结构并在程序中访问它们。 Open3D 广…...
Windows10系统还原操作
哈喽,大家好,我是雷工! 复制了下虚拟机的Win10系统,但其中有一些软件,想实现类似手机的格式化出厂操作,下面记录Windows10系统的还原操作。 一、系统环境: 虚拟机内的Windows10,64…...
Django学习笔记-模板(Template)基础
使用模块可以很方便的执行一些数据操作,然后根据传入的数据直接在模板html文件中进行处理。 1.Django中的模板配置 Django的模板引擎在sttings.py文件中: TEMPLATES [{# 模板引擎,默认为django模板BACKEND: django.template.backends.dja…...
使用 NVM(Node Version Manager)管理 Node.js 版本
使用 NVM(Node Version Manager)管理 Node.js 版本 步骤一:安装 NVM NVM 是一个用于安装和管理不同版本的 Node.js 的工具。首先,你需要确保你的系统上已经安装了 NVM。可以通过以下命令检查 NVM 是否已经安装: nvm …...
(文章复现)梯级水光互补系统最大化可消纳电量期望短期优化调度模型matlab代码
参考文献: [1]罗彬,陈永灿,刘昭伟等.梯级水光互补系统最大化可消纳电量期望短期优化调度模型[J].电力系统自动化,2023,47(10):66-75. 1.基本原理 1.1 目标函数 考虑光伏出力的不确定性,以梯级水光互补系统的可消纳电量期望最大为目标,函数…...
tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 -量勺
tinkerCAD案例:24. Ruler - Measuring Lengths 标尺 - 测量长度 Project Overview: 项目概况: A machine shop, where any idea can become a reality, can cost millions and million of dollars. Still, the most important tool in the shop is the…...
linux系统编程重点复习--线程同步
目录 复习目标: 1 互斥锁 1.1互斥锁的使用步骤 1.2 练习 1.3 死锁 2 读写锁 3 条件变量 4 信号量 复习目标: 熟练掌握互斥量的使用说出什么叫死锁以及解决方案熟练掌握读写锁的使用熟练掌握条件变量的使用理解条件变量实现的生产消费者模型理解…...
【Docker 学习笔记】Windows Docker Desktop 安装
文章目录 一、前言二、Windows Docker 安装1. 基于Hyper-V后端和Windows容器的安装2. 基于WSL2后端的安装(推荐)3. 安装Docker Desktop on Windows4. 启动并验证Docker Desktop 一、前言 Docker并非是一个通用的容器工具,它依赖于已存在并运…...
getInputStream has already been called for this request 问题记录
问题背景 HttpServletRequest.getReader() HttpServletRequest.getInputStream() 不能在过滤器中读取一次二进制流(字符流),又在另外一个Servlet中读取一次,即一个InputSteam(BufferedReader)对象在被读取完成后,将无…...
日撸代码300行:第60天(小结)
1、自己对于这个专栏的代码抄写也是断断续续,由于种种原因上次在第54天没坚持下来,这次继续希望能抄完。 2、现在代码的阅读和理解能力明显比刚开始抄代码的时候强了不少。感觉坚持到现在收获还是不小。现在基本上来说仔细想一下都能够理清楚代码的意思。…...
python和java哪个更有前景,python和java哪个更有前途
大家好,小编为大家解答python和java哪个好学,零基础的问题。很多人还不知道python和java哪个更容易入门,现在让我们一起来看看吧! 进入编程行业是很多人的梦想,现在越来越多的人都想要通过培训的方式进入IT行业中,但是…...
LeetCode_11. 盛最多水的容器
题目描述 11. 盛最多水的容器 - 力扣(LeetCode)https://leetcode.cn/problems/container-with-most-water/ 思路分析 这题就是典型的是一道很经典的面试题,最优的解法是双指针,但很多人在第一次看到这题的时候很难想到用双指针来…...
【Android】APP电量优化学习笔记
电量优化原因 电量优化在 Android 开发中非常重要,原因如下: 用户体验: 电池续航时间是用户在使用移动设备时非常关注的因素之一。通过进行电量优化,可以延长设备的电池寿命,使用户能够更长时间地使用设备而不必频繁…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
