尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

基于YOLOv8的路口交通信号灯通行规则识别:从数据标注到规则解析的完整实践

基于YOLOv8的路口交通信号灯通行规则识别:从数据标注到规则解析的完整实践 简介本资源是一套面向高校毕业设计与智能交通系统开发者的高分毕设级项目聚焦路口交通信号灯通行规则识别这一典型视觉感知任务基于YOLOv8目标检测框架并融合OpenCV图像处理能力解决复杂光照、多角度、小目标等实际场景下的识别鲁棒性问题。压缩包共16个文件4.57MB含5个核心Python脚本main.py、train.py、Interface.py等实现训练、推理与界面交互、2张实拍测试图jpg、8张WebP格式的模型效果对比与界面截图以及1份结构清晰的README.md文档说明部署流程与使用方法。已有116人学习下载提供从数据准备、模型微调、实时检测到GUI封装的完整闭环方案代码注释详尽、模块职责明确特别适合作为计算机视觉课程设计、自动驾驶感知模块入门实践或毕设二次开发的基础工程模板。1. 项目缘起从毕设选题到路口信号灯识别的实战思考又到了一年一度的毕业季相信不少计算机视觉方向的同学尤其是做目标检测的都在为毕设选题发愁。选个太简单的怕工作量不够深度不足选个太前沿的又怕自己hold不住最后跑不出结果。我当年也经历过这个阶段所以今天想以一个过来人的身份聊聊一个既经典又实用且非常适合作为高分毕业设计的选题基于YOLOv8的路口交通信号灯通行规则识别。这个题目听起来是不是有点耳熟没错信号灯检测是自动驾驶和智能交通领域一个非常基础且关键的感知任务。但别急着觉得它“老套”这里面可做的文章多着呢。传统的信号灯检测可能只要求你框出红灯、绿灯、黄灯的位置这用YOLO跑个公开数据集调调参基本就能搞定。但“通行规则识别”这个后缀就把整个项目的难度和深度提上来了。它不再是简单的“是什么灯”而是要结合灯的状态、灯的类型直行、左转、右转、行人灯、以及它们在路口空间中的布局来综合判断当前车道或方向的“通行权”。这直接关联到实际的驾驶决策比如“当前亮起的是左转绿灯所以我方左转车道可以通行”或者“虽然机动车是绿灯但行人信号灯也是绿灯存在冲突需谨慎”。为什么说它适合做毕设首先它有明确的应用场景和价值能让你从“为了做模型而做模型”的思维里跳出来去思考一个真实世界的问题。其次它技术栈完整涵盖了数据收集与标注、模型选型与训练YOLOv8、后处理逻辑设计、评估指标构建甚至可能涉及到简单的跟踪或时序分析。最后它的难度可控你可以选择只做静态图片的识别也可以挑战视频流中的连续识别与规则判断工作量弹性很大。我自己在指导学弟学妹和做相关项目时发现大家最容易在两个地方卡壳一是数据的获取与标注红绿灯数据集不少但带有详细通行规则标签的几乎没有需要自己动手二是识别后的逻辑判断模块如何将YOLO输出的一个个检测框转化成一条条可执行的通行规则这里面的设计很考验对业务的理解。接下来我就结合一个高分毕设应有的深度把这套系统从数据到算法再到代码实现的完整链条掰开揉碎了讲清楚。2. 核心问题定义与数据工程的“脏活累活”在做任何算法项目之前清晰地定义你要解决的具体问题比盲目开始写代码重要十倍。对于“路口交通信号灯通行规则识别”我们可以把它拆解为两个核心子任务信号灯实例的精确检测与分类不仅要检测出图像中所有的信号灯还要对每一个实例进行细粒度分类。例如red_straight红色直行灯、green_left绿色左转箭头灯、yellow_pedestrian黄色行人灯、red_circle红色圆形灯等。这里“通行规则”的信息已经部分蕴含在灯的类型里了。基于空间与逻辑的通行规则解析将检测到的信号灯实例根据它们在图像中的位置通过先验知识或辅助信息映射到实际路口车道、它们的类型和状态综合判断出每条车道如左转车道、直行车道、右转车道、人行横道当前的通行状态禁止通行、允许通行、警示通行。明确了目标接下来就是所有AI项目最基石也是最繁琐的一步数据。公开数据集如TT100K、Bosch Small Traffic Lights Dataset主要提供信号灯的位置和颜色红、绿、黄标签但缺乏对灯类型箭头方向、圆形、行人标志的细致区分更不用说与车道的对应关系了。注意如果你的毕设想脱颖而出强烈建议不要完全使用现成数据集。自己采集和标注一部分数据不仅能体现工作量更能让你深入理解问题的细节。2.1 数据采集策略我的建议是混合数据源网络爬取与公开数据集从TT100K等数据集中筛选出包含清晰路口、多种信号灯类型的图片作为基础训练集。实地拍摄这是提升模型泛化能力的关键。使用手机或行车记录仪在你所在城市的不同类型路口十字路口、T型路口、带待转区的路口、有倒计时牌的路口进行多角度、多时段白天、夜晚、黄昏、雨天拍摄。特别注意拍摄一些“疑难杂症”如灯箱反光、部分遮挡、远处小目标、阳光直射导致过曝等。仿真数据补充如果条件允许可以用CARLA、AirSim等自动驾驶仿真平台生成大量带精确标注的交通信号灯数据尤其是可以轻松获取各种罕见天气和光照条件的数据。2.2 数据标注的“魔鬼细节”这里直接上我们项目采用的标注规范你可以直接参考标注工具推荐使用labelImg或功能更强大的CVAT。我们用的是Roboflow在线平台它支持团队协作和自动预处理非常方便。标注类别设计不要只标red,green,yellow。为了支持规则判断类别必须细化。我们定义了如下类别可根据你的路口实际情况调整red_straight,green_straightred_left,green_left,yellow_left(有些路口有独立的左转黄灯)red_right,green_rightred_circle,green_circle,yellow_circle(圆形灯通常用于指示直行或未分方向通行)pedestrian_red,pedestrian_green,pedestrian_flashing(行人信号闪烁通常表示即将变红)countdown(倒计时数字可选可用于增强规则判断的时序信息)标注框紧密包围信号灯发光区域而不是整个灯箱。这对于后续判断哪个灯是“亮起”的状态至关重要。关键点标注可选但推荐对于箭头灯除了边界框还可以标注箭头的指向关键点如箭头尖端。这可以作为辅助信息帮助模型更好地学习方向特征或者在后期处理中提供更精确的方向向量。2.3 数据预处理与增强YOLOv8虽然强大但好的数据增强能让它如虎添翼。针对交通信号灯场景我们特别强调了以下几类增强光度畸变模拟不同天气和光照。调整亮度、对比度、饱和度添加随机高斯噪声模拟雨滴、雾霾效果。几何畸变随机缩放、裁剪、水平翻转注意水平翻转要谨慎因为会改变箭头方向需要同步修改标签中的方向类别如left变为right我们通常禁用水平翻转、小角度旋转。模拟遮挡随机添加矩形马赛克块模拟被树木、车辆部分遮挡的信号灯。MixUp与MosaicYOLOv8训练时默认会使用Mosaic增强将四张图拼成一张这能极大地提升模型对小目标和上下文信息的感知能力。我们使用Roboflow平台配置了如下增强管道后导出给YOLOv8训练效果显著# Roboflow 增强配置示例 (导出时会自动应用) augmentation: - rotation: between -15 and 15 degrees - saturation: between -30% and 30% - brightness: between -30% and 30% - exposure: between -20% and 20% - blur: up to 1px radius - noise: up to 2% of pixels数据处理这块“脏活累活”是项目的根基投入的时间越多后面模型训练和规则判断就越顺利。我们当时三个人花了近两周时间标注了约5000张高质量图片涵盖了12个细分类别。3. YOLOv8模型选型、训练与优化实战数据准备好了接下来就是重头戏模型部分。为什么选YOLOv8因为它对于学生和研究者来说在精度、速度和易用性上取得了非常好的平衡。Ultralytics公司维护的这套框架API设计清晰训练、验证、导出一条龙能让你把更多精力放在问题本身而不是调试训练脚本上。3.1 模型版本选择与初始化YOLOv8提供了n/s/m/l/x不同尺度的模型。对于交通信号灯检测我的经验是YOLOv8s (Small)如果你的部署目标是嵌入式设备如Jetson Nano或需要高帧率这是起点。参数量较少在高质量数据集上也能达到不错精度。YOLOv8m (Medium)对于毕设项目这是我最推荐的版本。它在精度和速度之间取得了最佳权衡在RTX 3060级别的显卡上就能快速训练并且足以应对大多数路口场景的检测需求能够为你的“规则识别”提供可靠的基础检测结果。YOLOv8l/x (Large/Extra Large)除非你的路口异常复杂、信号灯极小极多或者纯粹追求刷高mAP指标否则没必要用。训练时间长容易过拟合部署也更困难。我们的项目基于YOLOv8m进行。首先准备好YOLO格式的数据集文件夹结构traffic_light_dataset/ ├── train/ │ ├── images/ │ └── labels/ ├── val/ │ ├── images/ │ └── labels/ └── data.yamldata.yaml文件是核心配置文件内容如下# data.yaml path: /path/to/your/traffic_light_dataset # 数据集根目录 train: train/images # 训练集图片路径 val: val/images # 验证集图片路径 # 类别数量 nc: 12 # 根据你的细分类别数修改例如我们之前定义的12类 # 类别名称列表必须和标注时的类别顺序一致 names: [red_straight, green_straight, red_left, green_left, yellow_left, red_right, green_right, red_circle, green_circle, yellow_circle, pedestrian_red, pedestrian_green]3.2 训练策略与超参数调优直接使用默认参数训练往往得不到最佳效果。以下是我们在项目中调整的关键超参数和经验from ultralytics import YOLO # 加载预训练模型 model YOLO(yolov8m.pt) # 使用在COCO上预训练的权重这是非常重要的起点 # 开始训练 results model.train( datapath/to/data.yaml, epochs150, # 对于中等数据集100-150个epoch通常足够 imgsz640, # 输入图像尺寸。信号灯是小目标可以尝试增大到896甚至1024以提升小目标检测能力但会显著增加显存和训练时间。 batch16, # 根据你的GPU显存调整。RTX 3060 12G可以跑到batch16。 workers4, # 数据加载线程数建议设为CPU核心数左右。 lr00.01, # 初始学习率对于微调任务可以从0.001或0.0005开始更稳定。 lrf0.01, # 最终学习率因子 (lr0 * lrf)。我们设为0.01让学习率平滑下降。 momentum0.937, weight_decay0.0005, warmup_epochs3.0, # 学习率预热epoch数有助于训练初期稳定。 box7.5, # 框损失权重默认值。 cls0.5, # 分类损失权重。对于类别区分重要的任务可以适当调高我们尝试过0.8。 dfl1.5, # DFL损失权重默认值。 hsv_h0.015, # 色相增强幅度对于信号灯这种颜色关键的目标可以稍微调低避免颜色失真。 hsv_s0.7, hsv_v0.4, degrees0.0, # 旋转角度。对于箭头灯我们禁用了旋转增强设为0因为方向是绝对信息。 translate0.1, scale0.5, shear0.0, perspective0.0, flipud0.0, fliplr0.0, # 水平翻转我们禁用了设为0。 mosaic1.0, # Mosaic增强概率默认1.0训练初期很有用。 mixup0.0, # MixUp增强概率。可以尝试0.1-0.2但注意可能会模糊小目标。 copy_paste0.0, # 复制粘贴增强对小目标检测有奇效可以尝试0.1。 erasing0.4, # 随机擦除概率模拟遮挡对提升鲁棒性有帮助。 crop_fraction1.0, optimizerAdamW, # 可以尝试AdamW有时比默认的SGD收敛更快更稳。 seed42, deterministicTrue, single_clsFalse, rectFalse, cos_lrFalse, label_smoothing0.0, nbs64, overlap_maskTrue, mask_ratio4, dropout0.0, valTrue, saveTrue, save_period-1, device0, # 使用GPU 0 projectruns/train, nameexp, exist_okTrue, pretrainedTrue, verboseTrue, )3.3 训练监控与模型评估训练过程中要密切关注train_batch.jpg查看数据增强效果、val_batch_labels.jpg查看验证集标签和val_batch_pred.jpg查看验证集预测。更重要的是看TensorBoard或Ultralytics自带的日志曲线损失曲线train/box_loss,train/cls_loss,val/box_loss,val/cls_loss。理想情况是训练损失平稳下降验证损失在后期也同步下降或保持平稳。如果验证损失很早就开始上升可能是过拟合。性能指标重点关注metrics/mAP50-95(B)即COCO标准的mAP。这是衡量模型综合性能的核心指标。对于信号灯检测我们同样关心每个细分类别的AP平均精度确保没有某个类别如yellow_left这种样本少的性能特别差。一个关键的调优技巧如果发现小目标远处的信号灯检测效果差除了增大imgsz还可以在模型结构上做文章。YOLOv8的model.yaml文件里可以调整detect层的nc类别数和scale参数。更直接的方法是使用注意力机制。我们尝试了在Backbone的C2f模块后加入SimAM或EMA注意力模块无需额外参数这对提升小目标和遮挡目标的特征提取能力有肉眼可见的帮助。这部分修改需要你熟悉YOLOv8的源码结构可以作为毕设的一个创新点。3.4 模型导出与测试训练完成后使用最佳权重进行导出和测试# 加载训练好的最佳模型 best_model YOLO(runs/train/exp/weights/best.pt) # 在测试集上评估 metrics best_model.val(datapath/to/data.yaml, splittest) # 如果你有独立的测试集 print(fmAP50-95: {metrics.box.map}) # 输出综合mAP # 对单张图片进行推理 results best_model(your_test_image.jpg, conf0.25, iou0.45) # 置信度和IOU阈值可根据需要调整 results[0].show() # 显示结果 results[0].save(output.jpg) # 保存结果 # 导出为ONNX格式便于后续部署 success best_model.export(formatonnx, imgsz640, simplifyTrue)至此你已经拥有了一个能够精准检测并分类路口各类信号灯的模型。但这只是完成了任务的一半。接下来我们要把这些冰冷的检测框变成有实际意义的“通行规则”。4. 从检测框到通行规则后处理逻辑的设计与实现这是本项目区别于普通目标检测的核心也是体现你算法设计能力和对业务理解深度的部分。YOLOv8给了我们一堆(x1, y1, x2, y2, conf, cls)的检测结果我们需要从中解析出“当前左转车道能否通行”4.1 输入与假设为了简化问题我们首先需要一些先验信息或假设。在完全未知的路口做通用规则识别是极其困难的属于高等级自动驾驶范畴。对于毕设我们可以设定一个可控的场景场景假设我们针对一个固定的、已知的路口。我们事先通过测量或标定知道每个信号灯组在图像中对应的大致区域Region of Interest, ROI并且知道每个ROI控制的是哪个方向的车道例如图像左上角的灯组控制南北向直行车道。输入YOLOv8对当前帧的检测结果列表。4.2 后处理算法步骤拆解我们的后处理算法可以设计为一个多阶段的流水线步骤一检测结果过滤与聚合def filter_and_aggregate(detections, conf_threshold0.5, iou_threshold0.5): 过滤低置信度检测并对同一灯位可能出现的多个重复检测进行NMS或聚类。 因为YOLO本身已经做了NMS这里主要是应对模型可能对同一个灯输出多个高置信框的情况较少见。 更常见的是对连续视频帧的检测结果进行时序滤波如卡尔曼滤波但单帧图片项目可暂缓。 filtered_dets [det for det in detections if det.confidence conf_threshold] # 简单的基于类别的IOU NMS boxes [] confs [] cls_ids [] for det in filtered_dets: boxes.append([det.x1, det.y1, det.x2, det.y2]) confs.append(det.confidence) cls_ids.append(det.class_id) # 可以使用torchvision.ops.nms或自实现 indices nms(boxes, confs, iou_threshold) return [filtered_dets[i] for i in indices]步骤二信号灯与ROI区域匹配这是我们规则判断的基础。我们需要一个预定义的ROI配置字典# 示例针对某个特定路口的ROI配置 (坐标需要根据你的路口图像手动标定或计算得出) ROI_CONFIG { north_straight: { roi_box: [100, 50, 200, 150], # (x1, y1, x2, y2) 该信号灯组在图像中的区域 controlled_lane: north_straight_lane, light_types: [red_circle, green_circle, yellow_circle] # 该灯组可能出现的灯类型 }, west_left_turn: { roi_box: [400, 200, 500, 300], controlled_lane: west_left_turn_lane, light_types: [red_left, green_left, yellow_left] }, east_pedestrian: { roi_box: [300, 400, 380, 480], controlled_lane: east_pedestrian_crossing, light_types: [pedestrian_red, pedestrian_green] }, # ... 更多ROI } def assign_detections_to_roi(filtered_dets, roi_config): 将检测到的每个信号灯分配到一个ROI。 策略计算检测框中心点落在哪个ROI内就属于哪个。 如果中心点不在任何预定义ROI内则可能是一个误检或未知灯位可以忽略或单独处理。 assignments {roi_name: [] for roi_name in roi_config.keys()} for det in filtered_dets: center_x (det.x1 det.x2) / 2 center_y (det.y1 det.y2) / 2 for roi_name, roi_info in roi_config.items(): rx1, ry1, rx2, ry2 roi_info[roi_box] if rx1 center_x rx2 and ry1 center_y ry2: # 可选检查检测到的灯类型是否在该ROI预期的类型列表中 if det.class_name in roi_info[light_types]: assignments[roi_name].append(det) break # 找到一个ROI就跳出 return assignments步骤三单个ROI内的状态裁决一个ROI一个灯组里可能有多个灯如红、黄、绿箭头。我们需要判断当前哪个灯是“激活”亮起状态。这里有一个关键逻辑通常一个灯组在同一时刻只有一个灯是亮的倒计时牌和行人闪烁灯除外。def determine_roi_state(roi_detections): 裁决一个ROI内当前有效的信号灯状态。 输入分配给该ROI的所有检测结果列表。 输出该ROI当前的状态例如 green_left, red, unknown。 if not roi_detections: return unknown # 未检测到任何灯可能是故障或遮挡 # 策略1取置信度最高的那个检测作为有效灯 # 这基于“一个灯组只有一个灯亮”的假设且模型对亮灯的检测置信度应远高于灭灯如果模型能区分灭灯的话通常我们不检测灭灯。 best_det max(roi_detections, keylambda d: d.confidence) # 策略2更鲁棒考虑所有检测如果存在高置信度的‘红’、‘绿’、‘黄’灯则以此为准。 # 因为有时模型会对灯箱整体有低置信度检测而对亮灯区域有高置信度检测。 for det in roi_detections: if det.confidence 0.7: # 高置信度阈值 # 根据类别名称判断基础状态 class_name det.class_name if green in class_name: return green elif red in class_name: return red elif yellow in class_name: return yellow # 如果没有高置信度检测则回退到策略1 return best_det.class_name.split(_)[-1] # 返回基础颜色或者返回更细的类别步骤四综合生成通行规则有了每个ROI的状态我们就可以根据交通规则映射表生成最终的通行指令。# 通行规则映射表 (需要根据实际路口交通规则定义) TRAFFIC_RULES { north_straight_lane: { green: permitted, # 允许通行 red: prohibited, # 禁止通行 yellow: warning, # 警告 (即将变红需谨慎或停止) unknown: caution # 未知建议谨慎观察 }, west_left_turn_lane: { green_left: permitted, red_left: prohibited, yellow_left: warning, unknown: caution }, east_pedestrian_crossing: { pedestrian_green: pedestrian_permitted, pedestrian_red: pedestrian_prohibited, pedestrian_flashing: pedestrian_warning, unknown: caution } } def generate_traffic_rules(roi_states, traffic_rules_map): 根据所有ROI的状态生成最终的通行规则报告。 roi_states: 字典 {roi_name: state} final_rules {} for lane, rule_map in traffic_rules_map.items(): # 这里需要一个从ROI状态到车道的映射。在我们的设计里ROI_CONFIG里包含了controlled_lane信息。 # 我们需要先根据roi_states找到控制这个车道的ROI的状态。 # 简化处理假设我们已经有一个映射关系 roi_name - lane controlling_roi None for roi_name, state in roi_states.items(): if ROI_CONFIG[roi_name][controlled_lane] lane: controlling_roi roi_name break if controlling_roi and state in roi_states: lane_state roi_states[controlling_roi] final_rules[lane] rule_map.get(lane_state, error) else: final_rules[lane] unknown return final_rules # 主流程串联 def process_frame(image, model, roi_config, traffic_rules): # 1. 模型推理 results model(image, conf0.25, iou0.45, verboseFalse) detections results[0].boxes.data.cpu().numpy() # 转换为numpy数组包含xyxy, conf, cls # 2. 过滤聚合 (这里简化假设results已经过NMS) # filtered_dets filter_and_aggregate(detections) # 3. 分配ROI assignments assign_detections_to_roi(detections, roi_config) # 需要将numpy数据转成自定义的det对象列表 # 4. 裁决每个ROI状态 roi_states {} for roi_name, det_list in assignments.items(): state determine_roi_state(det_list) roi_states[roi_name] state # 5. 生成规则 traffic_rules generate_traffic_rules(roi_states, TRAFFIC_RULES) return traffic_rules, results[0].plot() # 返回规则和绘制了检测框的图像这个后处理流程是规则识别系统的“大脑”。在实际应用中你还需要考虑更多边界情况比如时序滤波对于视频流不能只看单帧。可以使用滑动窗口或状态机来平滑判决结果避免因单帧误检导致的规则闪烁。例如只有当“绿灯”状态持续出现5帧以上才判定为可通行。冲突检测检查生成的规则是否存在逻辑冲突如对向车道同时显示绿灯直行。这可能是检测错误也可能是特殊交通相位。发现冲突可以触发系统报警或采用更保守的决策如默认禁止。未知状态处理当某个ROI长时间处于unknown状态时是认为该方向禁行还是需要依赖其他传感器如高精地图进行推断5. 系统集成、测试与毕设成果呈现将训练好的YOLOv8模型和上述规则判断逻辑集成起来就构成了一个完整的“路口交通信号灯通行规则识别系统”。对于毕设而言你需要一个直观的方式来展示你的工作成果。5.1 系统集成与可视化我们使用Python的Flask框架搭建了一个简单的Web演示系统当然你也可以用PyQt、Tkinter做桌面应用或者直接输出JSON格式的结果。# 一个简单的Flask API示例 from flask import Flask, request, jsonify, send_file import cv2 from PIL import Image import io # 假设你的处理函数在一个模块里 from traffic_rule_engine import process_frame app Flask(__name__) model YOLO(path/to/best.pt) # 加载模型 roi_config ... # 加载ROI配置 traffic_rules ... # 加载交通规则 app.route(/predict, methods[POST]) def predict(): if file not in request.files: return jsonify({error: No file uploaded}), 400 file request.files[file] image Image.open(io.BytesIO(file.read())) image_cv cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) # 调用核心处理函数 rules, annotated_image process_frame(image_cv, model, roi_config, traffic_rules) # 将标注后的图像转换为字节流返回 _, img_encoded cv2.imencode(.jpg, annotated_image) img_bytes img_encoded.tobytes() return jsonify({ traffic_rules: rules, image: img_bytes.decode(latin-1) # 简单处理实际应用建议分两个接口或传URL }) if __name__ __main__: app.run(debugTrue)前端页面可以上传图片后端返回JSON结果和标注图前端进行渲染清晰展示检测框、类别、置信度以及最终解析出的每条车道的通行规则如用绿色“可通行”、红色“禁止通行”文字标出。5.2 测试与评估指标对于毕设除了标准的目标检测指标mAP, Precision, Recall, F1 Score你还需要设计针对“通行规则识别”的评估指标规则判断准确率这是最终的系统级指标。准备一个测试集每张图片都有真实的通行规则标注例如{“north_straight_lane”: “prohibited”, “west_left_turn_lane”: “permitted”}。运行你的完整系统检测规则判断统计规则判断正确的图片比例。单灯状态准确率在ROI匹配正确的前提下统计每个ROI内信号灯状态红/绿/黄判断的准确率。鲁棒性测试在阴天、夜晚、逆光、运动模糊等挑战性场景下的性能保持度。实时性在目标硬件如你的笔记本或服务器上测量单张图片处理时间从读图到输出规则评估是否满足实时性要求例如10 FPS。5.3 毕设文档与代码组织一个高分毕设清晰、专业的文档和代码同样重要。代码结构TrafficLightRuleRecognition/ ├── README.md # 项目总述快速开始指南 ├── requirements.txt # Python依赖包列表 ├── data/ │ ├── raw/ # 原始数据 │ ├── processed/ # 处理后的数据YOLO格式 │ └── data.yaml # 数据集配置文件 ├── models/ │ ├── yolov8m_custom/ # 训练配置、权重、日志 │ └── export/ # 导出的ONNX/TensorRT模型 ├── src/ │ ├── data_preparation/ # 数据爬取、清洗、标注脚本 │ ├── training/ # 模型训练、超参数搜索脚本 │ ├── inference/ # 模型推理和后处理核心模块 │ │ ├── detector.py # YOLOv8检测器封装 │ │ ├── rule_engine.py # 规则判断逻辑 │ │ └── utils.py # ROI配置、可视化工具 │ └── demo/ # Flask/PyQt演示应用 ├── configs/ # 各种配置文件ROI、规则映射等 ├── tests/ # 单元测试、性能测试 └── docs/ # 详细设计文档、算法说明、用户手册文档内容开题报告/引言项目背景、意义、国内外研究现状。需求分析与系统设计详细的功能性需求和非功能性需求精度、速度系统总体架构图数据流、模块图。核心算法详述YOLOv8模型改进细节如果有、后处理规则判断的状态机或逻辑流程图。实验与结果分析数据集介绍、训练超参数、消融实验对比不同模型、不同数据增强、有无注意力机制等、各项评估指标的详细结果表格和曲线图、可视化结果展示成功案例、失败案例分析。系统实现与测试软件环境、接口说明、系统演示截图、鲁棒性和实时性测试结果。总结与展望项目成果总结、创新点、不足之处、未来可改进方向如引入时序模型LSTM、扩展到未知路口、与高精地图结合等。踩坑心得数据标注的一致性是生命线。不同人标注的松紧度、对箭头灯方向的判断会有差异一定要先制定详尽的标注规范并做一轮一致性检验。ROI配置的准确性直接决定规则判断的上限。最好能获取路口的设计图纸或者通过卫星地图现场测量进行标定。在图像中ROI区域要略大于实际灯组区域以容错检测框的轻微偏移。后处理逻辑的调试非常耗时。建议先用一个简单的、人造的检测结果比如在图上画几个已知位置的框来测试你的规则判断逻辑确保逻辑正确无误后再接入真实的、有噪声的模型检测结果。评估时不要只看mAP。一定要构建规则级别的测试集进行评估因为有可能mAP很高灯都检测对了但由于ROI匹配错误或状态裁决逻辑有bug导致最终规则判断错误。这个项目从数据到算法再到系统形成了一个完整的闭环。它不仅能让你深入掌握YOLOv8这一工业级目标检测工具更能锻炼你定义问题、设计解决方案、处理复杂逻辑和进行系统集成的能力。把这些都扎实地做下来整理成清晰的文档和代码一个优秀的毕设作品自然水到渠成。本文还有配套的精品资源点击获取
返回列表