1. 项目概述:为什么YOLOv5依然是目标检测的“硬通货”?

如果你这两年稍微关注过计算机视觉,尤其是目标检测领域,那“YOLOv5”这个名字你一定不陌生。它可能不是你听说过的第一个YOLO版本,但绝对是近年来在工业界和学术界被讨论、应用、魔改得最多的版本之一。从最初的争议到如今的广泛认可,YOLOv5已经从一个“非官方”的PyTorch实现,演变成了一个集成了数据增强、模型训练、模型导出、性能评估的完整目标检测工具箱。很多人第一次接触目标检测项目,就是从下载YOLOv5的代码仓库、跑通官方的COCO数据集预训练模型开始的。

那么,YOLOv5到底强在哪里?为什么在YOLOv7、v8甚至v9、v10相继推出的今天,依然有大量开发者,尤其是在嵌入式平台(如你搜索词里的RV1106、RK3568)上部署时,首选或者绕不开YOLOv5?核心原因在于它的 工程化友好度 生态成熟度 。它不仅仅是一个算法,更是一套标准化的流程。从准备数据集的YOLO格式标注,到使用超参数文件进行训练,再到导出为ONNX、TensorRT等格式进行部署,YOLOv5提供了一条清晰、可复现的路径。这对于需要快速验证想法、将算法落地到实际产品的工程师来说,价值巨大。

本文将带你深入YOLOv5网络的内部,不仅会拆解其Backbone、Neck、Head的结构,更会结合大量实际部署(包括你关心的RV1106、RK3568等边缘设备)和训练调参的经验,告诉你每个模块设计的意图、训练中常见的“坑”(比如训练map总是0),以及如何根据你的需求(比如训练单通道图像)进行定制化修改。无论你是刚入门的新手,还是正在为模型部署发愁的工程师,都能从中找到可直接操作的干货。

2. YOLOv5网络架构深度拆解

YOLOv5的整体架构延续了YOLO系列的一贯思想: “You Only Look Once” ,即单阶段检测。其网络可以清晰地分为三个部分: Backbone(骨干网络) Neck(颈部) Head(检测头) 。这种划分使得网络功能模块化,便于理解和修改。

2.1 Backbone:CSPDarknet与Focus模块的演进

YOLOv5的Backbone名为CSPDarknet,它是YOLOv4中CSPNet与Darknet53思想的结合与优化。其核心目标是高效地提取图像的多尺度特征。

CSP结构(Cross Stage Partial Network) 是这里的精髓。简单来说,它将特征图在通道维度上分成两部分,一部分经过一个密集的卷积块(通常是多个卷积层),另一部分则直接通过一个捷径(shortcut)连接。最后再将两部分合并。这样做的最大好处是 在保持甚至提升精度的同时,大幅减少计算量和参数量 ,并且减轻了梯度消失问题,让网络更容易训练。你可以把它想象成一条主干道分出了一条辅路,大部分车流走复杂的辅路去处理“难题”,小部分车流直接走主干道保持“信息通畅”,最后在出口汇合,既高效又全面。

在YOLOv5 v6.0版本之前,网络入口使用了一个颇具争议的 Focus模块 。这个模块的操作很巧妙:它将输入图像每个2x2的邻域像素取出来,拼接成一个4倍通道数的特征图。例如,一张640x640x3的图片,经过Focus模块后,会变成320x320x12的特征图,然后再通过一个卷积层调整通道数。这相当于一种无参数的“空间到深度”的变换,目的是在不丢失信息的情况下,进行下采样并增加通道数,为后续卷积提供更丰富的特征表示。不过,由于某些硬件或推理框架对这种特殊的切片操作支持不佳,在v6.0及之后的版本中,Focus模块被一个标准的 6x6卷积层(stride=2) 所替代,实现了相同的下采样效果,但兼容性更好。如果你在较老的代码或教程中看到Focus,需要知道这个变化。

Backbone中大量使用了 C3模块 (在v5.0版本中是BottleneckCSP模块)。一个C3模块由多个标准的卷积层和Bottleneck残差结构构成,并应用了前文提到的CSP思想。它是构建深度网络的基础块,负责在多个尺度上深化特征提取。

2.2 Neck:FPN+PAN的强强联合

Neck部分的任务是融合Backbone提取的不同层次的特征。低层特征分辨率高,包含丰富的细节信息(如边缘、纹理),有利于检测小物体;高层特征分辨率低,但语义信息强,有利于识别物体的类别和大致位置。YOLOv5的Neck采用了 FPN(Feature Pyramid Network)与PAN(Path Aggregation Network)结合的结构

FPN是自上而下的融合 :它将深层的高语义特征通过上采样,与浅层的细节特征进行逐元素相加(add)或拼接(concat),从而将语义信息“传递”到浅层,提升浅层特征的语义表达能力。

PAN是自下而上的融合 :在FPN的基础上,PAN再将融合后的浅层特征通过下采样,与深层特征进行二次融合。这样,深层特征也能获得更精确的定位信息。

这种 双向(自上而下+自下而上)的特征金字塔 结构,使得网络在各个尺度上都能同时拥有强语义和精定位信息,显著提升了模型对不同大小目标的检测能力,尤其是改善了小目标的检测效果。在代码中,这体现为一系列包含上采样、下采样和Concat操作的结构。

2.3 Head:解耦头与Anchor-Based机制

YOLOv5的Head负责输出最终的检测结果。在v5.0-v5.3版本中,它采用 耦合头(Coupled Head) ,即同一个卷积层同时预测类别概率和边界框坐标。而从v6.0版本开始,YOLOv5借鉴了YOLOX等工作的思想,引入了 解耦头(Decoupled Head)

解耦头将分类任务和回归任务分离开 ,使用两个独立的并行分支来分别处理。这样做的好处是让两个任务互不干扰,实践表明,解耦头通常能带来精度的小幅提升,并且更便于后续的模型部署和优化。

Head的预测是基于 Anchor(锚框) 的。YOLOv5继承了YOLOv2以来的Anchor机制,但有一个重要的改进: 自适应锚框计算 。在训练开始前,YOLOv5会对你提供的训练集标注框进行K-means聚类,自动计算出9组(针对3种不同尺度特征图)最匹配你数据集的Anchor尺寸。你不再需要手动去COCO数据集上找一组Anchor,然后硬套在自己的数据上,这大大提升了模型在你特定数据集上的收敛速度和最终精度。运行训练脚本时看到的“AutoAnchor: Running kmeans for 9 anchors on 2135 points...”就是这个过程。

Head最终会在三个不同尺度的特征图上进行预测(例如,80x80, 40x40, 20x20,对应输入640x640),分别负责检测小、中、大物体。每个预测位置会对应3个Anchor,每个Anchor会输出一个预测结果向量,通常包含:边界框中心点偏移量(tx, ty)、宽高缩放量(tw, th)、该框包含物体的置信度(objectness score)、以及各个类别的条件概率。

3. 从零开始:YOLOv5环境配置与数据准备实战

理论清晰之后,动手实践才是关键。很多人在第一步——环境安装和数据准备上就会遇到各种问题,导致“从入门到放弃”。这里,我将结合最常见的坑,给你一个清晰的路线图。

3.1 安装步骤详解与避坑指南

官方推荐使用Python>=3.8和PyTorch>=1.7。我的建议是,为了稳定性,尽量使用较新的、但非最新的版本组合,例如Python 3.8/3.9 + PyTorch 1.12/1.13。

# 1. 克隆仓库(建议使用国内镜像或指定分支,master分支可能包含最新但不稳定的改动)
git clone https://github.com/ultralytics/yolov5.git
cd yolov5

# 2. 创建并激活虚拟环境(强烈推荐,避免包冲突)
conda create -n yolov5 python=3.9
conda activate yolov5

# 3. 安装PyTorch(核心步骤,最容易出错)
# 先去PyTorch官网(https://pytorch.org/get-started/locally/)根据你的CUDA版本选择命令。
# 如果你没有NVIDIA GPU或CUDA,就选择CPU版本。
# 例如,对于CUDA 11.6:
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu116

# 4. 安装YOLOv5依赖
pip install -r requirements.txt

注意 requirements.txt 里的 opencv-python 在某些系统上可能安装失败,可以尝试 pip install opencv-python-headless ,这是一个不包含GUI功能的轻量版本,对于服务器部署更友好。另外,如果遇到PyTorch安装慢或失败,可以尝试使用清华、阿里云等镜像源。

安装完成后,强烈建议运行一下官方提供的快速验证脚本,确保一切正常:

python detect.py --weights yolov5s.pt --source data/images/

这个命令会下载最小的预训练模型 yolov5s.pt ,并对 data/images 文件夹下的示例图片进行推理。如果能看到输出图片并在控制台看到检测结果,说明安装成功。

3.2 训练自己的数据集:格式、脚本与技巧

YOLOv5要求的数据标注格式是 YOLO格式 .txt 文件。每个图像对应一个同名的txt文件,内容如下:

<class_id> <x_center> <y_center> <width> <height>

所有坐标值都是归一化后的 ,即相对于图像宽度和高度的比例,范围在0到1之间。

假设一张图片 img001.jpg 的尺寸是 640x480,上面有一个标注框,其左上角坐标为 (100, 120),宽高为 (200, 150),类别为“狗”(假设 class_id 为 0)。那么计算过程如下:

  • x_center = (100 + 200/2) / 640 = 0.234375
  • y_center = (120 + 150/2) / 480 = 0.3125
  • width = 200 / 640 = 0.3125
  • height = 150 / 480 = 0.3125 所以 img001.txt 的内容就是一行: 0 0.234375 0.3125 0.3125 0.3125

数据集的目录结构应如下所示:

datasets/
├── your_custom_dataset/
│   ├── images/
│   │   ├── train/
│   │   │   ├── img001.jpg
│   │   │   └── ...
│   │   └── val/
│   │       ├── img100.jpg
│   │       └── ...
│   └── labels/
│       ├── train/
│       │   ├── img001.txt
│       │   └── ...
│       └── val/
│           ├── img100.txt
│           └── ...

接下来,你需要创建一个数据集配置文件,例如 your_dataset.yaml ,放在 yolov5/data/ 目录下:

# 数据集路径(可以是绝对路径,也可以是相对于yolov5根目录的相对路径)
path: ../datasets/your_custom_dataset
# 训练集和验证集的图像目录(相对于上面的path)
train: images/train
val: images/val

# 类别数量
nc: 2  # 例如,猫和狗,就是2类

# 类别名称列表
names: ['cat', 'dog']

现在,你可以开始训练了。基础训练命令如下:

python train.py --img 640 --batch 16 --epochs 100 --data data/your_dataset.yaml --weights yolov5s.pt
  • --img 640 : 输入图像尺寸,默认是正方形。你可以根据你的数据集和目标大小调整,如 --img 416
  • --batch 16 : 批次大小。这个值受你的GPU显存限制。如果出现“CUDA out of memory”错误,就减小 --batch ,或者尝试使用 --batch-size (更细粒度控制)。
  • --epochs 100 : 训练轮数。
  • --data : 指向你刚创建的数据集配置文件。
  • --weights yolov5s.pt : 使用预训练权重进行迁移学习,这能极大加速收敛并提升最终精度。 yolov5s.pt 是最小的模型,还有 yolov5m.pt , yolov5l.pt , yolov5x.pt ,模型容量和精度依次增加,但速度变慢。

4. 超参数解析与调优实战:告别“map总是0”

训练启动后,最让人沮丧的莫过于看着损失曲线波动,但最后的mAP(平均精度)始终是0。这往往是数据、参数或训练过程出了问题。我们来逐一排查。

4.1 核心超参数详解

YOLOv5的超参数定义在 data/hyps/hyp.scratch-*.yaml (从头训练)和 data/hyps/hyp.finetune.yaml (微调)等文件中。理解它们对调优至关重要。

  1. 学习率(lr0, lrf) :

    • lr0 : 初始学习率。这是最重要的参数之一。太大容易震荡不收敛,太小则收敛慢。对于微调,通常从 0.01 0.001 开始尝试;对于小数据集,甚至可以从 0.0001 开始。
    • lrf : 最终学习率因子。最终学习率 = lr0 * lrf 。它定义了学习率衰减的程度。 lrf=0.01 意味着最终学习率是初始的1%。
  2. 动量(momentum)与权重衰减(weight_decay) :

    • momentum : 通常设为0.937,帮助优化器加速收敛并冲出局部最小值,一般不需改动。
    • weight_decay : 正则化参数,防止过拟合。默认 0.0005 。如果你的数据集很小,可以适当增大(如 0.001 );如果数据集很大,可以减小。
  3. 数据增强相关 :

    • hsv_h , hsv_s , hsv_v : HSV颜色空间增强的幅度。随机调整图像的色调、饱和度和明度,增加数据多样性。
    • degrees , translate , scale , shear : 几何增强参数,分别是旋转角度、平移比例、缩放比例和剪切比例。这些对于提升模型鲁棒性非常有效,但对于一些方向敏感的场景(如文字检测),需要调小 degrees shear
    • mosaic : 马赛克增强开关。默认开启( mosaic=1.0 )。它会将四张图片拼成一张进行训练,极大地丰富了背景和小物体上下文。 如果你的数据集目标很大,或者拼接后会导致目标变形严重,可以考虑在训练后期关闭(通过 --cos-lr 配合 close_mosaic=10 参数,表示最后10个epoch关闭mosaic)

4.2 “训练map总是0”的排查清单

当你的mAP为0时,请按以下顺序检查:

  1. 检查数据标注 :这是最常见的原因。用可视化脚本检查你的标注框是否画对了。YOLOv5提供了 utils/plots.py 中的函数,或者你可以直接运行:

    python train.py --data your_dataset.yaml --weights yolov5s.pt --epochs 1 --batch-size 1
    

    训练一个epoch,在 runs/train/exp 目录下会生成一个 train_batch*.jpg 文件,里面显示了数据增强后、带标注框的图片。 仔细看,框的位置和类别对吗? 常见错误有:坐标未归一化、类别ID超出范围(比如你只有2类,但标注了 class_id=2 )、标注文件与图片不对应等。

  2. 检查数据集配置文件(.yaml) :确保 path train val 路径正确无误。一个快速验证的方法是,在Python中加载这个yaml文件,并打印出找到的图片数量。路径错误会导致模型在“空数据”上训练。

  3. 检查类别不平衡 :如果你的某个类别样本极少,模型可能很难学会。查看 labels 文件夹下所有txt文件,统计每个类别的出现次数。如果严重不平衡,可以考虑使用 类别权重(class weights) 。YOLOv5默认是开启类别权重的(通过 --cls_pw 参数,默认值可能因版本而异),它会根据类别频率自动调整损失函数中的分类权重。你也可以在训练命令中显式设置 --cls_pw 1.0 来尝试。

  4. 降低学习率 :这是解决“损失下降但mAP为0”的常用手段。预训练模型是在大数据集上训练的,其权重已经在一个较好的位置。用太大的学习率微调,可能会“冲垮”这些已有知识。尝试将 lr0 从默认的 0.01 降到 0.001 甚至 0.0001

  5. 关闭复杂的数据增强 :特别是 mosaic mixup 。对于非常规尺寸目标或小数据集,过于激进的数据增强可能会让模型“学懵”。在 hyp.finetune.yaml 中,将 mosaic 设为 0 mixup 设为 0 ,先让模型在“正常”的图片上学会基础特征。

  6. 检查Anchor是否匹配 :虽然YOLOv5有自动计算Anchor的功能,但如果你的目标尺寸非常特殊(比如所有目标都是极细长的条状),自动计算的Anchor可能仍然不理想。训练日志里会打印出计算出的Anchor和最佳可能召回率(Best Possible Recall, BPR)。如果BPR低于0.98,说明Anchor匹配度不高。你可以考虑:

    • 使用 --noautoanchor 参数禁用自动Anchor,使用默认Anchor训练看看。
    • 自己运行K-means聚类算法,生成更适合你数据集的Anchor尺寸,然后修改模型配置文件( .yaml )中的 anchors 参数。
  7. 从更小的模型开始 :如果使用 yolov5x.pt 不收敛,可以尝试用 yolov5s.pt 。小模型参数少,更容易优化,虽然最终精度可能低点,但至少能验证流程是否正确。

5. 特殊场景与高级技巧:单通道图像与嵌入式部署

5.1 训练单通道(灰度)图像

YOLOv5默认输入是3通道(RGB)图像。如果你的数据是灰度图,直接输入会导致维度不匹配。你需要修改两个地方:

  1. 修改模型配置文件 :以 yolov5s.yaml 为例,找到第一层卷积的定义:

    # YOLOv5 v6.0 backbone
    backbone:
      # [from, number, module, args]
      [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
       ...
      ]
    

    初始的 Conv 层(对应替换掉Focus的那个6x6卷积)的输入通道数由 args 列表的第一个数字 64 前面的默认值(3)决定。你需要修改网络深度( nc )和宽度( depth_multiple , width_multiple )参数之后,增加一个 channels 参数,或者直接修改源码。更简单的方法是 在数据加载时,将灰度图复制成3通道 。这不会损失信息,因为卷积核会学习到三个通道的权重是相同的。这是最常用且省事的做法。

    dataset.py LoadImagesAndLabels 类中,图像读取后(通常是 cv2.imread ),如果是单通道,可以 img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) 。或者,在你准备数据集时,就提前将灰度图转换成3通道的“伪RGB”图。

  2. 修改预训练权重加载逻辑(可选) :如果你使用RGB预训练模型(如 yolov5s.pt )来微调灰度任务,第一层卷积核的维度不匹配(预训练是3通道输入,你现在是1通道)。常见的处理方式是 随机初始化第一层卷积核,或者将预训练权重中3通道的均值作为新1通道的权重 。但更推荐上述“灰度转伪RGB”的方法,因为它无需修改模型结构,能完全利用预训练知识。

5.2 在嵌入式平台部署:RK3568与RV1106实战要点

将YOLOv5部署到RK3568(瑞芯微)或RV1106(瑞星微)这类边缘计算芯片上,是当前的热门需求。核心流程是: PyTorch训练 -> ONNX导出 -> 芯片厂商工具链转换(如RKNN、RV工具链) -> 板上推理

步骤一:导出ONNX模型 首先,你需要一个训练好的 .pt 模型文件。使用YOLOv5自带的导出脚本:

python export.py --weights runs/train/exp/weights/best.pt --include onnx --img 640 --batch 1 --dynamic
  • --include onnx : 指定导出为ONNX格式。
  • --img 640 : 指定输入尺寸,必须与训练和部署时一致。
  • --batch 1 : 指定批次为1,很多嵌入式推理框架只支持batch=1。
  • --dynamic : 导出动态尺寸的ONNX模型(输入尺寸可以在一定范围内变化)。如果确定是固定尺寸(如640x640),可以不加此参数,性能可能更优。

步骤二:使用厂商工具链转换 这是最易出错的环节,因为不同芯片的NPU(神经网络处理单元)指令集和内存结构不同。

  • 对于RK3568(使用RKNN Toolkit) :

    1. 安装RKNN Toolkit(通常由厂商提供Python包)。
    2. 编写转换脚本,加载ONNX模型,进行量化(INT8量化能极大提升速度并降低功耗,但会轻微损失精度),生成 .rknn 模型文件。
    3. 关键点: 注意预处理和后处理 。YOLOv5的输入需要归一化( /255.0 ),输出需要经过非极大值抑制(NMS)。你需要确认这个预处理是在模型内部(即导出ONNX时已包含)还是需要在推理代码中手动完成。通常,为了部署简便,我们希望在模型内部完成预处理(减均值、除标准差)。可以在 export.py 时通过 --simplify --opset 版本尝试,或者使用RKNN Toolkit提供的预处理参数配置。
  • 对于RV1106 : 流程类似,但使用的是RV1106配套的AI工具链(如Rock-X SDK或厂商自定义的工具)。需要特别注意:

    1. 模型简化 :RV1106算力和内存更有限。可能需要选择更小的模型(如 yolov5n 或自定义的剪枝版 yolov5s )。
    2. 输入尺寸 :可能不支持太大的输入(如640x640),需要尝试更小的尺寸(如320x320, 416x416),这需要重新训练或使用动态尺寸导出。
    3. 算子支持 :确认工具链是否支持ONNX模型中的所有算子(如 Resize (上采样)、 Slice 等)。不支持的需要在导出前修改网络结构或用支持的操作替换。

部署通用技巧

  • 精度验证 :在PC上,用ONNX Runtime加载导出的ONNX模型,对同一张图片进行推理,对比结果与PyTorch原始模型的结果是否一致(允许微小误差)。这是确保导出过程无误的关键一步。
  • 性能分析 :在板端部署后,使用工具链提供的性能分析功能,查看每一层的耗时。瓶颈可能出现在某些特定算子(如大尺寸的卷积)或数据搬运上。针对性地优化(如调整网络结构、使用更高效的算子实现)。
  • 内存优化 :嵌入式设备内存紧张。确保你的模型在量化后,中间激活层的内存占用不会超出限制。有时需要降低输入分辨率或减少网络宽度/深度。

6. 模型训练监控、评估与结果分析

训练不是一蹴而就的,你需要像看仪表盘一样监控整个过程,并在结束后客观评估模型好坏。

6.1 训练过程监控

启动训练后,YOLOv5会在终端打印日志,并在 runs/train/exp (每次训练会新建一个如 exp2 , exp3 的目录)文件夹下生成一系列可视化文件,最重要的有:

  • 损失曲线(loss.png) :包含 box_loss , obj_loss , cls_loss 。理想情况下,它们应该平滑下降并最终趋于平缓。如果 box_loss cls_loss 剧烈震荡或上升,可能是学习率太大或数据有问题。如果 obj_loss (物体置信度损失)一直很高,可能是Anchor匹配度差或背景中有很多类似目标的干扰。
  • 评估指标曲线(metrics.png) :主要看 precision (精确率)和 recall (召回率)曲线。我们希望两者都高。如果 precision 高但 recall 低,说明模型很保守,只检测它非常确信的目标,漏检多;反之,则误检多。训练后期,两者应达到一个平衡。
  • 混淆矩阵(confusion_matrix.png) :查看类别间的误检情况。理想情况下,对角线(正确分类)应该最亮。如果某些类别容易被混淆(例如“猫”和“狗”),说明这些类别在特征上比较接近,可能需要更多数据或数据增强。

6.2 模型评估与mAP解读

训练结束后,模型的最佳权重(默认是 best.pt ,基于mAP@0.5:0.95指标)和最后权重( last.pt )会保存在 weights 文件夹下。使用以下命令在验证集上评估模型:

python val.py --weights runs/train/exp/weights/best.pt --data data/your_dataset.yaml --img 640 --task val

关键的输出指标是 mAP(mean Average Precision)

  • mAP@0.5 :IoU(交并比)阈值为0.5时的平均精度。这是最常用的指标,衡量模型在宽松阈值下的检测能力。
  • mAP@0.5:0.95 :IoU阈值从0.5到0.95,步长0.05,共10个阈值下mAP的平均值。这个指标更严格,衡量模型定位的精确度。

一份好的评估报告还会给出每个类别的AP(Average Precision),帮助你发现哪些类别是模型的短板。

6.3 模型测试与推理优化

得到满意的模型后,就可以用它来预测新图片或视频了:

python detect.py --weights runs/train/exp/weights/best.pt --source your_image_or_video_path --conf 0.25 --iou 0.45
  • --conf : 置信度阈值。高于此值的检测框才会被保留。根据你的应用场景调整:需要高召回率(宁可错杀,不可放过)就调低(如0.1);需要高精确率(确保检测到的都是对的)就调高(如0.5)。
  • --iou : NMS用的IoU阈值。用于合并重叠的检测框。值越小,合并越严格,留下的框越少。

对于部署,你可能会关心推理速度(FPS)。使用 --half 参数可以启用FP16半精度推理,在支持Tensor Core的GPU上能显著提升速度,且精度损失很小。

python detect.py --weights best.pt --source data/images --half

7. 进阶话题与未来展望

掌握了以上内容,你已经可以解决YOLOv5项目中90%的问题。如果你想更进一步,这里有一些方向:

  1. 模型轻量化与剪枝 :对于嵌入式部署,模型大小和速度至关重要。可以探索:

    • 知识蒸馏 :用一个大模型(教师)指导一个小模型(学生)训练,让小模型获得接近大模型的性能。
    • 通道剪枝 :识别并剪掉网络中不重要的通道,减少计算量和参数。有一些开源工具如 torch-pruning 可以尝试。
    • 使用更高效的网络结构 :将YOLOv5的Backbone替换为MobileNetV3、ShuffleNetV2等轻量级网络,但这通常需要重新设计Neck和Head的通道数来匹配。
  2. 自定义数据增强 :YOLOv5支持丰富的数据增强,你还可以在 dataset.py 中自定义增强策略。例如,对于遮挡严重的场景,可以增加随机擦除(Random Erasing);对于光照变化的场景,可以增加更复杂的颜色抖动。

  3. 损失函数改进 :YOLOv5默认使用CIoU Loss。你可以尝试替换为更先进的损失函数,如Alpha-IoU、SIoU等,这些可能在你的特定数据集上有更好的边界框回归效果。这需要修改 utils/loss.py 文件。

  4. 关注社区与后续版本 :Ultralytics团队一直在更新YOLOv5,并推出了YOLOv8。YOLOv8在易用性、速度和精度上又有提升,并且原生支持了实例分割、姿态估计等任务。虽然YOLOv5的生态和稳定性目前仍是巨大优势,但了解v8的新特性(如无Anchor机制、更简洁的架构)对于技术选型很有帮助。不过,对于许多已部署的项目和边缘设备,由于其工具链和生态的成熟度,YOLOv5在未来一段时间内仍将是主流选择之一。

从我个人的多次部署经验来看,YOLOv5的成功不在于它是最先进的算法,而在于它提供了一个极其稳健、可复现、文档齐全的工程框架。它降低了目标检测的应用门槛,让开发者能更专注于解决业务问题本身。当你吃透了它的网络结构、数据流和配置哲学,再去学习或迁移到其他任何视觉模型,都会感到事半功倍。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐