基于YOLOv8和Streamlit的汽车碰撞事故检测系统
文末附下载地址
开发目的
随着城市化进程的加快和机动车保有量的持续攀升,道路交通安全问题日益突出,汽车碰撞事故频发不仅严重威胁驾乘人员的生命安全,也对公共秩序、应急响应效率及交通管理能力提出了严峻挑战。传统的交通事故监测主要依赖人工报警、路面监控巡查或车载传感器触发,存在响应滞后、覆盖盲区多、人力成本高等弊端,难以满足现代智慧交通对实时性与智能化的双重需求。尤其在无人值守路段或夜间低光照环境下,事故难以被及时发现,极易引发二次伤害或交通拥堵。为破解这一难题,亟需构建一套高效、精准、可落地的自动化碰撞事故识别系统。
YOLOv8作为当前最先进的实时目标检测模型,凭借其卓越的检测精度、推理速度以及对多尺度、遮挡目标的强适应能力,能够有效识别复杂交通场景中车辆的异常状态,如剧烈位移、变形、翻车及散落物等碰撞特征。结合Streamlit这一高效交互式Web应用框架,本系统实现了检测模型的可视化部署与实时视频流分析,支持用户便捷上传视频、查看检测结果并获取预警提示,极大提升了系统的可用性与推广价值。
基于YOLOv8和Streamlit的汽车碰撞事故检测系统不仅能够实现对交通事故的秒级识别与自动报警,助力交管部门快速响应、缩短救援时间,还可在智能交通监控、自动驾驶辅助、保险定损等多个场景中发挥重要作用,推动人工智能技术在交通安全治理领域的深度应用,具有显著的社会效益与技术创新意义。
YOLO介绍
YOLOv8是Ultralytics公司于2023年推出的最新目标检测模型,作为YOLO系列的最新迭代,它在检测精度、推理速度和模型可扩展性方面实现了显著提升。YOLOv8延续了YOLO系列“一阶段检测”的高效架构,但在骨干网络、Neck结构和检测头设计上进行了多项关键优化,进一步提升了整体性能。以下从骨干网络、Neck和检测头三个方面深入解析YOLOv8,并对比其与YOLOv5、YOLOv7的主要改进与创新。
1. 骨干网络(Backbone)
YOLOv8的骨干网络采用CSP(Cross Stage Partial)结构的改进版本,引入了更高效的C2f模块替代YOLOv5中的C3模块。C2f模块通过更轻量的特征融合方式,在减少参数量的同时增强了梯度流动,提升了特征提取能力。此外,YOLOv8在不同尺度模型(如YOLOv8n、YOLOv8s、YOLOv8m等)中灵活调整网络深度和宽度,实现精度与速度的良好平衡。相比YOLOv5中使用的Focus结构,YOLOv8采用标准卷积进行下采样,避免信息丢失,提升特征完整性。而相较于YOLOv7中复杂的ELAN(Extended Efficient Layer Aggregation Networks)结构,YOLOv8的C2f设计更加简洁高效,兼顾性能与部署便捷性。
2. Neck结构
YOLOv8的Neck部分延续了PANet(Path Aggregation Network)的双向特征融合思想,但对结构进行了简化和优化。它采用改进的PAN结构,结合C2f模块进行多尺度特征融合,增强了高层语义信息与底层细节特征的交互能力。与YOLOv5相比,YOLOv8的Neck在特征融合路径上减少了冗余连接,提升了计算效率。而相较于YOLOv7中高度复杂且深度定制的E-ELAN结构,YOLOv8的Neck更注重模块化与通用性,避免过度设计,在保持高性能的同时提升了模型的可维护性和跨平台部署能力。
3. 检测头(Head)
YOLOv8最大的创新之一在于检测头的设计:它摒弃了YOLOv5和YOLOv7中沿用的“耦合头”(即分类与回归共用部分参数),转而采用解耦头(Decoupled Head)结构。这种结构将分类任务和边界框回归任务完全分离,各自拥有独立的卷积分支,显著提升了模型的表达能力与检测精度。此外,YOLOv8引入了任务对齐分配器(Task-Aligned Assigner)作为标签分配策略,动态匹配正样本,使分类得分与定位精度更一致,提升训练稳定性与推理效果。在回归分支中,YOLOv8还采用更先进的损失函数(如DFL,Distribution Focal Loss),进一步优化边界框的定位能力。
与YOLOv5、YOLOv7的对比与创新总结
相比YOLOv5:YOLOv8在结构上更为先进,采用C2f模块增强特征提取,使用解耦头提升检测性能,并引入更优的标签分配策略。整体精度更高,尤其在小目标检测和密集场景下表现更优。同时,YOLOv8取消了Anchor-Based设计中的手动Anchor聚类,支持Anchor-Free模式,适应性更强。
相比YOLOv7:YOLOv7强调极致的参数利用和复合缩放,结构复杂,训练成本高。而YOLOv8在保持高性能的同时,追求简洁与高效,避免了YOLOv7中复杂的模块堆叠和训练技巧(如模型重参数化、辅助头等),更适合工业级部署。此外,YOLOv8在架构设计上更具统一性,支持分类、检测、分割等多任务,生态更完善。
综上所述,YOLOv8在继承YOLO系列高效特性的同时,通过C2f骨干、优化Neck结构和解耦检测头等创新,实现了精度与速度的双重提升。相比YOLOv5和YOLOv7,它在模型设计上更加现代化、模块化,兼顾高性能与易用性,成为当前目标检测领域极具竞争力的主流模型。
系统设计
数据集
(1) 数据集基本情况
本项目使用的数据集为专门用于车辆碰撞事故检测的目标检测数据集,数据来源于在网络上爬取的真实交通事故场景采集图像,并经过专业筛选与清洗。整个数据集包含超过一万张标注图像,具体划分为:
- 训练集:9758张图像
- 验证集:1347张图像
- 测试集:675张图像
数据集中包含两个类别标签:
- 中度碰撞
- 重度碰撞
所有图像均已使用LabelMe
工具完成标注,并转换为YOLO系列模型所需的格式。数据集附带完整的classes.yaml
配置文件,用户下载后无需任何预处理即可直接用于YOLOv8模型训练。经实测,使用YOLOv8n(nano版本)在该数据集上训练后,mAP@50可达0.985,表明数据质量高、标注准确,适合用于高精度事故识别任务。
(2) 数据集处理
原始图像在采集后,使用开源标注工具 LabelMe 进行人工标注。LabelMe 是一个基于图形界面的图像标注工具,支持多边形、矩形、点等多种标注方式,广泛应用于目标检测、语义分割等任务。
标注完成后,每张图像会生成一个对应的 .json
文件,记录了图像中每个目标的位置信息(如边界框坐标)、类别名称及图像元数据。
由于 YOLO 系列模型要求输入的数据格式为归一化后的文本格式(.txt
),因此我们将 LabelMe 生成的 .json
标注文件统一转换为 YOLO 所需的格式:
YOLO目标检测数据格式说明:
对于每张图像 image.jpg
,需提供一个同名的 .txt
文件(如 image.txt
),其内容为每一行代表一个目标对象,格式如下:
<class_id> <x_center> <y_center> <width> <height>
其中:
class_id
:类别索引(从0开始)x_center
,y_center
:边界框中心点坐标(相对于图像宽高的归一化值,范围 [0,1])width
,height
:边界框的宽和高(同样为归一化值)
例如:
0 0.456 0.321 0.210 0.150
1 0.789 0.654 0.180 0.120
表示图像中有两个目标,分别为“中度碰撞”和“重度碰撞”,其位置信息已归一化。
最终,整个数据集组织结构如下:
dataset/
├── images/
│ ├── train/
│ ├── val/
│ └── test/
├── labels/
│ ├── train/
│ ├── val/
│ └── test/
└── data.yaml
data.yaml
文件定义了类别数量、类别名称列表以及训练/验证/测试集路径,供模型训练时读取。
模型训练
安装 Ultralytics
YOLOv8 由 Ultralytics 公司开发并维护,提供了简洁高效的 API 接口。我们通过 ultralytics
库来完成模型的训练与推理。
安装命令如下:
pip install ultralytics
训练代码编写
训练脚本通常以 Python 脚本形式编写,调用 YOLO
类进行训练。示例代码如下:
from ultralytics import YOLO
# 加载预训练模型
model = YOLO('yolov8n.pt') # 可替换为其他规模模型
# 开始训练
results = model.train(
data='path/to/data.yaml',
epochs=100,
imgsz=640,
batch=16,
name='yolov8n-crash-detection'
)
训练参数设置(超参数详解)
Ultralytics 提供了丰富的可调超参数,以下为本次训练中关键超参数的设置及其含义说明:
超参数 | 取值 | 含义说明 |
---|---|---|
epochs |
100 | 训练总轮数,控制模型学习充分性 |
batch |
16 | 每批次处理的图像数量,影响内存占用与梯度稳定性 |
imgsz |
640 | 输入图像尺寸(H×W),越大细节越多但计算量增加 |
optimizer |
‘auto’ | 优化器选择(SGD/Adam/AdamW),默认自动选择 |
lr0 |
0.01 | 初始学习率,决定参数更新步长 |
lrf |
0.01 | 最终学习率与初始学习率的比率(线性衰减) |
momentum |
0.937 | SGD动量因子,提升收敛速度 |
weight_decay |
5e-4 | L2正则化系数,防止过拟合 |
warmup_epochs |
3.0 | 学习率预热阶段的epoch数 |
warmup_momentum |
0.8 | 预热阶段动量值 |
box |
7.5 | 边界框回归损失权重 |
cls |
0.5 | 分类损失权重 |
conf |
1.0 | 置信度损失权重 |
iou |
0.5 | IoU损失阈值 |
patience |
50 | EarlyStop耐心值,若50轮无提升则停止训练 |
这些超参数可根据实际硬件条件和性能需求进行微调。Ultralytics 支持从外部 YAML 文件加载自定义超参数,便于复现实验结果。
训练后评估
为什么需要模型评价?
训练完成后,必须对模型性能进行全面评估,以判断其是否具备实际部署能力。仅凭训练损失下降无法反映模型在真实场景中的表现,因此需要引入标准化的评估指标。
PR曲线(Precision-Recall Curve)
PR曲线是目标检测中最常用的可视化工具之一,横轴为召回率(Recall),纵轴为精确率(Precision)。
精确率(Precision):预测为正类的样本中,实际为正类的比例
Precision = T P T P + F P \text{Precision} = \frac{TP}{TP + FP} Precision=TP+FPTP召回率(Recall):实际为正类的样本中,被正确预测的比例
Recall = T P T P + F N \text{Recall} = \frac{TP}{TP + FN} Recall=TP+FNTP
其中:
- TP:真正例(True Positive)
- FP:假正例(False Positive)
- FN:假反例(False Negative)
PR曲线越靠近右上角,说明模型性能越好。曲线下面积即为 AP(Average Precision)。
mAP(mean Average Precision)
mAP 是综合衡量目标检测性能的核心指标,是对所有类别 AP 的平均值。
- mAP@0.5:IoU 阈值为 0.5 时的平均精度
- mAP@0.5:0.95:在 IoU 从 0.5 到 0.95(步长0.05)共10个阈值下的平均 mAP
数学表达式:
mAP = 1 N ∑ i = 1 N AP i \text{mAP} = \frac{1}{N} \sum_{i=1}^{N} \text{AP}_i mAP=N1i=1∑NAPi
其中 N N N 为类别总数, AP i \text{AP}_i APi 为第 i i i 类的平均精度。
在本项目中,YOLOv8n 模型在测试集上达到了 mAP@50 = 0.985,表明模型对车辆碰撞具有极高的检测准确率。
模型推理
图片推理代码
使用训练好的模型进行单张图像推理:
from ultralytics import YOLO
model = YOLO('runs/detect/yolov8n-crash-detection/weights/best.pt')
results = model.predict(source='test.jpg', conf=0.5, iou=0.45)
for r in results:
im_array = r.plot() # 绘制检测结果
im = Image.fromarray(im_array[..., ::-1]) # BGR to RGB
im.show()
视频推理代码
对视频文件逐帧进行推理:
import cv2
from ultralytics import YOLO
model = YOLO('best.pt')
cap = cv2.VideoCapture('input.mp4')
while cap.isOpened():
success, frame = cap.read()
if not success:
break
results = model.predict(frame, conf=0.5)
annotated_frame = results[0].plot()
cv2.imshow('Crash Detection', annotated_frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
以上代码可用于离线视频分析或实时摄像头检测。
系统UI设计
Streamlit 框架优势
本系统采用 Streamlit 作为前端交互框架,其主要优点包括:
- 开发简单:纯 Python 编写(Streamlit本质上是利用Python对前端的HTML、CSS、JS做了封装),因此无需HTML/CSS/JS知识,直接调用Streamlit的Python接口即可产生精美的Web界面
- 快速部署:几行代码即可构建Web应用
- 实时交互:支持滑块、按钮、上传组件等动态控件
- 集成性强:易于与PyTorch、OpenCV、Pandas等库结合
- 本地运行:无需服务器即可启动本地Web服务
UI搭建流程(结合源码说明)
根据提供的 app.py
源码,系统UI主要由以下部分构成:
页面配置与标题设置
st.set_page_config(page_title="code learn corner", layout="centered") st.markdown("<h1 style='text-align: center;'>基于YOLO8的汽车碰撞事故检测系统</h1>", unsafe_allow_html=True)
侧边栏控制面板
- 模型选择下拉框
- 置信度与IoU滑动条调节
- 检测类型单选(图片/视频/摄像头)
主区域功能实现
- 图像上传与结果显示
- 视频上传并逐帧播放检测结果
- 摄像头实时检测(通过OpenCV捕获)
结果展示增强
- 使用
st.data_editor
展示检测结果表格(类别、置信度、坐标) - 实时图像渲染使用
st.image()
显示带框图
- 使用
隐藏默认样式
st.markdown(hide_streamlit_style, unsafe_allow_html=True)
去除Streamlit默认页脚和菜单,提升专业感。
整个UI逻辑清晰,模块化程度高,用户可通过简单操作完成多种模式下的碰撞检测任务。
系统功能
根据源码分析,本系统具备以下核心功能:
✅ 多模型切换支持
用户可在侧边栏选择不同规模的YOLOv8模型(如n/s/m/l/x),灵活平衡速度与精度。✅ 置信度与IoU阈值可调
提供滑块控件,允许用户动态调整conf
和iou
参数,适应不同检测场景需求。✅ 三种检测模式
- 图片检测:支持上传 JPG/PNG/JPEG 图像,显示检测结果、标注框、类别统计表
- 视频检测:上传 MP4 视频文件,逐帧推理并实时播放带框视频流
- 本地摄像头检测:调用设备摄像头(ID=0),实现现场实时监控
✅ 结构化结果输出
- 表格展示每个检测目标的序号、类别、置信度、边界框坐标(x1,y1,x2,y2)
- 统计各类别总数(如“中度碰撞:2辆”,“重度碰撞:1辆”)
✅ 高效推理与缓存机制
- 使用
@st.cache_resource
缓存已加载模型,避免重复加载导致延迟 - 视频帧率控制(每2帧处理一次),提升运行流畅度
- 使用
✅ 用户友好界面
- 中文标题与提示
- 实时进度提示(如“图片推理执行中…”)
- 支持一键终止摄像头检测
该系统集成了数据处理、模型推理、可视化展示于一体,具备良好的实用性与扩展性,适用于智能交通、保险定损、自动驾驶辅助等应用场景。
总结
本文围绕“基于YOLOv8和Streamlit的汽车碰撞事故检测系统”展开,系统性地阐述了项目的开发背景、核心技术选型、数据处理流程、模型训练与评估方法,以及前端交互系统的设计与实现。通过整合YOLOv8在目标检测领域的先进性能与Streamlit在Web应用开发中的便捷性,成功构建了一套高效、直观、可扩展的智能交通监控解决方案。
该系统不仅实现了对中度与重度碰撞事故的高精度识别(mAP@50达0.985),还支持图片、视频及实时摄像头三种检测模式,具备良好的实用性与部署灵活性。同时,通过可调节的置信度与IoU参数、结构化结果输出和模型缓存机制,显著提升了用户体验与系统响应效率。
未来,本系统可进一步拓展至多车协同检测、事故严重性分级、自动报警联动、与交通信号控制系统集成等方向,助力构建更加智能化、自动化的城市交通安全管理体系。总体而言,该项目充分体现了人工智能技术在现实场景中的落地价值,为智慧交通与公共安全领域提供了有力的技术支撑。
另外,限于本篇文章的篇幅,无法一一细致讲解系统原理、项目代码、模型训练等细节,需要数据集、项目源码、训练代码、系统原理说明文章的小伙伴可以从下面的链接中下载:
基于YOLO8的汽车碰撞事故检测系统【数据集+源码+文章】