1. 项目概述从零到一亲手训练一个YOLOv5模型如果你对AI感兴趣尤其是计算机视觉里的目标检测那么“YOLOv5”这个名字你一定不陌生。它就像一个“开箱即用”的瑞士军刀速度快、精度高而且社区生态极其丰富让很多复杂的任务变得触手可及。但很多新手朋友卡在了第一步看懂了原理也下载了代码但面对自己的一堆图片却不知道如何让模型“认识”它们训练出一个属于自己的检测器。网上的教程要么太老要么步骤跳跃环境配置、数据准备、训练调参每一步都可能是个坑。这篇内容就是为你准备的。我将以一个从业者的视角带你完整走一遍用YOLOv5训练自己数据集的流程。我们不谈空洞的理论只聚焦于“怎么做”。从环境搭建、数据标注、配置文件修改到启动训练、评估模型最后用训练好的模型进行推理每一步都有详细的命令和截图并解释清楚背后的逻辑。无论你是学生、工程师还是对AI有浓厚兴趣的爱好者只要跟着步骤走你就能亲手“喂”出一个能识别特定目标的AI模型。比如你可以让它学会识别你花园里的不同花卉、仓库里的零件瑕疵或者统计视频中的人流车流。整个过程就像教一个孩子认东西只不过我们用的是代码和图片。2. 核心思路与工具选型为什么是YOLOv5在动手之前我们得先明白为什么选择YOLOv5以及我们整个项目的核心思路是什么。目标检测的模型很多从古老的R-CNN系列到YOLO系列再到后来的DETR等Transformer模型各有优劣。2.1 为什么选择YOLOv5对于新手和大多数工业应用场景YOLOv5至今仍是一个极佳的选择原因有以下几点极致的易用性这是它最大的优点。Ultralytics公司将其工程化做到了极致。一个git clone一个pip install -r requirements.txt环境就差不多了。训练命令简单到只需指定数据配置文件和几个参数。这种“一键式”的体验极大地降低了入门门槛。活跃的社区与完善的文档YOLOv5的GitHub仓库issue区非常活跃你遇到的90%的问题都能在那里找到答案或讨论。其官方文档和教程也在不断更新涵盖了从训练到部署的方方面面。优秀的精度-速度平衡YOLOv5提供了从n最小最快到x最大最准多个预训练模型尺寸。你可以根据你的硬件条件和精度要求灵活选择。在主流GPU上即使是YOLOv5s也能达到实时检测30 FPS和高精度。完整的工具链它不仅仅是一个模型更是一个工具箱。除了训练它还内置了模型验证计算mAP等指标、模型导出到ONNX、TorchScript、CoreML等格式、模型推理对图像、视频、流媒体等一系列功能省去了你到处找工具拼接的麻烦。数据格式友好YOLOv5使用的数据格式是经典的“YOLO格式”即每个图像对应一个.txt文件里面用归一化后的中心坐标和宽高表示边界框。这种格式简单明了很多标注工具如LabelImg、Roboflow都直接支持导出。相比之下虽然YOLOv8、YOLOv9等后续版本在性能上可能有提升但YOLOv5的稳定性、社区资源和学习资料目前仍然是最丰富的对于“训练自己的数据集”这个目标来说它是最稳妥的起点。2.2 项目核心思路拆解我们的目标很明确让YOLOv5模型学会识别我们自定义的类别。整个流程可以抽象为以下几个核心步骤环境准备搭建一个能运行PyTorch和YOLOv5代码的Python环境。数据准备收集图片进行标注并整理成YOLOv5要求的目录结构。配置修改告诉模型我们的数据在哪里以及要识别哪些类别。模型训练启动训练过程让模型从数据中学习。模型评估使用模型未见过的图片测试其性能查看指标如精度、召回率、mAP。模型使用用训练好的模型对新图片或视频进行预测。这个思路是通用的无论你检测什么目标流程都大同小异。接下来我们就深入到每一个环节的细节中。3. 环境搭建与项目初始化打造你的AI工作台工欲善其事必先利其器。一个干净、可控的环境是成功的第一步。强烈建议使用Anaconda或Miniconda来管理Python环境避免包版本冲突。3.1 创建并激活虚拟环境打开你的终端Windows用Anaconda Prompt或CMDLinux/macOS用终端执行以下命令# 创建一个名为yolov5的Python环境指定Python版本为3.83.7-3.10都行3.8最兼容 conda create -n yolov5 python3.8 # 激活这个环境 conda activate yolov5激活后你的命令行提示符前面应该会显示(yolov5)表示你已经在这个独立的环境中了。3.2 克隆YOLOv5仓库并安装依赖YOLOv5的官方代码托管在GitHub上。我们将其克隆到本地。# 克隆仓库如果慢可以考虑使用Gitee镜像 git clone https://github.com/ultralytics/yolov5.git cd yolov5进入目录后安装所需的Python包。requirements.txt文件里列出了所有依赖。# 使用pip安装依赖建议使用清华源加速 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple注意这个过程会安装PyTorch。requirements.txt里默认的PyTorch安装命令可能不包含CUDAGPU支持。如果你有NVIDIA显卡并希望使用GPU加速训练这能快几十倍你需要根据你的CUDA版本手动安装PyTorch。可以先运行nvidia-smi查看CUDA版本然后去 PyTorch官网 获取对应的安装命令。例如对于CUDA 11.8pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118安装完PyTorch后再执行pip install -r requirements.txt安装其他依赖。安装完成后你可以运行一个简单的命令来验证环境和代码是否正常python detect.py --source data/images/bus.jpg --weights yolov5s.pt这条命令会用官方预训练的小模型yolov5s.pt去检测一张示例图片公交车。如果一切正常你会在runs/detect/exp目录下看到生成的结果图片上面画出了检测到的边界框。这证明你的环境已经准备好了。4. 数据集准备与标注教会模型“看”什么这是整个过程中最耗时但也最核心的一步。模型的好坏很大程度上取决于你喂给它的数据质量。4.1 数据收集与原则你需要收集包含你待检测目标的图片。例如如果你想检测苹果和香蕉就需要大量包含苹果和香蕉的图片。数据收集有几个原则多样性目标应该在各种场景、光照、角度、尺度下出现。如果只拍正面模型可能不认识侧面。代表性数据分布应尽可能接近模型将来要应用的真实场景。数量这没有绝对标准但通常一个类别至少需要几百张图片。数据越多模型泛化能力可能越强但也要考虑标注成本。质量图片清晰度要高目标要明确。过于模糊或目标极小的图片可能带来负面影响。将收集到的所有图片放在一个文件夹里例如my_dataset/images/。4.2 数据标注工具与流程我们需要为每张图片中的目标画框边界框并打上类别标签。推荐使用LabelImg这个开源工具它直观易用且直接支持导出YOLO格式。安装LabelImg# 在之前激活的yolov5环境中安装 pip install labelImg # 安装后直接在命令行输入 labelImg 即可启动 labelImg标注流程打开LabelImg点击“Open Dir”选择你的图片目录my_dataset/images/。点击“Change Save Dir”设置标注文件.txt的保存目录。强烈建议设置为my_dataset/labels/这样图片和标签能分开管理也符合后续的目录结构要求。在右侧点击“PascalVOC”切换到“YOLO”格式。开始标注按W键调出画框工具框住目标。在弹出的窗口中输入类别名称如apple点击OK。一张图标注完后按CtrlS保存然后按D键切换到下一张。创建类别文件 在my_dataset目录下创建一个名为data.yaml的文件。这个文件是YOLOv5的数据配置文件是连接你的数据和模型的桥梁。# my_dataset/data.yaml path: ../my_dataset # 数据集根目录的相对路径相对于yolov5代码目录 train: images/train # 训练集图片路径相对于path val: images/val # 验证集图片路径相对于path # test: images/test # 测试集可选 # 类别数量与名称 nc: 2 # 你的目标类别数量例如2苹果和香蕉 names: [apple, banana] # 类别名称列表顺序很重要索引0对应‘apple’1对应‘banana’重要提示names列表的顺序必须与你标注时使用的类别名称一致并且索引0, 1, 2...将作为模型内部的类别ID。后续所有预测结果中的类别数字都对应这里的索引。4.3 数据集划分与目录结构我们不能把所有数据都用来训练需要留出一部分不参与训练用于验证模型在“没见过”的数据上的表现防止过拟合。通常按70%训练20%验证10%测试或8:1:1的比例随机划分。你可以手动复制图片但更推荐写一个简单的Python脚本自动完成。最终你的数据集目录结构应该如下所示my_dataset/ ├── data.yaml # 数据配置文件 ├── images/ # 所有图片 │ ├── train/ # 训练集图片 │ │ ├── img1.jpg │ │ └── ... │ └── val/ # 验证集图片 │ ├── img2.jpg │ └── ... └── labels/ # 所有标签文件与images一一对应 ├── train/ │ ├── img1.txt │ └── ... └── val/ ├── img2.txt └── ...确保images/train里的每个jpg文件在labels/train里都有一个同名的txt文件。标签文件内容格式示例img1.txt0 0.5 0.5 0.3 0.4 1 0.7 0.3 0.2 0.2每一行代表一个目标。第一列是类别索引对应data.yaml中的names后面四个数字是归一化后的中心x坐标、中心y坐标、宽度、高度。5. 模型训练详解让学习过程运转起来数据准备好了环境也OK了现在可以开始最激动人心的环节——训练。5.1 理解训练命令与参数YOLOv5的训练入口是train.py。其核心参数并不多但每一个都至关重要。python train.py --img 640 --batch 16 --epochs 100 --data my_dataset/data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name my_first_train我们来拆解这些参数--img 640输入图片的尺寸。YOLOv5会统一将图片缩放到这个尺寸进行训练。更大的尺寸如1280可能提升精度但会显著增加显存消耗和训练时间。640是一个在速度和精度间取得良好平衡的常用值。--batch 16批大小。一次迭代送入模型多少张图片。越大训练越稳定速度可能越快但需要更多显存。如果出现“CUDA out of memory”错误首先尝试减小batch如改为8或4。--epochs 100训练轮数。整个训练集被完整遍历一次称为一个epoch。轮数太少模型学不够太多可能导致过拟合。100是一个常见的起点你可以根据验证集指标变化情况提前终止。--data my_dataset/data.yaml指向我们刚才创建的数据配置文件。--cfg models/yolov5s.yaml模型结构配置文件。我们选择yolov5s.yaml这是最小的模型训练快适合实验。如果你想追求更高精度可以选yolov5m.yaml或yolov5l.yaml但需要更长的训练时间和更大的显存。--weights yolov5s.pt初始权重文件。这里我们使用在COCO数据集上预训练过的yolov5s.pt。这是关键的一步称为迁移学习。模型已经具备了通用的物体检测能力边缘、纹理、形状等我们在此基础上针对自己的特定目标进行微调这比从零开始训练要快得多、好得多。--name my_first_train本次训练实验的名称。所有输出日志、模型权重、可视化结果都会保存在runs/train/my_first_train目录下。5.2 启动训练与监控在终端执行上述命令注意路径确保在yolov5代码根目录下并且data.yaml的路径正确。训练开始后你会看到类似下面的输出Starting training for 100 epochs... Epoch gpu_mem box obj cls labels img_size 0/99 2.1G 0.1xxx 0.0xxx 0.0xxx 16 640: 100%|██████████| 100/100 [01:2300:00, 1.20it/s] Class Images Labels P R mAP.5 mAP.5:.95: 100%|██████████| 10/10 [00:0500:00, 1.80it/s] all 100 500 0.xxx 0.xxx 0.xxx 0.xxxgpu_memGPU显存使用情况。box,obj,cls分别是边界框回归损失、目标性损失、分类损失。随着训练进行这些损失值应该总体呈下降趋势。P(Precision),R(Recall),mAP.5,mAP.5:.95这是在每个epoch结束后在验证集上计算的指标。它们是衡量模型性能的关键。精度Precision模型预测为正的样本中真正为正的比例。“查得准不准”。召回率Recall所有真实的正样本中被模型预测出来的比例。“查得全不全”。mAP.5在IoU交并比阈值为0.5时的平均精度均值。这是目标检测领域最核心的指标之一值越高越好。mAP.5:.95在IoU阈值从0.5到0.95步长0.05区间内mAP的平均值是更严格的指标。训练过程中YOLOv5会自动在runs/train/my_first_train目录下生成很多有用的文件weights/best.pt训练过程中在验证集上表现最好的权重文件。weights/last.pt最后一个epoch的权重文件。results.png损失和指标随epoch变化的曲线图是判断训练状态、是否过拟合/欠拟合的重要依据。confusion_matrix.png混淆矩阵可视化模型在各个类别上的分类错误情况。5.3 训练过程的心得与调参技巧耐心观察损失曲线训练初期损失下降很快是正常的。重点观察后期训练损失持续下降而验证损失开始上升或波动这可能是过拟合的迹象。此时可以考虑提前停止训练Early Stopping或者增加数据增强、使用更小的模型。关注mAP指标我们的最终目标是提升mAP。通常mAP会随着训练轮数增加而上升然后逐渐趋于平稳。当连续多个epoch的mAP不再显著提升时就可以考虑停止训练了。学习率与优化器YOLOv5默认使用SGD优化器并带有学习率热身Warmup和余弦退火Cosine Annealing调度。对于大多数情况默认设置工作得很好。如果你修改了模型大小或数据集可以微调初始学习率--lr0默认0.01。数据增强YOLOv5默认开启了强大的在线数据增强如 mosaic mixup 色彩抖动等这能极大提升模型的泛化能力。除非你有特殊原因例如医学影像对形变敏感否则不要关闭它。相关参数在data/hyps/hyp.scratch-low.yaml等配置文件中。显存不足怎么办如果遇到CUDA内存错误依次尝试减小--batch-size减小--img-size如从640到416使用更小的模型从s换成n使用梯度累积--accumulate例如--accumulate 2相当于有效batch size翻倍但显存占用不变。6. 模型评估与性能分析给你的模型打个分训练结束后我们得到了best.pt模型。但它到底有多好我们需要用验证集或者预留的测试集进行系统评估。6.1 使用val.py进行标准评估YOLOv5提供了专门的验证脚本val.py。使用它来计算我们在训练日志里看到的那些指标。python val.py --weights runs/train/my_first_train/weights/best.pt --data my_dataset/data.yaml --img 640 --batch 32 --task val --name my_evaluation--weights指定要评估的模型权重。--data同样的数据配置文件。--task val指定使用验证集进行评估。如果你有独立的测试集可以在data.yaml中指定test路径然后使用--task test。运行后你会得到一个详细的评估报告包括每个类别的精度、召回率、mAP以及整体的性能指标。同时它还会在runs/val/my_evaluation目录下生成可视化结果如预测框与真实框的对比图这对于定性分析模型错误非常有帮助。6.2 核心指标解读与问题诊断看评估报告要抓住几个关键点各类别mAP是否均衡如果“苹果”的mAP0.5有0.9而“香蕉”只有0.6说明模型对香蕉的检测能力较差。可能的原因有香蕉的样本数量不足、图片中香蕉的形态或背景过于单一、标注质量有问题。解决方法就是针对性地补充“困难样本”。精度P和召回率R的平衡高精度低召回说明模型很保守只对它非常确定的目标才进行预测漏检很多。高召回低精度说明模型很激进预测了很多框但其中误报把背景当目标也很多。你可以通过调整预测时的置信度阈值--conf-thres默认0.25来调整这个平衡。提高阈值会提升精度但降低召回反之亦然。查看混淆矩阵打开生成的confusion_matrix.png。对角线上的亮色表示分类正确。如果发现某个类别如类别1“香蕉”经常被误判为另一个类别如类别0“苹果”说明这两个类别在视觉上可能比较相似模型难以区分。你需要检查这两类物体的图片看看是否真的容易混淆并考虑收集更多有区分度的样本。6.3 过拟合与欠拟合的判断过拟合模型在训练集上表现极好损失很低精度很高但在验证集上表现很差。在results.png中表现为训练损失持续下降验证损失在某个点后开始上升。对策收集更多训练数据加强数据增强使用模型正则化技术如DropOut但YOLO结构已内置尝试更小的模型减少训练轮数早停。欠拟合模型在训练集和验证集上的表现都不好损失高精度低。在results.png中表现为训练损失和验证损失都下降得很慢或很早就停滞了。对策增加模型复杂度换用更大的YOLOv5模型如m或l减少数据增强如果增强过于激进可能破坏了原始信息增加训练轮数检查数据标注是否有大量错误。7. 模型推理与应用让你的模型“干活儿”模型评估合格后就可以投入实际使用了。YOLOv5的detect.py脚本让推理变得非常简单。7.1 对单张图片、批量图片、视频和摄像头进行检测# 检测单张图片 python detect.py --weights runs/train/my_first_train/weights/best.pt --source path/to/your/test_image.jpg --conf 0.5 # 检测一个文件夹下的所有图片 python detect.py --weights runs/train/my_first_train/weights/best.pt --source path/to/image_folder/ --conf 0.5 # 检测视频文件 python detect.py --weights runs/train/my_first_train/weights/best.pt --source path/to/video.mp4 --conf 0.5 # 使用摄像头默认摄像头索引为0 python detect.py --weights runs/train/my_first_train/weights/best.pt --source 0 --conf 0.5--weights指定训练好的模型。--source指定输入源可以是图片路径、文件夹路径、视频路径、摄像头索引、甚至是URL。--conf置信度阈值。高于此阈值的检测框才会被显示。你可以根据之前评估的精度-召回率情况调整这个值。如果误报多就调高如0.6如果漏检多就调低如0.3。--save-txt加上这个参数会将检测结果类别、坐标保存为YOLO格式的txt文件便于后续分析。--save-conf保存结果时同时保存每个检测框的置信度。检测结果默认会保存在runs/detect/exp或exp2,exp3...目录下。图片和视频上会画出检测框并标出类别和置信度。7.2 推理结果解析与后处理detect.py运行后除了保存可视化图像还会在终端打印检测结果摘要。对于更程序化的应用你通常需要直接获取检测框数据。这时最好的方式是直接调用YOLOv5的模型API而不是通过命令行脚本。下面是一个简单的Python示例import torch import cv2 # 加载自定义模型 model torch.hub.load(ultralytics/yolov5, custom, pathruns/train/my_first_train/weights/best.pt, force_reloadTrue) # 或者使用本地代码 # from models.experimental import attempt_load # model attempt_load(runs/train/my_first_train/weights/best.pt) # 设置模型参数 model.conf 0.5 # 置信度阈值 model.iou 0.45 # NMS的IoU阈值 # 读取图片 img cv2.imread(path/to/your/image.jpg) # 进行推理 results model(img) # 解析结果 predictions results.pandas().xyxy[0] # 转换为Pandas DataFrame格式为 (xmin, ymin, xmax, ymax, confidence, class, name) print(predictions) # 遍历每一个检测到的目标 for index, row in predictions.iterrows(): x1, y1, x2, y2 int(row[xmin]), int(row[ymin]), int(row[xmax]), int(row[ymax]) confidence row[confidence] class_name row[name] print(fDetected {class_name} with confidence {confidence:.2f} at [{x1}, {y1}, {x2}, {y2}]) # 你可以在这里画框或者将坐标信息发送给其他程序 # 直接显示带结果的结果图片 results.show() # 或者保存 results.save(output.jpg)这段代码展示了如何加载模型、设置参数、进行推理并获取结构化的检测结果。results.xyxy[0]返回的是一个Tensor而results.pandas().xyxy[0]将其转为更易处理的DataFrame。你可以轻松地集成这个流程到你的Python项目中。8. 常见问题与避坑指南实录在实际操作中你几乎一定会遇到一些问题。这里我整理了一些最常见的问题和解决方法这些都是我踩过坑后总结的经验。8.1 环境与依赖问题问题ImportError: libGL.so.1: cannot open shared object file(Linux)原因OpenCV的GUI依赖库缺失。解决安装系统库sudo apt-get update sudo apt-get install libgl1-mesa-glx。问题训练时出现CUDA out of memory原因批处理大小或图片尺寸太大超出GPU显存。解决减小--batch-size如从16降到8。减小--img-size如从640降到416。使用更小的模型从yolov5s.yaml换成yolov5n.yaml。使用梯度累积--accumulate 2这会在内部累积2个批次的梯度再更新一次权重模拟更大的batch size但显存占用不变。在train.py中尝试启用--multi-scale训练但这对显存帮助有限。问题ModuleNotFoundError: No module named ‘torch’或其他包找不到原因没有在正确的conda虚拟环境中或者依赖没有安装完整。解决确保已使用conda activate yolov5激活环境并重新运行pip install -r requirements.txt。8.2 数据与训练问题问题训练时损失loss为NaN或突然变得巨大原因学习率设置过高。这是最常见的原因。数据标注有严重错误例如坐标超出了[0,1]的范围。数据集中存在损坏的图片文件。解决尝试大幅降低学习率--lr0例如从0.01降到0.001。仔细检查你的标签文件.txt确保所有坐标值都在0到1之间。写个脚本批量检查。检查图片文件是否能正常打开。可以用OpenCV批量读取一下。问题训练了很久mAP一直很低比如低于0.3原因数据量太少模型学不到有效特征。数据标注质量差框不准或类别标错。类别不平衡某个类别的样本极少。选择的预训练权重与任务差异太大但用COCO预训练权重做下游任务通常没问题。解决增加每个类别的数据量至少几百张。重新审查和修正标注特别是边界框是否紧密贴合目标。对样本少的类别进行过采样或者使用数据增强专门为这些类别生成更多样本。可以尝试从零开始训练--weights ‘’但需要更多数据和epoch且效果通常不如迁移学习。问题模型预测时置信度普遍很低原因训练可能不充分或者训练数据和测试数据分布差异太大例如训练集是白天的图测试集是夜晚的图。解决增加训练轮数--epochs。检查并确保训练时数据增强是开启的默认是开的这能提升模型鲁棒性。收集与测试环境更接近的训练数据。8.3 推理与应用问题问题检测速度很慢原因使用了过大的模型如yolov5x.pt。推理图片尺寸--img-size设置得过大。在CPU上运行。解决换用更小的模型s或n。减小推理尺寸如--img 416。注意训练和推理的尺寸可以不同但性能可能会轻微下降。确保PyTorch安装了CUDA版本并且推理时在使用GPU。在代码中可以通过model.to(‘cuda’)将模型放到GPU上。问题同一个目标被重复检测出多个框原因非极大值抑制NMS的阈值--iou-thres设置得过高。解决NMS用于合并重叠的框。默认值是0.45。如果同一个目标出现多个框可以适当降低这个值如0.3让合并更激进。在detect.py中使用--iou 0.3。训练自己的YOLOv5模型就像完成一个精密的实验每一步的细节都影响着最终的结果。从环境配置的小心翼翼到数据标注的枯燥繁琐再到看到损失曲线下降、mAP上升时的兴奋最后到模型成功识别出目标的成就感这个过程本身就是对AI应用最生动的理解。我个人的体会是前期数据工作的质量决定了模型性能的上限而耐心的调参和问题排查则是达到这个上限的保证。不要害怕出错终端里红色的报错信息是你最好的老师也不要迷信参数多动手实验用验证集指标说话。当你跑通整个流程后你会发现让AI“看见”并“理解”你的世界并没有想象中那么遥远。