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或CMD,Linux/macOS用终端),执行以下命令:
# 创建一个名为yolov5的Python环境,指定Python版本为3.8(3.7-3.10都行,3.8最兼容) conda create -n yolov5 python=3.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安装命令可能不包含CUDA(GPU支持)。如果你有NVIDIA显卡并希望使用GPU加速训练(这能快几十倍),你需要根据你的CUDA版本手动安装PyTorch。可以先运行nvidia-smi查看CUDA版本,然后去 PyTorch官网 获取对应的安装命令。例如,对于CUDA 11.8:pip 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。 - 一张图标注完后,按
Ctrl+S保存,然后按D键切换到下一张。
- 打开LabelImg,点击“Open Dir”选择你的图片目录(
创建类别文件: 在
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.txt):
0 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:23<00:00, 1.20it/s] Class Images Labels P R mAP@.5 mAP@.5:.95: 100%|██████████| 10/10 [00:05<00:00, 1.80it/s] all 100 500 0.xxx 0.xxx 0.xxx 0.xxxgpu_mem:GPU显存使用情况。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是否均衡?如果“苹果”的mAP@0.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', path='runs/train/my_first_train/weights/best.pt', force_reload=True) # 或者使用本地代码 # 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(f"Detected {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。
- 原因:非极大值抑制(NMS)的阈值
训练自己的YOLOv5模型就像完成一个精密的实验,每一步的细节都影响着最终的结果。从环境配置的小心翼翼,到数据标注的枯燥繁琐,再到看到损失曲线下降、mAP上升时的兴奋,最后到模型成功识别出目标的成就感,这个过程本身就是对AI应用最生动的理解。我个人的体会是,前期数据工作的质量决定了模型性能的上限,而耐心的调参和问题排查则是达到这个上限的保证。不要害怕出错,终端里红色的报错信息是你最好的老师;也不要迷信参数,多动手实验,用验证集指标说话。当你跑通整个流程后,你会发现,让AI“看见”并“理解”你的世界,并没有想象中那么遥远。