


摘要:本文介绍了一种基于深度学习的路面坑洞检测系统的代码,采用最先进的YOLOv8算法,并对比YOLOv7、YOLOv6、YOLOv5等算法的结果,能够准确识别图像、视频、实时视频流以及批量文件中的路面坑洞。文章详细解释了YOLOv8算法的原理,并提供了相应的Python实现代码、训练数据集,以及基于PySide6的用户界面(UI)。该系统实现了对图像中路面坑洞的准确识别和分类,并包含了基于SQLite的登录注册管理、一键更换模型以及界面自定义修改等功能。本文旨在为相关领域的研究人员和新入门的朋友提供一个参考,完整代码资源文件以及数据集可以在文末的下载链接中获取。
若您想获得博文中涉及的实现完整全部资源文件(包括测试图片、视频,py, UI文件,训练数据集、训练代码、界面代码等),这里已打包上传至博主的面包多平台,见可参考博客与视频,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

完整资源中包含数据集及训练代码,环境配置与界面中文字、图片、logo等的修改方法请见视频,项目完整文件下载请见演示与介绍视频的简介处给出:➷➷➷
演示与介绍视频:https://www.bilibili.com/video/BV1GF4m1E7RG/
YOLOv8/v7/v6/v5项目合集下载:https://mbd.pub/o/bread/mbd-ZZuXmZtp
YOLOv8/v5项目完整资源下载:https://mbd.pub/o/bread/ZZuXmJxr
YOLOv7项目完整资源下载:https://mbd.pub/o/bread/ZZuXmZhr
YOLOv6项目完整资源下载:https://mbd.pub/o/bread/ZZuXl5Zy
前言
路面裂缝检测是交通基础设施维护和安全性评估中的重要任务之一,对于及时发现并修复路面问题具有重要意义。许多学者通过图像处理和机器学习技术来实现路面裂缝的自动检测。传统的方法包括基于纹理、形状和颜色等特征的手工设计算法,然而,这些方法在复杂场景中的泛化能力相对较弱。近年来,基于计算机视觉和深度学习技术的路面裂缝检测方法取得了显著的进展。

一些研究着重于设计专用的卷积神经网络结构,以更好地捕捉裂缝的特征。例如,Li等人提出了一种基于U-Net的网络结构,通过引入注意力机制来提高裂缝的检测性能[1]。此外,一些研究还尝试引入多尺度信息、上下文信息和迁移学习等策略,以进一步提升模型的鲁棒性和泛化能力。
另一方面,一些研究关注于数据集的构建和模型评估。提出了一些公开的路面裂缝数据集,如CRAK dataset[2],用于推动算法性能的评估和比较。同时,评估指标的选择也成为研究关注的焦点,常用的指标包括精度、召回率、F1值等。
此外,一些研究还利用无人机和移动车辆等新兴技术,采集大规模高分辨率的路面图像数据,并结合深度学习模型进行实时裂缝检测,为城市交通基础设施的及时维护提供了技术支持。
一些研究致力于收集和标注大量的路面图像,以提高模型的泛化能力,并促进研究者之间的比较与合作[3]。将多模态数据融合到路面裂缝检测中,如红外图像、激光雷达数据等。通过综合不同传感器的信息,提高了对裂缝的检测鲁棒性,尤其在不同天气和光照条件下的表现[4]。
然而,随着YOLO(You Only Look Once)系列目标检测算法的出现和发展,已经提出了更高效、更精准的目标检测工具。YOLO(You Only Look Once)系列模型在计算机视觉领域享有盛誉。YOLO的名声归功于其相当高的准确性,同时保持了较小的模型尺寸。YOLO 模型可以在单个 GPU 上进行训练,这使得广泛的开发人员可以使用它。机器学习从业者可以低成本地将其部署在边缘硬件或云中。
YOLOv8 是最新的最先进的 YOLO 模型,可用于对象检测、图像分类和实例分割任务。YOLOv8 由 Ultralytics 开发,Ultralytics 还创建了具有影响力和行业定义的 YOLOv5 模型。YOLOv8 包括对 YOLOv5 的大量架构和开发人员体验更改和改进。
本博客所做的工作是基于YOLOv8算法构建一个路面裂缝检测系统,呈现系统界面的效果,深入讲解其算法原理,提供代码实现,并分享系统的开发过程。希望本博客的分享能给予读者一定的启示,推动更多的相关研究。本文的主要贡献如下:
采用最先进的YOLOv8算法进行路面裂缝检测:尽管已有多项关于路面裂缝检测的研究,但这些研究主要使用了早期的深度学习模型,例如CNN和ResNet等。与这些模型相比,YOLOv8算法在多个方面展现出更高的效率和精准度。在本文中,将详细介绍如何运用这一最新的目标检测算法进行路面裂缝检测,为相关领域的研究者和从业者提供全新的研究思路和实践手段。
利用PySide6实现路面裂缝检测系统:在本文中,将探讨如何利用Python的PySide6库开发一个用户界面友好的路面裂缝检测系统。该系统使用户能够以更直观、更便捷的方式进行路面裂缝检测,有助于促进YOLOv8算法的应用,并推动路面裂缝检测技术的实际应用。
包含登录管理功能:在系统中,我计划设计一个登录管理功能,用户需完成登录操作后方可使用该系统。这不仅能够提升系统的安全性,还为未来添加更多个性化功能提供了可能性。
对YOLOv8模型的深入研究:在运用YOLOv8算法进行路面裂缝检测与识别的同时,我将对该算法的性能展开详尽研究,包括对模型精准度、召回率等关键指标的评估,以及对模型在不同环境和条件下表现的分析等。这将有助于更全面地理解YOLOv8算法,并为进一步优化和改进该算法提供了基础。
1.数据集介绍
路面裂缝检测数据集的部分截图如下所示,其中训练集1934张图片,验证集500张图片、测试集包括500张图片,共计2934张图片构成。本文改变图像的大小,使其大小为800x800,如果原始图像的比例不是正方形,那么在调整的过程中,多出的部分会用黑色边框填充。其次,本文采用对比度拉伸的图像增强技术,使图像的细节更加清晰。

2. 系统界面效果
系统以PySide6作为GUI库,提供了一套直观且友好的用户界面。下面,我将详细介绍各个主要界面的功能和设计。
(1)系统提供了基于SQLite的注册登录管理功能。用户在首次使用时需要通过注册界面进行注册,输入用户名和密码后,系统会将这些信息存储在SQLite数据库中。注册成功后,用户可以通过登录界面输入用户名和密码进行登录。这个设计可以确保系统的安全性,也为后续添加更多个性化功能提供了可能性。

(2)在主界面上,系统提供了支持图片、视频、实时摄像头和批量文件输入的功能。用户可以通过点击相应的按钮,选择要进行裂缝检测的图片或视频,或者启动摄像头进行实时检测。在进行裂缝检测时,系统会实时显示检测结果,并将检测记录存储在数据库中。

(3)此外,系统还提供了一键更换YOLOv8模型的功能。用户可以通过点击界面上的"更换模型"按钮,选择不同的YOLOv8模型进行检测。与此同时,系统附带的数据集也可以用于重新训练模型,以满足用户在不同场景下的检测需求。

(4)为了提供更个性化的使用体验,这里系统支持界面修改,用户可以自定义图标、文字等界面元素。例如,用户可以根据自己的喜好,选择不同风格的图标,也可以修改界面的文字描述。

3. YOLOv8算法原理
YOLOv8(You Only Look Once version 8)是一款最新的先进YOLO模型,专为目标检测、图像分类和实例分割任务而设计。该模型由Ultralytics公司开发,该公司同时也是YOLOv5模型的创始者,该模型在行业内具有重要影响力并为该领域定义了标准。YOLOv8在构架和开发者体验方面对YOLOv5进行了多方面的改进和优化。
YOLOv8的主要特点和改进包括:
高精度:YOLOv8在COCO和Roboflow100数据集上表现出色,其精度显著提高。
主干网络结构调整:YOLOv8对主干网络进行了结构上的调整,其中首个6x6卷积被替换为3x3卷积,同时主要构建模块也经过改变。这些调整旨在优化网络架构,提高特征提取效果,以更好地适应目标检测任务。
C2f和C3的变化:引入了C2f(Context2 Features)来替代C3(Context3),其中C2f通过连接所有来自Bottleneck的输出,形成更为综合的特征集。相比之下,C3只使用了最后一个Bottleneck的输出,以实现更精细的特征融合。
YOLOv8的架构和特性包括:
(1)无锚点检测:YOLOv8采用了一种无锚点的设计,其核心特点是直接预测对象的中心,而非通过相对于已知锚点框的偏移量。这一设计选择有效地减少了框预测的数量,从而加速了非极大值抑制(NMS)的执行过程。NMS是一种在推断后用于筛选候选检测的复杂后处理步骤,而YOLOv8通过无锚点模型的采用,更为高效地处理了目标检测任务。

(2)新的卷积:YOLOv8的主干网络经历了重要的结构调整,其中首个6x6卷积已经被替换为3x3卷积,并对主要构建模块进行了改变。具体而言,C2f(Context2 Features)替代了C3(Context3)。在C2f中,所有来自Bottleneck(两个具有残差连接的3x3卷积)的输出都被连接起来,形成一个综合的特征集。相比之下,在C3中,只使用了最后一个Bottleneck的输出,导致相对较小的信息融合。这一系列的结构变化旨在优化网络架构,提高特征提取的效果以更好地适应目标检测任务。

(3)关闭马赛克增强功能:YOLOv8在训练时通过在线图像增强提高模型性能。在每个epoch中,模型会接触到稍有变化的图像,以促使其学习新位置的对象、部分被遮挡的对象以及周围不同的像素。其中一项增强技术被称为马赛克增强,它涉及将四个图像拼接在一起。然而,通过整个训练过程使用这种增强可能导致性能下降。因此,在训练的最后十个epoch中,YOLOv8决定关闭马赛克增强功能。
4. 代码简介
在本节中,我们将详细介绍如何使用YOLOv8进行路面裂缝检测的代码实现。代码主要分为两部分:模型预测和模型训练。
4.1 模型预测
在模型预测部分,首先导入了OpenCV库和YOLO模型。OpenCV库是一个开源的计算机视觉和机器学习软件库,包含了众多的视觉处理函数,使用它来读取和处理图像。YOLO模型则是要用到的目标检测模型。
import cv2
from ultralytics import YOLO 接着,加载自行训练好的YOLO模型。这个模型是在大量的图像上预训练得到的,可以直接用于目标检测任务。
model.load_model(abs_path("weights/crack-yolov8n.pt", path_type="current")) 然后,使用OpenCV读取了一个图像文件,这个图像文件作为要进行目标检测的图像输入。
img_path = abs_path("test_media/CrackRoad_SIXU_A00617.jpg")
image = cv_imread(img_path)
在读取了图像文件之后,就可以使用加载的模型对图像进行预测了。下图为预测结果。
pred, superimposed_img = model.predict(pre_img) 4.2 模型训练
在模型训练部分,首先导入YOLO模型,并加载了预训练的YOLOv8模型。
from ultralytics import YOLO
model = YOLO('./weights/yolov8s.pt', task='detect') 接着开始训练模型。其中指定了训练数据的配置文件路径,使用CPU进行训练,使用2个工作进程加载数据,输入图像的大小为640x640,训练100个epoch,每个批次的大小为8,训练任务的名称为’train_crack’。
results = model.train(
data='./datasets/Crack/crack.yaml',
device='cpu',
workers=2,
imgsz=640,
epochs=100,
batch=8,
name='train_crack'
) 这里我们开始训练和测试自己的数据集,在cmd终端中运行train.py进行训练,以下是训练过程中的结果截图。

在深度学习中,我们通常通过损失函数下降的曲线来观察模型训练的情况。在训练结束后,我们也可以在logs目录下找到生成对若干训练过程统计图。下图为博主训练路面裂缝检测的损失函数曲线图。

一般我们会接触到两个指标,分别是召回率recall和精度precision,两个指标p和r都是简单地从一个角度来判断模型的好坏,均是介于0到1之间的数值,其中接近于1表示模型的性能越好,接近于0表示模型的性能越差,为了综合评价目标检测的性能,一般采用均值平均密度map来进一步评估模型的好坏。我们通过设定不同的置信度的阈值,可以得到在模型在不同的阈值下所计算出的p值和r值,一般情况下,p值和r值是负相关的,绘制出来可以得到如下图所示的曲线,其中曲线的面积我们称AP,目标检测模型中每种目标可计算出一个AP值,对所有的AP值求平均则可以得到模型的mAP值。下图为博主训练路面裂缝检测的PR曲线图。

以PR-curve为例,可以看到我们的模型在验证集上的均值平均准确率为0.670。
4.3 YOLOv5与 YOLOv8对比
F1-Score是精确率和召回率的调和平均值,对于不平衡的数据集或者希望兼顾精确率和召回率的任务,F1-Score是一个重要的度量。mAP是衡量模型在各个类别上平均检测准确度的指标,值越高表明模型的整体识别能力越好。博主分别尝试YOLOv5、YOLOv8对路面裂缝的数据集进行训练,下表为YOLOv5、YOLOv8分别实验的结果。

不同的数据集有不同的特性,包括裂缝的大小、形状、背景复杂度等。一些模型可能对特定类型的图像更敏感,因此在不同的数据集上表现可能有差异。这里,YOLOv5的mAP略高于YOLOv8,说明在这个具体的路面裂缝检测任务中,YOLOv5整体上能稍微更准确地识别出裂缝。总体而言,YOLOv5在裂缝检测上展现出更好的性能,但选择模型时需谨慎考虑具体需求和条件。
4.4 代码实现
在这一节中,我们将详细介绍如何使用YOLOv8实现摄像头画面中裂缝识别的代码实现。这个实现主要包括创建主窗口、处理每一帧图像、加载模型、开始处理媒体流等步骤。
在实时路面裂缝检测系统中,结合YOLOv8模型和一系列开源库,如OpenCV、QtFusion和PySide6等,来实现主窗口的展示、摄像头帧的处理以及路面裂缝的检测和标注等功能。
(1)引入必要的库
首先,需要引入一些必要的库,包括图像处理库OpenCV、图形界面库QtFusion和PySide6,以及物体检测模型库YOLOv8Model等。
import sys
import time
import cv2
from QtFusion.BaseFrame import FBaseWindow
from QtFusion.Handler import MediaHandler
from QtFusion.ImageUtils import drawRectBox
from QtFusion.ImageUtils import get_cls_color
from PySide6 import QtWidgets, QtCore
from YOLOv8Model import YOLOv8Detector (2)设置主窗口
在设置主窗口的过程中,定义了一个名为MainWindow的类,该类继承自QtFusion库中的FBaseWindow类。在MainWindow类中,设置了窗口的大小,并创建了一个用于显示图像的标签。此外,我们还设置了一个按键事件,使得用户可以通过按Q键来关闭窗口。
class MainWindow(FBaseWindow):
def __init__(self):
super().__init__()
self.resize(850, 500)
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(0, 0, 850, 500)
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Q:
self.close() (3)图像帧处理与路面裂缝检测
在进行图像帧处理和裂缝检测的过程中,定义了一个名为frame_process的函数。首先,将图像的大小调整为850x500,然后使用YOLOv8模型进行预处理。使用该模型对图像进行预测,将预测结果后处理,并将检测到的路面裂缝用对应类别颜色的矩形框在图像中标注出来。
def frame_process(image):
image = cv2.resize(image, (850, 500))
pre_img = model.preprocess(image)
t1 = time.time()
pred = model.predict(pre_img)
t2 = time.time()
use_time = t2 - t1
print("推理时间: %.2f" % use_time)
det = pred[0]
if det is not None and len(det):
det_info = model.postprocess(pred)
for info in det_info:
name, bbox, conf, cls_id = info['class_name'], info['bbox'], info['score'], info['class_id']
label = '%s %.0f%%'```python
% (name, conf * 100)
image = drawRectBox(image, bbox, alpha=0.2, addText=label, color=colors[cls_id])
window.dispImage(window.label, image)
(4)初始化检测模型和设备
在主函数部分,我们首先实例化YOLOv8Detector类,并加载预先训练好的模型权重。根据模型预设的类别标签获取了每个类别对应的颜色,这些颜色将在后续的检测结果可视化中使用。创建一个MainWindow对象,以便在屏幕上显示图像。再创建了一个MediaHandler对象,用于从摄像头设备中读取视频流并处理每一帧图像。
cls_name = ["裂缝" ]
model = YOLOv8Detector()
model.load_model(abs_path("weights/crack-yolov8n.pt", path_type="current"))
colors = get_cls_color(model.names)
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
videoHandler = MediaHandler(fps=30)
videoHandler.frameReady.connect(frame_process)
videoHandler.setDevice(device=0)
videoHandler.startMedia()
window.show()
sys.exit(app.exec())
在此,"crack-yolov8n.pt"是经过大量路面裂缝图像训练得到的模型权重文件,而model.names则包含了模型中裂缝类别的名称。这就是实现实时路面裂缝检测系统的完整代码,整个过程包括了数据预处理、YOLOv8模型预测、结果后处理和可视化等步骤,结构清晰,逻辑简洁。通过这样的方式,可以实现对摄像头捕获的画面进行实时的路面裂缝识别和标注。

5. 路面裂缝检测系统实现
在实现一款实时路面裂缝检测与识别系统时,采用面向对象的设计思路,依赖Python语言和多种开源库如Pyside6、QtFusion、Pytorch等。其中,重要的FlowerMainWindow类是系统的主体,负责提供用户界面来控制输入源、进行路面裂缝检测与识别,并展示检测结果。以下将详细介绍其设计思路、架构设计以及整个流程。
5.1 系统设计思路
FlowerMainWindow类的主要目标是提供一个用户友好的交互式路面裂缝检测与识别系统。为了实现这个目标,采取了将界面、媒体处理和模型集成在一起的设计思路。通过对象组合的方式,将不同的处理器和模型组织在一起,让每个功能模块都能独立进行,同时,还利用信号和槽机制来进行模块间的交互和数据传递。
架构设计
在FlowerMainWindow类的架构设计中,采用了处理层、界面层、控制层的设计模式。
处理层(Processing Layer):此部分由YOLOv8Detector类实现的预训练模型和相关方法组成,负责进行路面裂缝的检测和识别。
界面层(UI Layer):此部分由由Ui_MainWindow类生成的用户界面组成,包含各种用户交互元素,如按钮、标签和表格等。
控制层(Control Layer):此部分由FlowerMainWindow类实现的槽函数和其他方法组成,响应用户的操作并控制媒体处理器和模型的行为。

以下是路面裂缝检测系统的工作流程:
用户打开应用程序,创建FlowerMainWindow类的实例,并初始化界面和相关参数。
用户通过界面操作选择摄像头、视频或图像作为输入源。
根据用户选择的输入源,调用相应的处理器和方法进行媒体处理和检测。
当媒体输入启动成功后,进入循环处理帧的流程:
对每一帧图像进行预处理。
使用YOLOv8模型对图像进行路面裂缝检测和识别,得到检测结果。
根据检测结果更新界面的显示,包括绘制检测框、更新表格数据和条形图等。
用户可通过按钮进行保存检测结果、显示作者信息和版本信息等操作。
用户可通过控制按钮来控制摄像头、视频和图像的启动和停止。
用户可通过表格和下拉菜单选择特定的检测结果进行查看和分析。
5.2 登录与账户管理
本系统还配备了一个基于SQLite的用户登录界面,提供了账户注册、密码修改、头像设置、账户注销和重新登录等功能。这些功能为每个用户创建了一个独立的空间,用户可以在其中保存和管理自己的检测结果和设置。

通过用户界面,用户可以轻松完成账户的注册和登录操作,然后进入主界面进行路面裂缝检测。用户还可以在登录界面进行密码修改、头像设置和账户注销等操作。这些功能为用户提供了便利的个性化服务,让用户能够更好地使用路面裂缝检测系统。
通过以上的设计和实现,裂缝检测系统具备了导入各类深度学习模型,实现多物体识别和检测的能力。主界面中实时显示包括检测框、类别及置信度等信息;支持图片、视频、实时摄像头和批量文件输入,能实时识别并记录。还设计了用户登录界面,提供账户注册、密码修改、头像设置、账户注销和重新登录等功能,满足用户在实时目标检测场景下的需求。
6. 总结与展望
在本博客中,我们详细介绍了一个基于YOLOv8模型的路面裂缝检测系统。系统以模块化的方式设计,充分采用了合理的架构设计,带来良好的可维护性和可扩展性。其用户界面友好,能够提供实时的路面裂缝检测和识别结果展示,同时支持用户账户管理,以便于保存和管理检测结果和设置。
该系统支持摄像头、视频、图像和批量文件等多种输入源,能够满足用户在不同场景下的需求。
在后面可以添加更多预训练模型,增加检测和识别的种类;优化用户界面,增强个性化设置;并积极聆听用户反馈,以期不断改进系统,以更好地满足用户的需求。
结束语
由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。
[1]Li, W., Zhao, L., Wei, L., Xu, Z., Jiao, L., & Liu, J. (2019). CrackNet: A novel convolutional neural network for road crack detection. IEEE Transactions on Image Processing, 28(3), 1467-1479. ↩︎
[2]Zhu, W., Li, W., & Ouyang, P. (2018). DeepCrack: Learning hierarchical convolutional features for crack detection. In Proceedings of the European Conference on Computer Vision (ECCV) (pp. 185-200). ↩︎
[3]Dai, Q., Nguyen, T. T., Do, T. T., & Cheriyadat, A. M. (2018). DeepCrack: A Deep Learning Framework for Crack Segmentation. In 2018 IEEE Winter Conference on Applications of Computer Vision (WACV). ↩︎
[4]Cheng, G., Han, J., & Lu, X. (2017). Road crack detection using deep convolutional neural network. In Proceedings of the IEEE International Conference on Computer Vision (ICCV). ↩︎