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

news/2024/7/10 22:56:58 标签: YOLO

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

《基于轻量级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.niftyadmin.cn/n/5022085.html

相关文章

LeetCode 428. Serialize and Deserialize N-ary Tree【树,BFS,DFS】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

C++ 中的原子变量(std::atomic)使用指南

目录 C 中的原子变量(std::atomic)使用指南基本概念使用方法创建原子变量读取值修改值原子操作 常见应用场景1. 计数器2. 控制标志3. 链表和数据结构 示例代码结论 C 中的原子变量(std::atomic)使用指南 原子变量(std…

初识Java 8-1 接口和抽象类

目录 抽象类和抽象方法 接口定义 默认方法 多重继承 接口中的静态方法 作为接口的Instrument 本笔记参考自: 《On Java 中文版》 接口和抽象类提供了一种更加结构化的方式分离接口和实现。 抽象类和抽象方法 抽象类,其介于普通类和接口之间。在构…

Zabbix监控平台环境部署

Zabbix监控平台环境部署 1.Linux环境部署 hostnamectl set-hostname zabbix_server #修改主机名方便查看 hostnamectl set-hostname zabbix_agent ​ systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #关闭防火墙开机自启 setenforce 0 #关闭SElinu…

保姆级--scratch连接wedo2.0超详细教程(附资源)

一. 系统和软件版本 1. Windows10 2. 蓝牙 3. Scratch 3.24.0 3.24.0是scratch版本号,scratch打开后左上角显示的就是它的版本号。 4. ScratchLink 1.3.66 1.3.66是ScratchLink的版本号,运行起来后鼠标单击会显示出来 5. …

解决huggingface 在代码因为网络无法下载模型和数据集的问题(伪)

huggingface的模型下载 其实是用git手动下载 具体的方法: sudo apt-get update sudo apt-get install git-lfs git lfs install 然后git clone https://huggingface.co/roberta-large huggingface数据集下载 首先有些数据集也可以通过git下载(那种&…

(1)数据库 MSQ 数据库 安装 使用 以及增删改查

下载官网:MySQL :: Download MySQL Shell 常见的数据库分为: 关系型数据库, Oracle、MySQL、SQLServer、Access非关系型数据库, MongoDB、Redis、Solr、ElasticSearch、Hive、HBase 安装过程 使用过程

Python中的def函数

概念: Python中的def语句用于定义一个函数。函数是一个代码块,它可以被重复调用,并且可以接收输入参数和返回值。在Python中,函数是由def关键字、函数名和圆括号内的参数列表组成的。 场景: 以下是几个函数使用场景…