AI YOLOv8 深度学习驱动 · 头盔检测 + 车辆识别 + 标注输出
🔒 上传视频文件 · 支持 MP4 / AVI / MOV 格式
🪖

头盔检测

佩戴 / 未佩戴识别

🏍️

车辆识别

自行车 / 摩托 / 汽车

📹

标注输出

带框视频 + JSON报告

上传视频,开始检测

上传一段交通监控视频
AI 自动检测头盔佩戴情况与车辆类型,输出带标注框的结果视频

TECHNICAL DOCUMENTATION

系统架构 | AI 模型 | 核心代码

电动车头盔佩戴检测系统 · 完整技术解析

技术文档目录

1. 系统架构 2. AI 模型详解 3. 检测处理流程 4. 核心代码模块 5. 数据统计与数据库 6. 技术亮点 7. 技术栈与依赖 8. 部署架构

1. 系统架构

┌──────────────────────────────────────────────────────────────┐ │ 用户浏览器 (Browser) │ │ 上传视频 / 查看结果 / 历史统计 │ └────────────────────────┬─────────────────────────────────────┘ │ HTTPS (nginx proxy) ▼ ┌──────────────────────────────────────────────────────────────┐ │ Flask Web Server (app.py :5090) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────────┐ │ │ │ /upload │ │ /status │ │ /result │ │ /api/stats │ │ │ │ 上传视频 │ │ 处理进度 │ │ 下载结果 │ │ 统计数据 │ │ │ └────┬─────┘ └──────────┘ └──────────┘ └──────┬───────┘ │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ 后台视频处理线程 │ │ │ │ │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ │ │ YOLOv8 │ │ DeepSORT │ │PaddleOCR │ │ │ │ │ │ 头盔检测 │──▶│ 目标追踪 │──▶│ 车牌识别 │ │ │ │ │ │ 车辆分类 │ │ 流量计数 │ │ │ │ │ │ │ └──────────┘ └──────────┘ └──────────┘ │ │ │ │ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ │ │ ┌──────────────────────────────────────────────┐ │ │ │ │ │ 标注视频 + 违规截图 + 统计数据 + SQLite 存储 │ │ │ │ │ └──────────────────────────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────┘

纯软件 AI 视觉系统,无硬件传感器依赖。YOLOv8 + PaddleOCR + DeepSORT 三模型协同工作,实现从目标检测到违规取证的全流程自动化。

2. AI 模型详解

YOLOv8n — 头盔佩戴检测 + 车辆分类

使用 ultralytics YOLOv8n 预训练模型(iam-tsr/yolov8n-helmet-detection),检测类别包括:佩戴头盔(rider+helmet)、未戴头盔(no_helmet)、电动自行车(ebike)、自行车(bicycle)、摩托车(motorcycle)、汽车(car)、巴士(bus)、卡车(truck)

模型YOLOv8n (nano)输入尺寸640×640
推理设备CPU置信度阈值0.65 (头盔) / 0.35 (车辆)
检测间隔每 5 帧检测一次后处理大面积误检过滤 (>25%画面)

PaddleOCR — 中文车牌识别

百度 PaddleOCR 框架,语言设置为中文(ch),启用角度分类检测。对检测到的车牌区域进行 OCR 识别,输出车牌号码文本。未安装时自动降级,不影响头盔检测核心功能。

DeepSORT + IOU 追踪 — 目标跨帧追踪与流量统计

DeepSORT 多目标追踪器 + IOU 匹配回退方案。设置水平计数线(画面50%位置),判断目标穿越方向(上行/下行),累加各类型车辆的流量计数。追踪器参数:max_age=30帧(目标消失30帧后移除),n_init=3帧(连续3帧确认新目标)。

3. 检测处理流程

用户上传视频 (mp4/avi/mov, 最大200MB) │ ▼ ┌─ 后台线程启动 ──────────────────────────────────────┐ │ │ │ OpenCV 逐帧读取 (cv2.VideoCapture) │ │ │ │ │ ▼ (每5帧检测一次) │ │ ┌──────────────────────┐ │ │ │ 1. YOLOv8 目标检测 │ │ │ │ · 头盔佩戴/未佩戴 │ │ │ │ · 车辆类型分类 │ │ │ └────────┬─────────────┘ │ │ ▼ │ │ ┌──────────────────────┐ │ │ │ 2. DeepSORT 目标追踪 │ │ │ │ · 跨帧关联目标ID │ │ │ │ · 计数值穿越方向 │ │ │ │ · 去重统计 │ │ │ └────────┬─────────────┘ │ │ ▼ │ │ ┌──────────────────────┐ │ │ │ 3. PaddleOCR 车牌识别 │ │ │ │ · 裁剪车牌区域 │ │ │ │ · 中文字符识别 │ │ │ └────────┬─────────────┘ │ │ ▼ │ │ ┌──────────────────────┐ │ │ │ 4. 结果输出 │ │ │ │ · cv2 绘制检测框+标签 │ │ │ │ · 每30帧截取违规截图 │ │ │ │ · 写入输出视频 (mp4v) │ │ │ │ · SQLite 保存违规记录 │ │ │ └──────────────────────┘ │ │ │ └─────────────────────────────────────────────────────┘ │ ▼ 处理完成 → 前端展示:标注视频 + 违规截图 + 统计数据

4. 核心代码模块

HelmetDetector — YOLOv8 头盔检测

class HelmetDetector: """头盔检测器 - YOLOv8n""" def __init__(self): self.model = YOLO("models/helmet_detection.pt") self.confidence = 0.65 def detect(self, frame): # 推理 + 后处理:过滤大面积误检 (>25%画面) results = self.model(frame, conf=self.confidence, imgsz=640, device='cpu') detections = [] for box in results[0].boxes: bbox_ratio = area(box) / frame_area if bbox_ratio > 0.25: continue # 跳过大框误检 detections.append({ "bbox": xyxy, "confidence": conf, "class_name": cls_name }) return detections

TrafficTracker — 目标追踪 + 流量计数

class TrafficTracker: def __init__(self, frame_w, frame_h): # 计数线:画面中间偏下位置 self.counting_line_y = int(frame_h * 0.5) self.tracked_objects = {} # track_id → {info} self.counted_ids = set() # 已计数目标(去重) self.up_count = 0 # 上行流量 self.down_count = 0 # 下行流量 self.helmet_count = 0 self.no_helmet_count = 0 def update(self, detections): # IOU 匹配 → 更新追踪状态 → 判断穿越计数线 for det in detections: if track crossed counting_line_y: if direction == "up": up_count += 1 else: down_count += 1

process_video_job — 视频处理主循环

def process_video_job(job_id, input_path, output_dir, conf): cap = cv2.VideoCapture(input_path) total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) out = cv2.VideoWriter(output_path, fourcc, fps, (w, h)) while True: ret, frame = cap.read() if not ret: break if frame_idx % 5 == 0: # 每5帧检测 hdets = helmet_detector.detect(frame) vdets = vehicle_detector.detect(frame) tracks = tracker.update(hdets + vdets) # OCR 车牌(如有车牌检测结果) plates = plate_ocr.recognize(frame) # 绘制检测框、标签、计数线 frame = draw_detections(frame, tracks, colors) out.write(frame) cap.release(); out.release() # 保存统计数据到 SQLite save_violation(job_id, stats)

5. 数据统计与数据库

SQLite 数据库

轻量级本地数据库,存储每日违规记录、交通流量统计。表结构包括:violations(违规事件)、daily_traffic(每日流量)、weekly_stats(周统计)。

统计维度

  • 今日违规数 / 今日总流量
  • 头盔佩戴率 (helmet / total)
  • 车辆类型分布(自行车/摩托/汽车/巴士/卡车)
  • 上行 / 下行方向流量
  • 最近违规列表(时间+截图+车牌)
  • 周流量趋势统计

API 接口

GET /api/stats/today今日统计
GET /api/stats/weekly周统计
GET /api/violations违规列表
GET /history历史记录页

6. 技术亮点

三模型协同

YOLOv8(检测) → DeepSORT(追踪) → PaddleOCR(车牌识别) 串行流水线,各模型独立加载、独立推理,支持按需禁用。

大框误检过滤

检测到边界框面积超过画面25%时自动过滤——防止安全帽/头盔装饰被误识别为骑行者头盔。

流量计数线

画面水平计数线 + 目标穿越方向判断(上行/下行),已计数目标自动去重,支持交通流量统计分析。

5帧间隔检测

每5帧执行一次YOLOv8推理(非逐帧检测),大幅降低CPU负载;中间帧复用最近一次检测结果 + 追踪器插值。

OCR 可选降级

PaddleOCR 未安装时自动跳过车牌识别功能,头盔检测和车辆分类不受影响,核心功能完整可用。

异步视频处理

视频上传后由后台线程异步处理,前端轮询 /api/status 获取实时进度,不阻塞 Web 服务器响应。

7. 技术栈与依赖

类别技术版本/说明
目标检测YOLOv8nultralytics >=8.2.0, iam-tsr/yolov8n-helmet-detection
OCRPaddleOCR>=2.8.0, 中文语言包, 角度分类
目标追踪DeepSORT + IOUdeep-sort-realtime >=1.3.2
深度学习框架PyTorch>=2.2.0 (CPU 推理)
图像处理OpenCV>=4.9.0, 视频编解码 + 标注绘制
Web 框架Flask>=3.0, Jinja2 模板引擎
数据库SQLite本地文件数据库, 零配置
部署Ubuntu 22.04 + systemd + nginxHTTPS 反向代理, Let's Encrypt 证书

8. 部署架构

用户 Chrome/Edge │ ▼ https://cdqtech.online/helmet/ │ ▼ ┌─────────────────────────────────────────┐ │ nginx (124.221.224.40:443) │ │ Let's Encrypt SSL │ │ location /helmet/ { │ │ proxy_pass http://127.0.0.1:5090/; │ │ } │ │ location /helmet/static/ { │ │ alias /opt/helmet-detection/static/;│ │ } │ └────────────┬────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────┐ │ systemd: helmet-detect.service │ │ WorkingDirectory=/opt/helmet-detection │ │ ExecStart=venv/bin/python3 app.py │ │ Port: 5090 │ └─────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────┐ │ /opt/helmet-detection/ │ │ ├── app.py Flask 主程序 │ │ ├── detector.py YOLOv8 检测器 │ │ ├── tracker.py DeepSORT 追踪器 │ │ ├── ocr_reader.py PaddleOCR 识别器 │ │ ├── database.py SQLite 数据层 │ │ ├── config.py 全局配置 │ │ ├── models/ 模型权重文件 │ │ ├── data/ SQLite + 输出文件 │ │ ├── templates/ 前端模板 │ │ └── venv/ Python 虚拟环境 │ └─────────────────────────────────────────┘

服务通过 systemd 管理:sudo systemctl restart helmet-detect 重启服务,崩溃自动拉起(Restart=always, RestartSec=3s)。nginx 提供 HTTPS 反向代理,静态文件(CSS/JS/截图)由 nginx 直接 serve,视频/API 请求代理到 Flask。