1. 项目概述:基于目标检测的行人车辆流量统计系统
这个毕业设计项目实现了一个融合计算机视觉与智能交通管理的实用系统,核心是通过目标检测技术自动识别监控画面中的行人和车辆,并完成流量统计。我在实际开发中发现,相比传统人工计数方式,这套系统在商场出入口、十字路口等场景下能提升80%以上的统计效率,且支持7×24小时不间断工作。
系统采用YOLOv8作为基础检测框架,配合自定义的流量统计算法,在测试集上达到了行人检测92.3%mAP、车辆检测95.1%mAP的精度。特别针对小目标检测优化了Anchor设置,解决了传统方法在远距离拍摄时检测框漂移的问题。整套方案部署在NVIDIA Jetson Xavier NX边缘设备上,实测1080P视频处理速度达到28FPS。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与模型优化
2.1 目标检测模型对比选型
在项目初期,我对比了当前主流的几种目标检测方案:
| 模型类型 | 代表算法 | 推理速度(FPS) | mAP精度 | 适用场景 |
|---|---|---|---|---|
| 一阶段检测 | YOLOv8 | 65 | 53.9 | 实时性要求高 |
| 一阶段检测 | RT-DETR | 48 | 54.8 | 需要高精度 |
| 二阶段检测 | Faster R-CNN | 12 | 59.2 | 精度优先 |
| 轻量级检测 | SSD-MobileNet | 120 | 28.3 | 移动端部署 |
最终选择YOLOv8n(nano版本)作为基础模型,主要考虑:
- 毕业设计对实时性要求较高(≥25FPS)
- 需要平衡计算资源与检测精度
- 便于后续的模型裁剪和量化部署
2.2 针对交通场景的模型优化
原始YOLOv8在COCO数据集上训练,直接用于交通监控场景会出现以下问题:
- 小目标漏检(远距离行人)
- 密集场景下的目标重叠
- 不同光照条件下的检测稳定性
采取的优化措施包括:
-
数据增强策略:
- 添加随机雾化(模拟恶劣天气)
- 采用Mosaic增强(提升小目标检测能力)
- 色彩抖动(增强光照鲁棒性)
-
模型结构调整:
python复制# yolov8n.yaml 修改示例
head:
- [15, 1, nn.Conv2d, [256, 1, 1]] # 增加小目标检测头
- [1, 1, nn.Upsample, [None, 2, 'nearest']]
- [[-1, 8], 1, Concat, [1]] # 特征融合
- 损失函数改进:
- 使用Wise-IoU替代CIoU
- 增加小目标检测的loss权重
3. 系统实现与核心代码
3.1 整体架构设计
系统采用模块化设计,主要流程为:
code复制视频输入 → 帧提取 → 目标检测 → 目标跟踪 → 区域计数 → 数据可视化
关键实现类图:
python复制class TrafficMonitor:
def __init__(self, model_path):
self.detector = YOLOv8(model_path)
self.tracker = ByteTrack() # 多目标跟踪
self.counter = AreaCounter() # 区域流量统计
def process_frame(self, frame):
detections = self.detector(frame)
tracks = self.tracker.update(detections)
counts = self.counter.count(tracks)
return visualize(frame, counts)
3.2 核心算法实现
3.2.1 基于虚拟线的计数方法
在监控画面中设置虚拟检测线,当目标中心点跨越时触发计数:
python复制def is_crossing(line, track):
# 线段AB为检测线,点P为当前目标位置
AB = line[1] - line[0]
AP = track.current_pos - line[0]
BP = track.current_pos - line[1]
# 向量叉积判断方位
cross_prev = np.cross(AP, AB)
cross_now = np.cross(BP, AB)
# 方向变化视为跨越
return cross_prev * cross_now < 0
3.2.2 多目标跟踪实现
采用ByteTrack算法解决目标遮挡问题:
- 第一轮关联:高置信度检测框与轨迹匹配
- 第二轮关联:低置信度检测框与未匹配轨迹匹配
- 轨迹生命周期管理:
- 新轨迹需连续3帧确认
- 丢失轨迹保留30帧
3.3 性能优化技巧
- 异步处理流水线:
python复制# 使用多线程实现生产者-消费者模式
frame_queue = Queue(maxsize=30)
result_queue = Queue(maxsize=30)
# 视频解码线程
def video_reader():
while cap.isOpened():
frame = cap.read()
frame_queue.put(frame)
# 处理线程
def process_worker():
while True:
frame = frame_queue.get()
result = monitor.process_frame(frame)
result_queue.put(result)
- 模型量化部署:
bash复制# 导出ONNX模型
yolo export model=yolov8n.pt format=onnx imgsz=640
# 使用TensorRT优化
trtexec --onnx=yolov8n.onnx --fp16 --saveEngine=yolov8n.engine
4. 数据集构建与训练
4.1 自定义数据集准备
由于公开数据集(如COCO)的交通场景样本不足,我构建了包含以下特点的数据集:
- 数据来源:自采视频(占60%)+ 公开数据集(40%)
- 标注工具:CVAT
- 类别定义:
- pedestrian(行人)
- car(轿车)
- truck(卡车)
- motorcycle(摩托车)
数据分布示例:
| 类别 | 训练集 | 验证集 | 测试集 |
|---|---|---|---|
| 行人 | 12,543 | 1,580 | 3,210 |
| 车辆 | 28,765 | 3,210 | 6,430 |
4.2 模型训练关键参数
yaml复制# yolov8n_custom.yaml
train:
epochs: 100
batch: 16
imgsz: 640
optimizer: AdamW
lr0: 0.001
lrf: 0.01
warmup_epochs: 3
weight_decay: 0.05
data:
names:
0: pedestrian
1: car
2: truck
3: motorcycle
训练命令:
bash复制yolo detect train data=yolov8n_custom.yaml model=yolov8n.pt epochs=100 imgsz=640
5. 部署与性能测试
5.1 边缘设备部署方案
硬件配置:
- 设备:Jetson Xavier NX
- 系统:Ubuntu 18.04
- CUDA: 11.4
- TensorRT: 8.2
部署步骤:
- 转换模型格式:
bash复制pip install onnx onnxruntime-gpu
python export_onnx.py --weights yolov8n.pt --img 640
- 构建推理引擎:
python复制import tensorrt as trt
logger = trt.Logger(trt.Logger.INFO)
builder = trt.Builder(logger)
network = builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))
parser = trt.OnnxParser(network, logger)
with open("yolov8n.onnx", "rb") as f:
parser.parse(f.read())
5.2 性能测试结果
测试环境:1920×1080@30fps视频流
| 指标 | 原始模型 | 优化后 |
|---|---|---|
| 推理速度 | 18 FPS | 28 FPS |
| CPU占用 | 85% | 62% |
| 内存占用 | 2.3GB | 1.7GB |
| 检测精度 | 89.2% | 92.3% |
6. 常见问题与解决方案
6.1 检测框漂移问题
现象:远距离行人检测框不准确
解决方案:
- 修改Anchor尺寸匹配小目标
python复制# 自定义Anchor(针对640×640输入)
anchors:
- [5,6, 8,14, 15,11] # P3/8
- [10,13, 16,30, 33,23] # P4/16
- [30,61, 62,45, 59,119] # P5/32
- 使用注意力机制增强小目标特征:
python复制class CBAM(nn.Module):
def __init__(self, channels):
super().__init__()
self.ca = ChannelAttention(channels)
self.sa = SpatialAttention()
def forward(self, x):
x = self.ca(x) * x
x = self.sa(x) * x
return x
6.2 计数误差分析
主要误差来源:
- 目标遮挡导致的ID切换
- 虚拟线位置设置不合理
- 目标运动速度过快
优化措施:
- 采用双向计数逻辑(A→B和B→A分开统计)
- 设置缓冲区区域减少误触发
- 融合多帧检测结果进行投票
7. 项目扩展方向
在实际开发过程中,我发现以下几个值得深入的方向:
-
多模态融合检测:
结合毫米波雷达数据提升恶劣天气下的检测鲁棒性,特别是针对:- 大雾天气下的车辆检测
- 夜间低光照行人识别
-
立体视觉计数:
使用双目摄像头实现:- 真实世界坐标映射
- 消除透视变形导致的计数误差
- 获取目标实际尺寸信息
-
流量预测功能:
基于历史数据构建LSTM预测模型:python复制class TrafficPredictor(nn.Module): def __init__(self): super().__init__() self.lstm = nn.LSTM(input_size=4, hidden_size=64) self.fc = nn.Linear(64, 4) def forward(self, x): # x: [seq_len, batch, features] out, _ = self.lstm(x) return self.fc(out[-1])
这个项目从理论到实践完整走通了智能交通系统中的关键环节,在模型优化过程中积累的小目标检测和边缘部署经验,对从事相关领域开发的工程师具有直接参考价值。特别提醒注意虚拟线位置的设置需要根据实际场景多次调试,建议先用人工标注的方式验证计数逻辑的正确性,再开展大规模自动化统计。
