资讯动态

车辆行人检测课设全攻略:从YOLO选型到部署答辩

发布时间:2026/10/22 18:09:04 来源:尧图企业网站定制
又到课程设计季车辆行人目标检测这种经典题目一下子就成了很多计算机视觉方向同学的刚需。你可能会在各种地方看到类似“车辆行人目标检测系统 深度学习 计算机视觉 课程设计 数据集 代码(源码lw部署文档讲解等)”这样的教程链接我也接到过不少同学的私信问同一个问题这个题目到底应该怎么下手能不能用一个晚上把整套东西学明白说实话这个题目确实是课设界的“黄金选题”它的难度适中既不像人脸识别那样数据获取受限又不像通用目标检测那样漫无边际。而且它背后是一条非常完整的链路数据集构建、模型训练、指标评估、部署推理、报告撰写全流程走一遍下来几乎覆盖了深度学习目标检测的所有核心知识。这篇文章我不评价任何现成套餐的有没有用只是站在从业者和带过课设的人的角度把这个项目从拆解到落地的每一步都摊开讲清楚包括技术选型、数据准备、代码结构、训练调优、部署文档、报告与答辩准备。不管你是准备自己做还是打算消化手里已有的某个源码包按这条路径走下来你都能做到心里有数。1. 项目整体设计与选型课程设计不是只能“跑得通”一个车辆行人检测课设项目最容易犯的错误是把“代码能跑”当成任务完成。这个选题真正难的不是把模型跑起来而是你能否讲清楚为什么要选这个模型、数据怎么处理、训练过程遇到了什么问题、最后的结果指标为什么有价值。所以第一步不是急着下载代码而是把项目当作一个完整的小型产品来设计。1.1 从交付物反推需求这套项目到底要交什么不管是自己做的还是买来的课设项目最终交付物都绕不开四类东西——源码、课设报告很多资料里习惯叫lw其实就是设计报告或者论文、部署文档、讲解材料。这四个交付物的背后对应的是不同的考核维度。源代码考察的是工程能力。老师不会一行行看你的代码但会看目录结构是否清晰注释是否到位训练脚本和推理脚本是不是分开配置文件和模型定义有没有解耦。很多同学从网上拉一个仓库下来就当课设提交了结果目录里一堆实验垃圾文件这给人的第一印象就很差。课设报告考察的是逻辑表达。你要能自圆其说为什么选这个任务、用了什么数据、模型结构是什么、训练了多少轮、精度达到多少每部分都得有据可查。报告不是把代码文档粘贴一遍而是把你的思考过程写出来。部署文档考察的是可复现性。把这个文档拿给一个懂一点计算机知识的人他能不能在你的代码基础上把环境配起来跑通一次训练和推理很多项目之所以被判定为“水分大”就是因为部署文档写得太笼统缺依赖版本、缺启动命令、缺常见报错处理。讲解材料考察的是临场表达。课设几乎都有答辩环节你需要在短时间内讲清楚“这是什么、怎么做的、遇到什么问题、结果如何”。这四件事任何一个讲不清楚都容易被追问到怀疑人生。把这四个交付物当成项目的四个维度你自然就清楚该在哪里分配精力了。1.2 算法选型为什么 YOLO 是课设场景的最优解目标检测的算法选型在课设强度下其实没什么悬念。我见过几种方案的对比直接整理成表格更好理解。方案推理速度精度水平资料与生态硬件门槛学习成本课设友好度Faster R-CNN较慢高经典但资料偏老较高理解难度大中SSD较快中高生态一般中结构较老中YOLOv5快高极丰富中低低高YOLOv8快更高较丰富中低低高DETR等Transformer方案中取决于数据资料较少显存压力大高低我当时带人做课设基本都推荐 YOLOv5 或者 YOLOv8。原因有三条。第一条是生态成熟YOLOv5 从2020年发布到现在社区里积累了海量的博客、视频、答疑帖子你在训练时遇到的绝大多数坑都有人踩过并且写了解法这对课设阶段的学生来说太重要了。第二条是代码封装程度适中它不像是某些模型一样把整个前处理都藏在库里数据处理、模型结构、训练循环都是可以直接阅读和修改的 Python 代码方便你在报告里写清楚结构和细节。第三条是硬性要求低一张普通家用显卡甚至 CPU 都能跑只是时间长短问题。如果说唯一需要斟酌的地方就是 YOLOv8 结构更新、精度更好但 YOLOv5 的参考代码和历史帖子更多。如果让我来选我会看指导老师更认可哪个版本或者看你手上已有的辅助资料更偏向哪个。至于为什么不用 DETR 这类新方案最关键的是课设时间有限Transformer 检测器对训练数据量、调参技巧、显存容量都有更高要求你花同样的时间不一定能调出一个让 mAP 指标好看的结果。目标检测的课设本质上考察的是“工程落地思维”而不是“科研创新思维”选最稳的方案把时间花在把指标做漂亮和分析结果上才是正确的策略。1.3 项目目录结构像正经工程一样组织代码一套看着舒服的代码目录在答辩和报告里都是隐形加分项。一个典型的车辆行人检测项目目录结构可以规划成下面这样vehicle_person_detector/ ├── data/ │ ├── dataset.yaml # 数据集配置文件 │ ├── images/ │ │ ├── train/ │ │ └── val/ │ └── labels/ │ ├── train/ │ └── val/ ├── models/ │ ├── yolov5s.yaml # 模型结构配置 │ ├── yolo.py # 模型定义与检测头 │ └── common.py # 基础模块ConvC3等 ├── utils/ │ ├── datasets.py # 数据加载与增强 │ ├── loss.py # 损失函数 │ ├── metrics.py # 指标计算 │ └── plots.py # 可视化工具 ├── weights/ │ ├── yolov5s.pt # 预训练权重 │ └── best.pt # 自己训练好的权重 ├── runs/ │ ├── train/ # 训练日志和曲线 │ └── detect/ # 推理结果 ├── train.py # 训练入口 ├── detect.py # 推理入口 ├── val.py # 验证入口 ├── requirements.txt └── README.md这套结构不是我凭空想出来的而是从 YOLOv5 官方仓库演化而来的标准实践。它的核心优势是各部分职责清晰数据归数据模型归模型工具归工具。你不需要自己重写全部代码只需要在此基础上补充自己的数据集配置、类别名称和业务逻辑就可以启动完整流程。这里有一个值得注意的细节很多同学吃力地自己是把训练和推理写在一个脚本里或者把所有代码都堆在一个 main.py 里。这样虽然也能跑通但课设报告里很难画架构图因为你根本说不清模块边界。除非老师明确禁止参考现有框架不然我还是很推荐在 YOLO 的工程结构上进行二次封装把模型配置、数据路径、训练条目适当分离这样对后续改造和答辩都有好处。2. 目标检测核心原理与源码模块拆解看懂才能改拿着代码跑一遍只是皮毛真正被问到“算法的基本原理”时你必须能用自己的话说清楚。这里我尽量用比较通俗的方式把目标检测的主线逻辑拆开。2.1 从网格预测到一次前向YOLO 的核心思想YOLO 的名字是 You Only Look Once也就是“只看一眼”这就直接点出了它的核心特点用一个神经网络把目标的位置和类别一次性预测出来而不是像传统方法或者两阶段检测器那样先提候选区域再分类。怎么理解它呢你可以把输入图片划分成 S×S 的网格。每个网格单元负责预测若干种预设的目标框也叫 anchor box。每个框会输出四个坐标值中心点位置和宽高、一个置信度当前框里有没有目标的概率以及一个类别概率分布。整个过程就是一次前向传播所以推理速度非常快。项目里面对的车辆和行人在照片中的尺寸差异通常很大。一辆镜头前的公交车可能占据半张图而远端的行人可能只有几十个像素。为了应对这种尺度差异YOLOv5 引入了特征金字塔结构从网络不同层抽取特征大的特征图负责检测小目标小的特征图负责检测大目标然后把它们融合起来。这就是代码中 PANet 或类似结构做的事情。做课设的时候你不需要把每一个模块的原理都背得滚瓜烂熟但至少要把“输入图片经过 Backbone 提取特征、经过 Neck 融合多尺度特征、通过 Head 输出预测框、最后用 NMS 去除重复框”这条主线讲清楚。这是所有答辩提问里最高频的串。2.2 IoU 与 NMS两个绕不开的调优利器IoU 是交并比也就是预测框和真实标注框的交集面积除以并集面积它是判断一个框检测得准不准的基础度量。NMS非极大值抑制是一个后处理操作放在模型输出之后。因为网格里相邻的多个 anchor 可能同时预测到同一个目标模型会得到一堆冗余的框。NMS 的做法是先按置信度排序留下分数最高的框然后把和它 IoU 重叠度超过设定阈值的其他框抑制掉再在剩下的框里重复这个过程最后每个目标只保留最合适的一个边界框。把 NMS 的 IoU 阈值调大能够保留更多的重叠框减少一些漏检但也容易增加重叠误检调小则相反。检测的置信度阈值也有类似效果阈值设得高框会更少更精准但可能漏掉一些目标设得低框会变多误检也会变多。我遇到过不少同学拿到的模型测试效果不好第一反应就是换模型、加数据结果最后发现其实是后处理阈值没有调对。在课设这种有限时间内先把阈值范围内粗扫一遍往往比盲目调参更有效。2.3 源码里真正应该优先读的三个文件拿到一套 YOLO 源码不用从第一个文件看到最后一个文件那样效率太低。你只需要挑三个关键点读透就可以应付课程设计的绝大部分提问。第一个是数据加载相关文件在 YOLOv5 里通常是 utils/datasets.py。它的核心工作是把图片和标注对应起来在进入网络前做 letterbox 缩放、归一化、随机翻转、Mosaic 拼接等操作。你需要关注两个东西一是 label 的格式每行是“类别 中心点x 中心点y 宽 高”后四个都是相对图片尺寸归一化后的值二是增强操作因为增强的参数直接影响训练效果。第二个是模型结构文件在 YOLOv5 里是 models/yolo.py。这个文件定义了前向推理逻辑和损失计算。你不需要逐行理解矩阵运算但至少要知道输出张量的形状比如某个尺度下输出的通道数等于 (类别数加5) 乘以 anchor 数量。这个形状如果你能解释清楚老师通常会默认你是真的懂模型结构。第三个是指标计算文件YOLOv5 里是 utils/metrics.py。它实现了 IoU 的计算、平均精度 AP 的计算、mAP 的汇总。报告中需要展示的 Precision、Recall、mAP0.5 等指标都是在这个文件里完成的。读懂它能让你在报告里对每个数字的来源心里有底。我建议在读这三个文件的时候配合一个小脚本打印出某张训练图片对应的 label 张量和某个模型输出的张量形状边打印边对照源码。这个动作看起来简单但会让抽象的概念一下子落地。3. 数据集准备与代码实现数据质量决定结果上限很多同学从网上下载一个 VOC 数据集或者从某个平台直接拉数据却发现训练出的模型表现很差。这里面的问题往往不是因为模型不好而是数据准备阶段没有做细致检查。数据质量决定了结果的收听上限。3.1 数据来源与标注格式转换从 COCO 到 YOLO 的落地适合做车辆行人检测的公开数据集并不少比较常用的有 COCO、KITTI、BDD100K 和 Cityscapes。COCO 里自带 car、truck、bus 和 person 这些类KITTI 是驾驶场景数据集车辆和行人标注很规范BDD100K 更强调城市道路场景包含更多遮挡和小目标。如果直接用官方 YOLO 仓库它默认支持 COCO 格式。但你要是从 COCO 原版 JSON 数据构建自己的训练集就需要写转换脚本把 COCO 的边界框左上角 x、左上角 y、宽、高转换成 YOLO 需要的归一化中心坐标格式。这里给出一个参考脚本import os import json import shutil from PIL import Image # COCO 标注文件路径 annotation_file annotations/instances_train2017.json with open(annotation_file, r, encodingutf-8) as f: coco_data json.load(f) # 只保留车辆和行人相关类别指定你自己的类别 id keep_ids {1: person, 2: car, 3: truck, 4: bus} images_info {img[id]: img for img in coco_data[images]} annotations coco_data[annotations] for ann in annotations: if ann[category_id] not in keep_ids: continue image_id ann[image_id] img images_info[image_id] img_path os.path.join(train2017, img[file_name]) if not os.path.exists(img_path): continue # COCO 的 bbox 格式为 [x, y, w, h] bbox ann[bbox] img_w, img_h img[width], img[height] # 转换成 YOLO 格式 cx (bbox[0] bbox[2] / 2) / img_w cy (bbox[1] bbox[3] / 2) / img_h bw bbox[2] / img_w bh bbox[3] / img_h label_id list(keep_ids.keys()).index(ann[category_id]) label_path os.path.splitext(img_path)[0] .txt os.makedirs(os.path.dirname(label_path), exist_okTrue) with open(label_path, a) as lf: lf.write(f{label_id} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}\n)这个脚本最值得注意的就是坐标归一化的换算逻辑。YOLO 标签坐标系已经归一化到 0 到 1而 COCO 的坐标是绝对像素值转换时必须除以图片宽高。如果这里算错训练过程不会报错但模型永远学不到正确的位置信息最后 mAP 会特别难看。3.2 类别统计与数据增强小目标提升的突破口数据准备好之后我强烈建议先做一次统计而不是立刻训练。统计每个类别的目标数量、目标框的宽高分布、图片数量。这一步能让你提前知道很多坑。假设你选择了 COCO 的 person、car、truck、bus 四类但原始数据里 car 的标注框数量是 person 的三四倍这就会造成类别不均衡模型对 person 的检测能力明显弱于 car。提升的做法有几种一是可以针对少量类别做过采样复制样本或者调整每张图抽样权重二是利用数据增强手段尤其是 Mosaic 拼接把多张图片拼接成一张新图既能增加目标密度又能让模型看到更多小尺寸目标。YOLOv5 在训练时默认开启 Mosaic 增强。这个增强把四张训练图片随机缩放、裁剪后拼接在一起使模型在训练过程中经常看到不同尺度、不同位置的目标组合对泛化能力和小目标检测有明显帮助。如果你发现车辆和行人的小目标检测很差可以在训练时增加输入分辨率比如把 --img 从 640 提到 960这通常比盲目增加训练轮数更有效。3.3 dataset.yaml 的编写细节YOLO 系列里dataset.yaml 是数据集的配置入口。它的写法就像这样train: data/images/train val: data/images/val nc: 4 names: [person, car, truck, bus]需要注意的是 train 和 val 路径既可以写相对路径也可以写绝对路径。这里有个很容易犯的错代码运行时的工作目录不同相对路径会失效导致训练一启动就报错找不到图片。所以建议你在这个文件里使用绝对路径或者在 README 里写清楚“必须在项目根目录下运行命令”。另外nc 表示类别数量names 的顺序必须与训练标签里的类别 id 严格对应只要错一位模型就会把猫狗都认成车。4. 训练环境、实验配置与调优排查实录环境配置和训练调优是整个课设中最磨人的环节。很多项目做不下去不是算法选错而是卡在环境上。4.1 环境安装一套能用的版本组合比“最新版”更重要安装深度学习环境最忌讳的就是无脑安装最新版本。推荐一套相对稳定、文档又丰富的版本组合Python 3.8 或 3.9PyTorch 1.12 或 2.0CUDA 11.6 或 11.7以显卡驱动能支持为前提OpenCV 4.5 以上如果没有 GPU也可以用 CPU 跑但训练时间会很折磨在 Windows 上安装时可以考虑使用虚拟环境比如 conda避免不同项目之间的依赖冲突。安装 PyTorch 时注意选择与 CUDA 匹配的版本否则会报“CUDA not available”之类的错误。一个经常被忽视的细节是 NumPy 的版本。YOLOv5 老版本代码在新版 NumPy 下可能报np.int属性不存在的错误这时就需要安装兼容版本比如pip install numpy1.23.5。这种问题的背后逻辑是官方仓库发布时有自己的依赖范围课设阶段你不需要追新稳定复现才最重要。4.2 训练参数配置这份模板可以直接用推荐一份可以直接跑通车辆行人检测的训练配置python train.py \ --data dataset.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --device 0各参数的含义要能解释清楚--weights 使用预训练权重。YOLOv5s.pt 是在 COCO 数据集上预训练过的权重直接加载它作为初始值可以大幅度缩短训练时间。如果不用预训练权重从零开始训练在数据量只有几千张的情况下很难收敛出理想效果。这是课设阶段最划算的“经验值”。--img 是输入分辨率。分辨率越大网络能感知的细节越多小目标检测越好但显存占用成倍上涨。显存只有 6G 的显卡推荐用 6408G 以上可以考虑 960。--batch-size 是每次迭代送入网络的图片数量。显存不足时优先把它调小但 batch 太小时训练不稳定。如果调小 batch可以适当降低学习率。--epochs 建议 100 到 150。这个数据量下模型通常在前 50 轮就收敛得差不多100 轮足够你观察曲线走势。如果训练集是几万张的大数据集可以缩短到 50 轮但课设一般推荐 100 轮打底。训练结束之后不要只关注最后一轮的权重YOLO 会在 runs/train/exp/weights 下保存 best.pt 和 last.ptbest.pt 是验证集上表现最好的权重。如果你不知道怎么选就用 best.pt 做阶段检测。4.3 训练日志与指标怎么看不要只看 loss训练完成后你会在 runs/train/exp 下看到很多图表和日志。最直观的是 loss 曲线和指标曲线。loss 下降是必须的但训练损失下降不代表模型泛化好。要特别关注 验证集上的 metrics也就是 precision、recall、mAP0.5 这几个值。如果训练 loss 持续下降但验证集 mAP 不再上升甚至下降那就是过拟合了解决办法包括加大数据增强、减少模型复杂度、增加训练数据、更早地停止训练。如果验证集 mAP 从头到尾都没有起色要先检查数据标签是否正确最快捷的方法是把训练样本的标注框可视化出来看是不是画在正确对象上。这是整个项目中投入产出比最高的一次检查因为很多看起来玄学的训练失败最后溯源都是标签文件的问题。4.4 高频问题排查速查表直接汇总我遇到过的频率最高的问题问题现象可能原因解决方法训练 loss 为 nan学习率过大 / 数据包含脏数据降低学习率到 0.0001检查标签是否越界CUDA out of memorybatch 太大或输入分辨率太高调小 batch-size或降低 --img读取图片报错路径配置错误或图片损坏检查 dataset.yaml 路径清理损坏图片mAP 很低但 loss 正常标签类别顺序错误 / 数据量太少可视化标签检查 names 顺序增加训练数据推理速度很慢使用了 GPU 推理却没有装对应的 CUDA 版 PyTorch检查 torch.cuda.is_available()换编译版本同一目标出现大量重复框NMS 阈值过高调低 NMS IoU 阈值比如从 0.45 调到 0.25小目标检测不到输入分辨率过低增大 --img使用多尺度训练这张表里的很多问题我在帮别人调课设时都见过。比如有一次某同学训练结束后 mAP 一直只有 0.3我帮他看标签文件发现所有标注框的坐标全部归一化到以图片短边为基准而不是以实际宽高为基准模型相当于一直在学一个错误的任务。这种问题很难靠调参数解决只能靠可视化检查数据。5. 推理部署、报告撰写与答辩讲解把成果完整交付训练出好的模型只是完成了项目的一半另一半是把模型用起来并且让你的老师、答辩评委认为你真的理解了整套系统。5.1 本地推理与视频实时检测的完整代码在 YOLOv5 中最直接推理一张图片的方法是使用 detect.pypython detect.py --weights runs/train/exp/weights/best.pt --source data/images/test.jpg --conf-thres 0.25如果你想在代码里以更灵活的方式调用模型比如做一个 Qt 界面或 API 接口可以使用类似下面的逻辑import torch import cv2 model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt) model.conf 0.25 model.iou 0.45 img cv2.imread(test.jpg) results model(img) results.show() results.save() # 保存到 runs/detect/exp对于视频或摄像头输入直接把 source 换成视频路径或 0 即可。这个过程中值得留意的几点是推理前输入图片会被自动做 letterbox 填充所以得到的结果框坐标已经映射回原图不要在前处理环节擅自修改缩放逻辑否则框的位置会偏。如果要做一个简单的实时演示可以把推理结果叠加上 FPS 信息后写入视频文件这个效果在课设答辩现场很加分。真正的工程部署其实还有更复杂的模型转换和优化但在课程设计这个层次用 PyTorch 直接跑推理已经足够。5.2 部署文档需要覆盖的内容让别人能复现才是完整交付部署文档不是只写一句“环境配好之后运行 train.py”。一个合格的 README 或部署文档至少要包含五块第一是环境要求包括操作系统、Python 版本、CUDA 版本、主要依赖库版本这种信息写成表格最容易对照检查。第二是目录结构说明让读者一眼知道代码放在哪里权重放哪里数据集放哪里。第三是模型文件说明尤其是类别名称和数量这样别人替换自己的数据时不会迷路。第四是启动步骤从安装依赖到训练再到推理每一条命令都要能直接复制运行。第五是常见报错与解决方法把自己踩过的坑整理成表格放进去。这段内容不是我写得太保守而是我自己在复现别人项目时被坑过的真实体会。部署文档的价值不取决于它写了多少字而取决于一个全新环境的人能否顺着它走通全流程。如果你在报告里附上自己项目的部署文档并且现场演示从零配置环境到成功检测一张图片的全过程这在答辩中的说服力远比几页原理导出要强得多。5.3 课程设计报告lw的结构与写作技巧课程设计报告有固定的基本结构我建议这样排第一部分是摘要和关键词摘要在三四百字内说清楚做了什么、用了什么方法、达到什么指标。第二部分是背景与目标简要介绍车辆行人检测的应用价值以及课设要达到的验收标准。第三部分是相关技术概述重点讲目标检测的发展脉络和 YOLO 的核心原理。第四部分是系统设计包括整体架构图、模块划分、数据预处理流程、模型结构安排。第五部分是实验与环境详细写硬件参数、依赖库版本、超参数配置。第六部分是结果与分析展示检测效果图、PR 曲线、指标表格对失败案例做几个简单分析。最后是总结与展望。有一个最常见的写作误区一上来就把 YOLO 的原理大段大段地从网上粘过来占了一半篇幅自己的实验部分却草草几行。答辩老师其实最想看到的是你自己做的事比如你选了多少张图、标注了几类目标、训练中调过哪些参数、mAP 从多少升到了多少这些真实的过程数据远比背诵原理更有说服力。结果部分每个人的数据我都会建议带透明可追溯性即每个图表下面都标注“在什么数据集、什么模型参数下得到”。如果自己的实验结果不够漂亮就把失败案例拿出来分析这反而是加分项因为说明你真的理解了问题而不是只交了一套能跑的表皮。5.4 讲解材料与答辩演示把链路串成故事课程设计的终点通常是一次答辩或者一次展示讲解的思路要遵循“需求、设计、实现、验证”这条主线而不是把代码函数从头到尾背一遍。建议准备一份十几页的演示文稿开场用一分钟讲项目背景和应用场景接着用一页架构图讲技术选型和整体流程然后用两三页讲数据集的来源、预处理和增强策略再放一页训练配置和指标变化穿插两三张检测效果图最后做一次现场演示把摄像头前的人或者一张测试图框出来。这个节奏大概七八分钟正好符合常见的答辩时长。现场演示的时候最好提前准备一个应急方案比如如果摄像头设备有问题就改成用视频文件或者图片演示。这是我在观看许多现场答辩崩溃后养成的一个习惯。还有一个容易被忽略的细节把训练日志里最好的一批 result 曲线准备好一旦被问到“这个指标说明了什么”你能直接对着曲线解释而不是临时发挥。如果在答辩里遇到不会的技术问题我个人的经验是不要硬拗而是坦诚说明自己的理解边界然后补充一句“但我通过实验验证了某个替代方案的效果”这样反而显得有工程素养。课设答辩的重点是表现你对整个项目链路的完整理解而不是证明你能背下所有论文公式。我个人在带别人做这个项目时最深的体会是车辆行人检测这个题目能做的事情非常多做完基本功能后你还可以往里加很多有区分度的扩展点。比如在模型层面换成 YOLOv8s 做对比实验在业务层面加上车速估计或者目标计数在部署层面写一个小 Web 页面或者 API 接口。任何一个扩展点都能让你的课设从及格线往上再跳一到两个档次。但前提是前面这条主干链路你必须真正吃透而不是只会复制粘贴。只要数据、模型、训练、推理、文档这条线在你心里是完整闭环的这个课设就算真正做成了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑