助力智能化公路养护,基于YOLOv5s集成SPD-BIFPN-SE开发构建公路开裂检测识别系统

news2024/12/23 13:17:00

在前文中我们尝试构建了在隧道、涵洞尝尽下的自动智能化养护巡查相关的模型,进行了实地测试评估,感兴趣的话可以自行移步阅读即可:

《基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统》

本文的想法是相近的,核心的目的是想要以公路养护场景为切入点,探索实践在自动巡航拍摄的视频图像数据基础上是否具备准确检测分析识别的能力。

首先看下效果图,如下所示:

接下来整体看下数据集情况,如下所示:

数据来源于实际巡航拍摄,为的就是真实数据来训练测试模型。

这里由于资源限制的问题,在初步版本的模型开发选型上,我们选择的是yolov5s系列的模型,原生模型文件如下所示:

# Parameters
nc: 1
depth_multiple: 0.33
width_multiple: 0.50


anchors:
  - [10,13, 16,30, 33,23]
  - [30,61, 62,45, 59,119] 
  - [116,90, 156,198, 373,326]



backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],    # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],    # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],    # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],   # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],      # 9
  ]



head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)

   [[17, 20, 23], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

这里为了提升模型精度,我继承了前不久提出的spd-conv模块、BIFPN模块和SE注意力模块,这块的内容可以参考前面的博文,这里就不再赘述了,如下所示:

# Parameters
nc: 1  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32


# Backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],     # 0-P1/2
   [-1, 1, Conv, [128, 3, 1]],  # 1
   [-1,1,SPD,[1]],              # 2 -P2/4
   [-1, 3, C3, [128]],          # 3
   [-1, 1, Conv, [256, 3, 1]],  # 4
   [-1,1,SPD,[1]],              # 5 -P3/8
   [-1, 6, C3, [256]],          # 6
   [-1, 1, Conv, [512, 3, 1]],  # 7-P4/16
   [-1,1,SPD,[1]],              # 8 -P4/16
   [-1, 9, C3, [512]],          # 9
   [-1, 1, Conv, [1024, 3, 1]], # 10-P5/32
   [-1,1,SPD,[1]],              # 11 -P5/32
   [-1, 3, C3, [1024]],         # 12
   [-1, 1, SPPF, [1024, 5]],    # 13
  ]



# Head
head:
  [[-1, 1, Conv, [512, 1, 1]],                     #14
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],     #15
   [[-1, 9], 1, BiFPN, [256, 256]],                #16 cat backbone P4
   [-1, 3, C3, [512, False]],                      #17

   [-1, 1, Conv, [256, 1, 1]],                     #18
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],     #19
   [[-1, 6], 1, BiFPN, [128, 128]],                #20 cat backbone P3
   [-1, 3, C3, [256, False]],                      #21 

   [-1, 1, Conv, [512, 3, 2]],                     #22
   [[-1, 17, 9], 1, BiFPN, [256, 256]],            #23 v5s通道数是默认参数的一半
   [-1, 3, C3, [512, False]],                      #24 

   [-1, 1, Conv, [512, 3, 2]],                     #25
   [[-1, 14], 1, BiFPN, [256, 256]],               #26
   [-1, 3, C3, [1024, False]],                     #27 
   [-1, 1, SE, [1024]],                            #28

   [[21, 24, 28], 1, Detect, [nc, anchors]],       #29 Detect(P3, P4, P5)
  ]

默认完全相同的训练参数,均执行100次epoch的迭代计算。

等待训练完成后,我们来整体对比分析下,如下所示:

【Precision曲线】
精确率曲线(Precision-Recall Curve)是一种用于评估二分类模型在不同阈值下的精确率性能的可视化工具。它通过绘制不同阈值下的精确率和召回率之间的关系图来帮助我们了解模型在不同阈值下的表现。
精确率(Precision)是指被正确预测为正例的样本数占所有预测为正例的样本数的比例。召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。
绘制精确率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率和召回率。
将每个阈值下的精确率和召回率绘制在同一个图表上,形成精确率曲线。
根据精确率曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
通过观察精确率曲线,我们可以根据需求确定最佳的阈值,以平衡精确率和召回率。较高的精确率意味着较少的误报,而较高的召回率则表示较少的漏报。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
精确率曲线通常与召回率曲线(Recall Curve)一起使用,以提供更全面的分类器性能分析,并帮助评估和比较不同模型的性能。


【Recall曲线】
召回率曲线(Recall Curve)是一种用于评估二分类模型在不同阈值下的召回率性能的可视化工具。它通过绘制不同阈值下的召回率和对应的精确率之间的关系图来帮助我们了解模型在不同阈值下的表现。
召回率(Recall)是指被正确预测为正例的样本数占所有实际为正例的样本数的比例。召回率也被称为灵敏度(Sensitivity)或真正例率(True Positive Rate)。
绘制召回率曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的召回率和对应的精确率。
将每个阈值下的召回率和精确率绘制在同一个图表上,形成召回率曲线。
根据召回率曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
通过观察召回率曲线,我们可以根据需求确定最佳的阈值,以平衡召回率和精确率。较高的召回率表示较少的漏报,而较高的精确率意味着较少的误报。根据具体的业务需求和成本权衡,可以在曲线上选择合适的操作点或阈值。
召回率曲线通常与精确率曲线(Precision Curve)一起使用,以提供更全面的分类器性能分析,并帮助评估和比较不同模型的性能。


【F1值曲线】
F1值曲线是一种用于评估二分类模型在不同阈值下的性能的可视化工具。它通过绘制不同阈值下的精确率(Precision)、召回率(Recall)和F1分数的关系图来帮助我们理解模型的整体性能。
F1分数是精确率和召回率的调和平均值,它综合考虑了两者的性能指标。F1值曲线可以帮助我们确定在不同精确率和召回率之间找到一个平衡点,以选择最佳的阈值。
绘制F1值曲线的步骤如下:
使用不同的阈值将预测概率转换为二进制类别标签。通常,当预测概率大于阈值时,样本被分类为正例,否则分类为负例。
对于每个阈值,计算相应的精确率、召回率和F1分数。
将每个阈值下的精确率、召回率和F1分数绘制在同一个图表上,形成F1值曲线。
根据F1值曲线的形状和变化趋势,可以选择适当的阈值以达到所需的性能要求。
F1值曲线通常与接收者操作特征曲线(ROC曲线)一起使用,以帮助评估和比较不同模型的性能。它们提供了更全面的分类器性能分析,可以根据具体应用场景来选择合适的模型和阈值设置。

整个训练过程中的loss对比曲线如下所示:

综合对比来看:经过改进后的s系列的模型要明显由于官方原生的模型精度。

很多时候大家也都可以根据实际场景下业务需求来针对性地进行一下适配改造,可能会有意想不到的效果。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linkerd2初探

Linkerd2初探 部署环境Linkerd简介安装Linkerd客户端在k8s上安装Linkerd控制平面(服务端)实验:数据平面代理注入demo应用安装viz插件(可视化面板)部署grafana 其他 部署环境 k8s环境: KIND 模拟kubernetes 1.21.1 kub…

页面设计都有哪些好用的工具推荐?

对于设计师来说,方便的页面设计工具和稳定的页面设计灵感也同样重要。 在今天的信息爆炸中,很容易找到页面设计工具,网上搜索有很多建议,但找到合适的页面设计工具并不那么简单。 本文推荐不容错过的9款页面设计工具 即时设计 …

【DevOps核心理念基础】3. 敏捷开发最佳实践

一、敏捷开发最佳实践 1.1 项目管理 1.2 需求管理 1.3 技术架构 1.4 技术开发 1.5 测试 二、敏捷开发最佳实践 2.1 敏捷开发的执行细节 三、全面的DevOps工具链 四、版本控制和协作开发工具 4.1 集中式版本控制工具 4.2 分布式版本控制工具 一、敏捷开发最佳实践 …

mysql的一些知识点或者说踩过的坑和想记住的内容

快速上传数据 这个应该是比inset into values更快的插入数据的办法了。 不过要求挺苛刻的,数据要整理成和表格一致,也就是说每条数据都是完整的一条,而不是一部分。 下面的示例我以***为分割符划分字段,以 \n来分割每条数据。 LO…

【atoi函数的功能介绍及使用与模拟实现——超详细版本】

atoi函数的功能介绍及使用与模拟实现——超详细版本 1.cplusplus网站介绍💻 1.1atoi函数的功能介绍💻 它的功能: 解析将其内容解释为整数的 C 字符串,该整数作为 类型的值返回。 该函数首先根据需要丢弃尽可能多的空格字符&…

java复习-eclipse开发工具使用

开发工具使用 项目文件结构 建立完成的项目目录中会自动创建有两个子目录: src:保存所有的 *.java 源文件bin:保存所有编译后的 *.class 程序文件,这些文件会自动进行编译处理 保存文件后,会自动进行编译。 快捷键…

无需专业技能,轻松创建个人博客:Cpolar+Emlog在Ubuntu上的搭建指南

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…

基于轻量级YOLOv5s开发构建隧道基建裂痕、脱落等缺陷问题检测系统

隧道内的定期检查与维护,对于及时发现和消除潜在的安全隐患有着重要的作用,基于人工的传统巡查方式不仅极为低效而且成本很高,将智能化的图像检测识别计数与实际的养护巡查场景相结合,开发构建智能AI检测识别系统是否可行&#xf…

C++QT day 5

实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性:半…

element-table 行的拖拽更改顺序(无需下载sortableJs

样例展示&#xff1a;vueelement 通过阅读element文档我们发现element并不提供拖拽相关的api 本博客通过element提供的行类名 注册函数 实现行与行的拖拽 1.设置el-table 的行样式类名 这里是用的是 function <el-table:data"outputData":row-class-name&qu…

Codeforces Round 896 (Div. 2)题解

前言: 3 solved of 7 A、B、C,太菜了&#xff0c;写B题的时候&#xff0c;常数设成1e5了&#xff0c;一直卡在Test 4,没想到一直提示我TLE&#xff0c;没有提示RE&#xff0c;导致我浪费了很多时间在B题上&#xff0c;最后时间太晚了交了TLE了一发睡觉去了 A-Make It Zero …

SpringCloud:Feign实现微服务之间相互请求

文章目录 &#x1f389;欢迎来到Java学习路线专栏~SpringCloud&#xff1a;Feign实现微服务之间相互请求 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&#xff1a;Java学习路线&#x1f4dc;其他专栏&#xf…

Sui Move智能合约提供更智能和简单的编程

编写区块链和其他计算环境的代码有很多相似之处&#xff0c;但区块链的重点大部分都集中在构建智能合约上。智能合约部署编译后的代码&#xff0c;本质上是在区块链上自动执行交易的apps。Sui网络本地的Sui虚拟机使用Sui Move编程语言编写智能合约。 术语“智能合约”意味着区…

Python之离线安装第三方库

1、场景介绍 在一些服务器上&#xff0c;我们搭建完Python环境之后&#xff0c;因为服务器的网络限制原因&#xff0c;不能直接通过pip命令下载安装Python的依赖包。 因此&#xff0c;我们需要在可以正常上网的服务器上下载好所需的依赖包文件&#xff0c;然后拷贝到目标服务器…

Screen的详细全面安装教程及Screen的用法

Screen可以大大提高终端使用效率&#xff0c;是Linux系统管理和运维的必备技能。当我们开启Screen后&#xff0c;只要Screen进程没有终止&#xff0c;其内部运行的会话都可以恢复。即使网络连接中断&#xff0c;用户也可以重新进入已开启的Screen中&#xff0c;对中断的会话进行…

Three.js-绘制矩形shader

绘制图中的嵌套矩形框 方法&#xff1a; vec3 drawRect(vec2 st,vec2 center,float width,float height,float thickness,vec3 fillColor, vec3 strokeColor) {vec3 color vec3(0);float halfWidth width * .5;float halfHeight height * .5;float halfTickness thicknes…

《向量数据库指南》——Milvus Cloud当初为什么选择向量数据库这个赛道呢?

我们公司专注于向量数据库大约可以追溯到 2018 年左右。当时&#xff0c;向量数据库的概念并不广泛。我们的 CEO 力排众议&#xff0c;认为这个领域有巨大潜力&#xff0c;因为这与我们的愿景高度契合。我们的公司定位是构建一个能够在云上处理非结构化数据的基础设施产品。经过…

window11wifi图标没了win11wifi图标消失连不上网的三种解决方法

最近win11系统有很多小伙伴都去安装体验,不过有的小伙伴在安装完之后说自己的wifi图标消失连不上网,那么如果遇到这种情况应该怎么办呢?下面就和小编一起来看看win11wifi图标消失连不上网的三种解决方法吧。 笔记本专用Win11娱乐版 V2023 [电脑系统] 笔记本专用Win11娱乐版…

UG\NX CAM二次开发 设置2D工序部件边界 UF_CAMBND_append_bnd_from_curve

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置2D工序部件边界 UF_CAMBND_append_bnd_from_curve 效果: 代码: static int init_proc(UF_UI_selection_p_t select, void* user_data) { int errorCode = 0; int num_triples = 1; …

自动创建设备节点udev机制的实现过程

udev是用户空间的一个应用程序&#xff0c;在内核里面安装一个驱动时&#xff0c;需要给这个驱动创建一个结点&#xff0c;安装驱动时向用户空间提交创建结点的信息&#xff0c;udev可以拿到提交的信息&#xff0c;自动在dev下创建结点。 创建结点的逻辑放在用户空间。内核空间…