ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于YOLOv8的车流检测系统实战:从模型训练到多端部署

基于YOLOv8的车流检测系统实战:从模型训练到多端部署 简介这是一套基于YOLOv8实现的多端车流检测系统完整工程资源面向计算机、人工智能、自动化等专业的在校学生、教师及初级开发者适用于课程设计、毕业设计、项目演示与算法落地实践。资源包含396个文件涵盖150个核心Python源码含模型训练、推理、Web/桌面端部署模块、34个YOLOv8配置yaml文件、40张测试图像与23张标注示例图、数据库SQL脚本、环境配置文件.env、UI界面资源.ui/.qrc及多个实测MP4演示视频整体压缩包仅16.94MB结构清晰、模块解耦。已有428人下载学习所有代码均通过本地环境实测运行成功答辩评审平均分达96分配套提供详细安装说明、README文档及多场景测试视频含报警触发、默认识别、测试图像推断等便于快速复现与二次开发。1. 项目概述一个拿来即用的车流检测实战方案最近在整理过往的项目资料翻到了去年为一个智慧交通概念验证项目做的车流检测系统。当时的需求很明确需要一个能快速部署、在多种设备上都能跑起来并且结果要直观可视化的车流计数工具。市面上虽然有不少开源方案但要么部署复杂要么功能单一很难满足“多端运行”和“开箱即用”的要求。于是我基于当时最新的YOLOv8整合了一套从数据标注、模型训练到前后端部署的完整系统。今天就把这个项目的核心源码、文档和所有踩过的坑系统地分享出来。这个“基于YOLOv8的多端车流检测系统”顾名思义核心就是用YOLOv8模型来识别和统计视频中的车辆。它的价值在于“多端”我不仅提供了在Windows/Linux服务器上运行的完整Python后端和Web前端还考虑了模型在边缘设备比如带GPU的工控机甚至通过一些优化尝试在安卓设备上部署的可能性。整个项目包你拿到手后按照详细的安装说明最快十几分钟就能在自己的电脑上跑起来看到实时的车流检测效果。无论你是想学习YOLOv8的实际应用还是需要一个车流分析的基础框架进行二次开发这个项目都能提供一个坚实的起点。2. 系统核心设计与技术选型考量2.1 为什么是YOLOv8在目标检测领域框架选择很多。两年前可能还会在YOLOv5、PP-YOLO之间纠结但到了这个项目启动时YOLOv8已经展现出了足够的优势。它并非官方续作而是Ultralytics公司基于此前YOLO系列经验重新构建的在精度和速度上取得了更好的平衡。对于车流检测这个具体场景我选择YOLOv8主要基于以下几点实战考量精度与速度的平衡车流检测通常需要处理实时视频流对速度要求高。YOLOv8提供的n、s、m、l、x不同尺寸的模型让我可以根据硬件条件灵活选择。在项目初期验证阶段我用YOLOv8s就能在GTX 1660 Ti上达到超过60 FPS的处理速度完全满足实时性要求。极其友好的开发体验Ultralytics提供的API设计非常简洁。训练自己的数据集从数据准备到模型导出往往只需要寥寥十几行代码。这对于需要快速迭代的原型项目来说极大地降低了开发门槛。完善的生态与部署支持YOLOv8支持导出为ONNX、TensorRT、OpenVINO等多种格式这为后续的“多端”部署铺平了道路。无论是想用Python推理还是想部署到C环境或边缘AI加速卡上都有成熟的路径。注意虽然YOLOv8很强但也要正视其“黑盒”性。相比一些学术框架其内部改动和实现细节文档相对较少。如果你需要做非常底层的模型修改可能会遇到一些挑战。2.2 “多端”系统架构解析“多端”并不意味着一个应用能在所有平台原生运行而是指核心的检测能力可以通过不同的技术路径部署到多种计算环境中。本系统的架构可以拆解为三个层次核心检测引擎YOLOv8 Model这是系统的“大脑”。我们使用PyTorch训练好的.pt权重文件它可以在安装有PyTorch的Python环境中直接运行。同时为了追求极致的性能特别是在边缘设备上我们提供了将模型导出为ONNX格式的脚本和说明。ONNX模型可以被TensorRT、OpenVINO等推理引擎加速也能被C、C#等语言调用这是实现多端部署的关键。业务逻辑与数据层Python Backend SQLite这是系统的“躯干”。我使用Flask搭建了一个轻量级的RESTful API后端。它的主要职责是接收前端上传的视频或调用摄像头调用YOLOv8引擎进行逐帧分析对检测结果进行后处理如车流量计数、车辆轨迹平滑将统计结果如时间、车道、车流量、平均速度存入SQLite数据库。选择SQLite是因为它无需单独安装数据库服务单文件管理非常适合这种中小型、单机部署的应用。交互展示层Web Frontend这是系统的“面孔”。一个基于HTML5、JavaScript和Chart.js构建的简单Web界面。它提供视频上传/摄像头选择按钮通过WebSocket或HTTP轮询与后端通信实时显示检测视频流将检测框和标签叠加回原视频并在侧边栏动态更新车流量统计图表。这种B/S架构使得任何有浏览器的设备PC、平板、手机都能成为监控客户端。技术栈选型总结深度学习框架PyTorch Ultralytics YOLOv8后端框架Flask轻量异步支持好适合快速开发API前端技术HTML5, JavaScript, Chart.js, WebSocket数据库SQLite也可通过配置轻松切换为MySQL部署格式PyTorch (.pt), ONNX (.onnx)这个架构的优势在于解耦清晰。你可以只使用核心检测引擎也可以将Flask后端替换为FastAPI或Django甚至可以把训练好的ONNX模型单独拿出来集成到你的C桌面程序或安卓APP中需配合NCNN、MNN等移动端推理框架真正实现“多端”。3. 从零开始环境配置与详细安装指南拿到源码后第一步就是搭建环境。我提供的requirements.txt和安装说明已经尽可能简化了流程但有些细节还是值得展开说说能帮你避开不少坑。3.1 Python环境与核心依赖安装强烈建议使用Anaconda或Miniconda来创建独立的Python环境避免与系统其他Python包冲突。# 1. 创建并激活一个名为traffic_det的Python 3.8环境3.9/3.10也兼容 conda create -n traffic_det python3.8 conda activate traffic_det # 2. 安装PyTorch这是最易出错的一步 # 先去PyTorch官网https://pytorch.org/get-started/locally/根据你的CUDA版本选择命令。 # 例如如果你有CUDA 11.7则安装命令可能如下 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117 # 如果没有NVIDIA GPU则安装CPU版本 # pip install torch torchvision torchaudio # 3. 安装Ultralytics YOLOv8 pip install ultralytics # 4. 进入项目目录安装其余依赖 cd /path/to/your/project pip install -r requirements.txtrequirements.txt里除了Flask、OpenCV-Python、NumPy等常见库还有两个需要特别关注的onnx和onnxruntime或onnxruntime-gpu用于模型的导出和ONNX格式的推理。如果你想用GPU加速ONNX推理务必安装onnxruntime-gpu并确保其版本与你的CUDA版本匹配。sqlalchemyPython的ORM工具用于更优雅地操作SQLite数据库。实操心得安装PyTorch时最稳妥的方法是先通过nvidia-smi查看自己的CUDA版本然后去PyTorch官网复制对应的安装命令。直接pip install torch可能会安装不匹配的CPU版本或旧版本导致后续无法利用GPU。3.2 数据库初始化与配置本项目使用SQLite无需安装但需要初始化数据库表结构。# 通常在项目根目录下运行初始化脚本 python init_database.py这个脚本会创建一个traffic.db文件并建立至少两张核心表detection_log存储每一帧或每隔一段时间如每秒的检测结果快照包含时间戳、车辆类型car, truck, bus等、边界框坐标、置信度等。这张表用于回溯详细数据。traffic_statistics存储聚合后的统计数据如每分钟/每小时的车流量、各车型占比、平均置信度等。这张表用于前端图表展示和历史查询。如果数据量预期很大或者需要多机访问你可以很容易地修改配置将数据库连接字符串从sqlite:///traffic.db改为MySQL或PostgreSQL的连接串。在config.py或app.py的顶部可以找到数据库配置项。3.3 模型准备使用预训练权重与自定义训练项目包里已经包含了一个在混合车辆数据集上微调过的yolov8s_traffic.pt模型你可以直接使用。但如果你有自己的路口视频想获得更精准的效果就需要训练自己的模型。步骤1数据准备与标注这是最耗时但最关键的一步。你需要收集包含各种车辆、不同天气、光照和角度的路口图片或视频帧。使用标注工具如labelImg、CVAT或Ultralytics自家的YOLO Label进行标注。确保标注格式为YOLO格式每个图片对应一个.txt文件内容为class_id x_center y_center width_height坐标是归一化后的值。按以下结构组织数据集dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/创建一个data.yaml配置文件指明路径和类别path: /absolute/path/to/dataset train: images/train val: images/val nc: 5 # 类别数例如0: car, 1: truck, 2: bus, 3: motorcycle, 4: person names: [car, truck, bus, motorcycle, person]步骤2模型训练使用Ultralytics提供的命令行工具或Python API进行训练非常简单from ultralytics import YOLO # 加载一个预训练模型作为起点 model YOLO(yolov8s.pt) # 开始训练 results model.train( datapath/to/your/data.yaml, epochs100, imgsz640, batch16, device0, # 使用GPU 0如果是CPU则设为cpu projecttraffic_train, nameexp1 )训练过程会在traffic_train/exp1目录下生成权重文件和日志。关键是要关注results.csv和生成的损失曲线图判断模型是否收敛。注意事项训练时batch size的设置受显卡内存限制。我的GTX 1660 Ti6GB显存在imgsz640时batch size最多设为8-10。如果出现CUDA out of memory错误首先尝试减小batch size其次可以减小imgsz如到512但这可能会影响检测小目标的精度。步骤3模型验证与导出训练完成后使用验证集评估模型性能yolo val modelpath/to/best.pt datapath/to/data.yaml查看mAP50、mAP50-95等指标。如果效果满意将其导出为ONNX格式以便后续多端部署from ultralytics import YOLO model YOLO(path/to/best.pt) model.export(formatonnx, imgsz[640, 640], simplifyTrue)simplifyTrue会应用ONNX Simplifier优化模型结构有时能减少节点并提升推理速度。4. 系统核心模块深度剖析与实操4.1 视频流处理与检测推理引擎这是系统的性能核心。直接使用OpenCV的VideoCapture读取视频流或摄像头然后循环读取每一帧送入模型。import cv2 from ultralytics import YOLO class TrafficDetector: def __init__(self, model_pathweights/yolov8s_traffic.pt, use_onnxFalse): self.use_onnx use_onnx if use_onnx: # 使用ONNX Runtime进行推理 import onnxruntime as ort self.session ort.InferenceSession(model_path) self.input_name self.session.get_inputs()[0].name else: # 使用原生YOLOv8 PyTorch模型 self.model YOLO(model_path) self.class_names [car, truck, ...] # 你的类别名 def process_frame(self, frame): 处理单帧图像 if self.use_onnx: # ONNX推理流程 # 1. 预处理调整大小、归一化、转换通道顺序 (HWC to NCHW) input_tensor self.preprocess_for_onnx(frame) # 2. 推理 outputs self.session.run(None, {self.input_name: input_tensor}) # 3. 后处理解析outputs得到boxes, scores, class_ids detections self.postprocess_onnx_output(outputs, frame.shape) else: # YOLOv8原生推理 (更简单) results self.model(frame, imgsz640, verboseFalse)[0] detections [] for box in results.boxes: xyxy box.xyxy.cpu().numpy()[0] # 左上右下坐标 conf box.conf.cpu().numpy()[0] # 置信度 cls_id int(box.cls.cpu().numpy()[0]) # 类别ID detections.append((xyxy, conf, cls_id)) # 应用非极大值抑制 (NMS) 去除重叠框 (YOLOv8内部已做但ONNX输出可能需要自己做) # filtered_detections nms(detections, iou_threshold0.5) return detections def preprocess_for_onnx(self, frame): 为ONNX模型准备输入张量 # 这是一个简化的示例实际需与导出模型时的预处理严格一致 img cv2.resize(frame, (640, 640)) img img / 255.0 # 归一化 img img.transpose(2, 0, 1) # HWC to CHW img np.expand_dims(img, axis0).astype(np.float32) # 增加batch维度 return img关键优化点异步处理对于实时视频如果每一帧都等待检测结果再显示延迟会很高。我采用了生产者-消费者模式一个线程专门抓取视频帧放入队列另一个线程从队列取帧进行检测检测完再放入结果队列供显示线程使用。跳帧检测对于非关键实时场景可以每N帧检测一次中间帧沿用上一帧的结果或进行跟踪能大幅提升整体吞吐量。ROI感兴趣区域设置只检测道路区域忽略天空、建筑等无关部分可以减少计算量提升速度。4.2 车流计数与轨迹追踪逻辑单纯的检测框还不够我们需要知道车辆是进入还是离开以及它们的轨迹。这里实现了一个简单的基于“虚拟检测线”的计数方法。定义检测线在视频画面中道路的某个断面画一条虚拟的线例如一条水平线y line_y。跟踪与匹配使用一个简单的跟踪器如基于IOU的卡尔曼滤波跟踪或使用ByteTrack等轻量级跟踪算法。为每一帧中的每个检测框分配一个唯一的ID。判断穿越记录每个ID的车辆中心点坐标的历史轨迹。当某个ID的车辆中心点从检测线的一侧移动到另一侧时例如y坐标从 line_y变为 line_y则认为发生了一次穿越。方向判断根据穿越前后的位置可以判断是上行还是下行。class TrafficCounter: def __init__(self, line_y): self.line_y line_y # 虚拟检测线的y坐标 self.up_count 0 self.down_count 0 self.track_history {} # 存储每个track_id的历史中心点 def update(self, detections, track_ids): 根据当前帧的检测结果和跟踪ID更新计数 for det, track_id in zip(detections, track_ids): xyxy, conf, cls_id det # 计算检测框底部中心点更接近车辆与地面的接触点 center_x (xyxy[0] xyxy[2]) / 2 center_y xyxy[3] # 底部y坐标 if track_id not in self.track_history: self.track_history[track_id] [] history self.track_history[track_id] # 保存当前中心点 history.append((center_x, center_y)) # 只保留最近N个点 if len(history) 30: history.pop(0) # 判断是否穿越检测线需要至少有两个历史点 if len(history) 2: prev_y history[-2][1] curr_y history[-1][1] # 从线上方到下方 - 向下行驶 if prev_y self.line_y curr_y: self.down_count 1 print(f车辆 {track_id} 向下穿越下行计数: {self.down_count}) # 从线下方到上方 - 向上行驶 elif prev_y self.line_y curr_y: self.up_count 1 print(f车辆 {track_id} 向上穿越上行计数: {self.up_count})实操心得这种基于单条线的计数方法在车流稀疏、车辆行驶轨迹规范时很有效。但在拥堵、车辆变道频繁的路口误计数率会上升。更稳健的方法是设置一个“检测区域”一个矩形或多边形判断车辆中心点进入和离开该区域的事件。也可以引入更复杂的多目标跟踪算法来维持ID的稳定性。4.3 Flask后端API设计与数据流后端使用Flask提供几个核心API端点GET /或GET /index: 返回前端主页面。POST /api/upload_video: 接收前端上传的视频文件。GET /api/video_feed: 提供一个MJPEG视频流将检测结果实时推送到前端。GET /api/statistics: 返回近期的车流统计数据JSON格式供前端图表更新。WebSocket /ws: 用于实时传输检测数据如车辆位置、数量比HTTP轮询更高效。核心的/api/video_feed生成器实现如下from flask import Response import cv2 import time def generate_feed(): 视频流生成器函数 camera cv2.VideoCapture(0) # 或者从上传的视频文件读取 detector TrafficDetector() counter TrafficCounter(line_y300) while True: success, frame camera.read() if not success: break # 执行检测 detections detector.process_frame(frame) # 更新计数 counter.update(detections, track_ids) # track_ids需从跟踪器获取 # 在帧上绘制检测框、标签和计数 annotated_frame draw_detections(frame, detections) cv2.putText(annotated_frame, fUp: {counter.up_count} Down: {counter.down_count}, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 将帧编码为JPEG格式 ret, jpeg cv2.imencode(.jpg, annotated_frame) frame_bytes jpeg.tobytes() # 以MJPEG流格式输出 yield (b--frame\r\n bContent-Type: image/jpeg\r\n\r\n frame_bytes b\r\n\r\n) # 控制帧率避免过度消耗CPU time.sleep(0.03) # 约30 FPS app.route(/api/video_feed) def video_feed(): return Response(generate_feed(), mimetypemultipart/x-mixed-replace; boundaryframe)4.4 前端可视化与交互实现前端页面主要做三件事显示实时视频流通过一个img标签其src属性指向/api/video_feed。绘制统计图表使用Chart.js定期如每秒通过Fetch API或WebSocket从/api/statistics获取数据更新折线图或柱状图。提供控制面板包含“开始/停止检测”、“选择摄像头”、“上传视频”、“下载报告”等按钮。关键代码片段视频流显示img idvideoStream src{{ url_for(video_feed) }} alt实时视频流关键代码片段通过Fetch获取统计数据function updateChart() { fetch(/api/statistics?periodhourly) .then(response response.json()) .then(data { // 更新Chart.js图表的数据 myChart.data.labels data.timestamps; myChart.data.datasets[0].data data.counts; myChart.update(); }); setTimeout(updateChart, 1000); // 每秒更新一次 }WebSocket的实现会稍微复杂一些但能实现更低延迟的数据推送代码逻辑类似建立连接后监听服务器推送的消息即可。5. 部署实战与性能调优经验5.1 多端部署的具体路径标准服务器部署Python环境这是最简单的模式。在服务器上安装好所有Python依赖后直接运行python app.py启动Flask开发服务器。对于生产环境需要使用GunicornWSGI服务器配合Nginx进行部署以提升并发能力和安全性。# 使用Gunicorn启动假设有4个worker进程 gunicorn -w 4 -b 0.0.0.0:5000 app:app边缘设备部署ONNX 优化推理引擎NVIDIA Jetson系列将PyTorch模型导出为ONNX然后使用TensorRT进一步优化并序列化为.engine文件。TensorRT是NVIDIA官方的推理优化器能针对特定GPU进行极致优化在Jetson上可以获得数倍的性能提升。Intel CPU/核显使用OpenVINO工具套件。将ONNX模型通过OpenVINO的Model Optimizer转换为IR格式.xml和.bin然后使用OpenVINO Runtime进行推理。OpenVINO对Intel硬件有深度优化并能利用集成显卡进行AI加速。ARM安卓设备这是一条更具挑战性的路径。需要将ONNX模型转换为移动端推理框架支持的格式如NCNN、MNN或TFLite。然后编写JNI接口或使用框架提供的Java API在安卓应用中调用。这部分代码不在当前项目的主包内但我会提供转换脚本和简单的安卓Demo思路。5.2 性能瓶颈分析与调优技巧在实测中性能瓶颈通常出现在以下几个环节模型推理速度这是最大的瓶颈。优化方法模型轻量化换用更小的模型变体YOLOv8n。或者使用剪枝、量化等模型压缩技术。YOLOv8官方支持导出时进行INT8量化能显著减少模型大小并提升速度但会轻微损失精度。推理引擎优化如前所述务必使用TensorRT或OpenVINO等专用推理引擎而不是纯PyTorch。输入分辨率降低imgsz参数如从640降到320速度会成倍提升但小目标检测能力会下降。视频I/O与编解码从网络摄像头读取时设置合适的分辨率如1280x720而非1920x1080。处理视频文件时使用cv2.VideoCapture的set方法尝试设置CAP_PROP_BUFFERSIZE为一个较小的值并跳帧读取避免内存堆积。考虑使用硬件加速编解码如OpenCV的cv2.CAP_FFMPEG后端并指定硬件加速器如CUDA。Python GIL与多线程Python的多线程由于GIL的存在对CPU密集型的检测任务帮助有限。对于多路视频流分析更有效的方法是使用多进程。可以启动多个独立的检测进程每个进程处理一路视频流。或者使用asyncio 异步HTTP服务器如Uvicorn运行FastAPI配合线程池来处理阻塞的检测任务。一个简单的多进程示例架构# master.py (主进程负责调度和Web服务) from multiprocessing import Process, Queue import app # 你的Flask app def run_detector(video_source, result_queue): # 子进程运行检测逻辑 detector TrafficDetector() cap cv2.VideoCapture(video_source) while True: ret, frame cap.read() results detector.process_frame(frame) result_queue.put((video_source, results)) if __name__ __main__: sources [rtsp://cam1, rtsp://cam2, 0] # 多个视频源 queues [Queue() for _ in sources] processes [] for src, q in zip(sources, queues): p Process(targetrun_detector, args(src, q)) p.start() processes.append(p) # 启动Flask app在API中从各个queue获取结果 app.run(queuesqueues) # 需要修改app以接收queues参数5.3 数据库优化与数据管理当系统长时间运行detection_log表会变得非常庞大。需要定期清理或归档旧数据。表分区如果使用MySQL/PostgreSQL可以按时间如每天对detection_log表进行分区提升查询和删除旧数据的效率。数据汇总与清除编写一个定时任务如Linux的cron或Python的APScheduler每天凌晨将前一天的详细日志聚合后存入traffic_statistics表然后删除detection_log表中的原始数据。索引优化确保在经常查询的字段上建立索引如timestamp时间戳、vehicle_type车型。CREATE INDEX idx_detection_log_timestamp ON detection_log (timestamp); CREATE INDEX idx_detection_log_type ON detection_log (vehicle_type);6. 常见问题排查与实战避坑指南在开发和部署过程中我遇到了不少问题这里把典型的列出来方便大家快速排查。6.1 环境与依赖问题问题ImportError: libGL.so.1: cannot open shared object file原因在Linux服务器上OpenCV需要系统图形库。解决安装缺失的库。对于Ubuntu/Debiansudo apt-get install libgl1-mesa-glx。对于Alpineapk add --no-cache mesa-gl。问题运行YOLOv8时警告UserWarning: CUDA initialization: CUDA unknown error或速度极慢。原因PyTorch安装的CUDA版本与系统驱动不匹配或未找到GPU退回到了CPU模式。解决python -c import torch; print(torch.cuda.is_available())检查CUDA是否可用。print(torch.version.cuda)查看PyTorch的CUDA编译版本。nvidia-smi查看系统驱动支持的CUDA版本。确保两者版本大致兼容PyTorch的CUDA版本 ≤ 系统驱动支持的CUDA版本。如果不匹配重新安装对应版本的PyTorch。问题安装onnxruntime-gpu后推理时并未使用GPU。原因ONNX Runtime GPU版需要与CUDA/cuDNN版本严格匹配或者未正确指定执行提供器。解决import onnxruntime as ort # 检查可用的提供器 print(ort.get_available_providers()) # 创建会话时显式指定GPU session ort.InferenceSession(model.onnx, providers[CUDAExecutionProvider])6.2 模型训练与推理问题问题训练自己的数据集时损失(loss)不下降或波动很大。可能原因与解决学习率过大尝试减小lr0参数在model.train()中或args里。数据标注质量差检查标注文件是否有大量漏标、错标。确保data.yaml中的类别ID和名称与标注文件一致。数据量太少目标检测通常需要成千上万张标注图片。如果数据少尝试使用更强的数据增强augmentTrue或使用预训练权重进行微调。类别不平衡某些类别的图片数量远少于其他类别。尝试对少数类别图片进行过采样或使用带权重的损失函数。问题检测结果中同一个物体出现多个重叠框。原因非极大值抑制NMS参数设置不当或者模型在训练时没有学好同一物体被重复预测。解决在推理时调整conf置信度阈值和iouNMS的IoU阈值参数。例如results model(frame, conf0.5, iou0.45)。提高conf可以过滤掉低置信度预测提高iou可以让NMS更激进地合并重叠框。检查训练数据确保每个物体只被标注了一次。问题导出ONNX模型后用ONNX Runtime推理结果与PyTorch不一致。原因预处理或后处理逻辑不一致。导出ONNX时模型的输入输出节点固定了但前后的处理代码如图像归一化、坐标反算必须和导出时完全一致。解决仔细对比PyTorch推理和ONNX推理的预处理步骤resize尺寸、归一化数值/255.0、通道顺序BGR to RGB?、均值标准差归一化。仔细对比后处理步骤如何从模型输出张量中解析出框坐标、置信度、类别。YOLOv8的ONNX输出格式可能与PyTorch直接推理的results对象不同。使用Netron工具https://github.com/lutzroeder/netron打开ONNX模型查看输入输出节点的名称和形状确保你的代码与之匹配。6.3 系统运行与部署问题问题Flask视频流延迟很高或者浏览器显示断断续续。原因网络带宽不足或服务器性能瓶颈。视频编码帧率太高或分辨率太大。Flask开发服务器性能有限不适合多并发。解决降低视频流分辨率在cv2.VideoCapture后使用cv2.resize。在generate_feed函数中增加time.sleep()来控制最大FPS避免无限制推送耗尽资源。生产环境务必使用Gunicorn等WSGI服务器并考虑使用WebSocket替代MJPEG流进行指令控制用HTTP流只传视频帧。问题车流计数不准特别是车多的时候。原因跟踪ID切换频繁或者基于单条线的计数逻辑在车辆并行、停车时容易误判。解决强化跟踪采用更鲁棒的跟踪算法如ByteTrack或DeepSORT虽然重一些它们能更好地在遮挡后维持ID。改进计数逻辑改用“检测区域”法。或者设置两条间隔很近的平行线只有按顺序穿越两条线才计数可以过滤掉在检测线附近徘徊的车辆。后处理滤波对计数结果进行时间窗平滑例如每秒统计一次如果某个方向的计数在短时间内暴增可能是误判则进行修正。这个项目从构思到实现再到各种环境下的部署调试几乎把基于深度学习的应用开发流程走了一遍。最大的体会是把一个算法模型变成稳定可用的系统中间有大量的工程细节需要打磨。比如如何平衡精度和速度如何设计数据流保证实时性如何让系统易于安装和配置。我提供的这套源码和文档希望能帮你跨过最初的工程化门槛把精力更多集中在解决具体的业务逻辑上。如果你在运行过程中遇到任何问题或者有了更好的改进思路欢迎一起交流。本文还有配套的精品资源点击获取
返回列表