ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于深度学习的交通标志与行人车辆检测系统

基于深度学习的交通标志与行人车辆检测系统 基于深度学习的交通标志与行人车辆检测系统 —— 功能与技术点详解一个把「YOLOv8 目标检测」和「PyQt5 桌面界面」完整打通的实战项目既能检测交通标志也能识别行人与车辆支持图片、文件夹批量、视频、摄像头四种输入方式。通过网盘分享的文件交通标志与行人车辆检测系统8.zip链接: https://pan.baidu.com/s/1SzfiXqEh0k8bRzFXYU0OyQ?pwdek4j 提取码: ek4j–来自百度网盘超级会员v7的分享一、项目背景交通场景下的感知任务是计算机视觉最经典的应用之一交通信号灯、限速标志、人行横道以及行人、公交车、汽车、卡车等目标都是自动驾驶与智能交通的基础感知对象。本项目实现了一套开箱即用的桌面级检测系统把训练好的 YOLOv8 模型封装进图形界面让不懂编程的使用者也能直接拖入图片或视频完成检测同时保留完整的参数调节与结果导出能力。二、系统功能一览2.1 检测类别共 9 类ID英文名中文名0Trafic Light Signal交通信号灯1Stop Signal停止信号2Speedlimit Signal限速信号3Crosswalk Signal人行横道信号4Crosswalk人行横道5Pedestrian行人6Bus公交车7Car汽车8Truck卡车2.2 核心功能功能说明单张图片检测支持 jpg / jpeg / png / bmp检测完成后在界面展示带框结果文件夹批量检测选中整个文件夹自动遍历所有图片逐张检测结果追加进结果表格视频文件检测支持 avi / mp4 / wmv / mkv逐帧检测并实时刷新预览画面摄像头实时检测调用本机摄像头默认设备 0实时画面 实时检测检测参数可调置信度阈值、交并比阈值IOU界面实时调节即时生效标签显示开关可一键切换「显示类别与置信度」或「只画检测框」目标逐个查看下拉框选择「全部」或某个具体目标单独查看该目标的框与坐标结果信息表格序号、文件路径、类别、置信度、坐标位置逐条列出结果导出图片结果写入save_data视频结果导出为带检测框的 avi 文件训练脚本提供train.py可基于自有数据集重新训练模型三、技术架构整个系统可以划分为三层层次清晰、职责单一┌─────────────────────────────────────────────┐ │ 界面层PyQt5 │ │ UiMain.py / style.css / 各类控件与信号槽 │ ├─────────────────────────────────────────────┤ │ 逻辑层MainProgram.py │ │ 业务调度读图/读视频/摄像头、参数管理、 │ │ 结果展示、结果保存、多线程 │ ├─────────────────────────────────────────────┤ │ 推理层ultralytics PyTorch │ │ YOLOv8 模型加载与推理输出 boxes 结果 │ ├─────────────────────────────────────────────┤ │ 工具层detect_tools.py / Config.py │ │ 图像格式转换、绘制、路径读取、全局配置 │ └─────────────────────────────────────────────┘界面层由 Qt Designer 设计.ui文件并生成UiMain.py通过style.css做 QSS 样式美化。逻辑层MainProgram.py中的MainWindow类负责把界面事件与推理逻辑串起来。推理层使用ultralytics的YOLO接口加载models/best.pt完成推理。工具层Config.py集中管理模型路径、类别名称、保存路径detect_tools.py提供绘图与格式转换等通用函数。四、核心技术点拆解4.1 目标检测YOLOv8 单阶段检测项目使用YOLOv8ultralytics 8.0.199作为检测模型任务类型为detect# MainProgram.pyfromultralyticsimportYOLO self.modelYOLO(Config.model_path,taskdetect)加载模型后一次推理即可拿到所有目标框。结果从results对象中按字段取出结构非常清晰resultsself.model(img_path,confself.conf_thres,iouself.iou_thres)[0]location_listresults.boxes.xyxy.tolist()# 每个目标的 [x1, y1, x2, y2]cls_listresults.boxes.cls.tolist()# 每个目标的类别 IDconf_listresults.boxes.conf.tolist()# 每个目标的置信度这种「一次前向 三个并行列表」的组织方式为后续界面展示提供了极大便利。4.2 模型训练策略模型基于 YOLOv8 架构训练关键超参数如下来自训练结果目录中的配置记录参数取值说明taskdetect目标检测任务epochs50训练轮数batch4批大小显存/内存友好imgsz640输入分辨率optimizerSGD优化器lr0 / lrf0.01 / 0.01初始学习率 / 最终学习率系数momentum0.937动量weight_decay0.0005权重衰减warmup_epochs3.0预热轮数close_mosaic10最后 10 轮关闭 Mosaic 增强fliplr0.5随机水平翻转增强mosaic1.0Mosaic 数据增强erasing0.4随机擦除增强degrees / shear / perspective0 / 0 / 0未启用旋转、错切、透视增强几个值得注意的工程取向数据增强适中启用了 Mosaic、水平翻转、HSV 色彩扰动但关闭了旋转、透视等强几何变换——交通场景的目标朝向相对固定过强的几何增强反而会引入噪声。最后阶段关闭 Mosaicclose_mosaic10让模型在训练末期回归真实分布提升最终精度。batch4 与 workers0典型的「消费级显卡 / CPU 环境也能跑」的保守配置。训练结果损失曲线、PR 曲线、混淆矩阵、验证集预测可视化等全部保存在models/exp27目录中可直接用于分析模型表现。4.3 PyQt5 界面Qt Designer QSS界面采用「可视化设计 代码生成」的方式.ui文件由 Qt Designer 设计UiMain.py由它生成业务代码通过多重继承方式复用生成的界面类classMainWindow(QMainWindow,Ui_MainWindow):def__init__(self,parentNone):super().__init__(parent)self.setupUi(self)# 装载设计好的界面self.initMain()# 业务初始化self.signalconnect()# 绑定信号与槽外观通过外部 QSS 文件统一管理样式与代码解耦style_fileUIProgram/style.cssself.setStyleSheet(QSSLoader.read_qss_file(style_file))这种写法的好处是改界面不用动业务逻辑改样式不用重新生成界面代码。4.4 信号与槽界面响应的事件驱动模型所有交互都通过 Qt 的信号槽机制绑定一处集中注册结构一目了然defsignalconnect(self):self.PicBtn.clicked.connect(self.open_img)# 打开图片self.FilesBtn.clicked.connect(self.detact_batch_imgs)# 批量检测self.VideoBtn.clicked.connect(self.vedio_show)# 打开视频self.CapBtn.clicked.connect(self.camera_show)# 打开摄像头self.SaveBtn.clicked.connect(self.save_detect_video)# 保存结果self.ExitBtn.clicked.connect(QCoreApplication.quit)# 退出self.comboBox.activated.connect(self.combox_change)# 目标切换4.5 多线程让视频保存不再卡死界面视频逐帧推理是一个耗时操作如果直接放在主线程里界面会「未响应」。项目用QThread把它挪到后台线程并通过信号回传进度classbtn2Thread(QThread):update_ui_signalpyqtSignal(int,int)# 当前帧数, 总帧数defrun(self):whilecap.isOpened()andself.is_running:ret,framecap.read()resultsself.model(frame,confself.conf,iouself.iou)[0]out.write(results.plot())self.update_ui_signal.emit(cur_num,total)# 上报进度主线程收到信号后更新进度条self.btn2Thread_object.update_ui_signal.connect(self.update_process_bar)同时还设置了is_running标志位支持用户中途取消保存关闭进度条窗口即终止线程这是一个很实用的健壮性设计。4.6 图像渲染从 OpenCV 到 Qt 的无缝转换OpenCV 使用 BGR 通道顺序、numpy数组存储Qt 需要QImage才能显示。项目封装了标准转换函数defcvimg_to_qpiximg(cvimg):height,width,depthcvimg.shape cvimgcv2.cvtColor(cvimg,cv2.COLOR_BGR2RGB)# BGR → RGBqimgQImage(cvimg.data,width,height,width*depth,QImage.Format_RGB888)returnQPixmap(qimg)同时为了让不同比例的图片都完整显示在固定大小的显示区内实现了等比自适应缩放defget_resize_size(self,img):img_height,img_width,_img.shape ratioimg_width/img_heightifratioself.show_width/self.show_height:self.img_widthself.show_width self.img_heightint(self.img_width/ratio)else:self.img_heightself.show_height self.img_widthint(self.img_height*ratio)returnself.img_width,self.img_height4.7 中文标签绘制绕开 OpenCV 的短板OpenCV 的cv2.putText不支持中文直接写会显示成「???」。项目的做法是交给 PIL 绘制defdrawRectBox(image,rect,addText,fontC,color):cv2.rectangle(image,(rect[0],rect[1]),(rect[2],rect[3]),color,2)cv2.rectangle(image,(rect[0]-1,rect[1]-25),(rect[0]60,rect[1]),color,-1)imgImage.fromarray(image)drawImageDraw.Draw(img)draw.text((rect[0]2,rect[1]-27),addText,(255,255,255),fontfontC)returnnp.array(img)字体在程序启动时加载一次并复用避免每帧都读字体文件fromPILimportImageFont self.fontCImageFont.truetype(Font/platech.ttf,25,0)4.8 参数动态调节改阈值即时重检置信度和 IOU 阈值不是「设完重启才生效」而是改动即触发重检交互体验更好defupdate_conf_thres(self,value):self.conf_thresvalueifhasattr(self,model):self.model.confvalueifhasattr(self,org_img):self.detect_current_image()# 立即用新阈值重新检测当前图片滑块滚动过程中就能直观看到「哪些目标被过滤掉了」非常适合做阈值调优演示。4.9 中文路径读取cv2.imread 的隐藏坑cv2.imread在中文路径下会静默失败返回 None。项目改用imdecode方案规避defimg_cvread(path):# 读取含中文名的图片文件imgcv2.imdecode(np.fromfile(path,dtypenp.uint8),cv2.IMREAD_COLOR)returnimg在本机实测中项目位于含中文的目录下依然可以正常运行。4.10 模型预热与设备自动选择两个容易被忽略但很影响体验的细节设备自动选择——有 GPU 用 GPU没有就退回 CPUself.device0iftorch.cuda.is_available()elsecpu模型预热——启动时先用一张小图跑一次推理把算子/runtime 初始化提前完成避免用户点第一张图时卡顿self.modelYOLO(Config.model_path,taskdetect)self.model(np.zeros((48,48,3)),deviceself.device)# 预先加载推理模型五、界面交互设计界面整体分为左右两大区域符合「左边看结果、右边看数据」的使用习惯左侧检测显示区展示原图 / 检测结果图 / 视频帧中央自适应缩放。右侧检测结果区顶部为检测参数设置标签开关、置信度阈值、交并比阈值中部为检测信息面板目标数目、目标选择下拉框、类型、置信度、xmin/ymin/xmax/ymax、用时底部为结果表格序号 / 文件路径 / 类别 / 置信度 / 坐标位置。底部操作栏打开图片、打开文件夹、打开视频、打开摄像头、保存、退出。批量检测时表格会自动滚动到最新一行并通过QApplication.processEvents()实时刷新界面让用户看到「逐张处理」的过程而不是假死。六、性能实测在纯 CPU环境下不依赖显卡实测指标实测值单张图片推理耗时约 58 ~ 71 ms640×640 输入前处理约 1 ~ 12 ms后处理约 1 ms运行设备CPUtorch.cuda.is_available()为 False 时自动回退也就是说CPU 下单张图片约 0.06 ~ 0.07 秒即可完成检测实时视频与摄像头场景也完全可用30 FPS 视频需约 33 ms/帧实测接近该量级。若配备 GPU 并安装 CUDA 版 PyTorch速度还可进一步提升。七、工程化细节与踩坑记录问题现象解决方式模型加载失败ModuleNotFoundError: No module named dillbest.pt使用dill序列化需在虚拟环境中pip install dill中文路径读图失败cv2.imread返回 None改用cv2.imdecode np.fromfile中文标签乱码cv2.putText显示问号改用 PILImageDraw TrueType 字体绘制视频保存时界面卡死主线程被推理阻塞用QThread后台推理 信号回传进度换机器后训练报错dataset.yaml里是绝对路径训练前改为自己的数据集路径ultralytics 自动装依赖装错环境dill 装到系统 Python 而非虚拟环境手动在虚拟环境中pip install dill八、可扩展方向模型升级替换为 YOLOv8s/m/l 等更大规模模型在精度与速度之间重新权衡。目标跟踪接入botsort/bytetrack为视频中的目标分配 ID实现轨迹跟踪与计数。性能加速导出 ONNX / TensorRT / OpenVINO 格式进一步提升推理速度。业务功能扩展加入越线检测、区域入侵、车流量统计等交通事件判定。部署形态扩展封装为 Web 服务FastAPI 前端或用 PyInstaller 打包成免安装 exe。九、总结这个项目最大的价值在于闭环完整从数据准备、模型训练train.pydataset.yaml到推理封装ultralyticsbest.pt再到界面交互PyQt5、多线程优化、结果导出形成了一条可以直接交付给使用者的完整链路。技术上它覆盖了几个非常实用的工程要点单阶段检测器的一次前向多字段解析Qt 界面与业务逻辑的解耦Qt Designer QSS 信号槽耗时任务的后台线程化与进度反馈跨库协作时的格式转换OpenCV ↔ Qt ↔ PIL中文路径、中文标签这类「国产环境下的经典坑」的规避方案。对于想入门「深度学习 桌面应用」落地的开发者来说这是一个很好的参考样本。
返回列表