去年我在参与一个智慧园区项目时,遇到了一个棘手的问题:需要实时监控园区内车辆和行人的流动情况。传统方案要么准确率不足,要么延迟太高。经过多次技术选型,最终基于YOLOv8构建的检测系统完美解决了这个问题。今天我就把这个经过实战检验的方案完整分享给大家。
这个系统最突出的特点是:
推荐使用Anaconda创建隔离的Python环境:
bash复制conda create -n yolov8 python=3.9 -y
conda activate yolov8
pip install torch torchvision torchaudio
pip install ultralytics opencv-python pyqt5
注意:如果使用GPU加速,需要安装对应版本的CUDA和cuDNN。建议使用PyTorch官方提供的预编译版本。
我们的数据集包含5607张标注图像,主要来自三个渠道:
数据集特点:
数据集目录结构:
code复制dataset/
├── images/
│ ├── train/ # 4485张
│ └── val/ # 1122张
└── labels/
├── train/
└── val/
使用YOLOv8s预训练模型进行迁移学习:
python复制from ultralytics import YOLO
model = YOLO('yolov8s.pt') # 加载预训练模型
results = model.train(
data='data.yaml',
epochs=300,
batch=64,
imgsz=640,
device='0', # 使用GPU
workers=8,
optimizer='AdamW',
lr0=0.001,
)
关键训练参数说明:
imgsz=640:输入图像缩放尺寸optimizer='AdamW':使用AdamW优化器cos_lr=True:启用余弦学习率调度fliplr=0.5:水平翻转增强概率我们在训练中采用了多阶段增强方案:
yaml复制augmentations:
- hsv_h: 0.015 # 色相增强
- hsv_s: 0.7 # 饱和度增强
- hsv_v: 0.4 # 明度增强
- translate: 0.1 # 平移
- scale: 0.5 # 缩放
在验证集上的表现:
| 指标 | 行人(mAP@0.5) | 车辆(mAP@0.5) | 综合 |
|---|---|---|---|
| 精确率 | 89.2% | 92.7% | 91.0% |
| 召回率 | 86.5% | 90.3% | 88.4% |
| 推理速度 | 45 FPS | 45 FPS | 45 FPS |
实测发现,夜间场景的检测准确率比白天低约5-8%,这是后续需要重点优化的方向。
整个系统采用模块化设计:
code复制src/
├── core/ # 核心检测逻辑
│ ├── detector.py # YOLOv8封装
│ └── utils.py # 工具函数
├── ui/ # 界面相关
│ ├── main.ui # Qt Designer文件
│ └── ui_main.py # 生成界面代码
└── app.py # 主程序入口
detector.py的关键实现:
python复制class YOLODetector:
def __init__(self, model_path):
self.model = YOLO(model_path)
self.class_names = ['person', 'car']
def detect(self, img, conf_thres=0.25, iou_thres=0.45):
"""执行目标检测"""
results = self.model.predict(
source=img,
conf=conf_thres,
iou=iou_thres,
classes=[0, 2], # 只检测行人和车辆
verbose=False
)
# 解析检测结果
detections = []
for result in results:
for box in result.boxes:
x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
conf = float(box.conf[0])
cls = int(box.cls[0])
detections.append({
'class': self.class_names[cls],
'confidence': conf,
'bbox': [x1, y1, x2, y2]
})
return detections, results[0].plot()
为提高实时性,我们采用生产者-消费者模式:
python复制from queue import Queue
from threading import Thread
class VideoProcessor:
def __init__(self):
self.frame_queue = Queue(maxsize=30)
self.result_queue = Queue(maxsize=30)
def start(self):
self.producer_thread = Thread(target=self._produce)
self.consumer_thread = Thread(target=self._consume)
self.producer_thread.start()
self.consumer_thread.start()
def _produce(self):
while self.running:
ret, frame = self.cap.read()
if ret:
self.frame_queue.put(frame)
def _consume(self):
while self.running:
frame = self.frame_queue.get()
results = self.detector.detect(frame)
self.result_queue.put(results)
使用PyQt5实现的主要功能:
界面布局采用左右分栏设计:
摄像头检测的核心流程:
python复制def start_camera(self):
self.cap = cv2.VideoCapture(0) # 打开默认摄像头
self.timer = QTimer()
self.timer.timeout.connect(self.update_frame)
self.timer.start(30) # 30ms间隔
def update_frame(self):
ret, frame = self.cap.read()
if ret:
# 转换颜色空间
rgb_img = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 执行检测
conf = self.conf_slider.value() / 100
iou = self.iou_slider.value() / 100
results = self.detector.detect(rgb_img, conf, iou)
# 显示结果
self.display_image(results[1], self.result_label)
为适配边缘设备,我们尝试了多种优化方案:
优化前后对比:
| 方案 | 模型大小 | 推理速度 | mAP@0.5 |
|---|---|---|---|
| 原始模型 | 22MB | 45FPS | 91.0% |
| 剪枝+量化 | 6.8MB | 68FPS | 89.3% |
| TensorRT | 15MB | 120FPS | 90.8% |
漏检问题:
误检问题:
性能瓶颈:
augment=True参数更接近真实表现在实际部署中,我们还尝试了以下增强方案:
多摄像头协同:
行为分析扩展:
云端部署方案:
这个项目最让我惊喜的是YOLOv8在小目标检测上的提升。相比之前的v5版本,在同样数据条件下mAP提升了约15%。特别是在处理遮挡目标时,v8的检测连续性明显更好。建议大家在训练时可以尝试不同的模型尺寸(n/s/m/l/x),根据实际硬件条件选择最适合的版本。