基于YOLO与PyQt5的井盖破损检测:从算法到桌面应用的完整实践

📅 2026/8/8 3:48:37
基于YOLO与PyQt5的井盖破损检测:从算法到桌面应用的完整实践
1. 项目概述从“脚下安全”到AI视觉的落地实践城市井盖的破损、缺失或移位是市政管理中一个看似微小却风险巨大的问题。一个不起眼的破损井盖轻则导致车辆颠簸、财产损失重则可能引发严重的人身安全事故。传统的人工巡检方式不仅效率低下、成本高昂而且受限于巡检人员的精力与视野难以实现全天候、全覆盖的监控。这正是我们启动“基于深度学习的井盖破损检测系统”项目的初衷——利用前沿的计算机视觉技术为城市基础设施的智能化、自动化巡检探索一条可行的技术路径。这个项目是一个完整的端到端解决方案演示。它不仅仅是一个算法模型更是一个集成了最新YOLO系列目标检测模型从经典的YOLOv5到最新的YOLOv12、PyQt5图形用户界面、完整的模型训练代码以及高质量标注数据集的系统工程。无论你是刚接触深度学习的学生希望找一个有实际应用价值的练手项目还是从事安防、智慧城市或工业质检的工程师寻求一种可快速部署的缺陷检测方案亦或是研究者想对比不同YOLO版本在特定场景下的性能差异这个项目都能为你提供一个清晰的“技术地图”和可直接运行的“代码仓库”。简单来说它解决了三个核心问题第一“如何检测”——提供了从YOLOv5到YOLOv12多个版本的训练与推理代码你可以自由选择或对比第二“如何展示”——通过PyQt5构建了直观的桌面应用支持图片、视频和实时摄像头的检测演示让算法结果“看得见、摸得着”第三“如何复现”——提供了结构清晰的训练脚本和精心准备的数据集降低了从零开始的门槛。接下来我将为你层层拆解这个项目的设计思路、技术选型背后的考量以及每一步的具体实现和避坑指南。2. 核心思路与技术选型解析2.1 为什么选择目标检测而非图像分类面对井盖破损检测这个问题初学者可能会首先想到图像分类将图片分为“完好”和“破损”两类。但这种方法在实际场景中存在明显局限。首先井盖在图像中的位置、大小、角度多变分类模型需要极强的空间不变性这增加了学习难度。其次分类模型无法给出破损的具体位置这对于需要精确定位以便维修的市政部门来说信息价值大打折扣。最后一张图中可能存在多个井盖有的完好有的破损分类模型无法处理这种多实例情况。因此我们选择了目标检测技术。目标检测模型如YOLO能够同时完成“定位”用边界框标出每个井盖和“分类”判断每个框内的井盖是“完好”还是“破损”。这完美契合了我们的需求不仅能发现破损还能告诉工作人员“破损的井盖在哪里”。YOLOYou Only Look Once系列因其在速度和精度间的优异平衡成为工业界和学术界实时目标检测的首选这也是本项目以它为核心的原因。2.2 YOLO版本演进与选型策略从v5到v12项目集成了YOLOv5, v8, v11, v12多个版本这并非简单的堆砌而是为了满足不同阶段用户的需求和提供技术演进的直观对比。YOLOv5由Ultralytics公司发布虽然不是官方YOLO系列但其凭借极致的工程优化、清晰的代码结构和丰富的文档成为了无数开发者的“初恋”和工业部署的常客。它的优势在于成熟稳定、社区生态极其丰富。对于刚入门的新手从v5开始可以避开很多环境配置和代码理解的坑快速看到效果建立信心。其PyTorch实现也让训练和部署非常方便。YOLOv8同样是Ultralytics的作品可以看作是v5的全面升级版。它在模型架构上做了大量改进例如引入了新的骨干网络和检测头设计在保持速度的同时显著提升了精度。YOLOv8还统一了框架将目标检测、实例分割、姿态估计等任务整合到同一个API下使用起来更加简洁。对于希望使用更先进架构且兼顾易用性的用户v8是目前最推荐的选择。YOLOv11/YOLOv12这代表了YOLO系列最新的研究进展。通常版本号越新会尝试集成更多前沿的优化策略如更高效的网络模块、更先进的损失函数或训练技巧等。将它们纳入项目主要是为了满足研究者和技术探索者的需求用于对比实验或验证最新技术在本任务井盖检测上的有效性。需要注意的是最新版本的稳定性、社区资源和部署友好度可能不如v5/v8。选型建议如果你是初学者或追求快速落地强烈建议从YOLOv5或YOLOv8开始。如果你的硬件资源有限如边缘设备可以关注v5/v8提供的不同尺寸模型n, s, m, l, x从小模型开始尝试。如果你是研究者或技术极客可以深入探索v11/v12分析其改进点并尝试在自定义数据集上微调。2.3 PyQt5为什么是桌面图形界面深度学习模型训练好后最终需要交付给可能不懂代码的终端用户如市政巡检员使用。一个命令行工具显然是不友好的。我们需要一个图形用户界面GUI。在Python的GUI框架中PyQt5是一个功能强大、跨平台且外观专业的成熟选择。相比于TkinterPyQt5的控件更丰富、界面更美观相比于Web框架如FlaskHTMLPyQt5打包成独立的可执行文件.exe更加方便无需配置服务器环境双击即可运行非常适合作为演示系统、离线工具或内部工具进行分发。在本项目中PyQt5界面实现了以下核心功能1选择本地图片/视频文件进行检测2调用电脑摄像头进行实时检测3可视化显示检测结果边界框、类别标签、置信度4简单的结果导出功能。这构成了一个功能完整的演示系统原型。2.4 数据集项目的基石任何监督学习项目数据都是重中之重。本项目提供的井盖破损数据集通常包含数千张已标注的图片。标注格式采用YOLO系列通用的.txt文件格式即每个图片对应一个文本文件其中每一行代表一个标注对象格式为class_id x_center y_center width height坐标是相对于图片宽度和高度的归一化值。数据集中通常包含两个类别0代表“完好井盖”intact_manhole1代表“破损井盖”broken_manhole。数据采集会涵盖不同天气晴、雨、阴、不同光照条件白天、夜晚、不同拍摄角度以及不同程度的破损情况裂缝、缺失、碎裂以确保模型的鲁棒性。高质量的数据集是模型性能上限的关键保障。3. 环境配置与核心工具详解3.1 Python与PyTorch环境搭建这是一个典型的深度学习项目环境核心是Python和PyTorch。Python版本选择推荐使用Python 3.8或3.9。这是目前主流深度学习框架兼容性最好的版本。避免使用太新如3.11或太旧如3.6的版本以免遇到不必要的库依赖冲突。PyTorch安装这是最需要仔细对待的一步。你需要根据你的操作系统、是否使用GPU以及CUDA版本来选择正确的安装命令。查看CUDA版本如果你有NVIDIA GPU并希望使用GPU加速训练和推理在命令行输入nvidia-smi右上角会显示CUDA版本如12.1。访问PyTorch官网前往PyTorch官网的“Get Started”页面使用其提供的配置器生成安装命令。例如对于CUDA 12.1命令可能类似于pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121CPU版本安装如果没有GPU则安装CPU版本pip install torch torchvision torchaudio验证安装安装后在Python中运行以下代码验证import torch print(torch.__version__) # 打印PyTorch版本 print(torch.cuda.is_available()) # 打印True则表示GPU可用避坑指南PyTorch版本与CUDA版本不匹配是环境配置中最常见的问题会导致import torch失败或无法调用GPU。务必严格对照官网指令。如果遇到问题一个万能的“笨办法”是先安装CPU版本确保环境可运行后续再根据需要升级。3.2 YOLO项目依赖安装以YOLOv5为例其依赖通常定义在requirements.txt文件中。在项目根目录下执行pip install -r requirements.txt这个文件会安装一系列必要的库例如opencv-python用于图像和视频的读取、处理与可视化。matplotlib用于绘制训练过程中的损失曲线、精度曲线等图表。pandas用于处理标注数据等表格信息。seaborn用于绘制更美观的统计图表。pycocotools用于评估模型性能计算mAP等指标。注意事项opencv-python在某些系统上可能安装缓慢或失败可以尝试使用国内镜像源如pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple如果安装pycocotools在Windows上失败可以尝试安装其Windows版本pip install pycocotools-windows。3.3 PyQt5安装与界面设计工具安装PyQt5非常简单pip install PyQt5为了更高效地设计界面我们通常会使用Qt Designer这个可视化拖拽工具。它不随PyQt5包自动安装。有两种方式获取如果你安装了完整的Anaconda它可能已经自带了。单独安装pip install pyqt5-tools。安装后你可以在Python安装目录下的Lib\site-packages\qt5_applications\Qt\bin中找到designer.exe。使用Qt Designer设计好界面保存为.ui文件后可以通过PyQt5提供的工具pyuic5将其转换为Python代码pyuic5 -o main_window.py main_window.ui这样你就可以在Python中导入main_window.py并使用其中定义的界面类了。这种方式实现了界面与逻辑的分离便于维护。4. 数据集准备与预处理实战4.1 数据集目录结构规范一个清晰规范的目录结构是项目可维护性的基础。建议采用如下结构井盖检测项目/ ├── data/ │ ├── images/ # 存放所有图片 │ │ ├── train/ # 训练集图片 │ │ └── val/ # 验证集图片 │ └── labels/ # 存放所有标注文件与images目录结构一一对应 │ ├── train/ │ └── val/ ├── dataset.yaml # 数据集配置文件核心 └── ... (其他项目文件)关键点images和labels下的子目录名称train,val必须严格对应且其中的文件名除后缀外要一一对应。例如images/train/manhole_001.jpg对应的标注文件应为labels/train/manhole_001.txt。4.2 数据集配置文件dataset.yaml详解这个YAML文件是YOLO系列模型读取数据的入口它告诉模型数据在哪里、有哪些类别。内容如下# dataset.yaml path: ../data # 数据集根目录的相对路径或绝对路径 train: images/train # 训练集图片路径相对于path val: images/val # 验证集图片路径相对于path # 类别列表 names: 0: intact_manhole # 完好井盖 1: broken_manhole # 破损井盖重要提示path的设定非常关键。如果是在训练脚本所在的目录运行通常使用相对路径如../data。如果是在其他位置调用可能需要使用绝对路径。路径错误是导致训练时找不到数据的最常见原因。4.3 数据增强策略数据增强是提升模型泛化能力、防止过拟合的关键手段。YOLO的训练脚本通常内置了丰富的数据增强选项我们只需在配置文件中进行开关和参数调整。常见的增强包括几何变换随机缩放、裁剪、平移、旋转、水平翻转。这模拟了拍摄时角度、距离的变化。色彩变换调整亮度、对比度、饱和度、色调并添加随机噪声。这模拟了不同天气和光照条件。Mosaic增强将四张训练图片拼接成一张进行训练这是YOLOv5/v8等引入的强力增强技术能让模型在一个批次内看到更多尺度的上下文信息显著提升小目标检测能力。在YOLOv5/v8的data/hyps/hyp.scratch-low.yaml等超参数文件中你可以找到这些增强的概率和强度参数。对于井盖检测建议适度增强因为过度的旋转或扭曲可能会让模型难以学习井盖的圆形或方形特征。可以适当提高色彩增强的概率以应对复杂的光照环境。5. 模型训练全流程与参数调优5.1 训练脚本启动与核心参数解析以YOLOv5为例训练的核心命令如下python train.py --img 640 --batch 16 --epochs 100 --data ./data/dataset.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name manhole_detection让我们拆解每个参数--img 640输入图片的尺寸宽度和高度。YOLO要求输入为正方形通常为640x640。更大的尺寸如1280可能提升精度但会大幅增加显存消耗和训练时间。对于井盖这种中等尺寸的目标640是一个很好的起点。--batch 16批次大小。一次迭代送入模型的图片数量。越大训练越稳定速度越快但需要更多显存。如果出现“CUDA out of memory”错误首先尝试减小batch或--img。--epochs 100训练轮数。整个数据集被完整遍历一次称为一个epoch。100个epoch对于中等规模数据集通常足够。可以通过观察验证集损失曲线来判断是否早停。--data ./data/dataset.yaml指定上一步创建的数据集配置文件路径。--cfg ./models/yolov5s.yaml指定模型结构配置文件。yolov5s.yaml代表最小的“小”模型还有n,m,l,x等更大更复杂的版本。--weights yolov5s.pt指定预训练权重。使用在COCO等大型数据集上预训练的权重进行迁移学习可以极大加速收敛并提升最终性能。yolov5s.pt是官方提供的对应模型的预训练权重。--name manhole_detection本次训练任务的名称。训练日志、模型权重都会保存在runs/train/manhole_detection目录下。5.2 训练过程监控与指标解读启动训练后控制台会输出实时信息更重要的是TensorBoard或内置的日志工具会记录关键指标。损失函数Loss这是训练优化的直接目标。主要关注box_loss边界框回归损失衡量预测框与真实框的位置和大小差异。此值应稳步下降。obj_loss目标置信度损失衡量网格内是否存在目标的预测准确性。cls_loss分类损失衡量目标类别预测的准确性。 一个健康的训练过程三条损失曲线都应平滑下降并在后期趋于平缓。如果损失剧烈震荡或迟迟不降可能是学习率过高、批次大小不合适或数据有问题。性能指标Metrics精度Precision模型预测为“破损”的框中有多少是真正的破损井盖。高精度意味着误报少。召回率Recall所有真实的破损井盖中有多少被模型成功检测出来。高召回率意味着漏检少。mAPmean Average Precision这是目标检测的核心综合指标尤其关注mAP0.5IoU阈值为0.5时的平均精度和mAP0.5:0.95在不同IoU阈值下的平均精度更严格。mAP0.5达到0.9以上通常说明模型性能优秀。训练过程中这些指标在验证集上会逐步上升。我们的目标是让精度和召回率都达到较高水平并在mAP上取得好成绩。5.3 超参数调优经验谈学习率Learning Rate这是最重要的超参数。YOLO默认的学习率调度策略通常效果很好。如果你要调整建议使用--lr0和--lrf参数微调初始和最终学习率。一个原则宁可小一点稳一点。过大的学习率会导致损失爆炸或震荡。优化器OptimizerYOLOv5/v8默认使用SGD with momentum。对于小数据集或微调任务可以尝试Adam或AdamW通过--optimizer参数指定它们有时能更快收敛。数据增强强度如前所述在超参数文件hyp.yaml中调整。如果模型在训练集上表现很好但在验证集上差过拟合可以适当增强如果模型收敛困难可以减弱增强。早停Early StoppingYOLO训练脚本通常有--patience参数。例如设置--patience 50意味着如果验证集指标在连续50个epoch内没有提升则自动停止训练并保存最佳模型。这能有效防止过拟合和节省时间。实操心得不要一开始就追求极致的调参。先用默认参数在小规模数据或少量epoch上跑通整个流程确保代码、数据、环境无误。然后进行一轮完整的训练如100个epoch分析损失曲线和指标找到明显的问题如过拟合、欠拟合后再进行有针对性的调参。记录每次实验的参数和结果这是迭代优化的基础。6. PyQt5图形界面开发与功能集成6.1 主界面设计与功能布局使用Qt Designer我们可以像搭积木一样设计界面。主窗口通常包含以下区域菜单栏/工具栏提供“打开文件”、“打开摄像头”、“退出”等基本操作入口。中央显示区域一个QLabel控件用于显示原始图片/视频流以及绘制了检测结果的图片。控制面板放置按钮如“开始检测”、“停止”、“保存结果”。以及一些选项如“选择模型”YOLOv5s.pt, YOLOv8n.pt等、“置信度阈值”滑动条。信息显示区域一个QTextEdit或QListWidget用于实时显示检测结果如“坐标(x1,y1,x2,y2)类别破损井盖置信度0.95”或运行日志。设计完成后通过pyuic5命令生成.py文件便得到了界面的“骨架”。6.2 业务逻辑与模型推理集成这是界面开发的核心我们需要在生成的界面代码类中添加业务逻辑。主要步骤如下初始化模型在窗口初始化函数如__init__中加载训练好的YOLO模型权重.pt或.onnx文件。import torch from models.experimental import attempt_load # YOLOv5的加载方式 # 或 from ultralytics import YOLO # YOLOv8的加载方式 class MainWindow(QMainWindow): def __init__(self): super().__init__() # ... 界面初始化代码 ... self.model None self.load_model(./weights/best.pt) # 加载最佳模型 def load_model(self, model_path): # 以YOLOv5为例 self.model attempt_load(model_path, devicecuda:0 if torch.cuda.is_available() else cpu) self.model.eval() # 设置为评估模式 print(f模型加载成功: {model_path})图像预处理将QLabel中显示的图片或从摄像头捕获的帧转换为模型需要的输入格式缩放至640x640归一化转换为Tensor等。def preprocess_image(self, cv_img): # cv_img 是OpenCV读取的BGR格式图像 img cv2.resize(cv_img, (640, 640)) img img[:, :, ::-1].transpose(2, 0, 1) # BGR to RGB, HWC to CHW img np.ascontiguousarray(img) img torch.from_numpy(img).to(self.device) img img.float() / 255.0 # 归一化 if img.ndimension() 3: img img.unsqueeze(0) # 增加批次维度 return img执行推理将预处理后的Tensor送入模型得到预测结果。def inference(self, img_tensor): with torch.no_grad(): # 禁用梯度计算加速推理 pred self.model(img_tensor)[0] # 获取预测结果 # 对pred进行非极大值抑制(NMS)处理过滤重叠框 pred non_max_suppression(pred, conf_thres0.25, iou_thres0.45) return pred结果可视化与显示将推理得到的边界框、类别标签和置信度绘制到原始图片上然后通过OpenCV转换为Qt支持的QImage格式最终显示在QLabel中。def plot_results(self, cv_img, detections): # detections 是NMS后的结果每个检测框包含[x1, y1, x2, y2, conf, cls] for *xyxy, conf, cls in detections: label f{self.class_names[int(cls)]} {conf:.2f} # 使用OpenCV绘制矩形和文字 cv2.rectangle(cv_img, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2) cv2.putText(cv_img, label, (int(xyxy[0]), int(xyxy[1])-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 将OpenCV BGR图像转换为Qt RGB图像 height, width, channel cv_img.shape bytes_per_line 3 * width qt_img QImage(cv_img.data, width, height, bytes_per_line, QImage.Format_RGB888).rgbSwapped() # 在QLabel上显示 self.label_display.setPixmap(QPixmap.fromImage(qt_img))多线程处理对于实时摄像头检测推理和图像显示是耗时操作必须放在独立的线程中进行否则会阻塞主线程导致界面卡死无响应。可以使用Python的threading模块或PyQt5的QThread类来实现。6.3 打包与分发开发完成后可以使用PyInstaller或cx_Freeze将整个Python项目打包成独立的可执行文件.exe方便在没有Python环境的电脑上运行。pyinstaller -w -F --add-data weights;weights --add-data data;data main.py-w: 隐藏命令行窗口。-F: 打包成单个exe文件。--add-data: 将模型权重文件夹weights和数据文件夹data一起打包进去。注意事项打包过程可能会因为动态库缺失而失败。特别是OpenCV、PyTorch等库依赖复杂。一个可靠的方法是创建一个干净的虚拟环境只安装项目必需的包然后在这个环境下进行打包。7. 模型优化与部署进阶探讨7.1 模型轻量化与加速当考虑将系统部署到资源受限的边缘设备如Jetson Nano、树莓派AI加速棒或移动端时需要对模型进行优化。模型剪枝Pruning移除网络中冗余的权重或通道在精度损失很小的前提下大幅减少模型大小和计算量。有结构化剪枝和非结构化剪枝之分。量化Quantization将模型权重和激活从32位浮点数FP32转换为更低精度如INT8。这能显著减少模型体积、提升推理速度、降低功耗。PyTorch提供了torch.quantization模块支持训练后动态量化或静态量化。知识蒸馏Knowledge Distillation用一个庞大复杂的“教师模型”来指导一个小型“学生模型”的训练让学生模型模仿教师模型的行为从而获得接近大模型的性能。转换为高效推理格式ONNX将PyTorch模型转换为开放神经网络交换格式便于在不同框架间迁移和优化。TensorRTNVIDIA推出的高性能深度学习推理SDK能对模型进行图优化、内核自动调优并在其GPU上实现极致加速。通常流程是PyTorch - ONNX - TensorRT。OpenVINOIntel推出的工具套件用于优化和部署模型到Intel CPU、集成显卡等硬件上。对于井盖检测如果部署在服务器端原始模型即可如果部署在边缘设备建议至少进行FP16或INT8量化并考虑使用YOLO本身提供的更小模型如YOLOv5n, YOLOv8n。7.2 工程化改进方向一个演示系统要转化为实际生产系统还需要考虑更多工程问题误报过滤模型可能会将井盖形状的圆形物体如车轮、窨井盖图案误检为井盖。可以通过添加后处理规则来过滤例如只检测图像下方一定区域路面区域、根据检测框的长宽比进行筛选井盖接近正方形或圆形。多帧融合与跟踪对于视频流可以对连续帧的检测结果进行关联跟踪使用SORT、DeepSORT等算法。这可以稳定检测框消除单帧抖动并为每个井盖分配唯一ID便于计数和状态持续监控。报警与上报机制当检测到“破损井盖”时系统应能自动触发报警。这可以是在界面弹窗、发出声音更实际的是通过HTTP API将报警信息时间、地点截图、坐标发送到后端管理平台或推送至维修人员的手机App。系统健壮性增加对输入视频流中断、模型加载失败等异常情况的处理。添加日志系统记录运行状态和检测事件便于排查问题。8. 常见问题与排查技巧实录在实际开发和部署过程中你几乎一定会遇到下面这些问题。这里记录了我的排查思路和解决方法。问题现象可能原因排查步骤与解决方案训练时Loss为NaN或突然变得巨大1. 学习率设置过高。2. 数据标注有误如坐标超出0-1范围。3. 数据中存在损坏的图片文件。1.立即停止训练将学习率--lr0降低一个数量级如从0.01降到0.001再试。2. 检查标注文件确保所有坐标值在0到1之间。可以用脚本遍历所有.txt文件验证。3. 使用OpenCV的cv2.imread检查所有训练图片是否能正常读取。模型训练很久但mAP一直很低如低于0.51. 数据集质量差或数量严重不足。2. 数据类别极度不平衡如完好样本远多于破损样本。3. 模型复杂度与数据量不匹配数据少却用了大模型导致过拟合。4. 预训练权重未加载或加载不正确。1. 可视化检查数据集和标注确保标注框准确。2. 统计各类别数量。如果严重不平衡可以使用过采样复制少数类样本或调整损失函数的类别权重YOLO中可通过--cls_pw参数调整分类损失权重。3. 换用更小的模型如YOLOv5s-YOLOv5n或加强数据增强。4. 确认训练命令中--weights参数指向了正确的预训练权重文件且网络能正常下载或读取。PyQt5界面运行正常但一点击按钮就卡死无响应GUI主线程被耗时操作如模型推理、文件读取阻塞。必须使用多线程将耗时的检测任务放在一个单独的QThread子类中执行。通过信号Signal和槽Slot机制与主线程通信例如子线程完成推理后发出一个包含结果的信号主线程的槽函数接收并更新UI。打包成exe后程序无法运行提示缺少DLL或模块PyInstaller未能正确打包所有依赖。特别是PyTorch、OpenCV等二进制依赖。1. 在打包命令中使用--hidden-import显式指定可能遗漏的模块如--hidden-import torchvision.models。2. 尝试在打包前在代码中显式import所有用到的子模块。3. 最彻底的方法在干净的虚拟环境中用pip install安装所有包然后使用pyinstaller的--collect-all参数谨慎使用可能导致包过大。4. 考虑使用conda-pack打包整个虚拟环境或使用Docker容器化部署。实时摄像头检测帧率很低FPS51. 模型推理速度慢。2. 图像预处理/后处理耗时。3. UI刷新过于频繁。1. 换用更轻量的模型如YOLOv5n或进行模型量化INT8。2. 优化预处理代码避免不必要的拷贝和转换。考虑使用OpenCV的GPU加速函数如cv2.cuda。3. 不要每帧都更新UI显示。可以设置一个定时器每处理完若干帧或固定时间间隔如100ms再更新一次UI图像。检测结果中同一个井盖被重复框出多个框非极大值抑制NMS的参数iou_thres设置过高导致重叠框未被有效抑制。调整推理代码中的NMS参数。降低iou_thres如从0.45降到0.3让重叠度较高的框被合并。但注意不要降得太低否则可能把相邻的两个真实井盖误合并。在树莓派等边缘设备上运行内存不足OOM模型或输入图像太大超出设备内存。1. 使用最小的模型YOLOv5n, YOLOv8n。2. 降低输入图像分辨率如从640降到320。这会损失一些精度但能大幅减少内存占用和计算量。3. 使用TensorRT或OpenVINO等针对特定硬件优化的推理引擎它们的内存管理更高效。这个项目从算法选型到工程实现覆盖了一个深度学习应用落地的完整链条。它像一把瑞士军刀为你提供了从研究到演示的多种工具。无论你的目标是学习YOLO、掌握PyQt5、理解一个完整项目的架构还是以此为蓝本开发自己的缺陷检测应用希望这份详尽的拆解能为你扫清障碍。记住看懂和跑通代码只是第一步亲手去调整参数、修复bug、增加功能才是真正掌握它的方式。如果在复现过程中遇到上面没提到的新问题不妨去项目的GitHub Issues区看看或者深入阅读YOLO和PyQt5的官方文档社区的智慧和官方的说明永远是最宝贵的资源。