1. 项目概述
街头摊贩检测系统是一个基于YOLOv8目标检测算法的计算机视觉应用,旨在帮助城市管理者高效监控和管理街头摊贩活动。随着城市化进程加快,街头摊贩作为城市经济的重要组成部分,其规范化管理面临诸多挑战。本系统通过深度学习技术实现对街头摊贩的自动识别和分类,为城市管理提供实时、准确的数据支持。
系统核心功能包括:
- 实时检测视频流中的街头摊贩
- 分类识别摊贩类型(食品车、亭子、市场摊位等)
- 可视化展示检测结果
- 数据统计与分析功能
2. 系统架构与技术选型
2.1 整体架构设计
系统采用前后端分离架构,分为三个主要模块:
- 检测引擎:基于YOLOv8的目标检测核心
- 后端服务:处理检测请求和数据分析
- 前端界面:结果展示和用户交互
code复制检测引擎 → 后端服务 → 前端界面
2.2 技术栈选择
2.2.1 检测模型选择
选择YOLOv8作为基础模型主要基于以下考虑:
- 实时性:YOLO系列以速度快著称,适合实时检测场景
- 准确性:v8版本在保持速度优势的同时提升了检测精度
- 易用性:Ultralytics提供了完善的API和文档支持
- 社区生态:丰富的预训练模型和改进方案
2.2.2 前后端技术
后端:
- Python + FastAPI:轻量高效的API服务框架
- Redis:缓存检测结果,提高响应速度
- PostgreSQL:存储历史检测数据
前端:
- Streamlit:快速构建数据可视化界面
- OpenLayers:地图展示检测结果
- ECharts:数据统计图表展示
3. 数据集构建与处理
3.1 数据集概况
我们构建了专门针对街头摊贩场景的数据集"street vendors",包含3000张高质量标注图像,涵盖三类主要摊贩:
- 食品车(food cart):移动餐饮设施,色彩鲜艳
- 小亭(kiosk):固定摊位,常见于繁忙街道
- 流动商店(shop on wheels):灵活移动的摊贩


3.2 数据增强策略
为提高模型鲁棒性,我们实现了多种数据增强方法:
python复制class Mosaic(BaseMixTransform):
"""马赛克增强,将4或9张图像组合成马赛克"""
def __init__(self, dataset, imgsz=640, p=1.0, n=4):
super().__init__(dataset=dataset, p=p)
self.imgsz = imgsz
self.border = (-imgsz//2, -imgsz//2)
self.n = n
def _mosaic4(self, labels):
"""创建2x2图像马赛克"""
s = self.imgsz
yc, xc = (int(random.uniform(-x, 2*s+x)) for x in self.border)
img4 = np.full((s*2, s*2, 3), 114, dtype=np.uint8)
# 拼接4张图像...
return img4
其他增强方法包括:
- 随机透视变换(RandomPerspective)
- 色彩空间调整(RandomHSV)
- 随机翻转(RandomFlip)
- 复制粘贴增强(CopyPaste)
4. 模型训练与优化
4.1 基础模型配置
使用YOLOv8n作为基础模型,主要参数配置:
yaml复制# yolov8n.yaml
nc: 3 # 类别数
depth: 0.33 # 模型深度
width: 0.25 # 通道宽度
anchors: 3 # 每个尺度的锚框数量
4.2 改进点与创新
我们在基础模型上实现了70+改进点,主要包括:
- 任务对齐分配器(TaskAlignedAssigner):
python复制class TaskAlignedAssigner(nn.Module):
def __init__(self, topk=13, num_classes=3, alpha=1.0, beta=6.0):
super().__init__()
self.topk = topk
self.num_classes = num_classes
self.alpha = alpha # 分类权重
self.beta = beta # 定位权重
- 自适应特征融合:动态调整不同尺度特征的贡献度
- 小目标检测增强:在高分辨率特征图上增加检测头
- 轻量化设计:使用Ghost模块减少计算量
4.3 训练过程监控
使用DVCLive进行训练过程可视化:
python复制def on_fit_epoch_end(trainer):
"""记录每个epoch的指标"""
if live:
metrics = {**trainer.label_loss_items(trainer.tloss, prefix='train'),
**trainer.metrics, **trainer.lr}
for metric, value in metrics.items():
live.log_metric(metric, value)
关键训练参数:
- 初始学习率:0.01
- 优化器:SGD with momentum=0.937
- Batch size:16
- 训练周期:100
- 输入尺寸:640x640
5. 系统部署与使用
5.1 环境准备
系统要求:
- Python 3.8+
- CUDA 11.3+(GPU加速)
- PyTorch 1.12+
安装依赖:
bash复制pip install ultralytics streamlit opencv-python
5.2 一键训练脚本
python复制from ultralytics import YOLO
# 加载模型
model = YOLO('yolov8n.yaml').load('yolov8n.pt')
# 训练模型
results = model.train(
data='street_vendors.yaml',
epochs=100,
imgsz=640,
batch=16,
device='0' # 使用GPU 0
)
5.3 Web界面启动
使用Streamlit构建的Web界面可通过以下命令启动:
python复制import subprocess
def run_web():
subprocess.run(['streamlit', 'run', 'web.py'])
6. 实际应用效果
系统在测试集上的表现:
| 类别 | 精确率 | 召回率 | mAP@0.5 |
|---|---|---|---|
| 食品车 | 0.92 | 0.89 | 0.91 |
| 小亭 | 0.88 | 0.85 | 0.87 |
| 流动商店 | 0.85 | 0.82 | 0.84 |


7. 常见问题与解决方案
7.1 检测漏检问题
现象:小尺寸摊贩检测效果不佳
解决方案:
- 增加高分辨率检测头
- 在数据集中补充更多小目标样本
- 调整anchor大小匹配小目标
7.2 类别混淆问题
现象:食品车与流动商店容易混淆
改进措施:
python复制# 在损失函数中增加类别权重
loss_fn = nn.CrossEntropyLoss(weight=torch.tensor([1.0, 1.0, 1.2]))
7.3 部署性能优化
技巧:
- 使用TensorRT加速推理
- 实现多线程视频流处理
- 采用模型量化技术减小模型体积
8. 项目扩展方向
- 多模态检测:结合红外图像提高夜间检测能力
- 行为分析:识别摊贩违规行为(占道经营等)
- 移动端部署:开发Android/iOS应用便于现场执法
- 数据大屏:构建城市级摊贩分布热力图
在实际部署中,我们发现模型的鲁棒性对光照变化特别敏感。通过增加随机亮度调整的数据增强方法,系统在低光照条件下的检测准确率提升了约15%。另外,将NMS阈值从0.45调整到0.5,有效减少了相邻摊贩的误合并情况。
