ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于YOLOv8的交通人群监测毕设实战:从跑通到替换数据集

基于YOLOv8的交通人群监测毕设实战:从跑通到替换数据集 简介这份资源是基于YOLOv8的交通人群监测完整项目包面向深度学习与图像识别方向的毕业设计、课程设计及期末大作业需求者也适合希望掌握实时目标检测落地流程的中级学习者。项目围绕交通场景中行人的识别、定位与流量统计展开可用于公共安全与智能交通管理等实际场景。压缩包共24个文件、约25.56MB包含3个Python脚本、1个训练权重文件、1份依赖清单以及png、jpg、gif等图像与可视化结果另有notebook笔记、日志和说明文档覆盖从数据到部署的完整链路。其中检测脚本分别支持摄像头实时监测与静态图片检测权重文件可直接加载推理曲线图与混淆矩阵便于评估模型表现笔记则记录了训练与调参过程。目前已有40人学习适合需要一套可运行、可参考的YOLOv8实战方案来快速搭建系统、理解工程结构的读者。1. 交通人群监测毕设包从跑通到改到自己数据集如果你正在做深度学习图像识别方向的毕业设计或期末大作业大概率绕不开 YOLOv8。这个「基于YOLOv8的交通人群监测设计.zip」就是一套典型的落地型资源包它把交通场景下的人群检测任务拆成了可运行的代码、预训练权重加载逻辑、数据集组织结构和推理脚本。你拿到手之后最直接的用途是跑通一个完整的检测流程然后替换成自己采集的交通路口或地铁站人群图片完成从训练到推理的闭环。适合谁适合已经装好 Python 环境、知道 Anaconda 或 venv 怎么用、但还没独立走完「数据标注→训练→验证→部署」全流程的本科生和课程设计选手。它不教你反向传播推导但能让你在答辩时拿出一条能跑的检测 demo。2. YOLOv8 交通人群检测的骨架模型选型与数据组织2.1 为什么交通人群监测优先选 YOLOv8n 或 YOLOv8s交通场景下的人群检测有两个硬约束一是画面里人小且密二是边缘设备或普通显卡要能跑得动。YOLOv8 官方提供 n/s/m/l/x 五个尺度其中 n 和 s 在 COCO 上的人体 AP 已经够用参数量分别是 3.2M 和 11.2M。我一般会先拿 YOLOv8n 跑基线因为它在 GTX1660Ti 这种 6G 显存的卡上batch16、imgsz640 能稳定训练不会中途 OOM。如果你用的是 30 系或 40 系卡可以上 YOLOv8s 换几个点的 mAP。资源包里默认配置大概率是 n 或 s你打开yolov8.yaml或训练脚本里的model参数就能确认。选型理由很简单毕业设计看的是完整流程和可解释的指标不是刷 SOTAn/s 的收敛速度和显存占用对新手最友好。2.2 数据集目录结构与 labelme 转 YOLO 格式交通人群监测的数据集通常来自监控截图或公开行人数据集。资源包一般会要求你按 YOLO 的格式组织dataset/ ├── images/ │ ├── train/ │ ├── val/ ├── labels/ │ ├── train/ │ ├── val/ └── data.yaml如果你用 labelme 标注得到的是 JSON 文件需要转成 YOLO 的 txt 格式。转换脚本核心逻辑如下import json import os from PIL import Image def labelme_to_yolo(json_path, output_dir, class_map): with open(json_path, r, encodingutf-8) as f: data json.load(f) img_w data[imageWidth] img_h data[imageHeight] lines [] for shape in data[shapes]: label shape[label] if label not in class_map: continue cls_id class_map[label] points shape[points] xs [p[0] for p in points] ys [p[1] for p in points] x_center (min(xs) max(xs)) / 2.0 / img_w y_center (min(ys) max(ys)) / 2.0 / img_h w (max(xs) - min(xs)) / img_w h (max(ys) - min(ys)) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) txt_name os.path.splitext(os.path.basename(json_path))[0] .txt with open(os.path.join(output_dir, txt_name), w) as f: f.write(\n.join(lines))这段代码做了三件事读取 labelme 的 JSON、把矩形框的绝对坐标归一化成 YOLO 需要的中心点加宽高、按类别映射写入 txt。参数说明class_map是类别名到数字 ID 的字典比如{person: 0}output_dir要和 images 目录平行YOLO 训练时靠路径替换自动找标签。常见坑是图片旋转信息没处理labelme 里如果图片带 EXIF 旋转坐标会对不上转换前先用 PIL 把图转正。2.3 data.yaml 的关键字段与路径陷阱data.yaml是 YOLO 训练的数据入口典型内容path: ./dataset train: images/train val: images/val nc: 1 names: [person]path是数据集根目录train和val是相对路径。很多人翻车在path用了绝对路径但换机器后失效或者names里类别顺序和标注时的 class_map 不一致导致训练时 loss 正常但推理全框错。我一般会在训练前用几行脚本抽查标签import os label_dir ./dataset/labels/train for f in os.listdir(label_dir)[:5]: with open(os.path.join(label_dir, f)) as fp: print(f, fp.read().strip())看输出的类别 ID 是不是从 0 开始、有没有超出nc范围。这一步花两分钟能省掉后面几小时的无效训练。3. 训练与推理从命令行到 Python 脚本的完整链路3.1 环境配置Ubuntu 20.04 与 Windows 的差异资源包通常不绑定系统但 YOLOv8 在 Ubuntu 20.04 上装起来最省心。CPU 版本也能跑推理只是训练会慢到怀疑人生。我一般建议训练用带 NVIDIA 卡的机器推理可以 CPU。安装命令conda create -n yolov8 python3.8 conda activate yolov8 pip install ultralytics如果你要指定 CUDA 版本先装 PyTorchpip install torch1.13.1cu117 torchvision0.14.1cu117 --extra-index-url https://download.pytorch.org/whl/cu117 pip install ultralytics参数说明cu117对应 CUDA 11.7GTX1660Ti 和 30 系卡都支持。装完用python -c import torch; print(torch.cuda.is_available())验证返回 True 才算 GPU 可用。Windows 下路径分隔符和num_workers有时会报错把workers设成 0 能绕过大部分数据加载问题。3.2 训练命令与关键参数含义资源包里一般会有一个train.py或直接给命令行。核心训练命令yolo detect train data./dataset/data.yaml modelyolov8n.pt epochs100 imgsz640 batch16 workers4逐项说明data指向 data.yamlmodel是预训练权重首次运行会自动下载yolov8n.ptepochs100对小型数据集够用交通人群场景如果样本少于 2000 张可以降到 50 并开早停imgsz640是输入分辨率显存不够就降到 416 或 320batch16根据显存调6G 卡跑 n 模型可以到 16s 模型建议 8workers4是数据加载线程数Windows 下报 BrokenPipe 就改 0。训练开始后看控制台输出的 box_loss 和 cls_loss正常情况前 10 个 epoch 下降明显如果 loss 震荡不降先查学习率默认 0.01 对小数据集偏大可以加lr00.001。3.3 推理脚本与结果可视化训练完权重在runs/detect/train/weights/best.pt。推理可以用命令行yolo detect predict modelruns/detect/train/weights/best.pt source./test_images saveTrue也可以写 Python 脚本做批量处理from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict(source./test_images, conf0.25, iou0.45, saveTrue) for r in results: boxes r.boxes for box in boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(f类别:{cls_id} 置信度:{conf:.2f} 坐标:{xyxy})参数说明conf0.25是置信度阈值交通人群密集时调到 0.3 能减少误检iou0.45是 NMS 的 IoU 阈值人群重叠严重时调到 0.5 保留更多框。saveTrue会把画框后的图片存到runs/detect/predict。如果你要统计人数直接对boxes长度求和即可但注意同一人被重复框选的情况NMS 之后一般不会。3.4 损失函数曲线与训练过程监控YOLOv8 训练完会在runs/detect/train下生成results.csv里面记录了每个 epoch 的 box_loss、cls_loss、mAP50 等。画曲线import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/train/results.csv) df.columns df.columns.str.strip() plt.plot(df[epoch], df[train/box_loss], labelbox_loss) plt.plot(df[epoch], df[train/cls_loss], labelcls_loss) plt.xlabel(epoch) plt.ylabel(loss) plt.legend() plt.savefig(loss_curve.png)这段代码把训练日志转成损失曲线图答辩时直接放这张图比口头说收敛更直观。注意列名可能有空格用str.strip()清理。如果 val 的 mAP 在某个 epoch 后不升反降说明过拟合可以减 epoch 或加数据增强。4. 避坑与排查交通人群检测里最容易翻车的五件事4.1 现象训练 loss 正常但推理全是错框原因data.yaml里names的顺序和标注时的类别 ID 对不上或者验证集图片路径写错导致模型没学到正确特征。解决用 2.3 节的抽查脚本核对标签确保names列表顺序和 class_map 一致再检查val路径下图片是否真的存在。4.2 现象CUDA out of memory原因batch或imgsz超过显存上限或者workers太多导致内存泄漏。解决先把batch减半再把imgsz从 640 降到 416如果还报加ampFalse关闭混合精度或者换 YOLOv8n。GTX1660Ti 跑 s 模型时 batch 不要超过 8。4.3 现象训练时 mAP 一直是 0原因标签文件里类别 ID 超出nc范围或者 txt 文件编码不是 UTF-8。解决检查标签第一列数字是否小于nc用file命令看编码必要时用iconv转成 UTF-8。另一个常见原因是图片和标签文件名没对应上YOLO 靠文件名匹配差一个后缀都会导致找不到标签。4.4 现象推理速度极慢CPU 跑一张图要好几秒原因模型在 CPU 上跑或者输入分辨率太高。解决确认torch.cuda.is_available()为 True如果只能用 CPU把imgsz降到 320并用yolo export formatonnx导出 ONNX 后用 onnxruntime 推理速度能快 2 到 3 倍。RK3588 或 Orin 部署时也是先转 ONNX 再转 RKNN 或 TensorRT这是常见做法。4.5 现象人群密集时漏检严重原因NMS 的iou阈值太低把重叠的人框合并掉了或者训练数据里密集场景样本太少。解决推理时把iou从 0.45 提到 0.6conf从 0.25 降到 0.2训练时加mosaic1.0和copy_paste0.3增强密集场景。如果还不行考虑换 YOLOv8m 或加注意力机制但毕设阶段优先保证流程完整。5. 进阶技巧用验证集反推模型短板并做针对性改进跑通基础流程之后别急着换模型。先做一件事把验证集里漏检和误检的图片单独挑出来按场景分类。我一般会写个脚本统计每张图的检测结果和真实标签的差异import os from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) val_img_dir ./dataset/images/val val_lbl_dir ./dataset/labels/val for img_name in os.listdir(val_img_dir): img_path os.path.join(val_img_dir, img_name) lbl_path os.path.join(val_lbl_dir, os.path.splitext(img_name)[0] .txt) if not os.path.exists(lbl_path): continue with open(lbl_path) as f: gt_count len(f.readlines()) results model.predict(img_path, conf0.25, verboseFalse) pred_count len(results[0].boxes) if abs(gt_count - pred_count) 2: print(f{img_name} 真实:{gt_count} 预测:{pred_count})这段代码输出真实人数和预测人数差超过 2 的图片名。把这些图打开看如果是夜间或逆光说明数据增强里要加亮度变换如果是小目标说明imgsz不够或需要加 P2 检测层。针对小目标的改进YOLOv8 官方支持在yolov8.yaml里加P2输出但会增计算量毕设阶段量力而行。另一个实用技巧是导出 ONNX 后用 Netron 看网络结构图确认 head 输出维度。命令yolo export modelruns/detect/train/weights/best.pt formatonnx imgsz640导出的best.onnx拖进 Netron能看到三个输出头分别对应 80x80、40x40、20x20 特征图。如果你改了注意力机制这里能直观看到模块插入位置。RK3588 或 hi3516cv610 部署时也是先看 ONNX 结构再决定量化策略。最后说个血泪经验我每次改完模型结构或数据增强都会先拿 10 张图跑一遍推理确认输出框数量合理再开训练。因为 YOLOv8 的配置文件改错一个字段训练照样跑但学出来的东西完全不对等 100 个 epoch 跑完才发现就太亏了。从那以后我每次动yaml或data.yaml都强制走一遍小样本推理验证。希望帮到你。本文还有配套的精品资源点击获取
返回列表