• 探索图像分辨率对于模型的影响,基于yolov5x开发构建桥洞、隧道、涵洞等水泥洞体建筑裂缝缺陷等检测识别系统


    在前面的很多文章中已经做过很多这方面的项目的开发实践工作了,感兴趣的话可以自行移步阅读即可:

    《洞场景安全智能巡检,基于yolov7/yolov7x/yolov7e6e开发构建基体建筑缺陷问题检测识别系统》

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

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

    这里仅罗列节前刚做的工作,再久之前的就不再一一罗列了。

    在以往的项目开发中,大都是基于已有的数据集去开发,比较少去关注数据本身的问题,也就是说对于结果的提升或者是优化来说大都是考虑再算法模型层面进行处理的,比较少去关注数据源头的问题,在刚刚过去的节假日中,回老家遇上一些老朋友,酒足饭饱之后聊了一些工作相关的内容,有一个朋友讲到他自己的项目开发经历,提升数据源头的质量对于最终效果的提升是比较有效的,我这里文章的主要目的就是想要构建不同数据质量下相同模型的训练开发,以此来进行模型性能的对比分析。

    在开始正式的内容之前,先来看一下平时以往容易混淆的概念。

    图像的大小取决于多个因素,包括:

    1. 分辨率:分辨率是指图像在每英寸内包含的像素点数,通常以PPI(Pixels Per Inch)表示。在相同的打印或显示尺寸下,高分辨率的图像比低分辨率的图像可以显示或打印出更多的细节和更精细的图像质量。
    2. 图像深度:图像深度是指每个像素所用的位数,它决定了图像的色彩分辨率。图像深度越高,可以呈现的色彩数越多,图像看起来就越真实。
    3. 图像格式:不同的图像格式对图像大小有着不同的影响。一些格式会压缩图像数据,使得图像文件更小,但可能会损失一定的图像质量。相反,一些高质量的格式会保留更多的图像信息,使得文件大小更大。
    4. 色彩模式:色彩模式也会影响图像大小。例如,RGB模式的图像每个像素使用24位来存储颜色信息,而灰度模式或黑白模式的图像则使用较少的位数来存储。
    5. 压缩算法:一些压缩算法(如JPEG、PNG等)可以在保证图像质量的前提下对图像进行压缩,从而减小文件大小。
    6. 尺寸:图像的尺寸也是影响大小的因素之一。尺寸越大,图像包含的像素就越多,文件大小自然也就越大。

    图像分辨率是指图像中存储的信息量,通常以每英寸图像内有多少个像素点来衡量,单位为PPI(Pixels Per Inch),也可以叫做像素每英寸。在相同的打印或显示尺寸下,高分辨率的图像比低分辨率的图像可以显示或打印出更多的细节和更精细的图像质量。一般来说,图像的分辨率越高,图像质量越好,适合用于大尺寸打印或高清晰度显示。而分辨率较低的图像则适合用于网络传输或小尺寸打印,因为它们占用的存储空间较小。

    图像分辨率和图像的尺寸是两个不同的概念,它们对图像的质量和大小有着不同的影响。图像分辨率是指图像中每英寸包含的像素点数,通常以PPI(Pixels Per Inch)表示。图像分辨率是描述图像清晰度的重要指标,它决定了图像的细节和显示效果。高分辨率图像包含更多的像素点,因此它们可以显示更多的细节和更丰富的色彩。一般来说,图像的分辨率越高,图像质量越好,适合用于大尺寸打印或高清晰度显示。图像的尺寸通常是指图像的宽度和高度,单位可以是像素、长度单位(如厘米、毫米、英寸等)或其他单位。尺寸是描述图像大小的数据,它决定了图像在显示设备上占据的空间大小。在保持图像分辨率不变的情况下,调整图像的尺寸将直接影响图像的显示效果和细节。虽然图像分辨率和图像的尺寸都影响图像的质量和大小,但它们描述的是图像的不同方面。图像分辨率主要关注图像的清晰度和细节,而图像的尺寸则关注图像在屏幕或纸张上的显示大小。在处理图像时,需要根据实际需要来选择合适的图像分辨率和尺寸,以达到最佳的图像质量和显示效果。

    这里使用与前文相同的数据集,只不过人工处理成为两部分的数据集,一部分为降低分辨率与尺寸的低质量数据集,另一部分是原始相机拍摄的也就是高质量数据集。

    模型层面使用的是yolov5系列下最大参数量的x系列的模型,如下:
     

    1. # YOLOv5 🚀 by Ultralytics, GPL-3.0 license
    2. # Parameters
    3. nc: 7 # number of classes
    4. depth_multiple: 1.33 # model depth multiple
    5. width_multiple: 1.25 # layer channel multiple
    6. anchors:
    7. - [10,13, 16,30, 33,23] # P3/8
    8. - [30,61, 62,45, 59,119] # P4/16
    9. - [116,90, 156,198, 373,326] # P5/32
    10. # YOLOv5 v6.0 backbone
    11. backbone:
    12. # [from, number, module, args]
    13. [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2
    14. [-1, 1, Conv, [128, 3, 2]], # 1-P2/4
    15. [-1, 3, C3, [128]],
    16. [-1, 1, Conv, [256, 3, 2]], # 3-P3/8
    17. [-1, 6, C3, [256]],
    18. [-1, 1, Conv, [512, 3, 2]], # 5-P4/16
    19. [-1, 9, C3, [512]],
    20. [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32
    21. [-1, 3, C3, [1024]],
    22. [-1, 1, SPPF, [1024, 5]], # 9
    23. ]
    24. # YOLOv5 v6.0 head
    25. head:
    26. [[-1, 1, Conv, [512, 1, 1]],
    27. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    28. [[-1, 6], 1, Concat, [1]], # cat backbone P4
    29. [-1, 3, C3, [512, False]], # 13
    30. [-1, 1, Conv, [256, 1, 1]],
    31. [-1, 1, nn.Upsample, [None, 2, 'nearest']],
    32. [[-1, 4], 1, Concat, [1]], # cat backbone P3
    33. [-1, 3, C3, [256, False]], # 17 (P3/8-small)
    34. [-1, 1, Conv, [256, 3, 2]],
    35. [[-1, 14], 1, Concat, [1]], # cat head P4
    36. [-1, 3, C3, [512, False]], # 20 (P4/16-medium)
    37. [-1, 1, Conv, [512, 3, 2]],
    38. [[-1, 10], 1, Concat, [1]], # cat head P5
    39. [-1, 3, C3, [1024, False]], # 23 (P5/32-large)
    40. [[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)
    41. ]

    默认都是100次epoch的迭代计算,这里肉眼可见的高质量的数据集训练的进度是非常非常缓慢的,基本上单个epoch是低质量数据集时耗的30倍。。。。。

    经过了漫长的等待之后,终于全部训练完成了,我们来整体对比分析看下:

    【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曲线】

    整体对比来看:不难看出,高质量的数据集在完全相同的训练配置下取得了全面领先的效果,不过这谣言的成绩背后是几十倍增加的计算量,在实际项目中是否真的有必要这个还有待商榷,不过这次的实验也是印证了如果想要无脑一味地涨点提升效果,数据源头也是一个可以重点关注的点。

  • 相关阅读:
    Mybatis-Plus时间范围查询
    【C++】类和对象(下)
    使用CyberController来将旧手机改造成电脑外挂------手机交互翻译、人脸解锁、语音识别....各个功能等你来探索
    PLL锁相环设计中的VCXO性能权衡
    【Android中RecyclerView刷新导致源数据被刷新】
    Elasticsearch 在bool查询中使用分词器
    【堆】数据结构-堆的实现【超详细的数据结构教学】
    计算机二级WPS 选择题(模拟和解析四)
    [ Linux ] 文件描述符和重定向
    基于Qt的Live2D模型显示以及控制
  • 原文地址:https://blog.csdn.net/Together_CZ/article/details/133633730