一、 项目背景在AI视觉应用落地的过程中实时目标检测与可视化一直是高频需求。无论是课堂学生行为分析、工厂安防监控还是零售门店客流统计都需要一套低延迟、易部署、可扩展的视频检测方案。本文将分享一个完整的实战项目 —— 基于YOLOv8与FastAPI构建的智能视频检测系统支持实时检测、统计面板、Excel自动记录、视频录制并最终打包成单个exe文件方便分发给非技术用户使用。二、 技术栈模块技术选型深度学习检测YOLOv8 (ultralytics)Web 后端框架FastAPI Uvicorn实时通信WebSocket前端展示HTML/CSS/JS (原生)数据存储OpenPyXL (Excel)视频处理OpenCV打包工具PyInstaller其他Asyncio, Threading三、️ 系统架构整个系统分为四层采集层通过OpenCV读取本地摄像头或RTSP流。推理层YOLOv8模型对每一帧进行目标检测返回标注图像与类别统计。服务层FastAPI提供REST接口启动/停止/切换模型与WebSocket推送后台异步任务持续处理视频流。展示层浏览器接收WebSocket推送的JPEG图像更新统计面板四、 核心实现关键代码片段1. 摄像头采集类为了提高在不同电脑上的兼容性采集模块会依次尝试打开索引0、1、2的摄像头直到成功读取到一帧为止。同时使用cv2.CAP_DSHOW后端仅Windows可显著减少打开延迟和权限错误。如果连续10次读取帧失败系统会自动停止检测并向前端推送错误提示。import cv2 class Camera: def __init__(self, source0): self.source source self.cap None self.is_opened False def open(self): # 尝试多个摄像头索引解决不同电脑索引不一致问题 sources_to_try [0, 1, 2] if self.source 0 else [self.source] for src in sources_to_try: cap cv2.VideoCapture(src, cv2.CAP_DSHOW) if cap.isOpened(): ret, frame cap.read() if ret and frame is not None: self.cap cap self.is_opened True print(f✓ 成功打开摄像头索引 {src}) return True cap.release() return False2. YOLOv8检测器封装封装了YOLODetector类初始化时加载模型文件。每帧调用detect方法内部使用results[0].plot()直接获得带有彩色框和置信度标签的BGR图像同时统计各类别的数量利用collections.Counter。置信度阈值默认为0.8可在参数中调整。from ultralytics import YOLO from collections import Counter class YOLODetector: def __init__(self, model_path, conf_threshold0.8): self.model YOLO(model_path) self.conf_threshold conf_threshold def detect(self, frame): results self.model(frame, confself.conf_threshold) if results[0].boxes is not None: cls_ids results[0].boxes.cls.cpu().numpy().astype(int) class_names [results[0].names[id] for id in cls_ids] stats dict(Counter(class_names)) else: stats {} annotated_frame results[0].plot() return annotated_frame, stats3. WebSocket实时推送在后端系统中通常会维护一个专门的ConnectionManager类来统一管理所有活跃的WebSocket连接。from fastapi import WebSocket from typing import Set class ConnectionManager: def __init__(self): self.active_connections: Set[WebSocket] set() async def broadcast(self, message: str): for conn in self.active_connections.copy(): try: await conn.send_text(message) except: self.active_connections.discard(conn)4、Excel与视频录制Excel记录独立的后台协程log_stats_periodically每秒唤醒一次读取当前最新统计结果动态检测是否有新类别出现如有则插入新列然后追加一行时间戳与各数量保存文件。视频录制在视频处理循环中如果当前处于检测状态且标注帧有效则初始化VideoWriterMP4V编码30fps将每一帧写入文件。停止识别时自动release()并保存文件。async def log_stats_periodically(): while is_running: await asyncio.sleep(1) stats latest_stats.copy() if not stats: continue wb load_workbook(excel_file_path) ws wb.active # 动态添加新类别列 for cat in stats: if cat not in existing_categories: ws.cell(row1, columnws.max_column1, valuecat) row [datetime.now().strftime(%Y-%m-%d %H:%M:%S)] row.extend(stats.get(cat, 0) for cat in headers[1:]) ws.append(row) wb.save(excel_file_path)五、️ 运行效果展示六、 总结本文详细介绍了一个基于YOLOv8FastAPIWebSocket的实时视频检测系统的设计与实现。通过异步架构、WebSocket推送和自动持久化系统兼具实时性、稳定性和易用性。最终打包成单文件exe使得非技术用户也能一键部署使用。希望这个项目能为你的AI视觉应用带来启发。如需完整源码或遇到任何问题欢迎留言交流