⭐深度学习之目标检测yolo算法Ⅲ-YOLOv5(1)

前言:

经过之前几个版本的yolo学习总结,这一章我用来总结YOLOv5中理论相关的知识,逐步来深入的总结经典版本之一的YOLOv5。

yolo系列的算法发展脉络

  • YOLOv1:首次提出 "端到端" 目标检测,将目标检测转化为回归问题,速度极快,但小目标检测效果差、定位精度低。
  • YOLOv2:引入锚框(Anchor Box)、批量归一化(BN)、高分辨率预训练,提升了检测精度和稳定性。
  • YOLOv3:采用 Darknet-53 骨干网络、多尺度检测、分类损失使用交叉熵,大幅提升小目标检测效果。
  • YOLOv4:引入 CSPNet、Mosaic 数据增强、CIoU 损失、自注意力机制,在精度和速度上实现平衡。
  • YOLOv5:基于 YOLOv4 优化,采用更轻量的骨干网络、自适应锚框计算、自适应图片缩放,同时支持快速部署,生态更完善(是目前工业界应用最广泛的 YOLO 版本之一)。

1.YOLOv5的网络架构

我在网上对比了很多YOLOv5的网络 架构,最终发现这几张能够清楚明白的展现YOLOv5的核心架构

17/20/23三个头的输出层数

⭐此处感谢(@酒酿小圆子~,@K同学啊)

(如有侵权请留言)

首先我们得清楚整个训练流程和推理流程,我们所说的网络架构其实就是前向传播中的网络架构如下图。

基于上述图形化的架构可以让我们对整个YOLOv5模型有更清晰的认知,接下来我将按照YOLOv5的整体网络架构剖析为以下几个部分。

训练阶段:

数据加载与预处理 → [Backbone→Neck→Head](前向传播,输出预测张量) → 正负样本匹配 (阈值 1) → 解码(仅正样本) → 混合损失计算(CIoU Loss + BCE Loss) → 反向传播 & 优化器更新权重 → 模型评估 & 保存 pt 权重文件

推理阶段:

输入图像预处理(无数据增强 + 自适应黑边缩放 + 转张量归一化) → 加载pt权重文件构建模型 → 前向传播输出预测张量 → 解码(预测张量转边界框坐标) → 置信度过滤(阈值2) → 类别的非极大值抑制(NMS)(阈值3) → 边界框坐标还原到原图尺寸 → 输出检测结果

⭐⭐⭐

阈值1:阈值 1 是锚框与标签框的 IOU 匹配阈值(YOLOv5 默认正样本 IOU 阈值约 0.5),用来区分正负样本。

阈值 2(置信度阈值):默认 0.25,过滤掉置信度低的预测框,减少无效计算;

阈值 3(NMS 的 IOU 阈值):默认 0.45,过滤同一目标的重复框;

IOU的使用:

  • IOU 及其优化版本是目标检测中边界框回归的核心,既用于训练阶段的损失计算
  • 推理阶段用于推理阶段的 NMS 后处理。

我们按提出顺序 + 优化逻辑梳理,核心是解决基础 IOU 的痛点:

指标 核心计算逻辑 解决的痛点 优缺点总结
基础 IOU 无,是所有优化版本的基础 ✅ 计算简单;❌ 框不重叠时 IOU=0,损失梯度为 0,模型无法学习;❌ 不考虑框的位置关系(如包含、分离)
GIoU 解决「框不重叠时梯度为 0」的问题,引入最小外接矩形的惩罚项 ✅ 框不重叠时仍能计算损失;❌ 当预测框被真实框完全包含时,退化为基础 IOU,无法区分框的位置差异
DIoU 解决 GIoU 的包含问题,直接关注两框中心点的距离 ✅ 收敛速度比 GIoU 快;✅ 包含场景下仍能有效优化;❌ 未考虑框的宽高比差异
CIoU 在 DIoU 基础上,增加宽高比惩罚项 ✅ 同时考虑:重叠面积 + 中心点距离 + 宽高比;✅ 是 YOLOv5/YOLOv7 默认的边界框损失;❌ 宽高比惩罚项权重固定,对不同尺度目标适应性一般
SIoU 重构损失组成,引入角度惩罚,更贴合目标框的几何特性 ✅ 考虑框的角度差异,对倾斜目标更友好;✅ 收敛速度和精度优于 CIoU;❌ 计算复杂度略高

2.目标检测的难题和优化方法

一、 遮挡密集目标检测解决方案

1.数据层面

  • 丰富数据的多样性,增加样本数量

  • 数据扩充(Mosaic 增强,采用「CutMix 增强」,禁用「随机翻转 / 大角度旋转」)

2.标签层面

  • 增加[遮挡程度标签]:训练时可通过损失函数加权(对重度遮挡样本赋予更高损失权重)
  • 采用「关键点标注」:针对目标的关键特征点(如人脸的眼睛、车辆的车轮)进行标注,此操作标注工作巨大,任务量巨大。

3.模型层面

  • YOLOv5s更换更大的模型(YOLOv5m/l/s),增加网络的深度和宽度,提升特征表达能力
  • 引入注意力机制(CA,ECA,CBAM)。
  • 优化损失函数,提升遮挡目标的回归精度:EIoU Loss 或**SIoU Loss,**增加「边界框回归损失的权重」。

实操:在 YOLOv5 的 Backbone 或 Neck 层插入注意力模块(修改models/common.py),无需大幅改动网络结构,工程落地难度低。

4.工业进阶方案(高成本)

  • 采用「多模型融合」:训练多个不同尺度的 YOLOv5 模型
  • 引入「实例分割」:使用 YOLOv5 的分割版本(YOLOv5-seg)或 Mask R-CNN,通过分割掩码区分重叠目标的轮廓,再转化为边界框,大幅提升密集遮挡场景的效果

二、 小目标检测解决方案(工业落地优先级排序)

1.数据层面

  • 提高样本的丰富度:重点收集不同场景、不同光照、不同背景下的小目标样本。
  • 标注优化:小目标标注需 "精准化",避免标注框过大或过小。
  • 数据扩充:优先使用「Mosaic 增强 」,采用「Copy-Paste 增强 」,禁用「大尺度裁剪、模糊增强」。

2.模型层面

  • 提升输入分辨率可以让小目标的特征信息更丰富,模型更容易捕捉,小目标像素少。
  • YOLOv5 默认输入分辨率为 640×640,可调整为1280×12801920×1920 (训练时通过--img 1280参数指定)。
  • 推理时可采用「多尺度推理」(如 640×640+1280×1280)
  • 优化网络结构,加强小目标特征提取与融合,**增加小目标检测分支,**优化骨干网络,减少低层特征下采样次数。
  • 引入「特征金字塔 + 注意力机制
  • 调整锚框(Anchor),适配小目标尺寸

3.推理和后处理

  • 采用「图像切片(Sliding Window)」策略
  • 调整后处理参数,降低小目标漏检率

4. 工业进阶方案(高成本,高精度,适合核心业务场景)

  • 采用「高分辨率模型 + 知识蒸馏
  • 更换「小目标专用检测模型

核心总结(工业落地关键要点)

  1. 无论是遮挡密集目标还是小目标检测,数据层面的优化都是第一优先级(成本最低、效果最显著),模型层面和后处理层面的优化是补充。
  2. 工业落地中,优先选择「简单高效、可快速部署」的方案(如 Mosaic 增强、提升输入分辨率、优化 NMS),再逐步尝试高阶方案(如注意力机制、图像切片)。
  3. 所有优化都需要结合实际业务场景调试(如阈值、分辨率、锚框),没有通用的 "最优解",只有 "最适配场景的解"。

3.YOLOv5参数详解

1.样本训练时修改XXX.yaml文件中的配置路径,且在train.py中相应位置修改路径

复制代码
    parser = argparse.ArgumentParser()

train.py训练集的参数注解

python 复制代码
def parse_opt(known=False):
    """Parse command-line arguments for YOLOv5 training, validation, and testing.

    Args:
        known (bool, optional): If True, parses known arguments, ignoring the unknown. Defaults to False.

    Returns:
        (argparse.Namespace): Parsed command-line arguments containing options for YOLOv5 execution.

    Examples:
        ```python
        from ultralytics.yolo import parse_opt
        opt = parse_opt()
        print(opt)
        ```

    Links:
        - Models: https://github.com/ultralytics/yolov5/tree/master/models
        - Datasets: https://github.com/ultralytics/yolov5/tree/master/data
        - Tutorial: https://docs.ultralytics.com/yolov5/tutorials/train_custom_data
    """
    parser = argparse.ArgumentParser()
    """
    argparse:专门管理参数的库
    default = 填充具体值
    root 是根目录
    """

    #初始预训练权重
    parser.add_argument("--weights", type=str, default=ROOT / "yolov5s.pt", help="initial weights path")
    #添加模型配置文件
    model_path = r"/root/wjj/yolov5/models/yolov5s.yaml"
    """
    模型配置文件,此处的default是要修改为自己配置的文件
    #/root/wjj/yolov5/models/yolov5s.yaml
    
    weight 和  cfg规则
    1.当weights不为空时,cfg为空则加载weights中的模型文件
    2.当weights为空时,cfg不为空,但此时不预训练权重
    3.当weights与cfg模型的结构一样时,就是给cfg赋初值weights
    4.当weights与cfg不一样时,取交集权重。
        ***能够继承大模型的初始权重***
        ***什么时候用初始权重,什么时候不用初始权重***
        生活场景使用
        工业场景:可以尝试先用,也可以不用
        
    ⭐训练技巧:先训练中度模型M权重例20层,将M权重作为weights初始加进cfg中
    此时cfg是小的权重,因为取交集的原因会权重迁移。从大模型中学习小模型。
    """
    parser.add_argument("--cfg", type=str, default=model_path, help="model.yaml path")
    #⭐配置训练数据源
    parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="dataset.yaml path")
    #⭐训练集参数文件地址,之前学习的超参数都在这里
    parser.add_argument("--hyp", type=str, default=ROOT / "data/hyps/hyp.scratch-low.yaml", help="hyperparameters path")
    #⭐训练epochs次数epochs = 100,300
    parser.add_argument("--epochs", type=int, default=1, help="total training epochs")
    #⭐batch 8 ,16,32,64
    parser.add_argument("--batch-size", type=int, default=1, help="total batch size for all GPUs, -1 for autobatch")
    #⭐训练的输入尺寸640,输出头20,40,80。取决于图大小一般最大也是1280
    parser.add_argument("--imgsz", "--img", "--img-size", type=int, default=640, help="train, val image size (pixels)")
    #矩形训练,不常用
    parser.add_argument("--rect", action="store_true", help="rectangular training")
    '''
    ⭐是否在 上一轮的基础上继续训练
        1.如果训练到一般停止了想要接着训练则需要将默认参数修改且将上述的weights权重也修改,默认路径修改为为暂停时的权重路径
        default=True 
        path_new = r"/root/wjj/yolov5/runs/train/exp3/weights/last.pt"
        parser.add_argument("--weights", type=str, default=path_new, help="initial weights path")
        2.如果开启了resume,此时我们修改.py中的参数是无效的,则需要取上述运行到一般的exp3文件修改参数值
        修改该文件下面两个其中一个,可以试试
        /root/wjj/yolov5/runs/train/exp3/opt.yaml
        /root/wjj/yolov5/runs/train/exp3/hyp.yaml
    '''
    parser.add_argument("--resume", nargs="?", const=True, default=False, help="resume most recent training")
    parser.add_argument("--nosave", action="store_true", help="only save final checkpoint")
    # 训练后有验证则关闭验证
    parser.add_argument("--noval", action="store_true", help="only validate final epoch")
    #不进行自动聚类anchor
    parser.add_argument("--noautoanchor", action="store_true", help="disable AutoAnchor")
    parser.add_argument("--noplots", action="store_true", help="save no plot files")
    parser.add_argument("--evolve", type=int, nargs="?", const=300, help="evolve hyperparameters for x generations")
    parser.add_argument(
        "--evolve_population", type=str, default=ROOT / "data/hyps", help="location for loading population"
    )
    parser.add_argument("--resume_evolve", type=str, default=None, help="resume evolve from last generation")
    parser.add_argument("--bucket", type=str, default="", help="gsutil bucket")
    parser.add_argument("--cache", type=str, nargs="?", const="ram", help="image --cache ram/disk")
    """
    ⭐自动对于类别不平衡时,BCE有自动平衡,自动平衡系数,小样本更聚焦
    1.针对数据少的给予更大的权重loss
    一般都是true
    """
    parser.add_argument("--image-weights", action="store_true", help="use weighted image selection for training")
    #代表多块显卡0,1,2代表三块显卡
    parser.add_argument("--device", default="", help="cuda device, i.e. 0 or 0,1,2,3 or cpu")
    """
    ⭐是否开启多尺度训练
    
    640标准
    最小320,最大960
    0.5 ,1 ,1.5
    """
    parser.add_argument("--multi-scale", action="store_true", help="vary img-size +/- 50%%")
    #单类训练
    parser.add_argument("--single-cls", action="store_true", help="train multi-class data as single-class")
    #优化器选择
    parser.add_argument("--optimizer", type=str, choices=["SGD", "Adam", "AdamW"], default="SGD", help="optimizer")
    #多卡训练才开启
    parser.add_argument("--sync-bn", action="store_true", help="use SyncBatchNorm, only available in DDP mode")
    """
    ⭐多进程读数据,需要开启4-8之间
    """
    parser.add_argument("--workers", type=int, default=8, help="max dataloader workers (per RANK in DDP mode)")
    parser.add_argument("--project", default=ROOT / "runs/train", help="save to project/name")
    parser.add_argument("--name", default="exp", help="save to project/name")
    parser.add_argument("--exist-ok", action="store_true", help="existing project/name ok, do not increment")
    parser.add_argument("--quad", action="store_true", help="quad dataloader")
    #是都开启余弦退火
    parser.add_argument("--cos-lr", action="store_true", help="cosine LR scheduler")
    #标签平滑,防止过拟合,降低gt的标准(给标签一个怀疑尺度)
    parser.add_argument("--label-smoothing", type=float, default=0.0, help="Label smoothing epsilon")
    """
    ⭐早停轮次,val毫无进展就早停,可修改参数
    """
    parser.add_argument("--patience", type=int, default=100, help="EarlyStopping patience (epochs without improvement)")
    """
    ⭐冻结训练:
    0代表不冻结,10代表冻结前10层
    1,3,5代表冻结下标为1,3,5层
    两个作用:
    1.有针对性的训练
    2.微调,best.pt已经97%,再来10张漏检,整个模型训练有风险,这是就可以针对此数据集进行微调
    """
    parser.add_argument("--freeze", nargs="+", type=int, default=[0], help="Freeze layers: backbone=10, first3=0 1 2")
    parser.add_argument("--save-period", type=int, default=-1, help="Save checkpoint every x epochs (disabled if < 1)")
    parser.add_argument("--seed", type=int, default=0, help="Global training seed")
    parser.add_argument("--local_rank", type=int, default=-1, help="Automatic DDP Multi-GPU argument, do not modify")

    # Logger arguments
    parser.add_argument("--entity", default=None, help="Entity")
    parser.add_argument("--upload_dataset", nargs="?", const=True, default=False, help='Upload data, "val" option')
    parser.add_argument("--bbox_interval", type=int, default=-1, help="Set bounding-box image logging interval")
    parser.add_argument("--artifact_alias", type=str, default="latest", help="Version of dataset artifact to use")

    # NDJSON logging
    parser.add_argument("--ndjson-console", action="store_true", help="Log ndjson to console")
    parser.add_argument("--ndjson-file", action="store_true", help="Log ndjson to file")

    return parser.parse_known_args()[0] if known else parser.parse_args()

detect.py训练集的参数注解

python 复制代码
def parse_opt():
    """Parse command-line arguments for YOLOv5 detection, allowing custom inference options and model configurations.

    Args:
        --weights (str | list[str], optional): Model path or Triton URL. Defaults to ROOT / 'yolov5s.pt'.
        --source (str, optional): File/dir/URL/glob/screen/0(webcam). Defaults to ROOT / 'data/images'.
        --data (str, optional): Dataset YAML path. Provides dataset configuration information.
        --imgsz (list[int], optional): Inference size (height, width). Defaults to [640].
        --conf-thres (float, optional): Confidence threshold. Defaults to 0.25.
        --iou-thres (float, optional): NMS IoU threshold. Defaults to 0.45.
        --max-det (int, optional): Maximum number of detections per image. Defaults to 1000.
        --device (str, optional): CUDA device, i.e., '0' or '0,1,2,3' or 'cpu'. Defaults to "".
        --view-img (bool, optional): Flag to display results. Defaults to False.
        --save-txt (bool, optional): Flag to save results to *.txt files. Defaults to False.
        --save-csv (bool, optional): Flag to save results in CSV format. Defaults to False.
        --save-conf (bool, optional): Flag to save confidences in labels saved via --save-txt. Defaults to False.
        --save-crop (bool, optional): Flag to save cropped prediction boxes. Defaults to False.
        --nosave (bool, optional): Flag to prevent saving images/videos. Defaults to False.
        --classes (list[int], optional): List of classes to filter results by, e.g., '--classes 0 2 3'. Defaults to
            None.
        --agnostic-nms (bool, optional): Flag for class-agnostic NMS. Defaults to False.
        --augment (bool, optional): Flag for augmented inference. Defaults to False.
        --visualize (bool, optional): Flag for visualizing features. Defaults to False.
        --update (bool, optional): Flag to update all models in the model directory. Defaults to False.
        --project (str, optional): Directory to save results. Defaults to ROOT / 'runs/detect'.
        --name (str, optional): Sub-directory name for saving results within --project. Defaults to 'exp'.
        --exist-ok (bool, optional): Flag to allow overwriting if the project/name already exists. Defaults to False.
        --line-thickness (int, optional): Thickness (in pixels) of bounding boxes. Defaults to 3.
        --hide-labels (bool, optional): Flag to hide labels in the output. Defaults to False.
        --hide-conf (bool, optional): Flag to hide confidences in the output. Defaults to False.
        --half (bool, optional): Flag to use FP16 half-precision inference. Defaults to False.
        --dnn (bool, optional): Flag to use OpenCV DNN for ONNX inference. Defaults to False.
        --vid-stride (int, optional): Video frame-rate stride, determining the number of frames to skip in between
            consecutive frames. Defaults to 1.

    Returns:
        argparse.Namespace: Parsed command-line arguments as an argparse.Namespace object.

    Examples:
        ```python
        from ultralytics import YOLOv5
        args = YOLOv5.parse_opt()
        ```
    """
    parser = argparse.ArgumentParser()

    #自己加的
    path_best_pt = r"/root/wjj/yolov5/runs/train/exp3/weights/best.pt"
    """
    ⭐detect.py中将自己加的训练权重赋值上去即可
    parser.add_argument("--weights", nargs="+", type=str, default = path_best_pt, help="model path or triton URL")
    """
    parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model path or triton URL")
    """
    ⭐图片/视频流都可以,作为资源检测
    """
    parser.add_argument("--source", type=str, default=ROOT / "data/images", help="file/dir/URL/glob/screen/0(webcam)")
    parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="(optional) dataset.yaml path")

    """
    ⭐推理尺寸:可以不等于训练尺寸
    """
    parser.add_argument("--imgsz", "--img", "--img-size", nargs="+", type=int, default=[640], help="inference size h,w")
    #置信度
    parser.add_argument("--conf-thres", type=float, default=0.25, help="confidence threshold")
    #nms去重置信度
    parser.add_argument("--iou-thres", type=float, default=0.45, help="NMS IoU threshold")
    #最多一张图有1000个目标
    parser.add_argument("--max-det", type=int, default=1000, help="maximum detections per image")
    #设备
    parser.add_argument("--device", default="", help="cuda device, i.e. 0 or 0,1,2,3 or cpu")
    parser.add_argument("--view-img", action="store_true", help="show results")
    """
    ⭐⭐⭐及其重要
    能否将预测结果保存为yolo格式标签标签
    1000张训练得到ai模型
    将后面的2000张做预测,得到其他2000张的标签
    用labeling,重新打开预测的标签查看是否正确
    1.必须手动设置classes.txt
        parser.add_argument("--save-txt", action="store_true",default = True, help="save results to *.txt")
    """
    parser.add_argument("--save-txt", action="store_true", help="save results to *.txt")
    parser.add_argument(
        "--save-format",
        type=int,
        default=0,
        help="whether to save boxes coordinates in YOLO format or Pascal-VOC format when save-txt is True, 0 for YOLO and 1 for Pascal-VOC",
    )
    parser.add_argument("--save-csv", action="store_true", help="save results in CSV format")
    #是否将预测框box截图截下来
    parser.add_argument("--save-conf", action="store_true", help="save confidences in --save-txt labels")
    parser.add_argument("--save-crop", action="store_true", help="save cropped prediction boxes")
    parser.add_argument("--nosave", action="store_true", help="do not save images/videos")
    parser.add_argument("--classes", nargs="+", type=int, help="filter by class: --classes 0, or --classes 0 2 3")
    parser.add_argument("--agnostic-nms", action="store_true", help="class-agnostic NMS")
    parser.add_argument("--augment", action="store_true", help="augmented inference")

    """
    ⭐⭐⭐及其重要
    将网络层中的特征,每层随机选32个通道保存可视化,cam热力图
    parser.add_argument("--visualize", action="store_true",default = True,help="visualize features")
    """
    parser.add_argument("--visualize", action="store_true", help="visualize features")

    parser.add_argument("--update", action="store_true", help="update all models")
    parser.add_argument("--project", default=ROOT / "runs/detect", help="save results to project/name")
    parser.add_argument("--name", default="exp", help="save results to project/name")
    parser.add_argument("--exist-ok", action="store_true", help="existing project/name ok, do not increment")
    parser.add_argument("--line-thickness", default=3, type=int, help="bounding box thickness (pixels)")
    parser.add_argument("--hide-labels", default=False, action="store_true", help="hide labels")
    parser.add_argument("--hide-conf", default=False, action="store_true", help="hide confidences")
    parser.add_argument("--half", action="store_true", help="use FP16 half-precision inference")
    parser.add_argument("--dnn", action="store_true", help="use OpenCV DNN for ONNX inference")
    parser.add_argument("--vid-stride", type=int, default=1, help="video frame-rate stride")
    opt = parser.parse_args()
    opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1  # expand
    print_args(vars(opt))
    return opt

val.py训练集的参数注解

python 复制代码
def parse_opt():
    """Parse command-line options for configuring YOLOv5 model inference.

    Args:
        data (str, optional): Path to the dataset YAML file. Default is 'data/coco128.yaml'.
        weights (list[str], optional): List of paths to model weight files. Default is 'yolov5s.pt'.
        batch_size (int, optional): Batch size for inference. Default is 32.
        imgsz (int, optional): Inference image size in pixels. Default is 640.
        conf_thres (float, optional): Confidence threshold for predictions. Default is 0.001.
        iou_thres (float, optional): IoU threshold for Non-Max Suppression (NMS). Default is 0.6.
        max_det (int, optional): Maximum number of detections per image. Default is 300.
        task (str, optional): Task type - options are 'train', 'val', 'test', 'speed', or 'study'. Default is 'val'.
        device (str, optional): Device to run the model on. e.g., '0' or '0,1,2,3' or 'cpu'. Default is empty to let the
            system choose automatically.
        workers (int, optional): Maximum number of dataloader workers per rank in DDP mode. Default is 8.
        single_cls (bool, optional): If set, treats the dataset as a single-class dataset. Default is False.
        augment (bool, optional): If set, performs augmented inference. Default is False.
        verbose (bool, optional): If set, reports mAP by class. Default is False.
        save_txt (bool, optional): If set, saves results to *.txt files. Default is False.
        save_hybrid (bool, optional): If set, saves label+prediction hybrid results to *.txt files. Default is False.
        save_conf (bool, optional): If set, saves confidences in --save-txt labels. Default is False.
        save_json (bool, optional): If set, saves results to a COCO-JSON file. Default is False.
        project (str, optional): Project directory to save results to. Default is 'runs/val'.
        name (str, optional): Name of the directory to save results to. Default is 'exp'.
        exist_ok (bool, optional): If set, existing directory will not be incremented. Default is False.
        half (bool, optional): If set, uses FP16 half-precision inference. Default is False.
        dnn (bool, optional): If set, uses OpenCV DNN for ONNX inference. Default is False.

    Returns:
        argparse.Namespace: Parsed command-line options.

    Examples:
        To validate a trained YOLOv5 model on a COCO dataset:
        ```python
        $ python val.py --weights yolov5s.pt --data coco128.yaml --img 640
        ```
        Different model formats could be used instead of `yolov5s.pt`:
        ```python
        $ python val.py --weights yolov5s.pt yolov5s.torchscript yolov5s.onnx yolov5s_openvino_model yolov5s.engine
        ```
        Additional options include saving results in different formats, selecting devices, and more.

    Notes:
        - The '--data' parameter is checked to ensure it ends with 'coco.yaml' if '--save-json' is set.
        - The '--save-txt' option is set to True if '--save-hybrid' is enabled.
        - Args are printed using `print_args` to facilitate debugging.
    """
    parser = argparse.ArgumentParser()
    parser.add_argument("--data", type=str, default=ROOT / "data/coco128.yaml", help="dataset.yaml path")
    parser.add_argument("--weights", nargs="+", type=str, default=ROOT / "yolov5s.pt", help="model path(s)")
    parser.add_argument("--batch-size", type=int, default=32, help="batch size")
    parser.add_argument("--imgsz", "--img", "--img-size", type=int, default=640, help="inference size (pixels)")
    """
    ⭐⭐⭐重要的参数
    1.训练过程中的训练集的置信度评价为0.001
    需要看业务情况,常见为0.25
    """
    parser.add_argument("--conf-thres", type=float, default=0.25, help="confidence threshold")
    parser.add_argument("--iou-thres", type=float, default=0.6, help="NMS IoU threshold")
    parser.add_argument("--max-det", type=int, default=300, help="maximum detections per image")
    parser.add_argument("--task", default="val", help="train, val, test, speed or study")
    parser.add_argument("--device", default="", help="cuda device, i.e. 0 or 0,1,2,3 or cpu")
    parser.add_argument("--workers", type=int, default=8, help="max dataloader workers (per RANK in DDP mode)")
    parser.add_argument("--single-cls", action="store_true", help="treat as single-class dataset")
    parser.add_argument("--augment", action="store_true", help="augmented inference")
    parser.add_argument("--verbose", action="store_true", help="report mAP by class")
    parser.add_argument("--save-txt", action="store_true", help="save results to *.txt")
    parser.add_argument("--save-hybrid", action="store_true", help="save label+prediction hybrid results to *.txt")
    parser.add_argument("--save-conf", action="store_true", help="save confidences in --save-txt labels")
    parser.add_argument("--save-json", action="store_true", help="save a COCO-JSON results file")
    parser.add_argument("--project", default=ROOT / "runs/val", help="save to project/name")
    parser.add_argument("--name", default="exp", help="save to project/name")
    parser.add_argument("--exist-ok", action="store_true", help="existing project/name ok, do not increment")
    parser.add_argument("--half", action="store_true", help="use FP16 half-precision inference")
    parser.add_argument("--dnn", action="store_true", help="use OpenCV DNN for ONNX inference")
    opt = parser.parse_args()
    opt.data = check_yaml(opt.data)  # check YAML
    opt.save_json |= opt.data.endswith("coco.yaml")
    opt.save_txt |= opt.save_hybrid
    print_args(vars(opt))
    return opt

hyp.XX.yaml参数注释

训练超参数文件

/root/wjj/yolov5/data/hyps/hyp.scratch-low.yaml

python 复制代码
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# Hyperparameters for low-augmentation COCO training from scratch
# python train.py --batch 64 --cfg yolov5n6.yaml --weights '' --data coco.yaml --img 640 --epochs 300 --linear
# See tutorials for hyperparameter evolution https://github.com/ultralytics/yolov5#tutorials

#训练超参数

#初始学习率⭐⭐⭐
#lr0: 0.01 # initial learning rate (SGD=1E-2, Adam=1E-3)
lr0: 0.0001 # initial learning rate (SGD=1E-2, Adam=1E-3)
#最终学习率
lrf: 0.01 # final OneCycleLR learning rate (lr0 * lrf)
#动量系数,一般不动
momentum: 0.937 # SGD momentum/Adam beta1
#正则化系数,一般不动,过拟合的话可以调大10倍
weight_decay: 0.0005 # optimizer weight decay 5e-4
#预热系列,让模型适应性学习,设置为0则无效
#warmup_epochs: 3.0 # warmup epochs (fractions ok)
warmup_epochs: 0.0 # warmup epochs (fractions ok)
warmup_momentum: 0.8 # warmup initial momentum
warmup_bias_lr: 0.1 # warmup initial bias lr

 """
 类别误检(检出但是类别错了):cls 和 cls_pw 同时调大 cls = 1.5 ,cls_pw = 1.5
 把背景认成了目标:obj_pw 和 obj 同时调大 obj = 1.5 ,obj_pw = 1.5
 
 """


#⭐⭐⭐
#位置损失系数,一般不动
box: 0.05 # box loss gain
#类别损失系数
cls: 0.5 # cls loss gain
#置信度损失系数
obj: 1.0 # obj loss gain (scale with pixels)

#total = 0.05 CIOU_LOSS + 1.0 BCE_CONF + 0.5 BCE_CLASS

#BCE(pos_weight=1.0)是这个函数的功能
#分类的正样本类别的比例的损失系数
cls_pw: 1.0 # cls BCELoss positive_weight

#BCE(pos_weight=1.0)是这个函数的功能
#置信度正样本类别的比例的损失系数
obj_pw: 1.0 # obj BCELoss positive_weight



#源码已被注释掉了
iou_t: 0.20 # IoU training threshold

#⭐yolov5中挑选正样本的方法(0.25-4之间一般也不动)
anchor_t: 4.0 # anchor-multiple threshold
# anchors: 3  # anchors per output layer (0 to ignore)

#面试必问(焦点损失Focal loss:更专注于难分样本)
#⭐⭐⭐焦点损失 Focal loss(通过这个焦点损失函数让难分样本的损失比易分样本的损失大,迫使网络倾向学习损失大的多学一点)
#焦点损失为0则代表不开启,如果设置为1.5则代表公式中的γ为1.5/2.0,α默认为0.25
fl_gamma: 0.0 # focal loss gamma (efficientDet default gamma=1.5)
#实操⭐⭐⭐:一般精度要在90%以上时(作为初始权重)才开启此项,最佳操作在93%以上
#精度太低则说明还没有学到重要特征,噪声过多

#⭐⭐⭐漏检误检专门做数据增强,数据增强后再放进训练集
#困难样本挖掘
#1.损失的角度上Focal Loss
#2.pt去推理所有的train和val得到pre_yolo_box->labeling去看错的专门去数据增强重新训练->将train放回数据集,val不放
#3.也是损失角度:将损失从大到小排序,sort,然后仅取(取正样本的三倍)损失比较大的进行bp(反向传播),在线困难样本挖掘

#⭐如果标签打错了以上办法无用,仅有第二种方法才能找出来。(标签必须重要)



#⭐⭐⭐hsv数据增强 :色彩色调上的饱和度
  #1.工业图像关闭(一般是黑白)
  #2.目标颜色为主要特征时也要关闭
hsv_h: 0.015 # image HSV-Hue augmentation (fraction)
hsv_s: 0.7 # image HSV-Saturation augmentation (fraction)
hsv_v: 0.4 # image HSV-Value augmentation (fraction)


#旋转一般+---15°之间
degrees: 0.0 # image rotation (+/- deg)
#平移百分之10 随机方向
translate: 0.1 # image translation (+/- fraction)
#缩放百分之50
scale: 0.5 # image scale (+/- gain)

#裁剪
shear: 0.0 # image shear (+/- deg)

#图像变换,不要用此项
perspective: 0.0 # image perspective (+/- fraction), range 0-0.001

#上下反转,一般0.5
flipud: 0.0 # image flip up-down (probability)
#左右反转,一般0.5
fliplr: 0.5 # image flip left-right (probability)

#masic
mosaic: 1.0 # image mosaic (probability)

#百分之10概率
mixup: 0.1 # image mixup (probability)

#只在分割时有效
copy_paste: 0.0 # segment copy-paste (probability)

⭐源码核心微调

train中是一轮训练 + 一轮验证 -> 最后拿最好的也就是best.pt文件进行验证(注意这些val中都没有设置置信度,也就是默认的0.001不合理),同时iou的阈值配置也需要调整,置信度也需要配置

train.py源码中 Model attributes

backward()梯度裁剪

train.py中验证集置信度筛选

fitness()函数:挑选best.pt权重(可定制)

断点续训,修改相应opt文件

基线训练时,默认关闭数据增强位置

数据的读取来自dateset->dateloader,需要注意的是如果修改了文件记得删除缓存

在线数据增强的位置和操作:

dateset源码:

1.CPU缓存

2.在dataloaders.py中实现了mosic数据增强(如果mosic则degress->平移->缩放->裁剪->再mosic->mixup->hsv->翻转)

3.如果想自己添加在线数据增强①首先先在hyp_scratch_low中添加参数。②在dataloaders.py中的getitems中添加相应的增强。

做完数据增强则进行前向传播然后进行损失计算

参数修改对应位置

hpy.scratch-low.yaml <-> loss.py 参数对应修改位置

此处是置信度和分类进行focalloss,我们可以定制先对置信度进行focal loss,再对整体做focal loss,有利于提高检出率

LOSS.py损失中可定制的点

YOLOv5改进(七)--改进损失函数EIoU、Alpha-IoU、SIoU、Focal-EIOU - 技术栈


4.首次运行结果可视化详解

1.混淆矩阵

val集中:预测自己是自己的概率,以及预测为其他类或者背景的概率。

指导漏检和误检的效用

1.目标认为是背景那就是漏检

2.目标认为是别的类称为误检


2.精确率和召回率

关于P和R的认知

P(查准率) R(查全率) AP mAP最通俗准确的讲解_yolo p r map是什么-CSDN博客​​​​​​

P: Precision,精确率,也叫查准率。预测为正类的样本中确实为正类的比例。

R:Recall,召回率,也叫查全率。所有实际正类中,有多少正类被预测出来。

F1 Score:是精确率和召回率的调和平均数,是一种兼顾精确率和召回率的综合指标。

我们正常查看和选取的是置信度和召回率形成平衡的点

还有一个评判标准F1

F1 Score:是精确率和召回率的调和平均数,是一种兼顾精确率和召回率的综合指标。

即F1值越高效果越好

3.数据分布效果

1.验证集中的分布和类别特点

经验:

我们可以根据其验证集的分布特点进行针对性的数据增强和网络重构

4.运行结果的关注要点

5.模型文件大小对应关系

YOLOv5 型号 对应 yaml 文件 模型文件大小(FP32 / 全精度) 模型文件大小(FP16 / 半精度) 模型文件大小(INT8 / 量化) 核心网络深度 / 宽度系数 适用场景
YOLOv5n (Nano) yolov5n.yaml ~4.0 MB ~2.0 MB ~1.0 MB 深度系数: 0.33;宽度系数: 0.25 边缘设备、超低算力、实时性要求极高(如单片机、嵌入式传感器)
YOLOv5s (Small) yolov5s.yaml ~14.0 MB ~7.0 MB ~3.5 MB 深度系数: 0.33;宽度系数: 0.50 移动端、手机 APP、轻量型部署(平衡速度和精度)
YOLOv5m (Medium) yolov5m.yaml ~42.0 MB ~21.0 MB ~10.5 MB 深度系数: 0.67;宽度系数: 0.75 边缘服务器、工控机、中等算力场景(精度优于 v5s,速度略降)
YOLOv5l (Large) yolov5l.yaml ~95.0 MB ~47.5 MB ~23.8 MB 深度系数: 1.00;宽度系数: 1.00 桌面端、高性能服务器、高精度要求场景(速度较慢,精度较高)
YOLOv5x (X-Large) yolov5x.yaml ~166.0 MB ~83.0 MB ~41.5 MB 深度系数: 1.33;宽度系数: 1.25 云端服务器、超算平台、极致精度要求(算力消耗大,速度最慢)

5.优化YOLO算法

核心:原理+代码

1.数据集

数据集层面的优化属于数据前处理阶段对输入的数据集进行优化。

**核心思路:**根据实际业务场景对数据集进行针对性的数据增强,针对性体现于产品的使用场景/条件/环境的多样性造成的影响,有针对性的数据增强。

**核心目标:**通过数据增强尽可能的模拟真实情况,确保训练集和验证集及测试集的数据分布特征的一致性。

造成影响:数据增强的本质就是加大学习的难度,所以可能会导致其精准率些许下降,属于正常情况,虽然下降了但模型的泛化能力增强了,效果可能更好。

预期结果:

1.提高特征的多样性。(不同的光照/亮度/背景/大小/角度[仿射变换]/颜色等)

2.样本的平衡多样性。

2.网络结构

网络结构层面的优化在于前向传播和反向传播的优化。

核心思路与目的:

**1.前向传播:**增减模块/替换模块/增加头的方法/添加注意力等方式,目的是为了更好的提取特征。

**2.反向传播:**通过更新网络结构防止梯度消失。

3.损失函数

yolo中损失函数的优化,分为两点

1.回归问题:MSE -> IOU系列

2.分类问题:CE -> BCE -> Focal Loss

⭐回归替换的原因:

1.优化目标与检测需求脱节:MSE 优化的是坐标 / 尺寸的数值误差 ,而非检测任务真正关心的框的重合度。例如:两框的坐标数值差异小,但可能不重叠,两框的坐标差异较大但可能大部分重叠。

2.对框的尺度和位置敏感,鲁棒性差:MSE 对 wh 的数值变化敏感,小目标的尺寸误差会被放大,大目标的尺寸误差会被缩小。

3.缺乏旋转不变性:当框发生旋转时,坐标数值会大幅变化,MSE 损失会急剧增大,但框的实际重合度可能并未降低,这在旋转目标检测场景下完全不适用。

⭐**进阶 IoU 损失的额外优化:**YOLOv5/v8 中使用的是 CIoU Loss

  • 解决 GIoU Loss 在框完全包含时的优化效率低问题;
  • 同时考虑 框的重叠面积、中心点距离、长宽比 三个因素,让回归更精准、收敛更快。

⭐分类替换的原因:本质是多个S函数

1.两者的核心差异在于 对 "正负样本" 和 "多标签场景" 的适配性:

  • 常规 CE 损失 指的是多分类交叉熵损失。

YOLO 中使用的是 BCE(二元交叉熵)损失。

  • YOLO 的锚框分为两类:包含目标的正样本 、不包含目标的负样本

⭐BCE 损失的核心优化点:

YOLO 中使用的是 BCEWithLogitsLoss (带 Sigmoid 的二元交叉熵),将分类任务转化为 "每个类别独立的二元判断"

1.适配 "多类别独立判断" 的需求: 每个锚框需要判断:是否为背景如果是目标,属于哪一类

**2.更好地处理正负样本不平衡:**通过调节正负样本的pos_weight权重系数。

**3.减少冗余:**BCEWithLogitsLoss 将 Sigmoid 激活和损失计算融合

Focal Loss 的核心优化逻辑:通过 "调制系数" 实现 "聚焦困难样本"

核心创新: 引入了动态调制系数(Modulation Factor)

理解:

  • 当样本是简单样本时:pt 接近 1(模型能准确预测),此时 (1−pt) 接近 0,经过γ次方后,调制系数会趋近于 0,最终该样本的损失会被 "压制" 到极低水平,几乎不参与模型优化;例如:γ=2,简单负样本的pt=0.9(模型准确判断为背景),调制系数为(1−0.9)2=0.01,该样本的损失会被缩小 100 倍,不再干扰模型;
  • 当样本是困难样本时:pt 接近 0.5(模型难以判断),此时 (1−pt) 接近 0.5,调制系数较大,该样本的损失会被 "保留" 甚至相对放大,成为模型优化的核心重点;例如:γ=2,困难正样本的pt=0.3(模型难以判断是否为目标),调制系数为(1−0.3)2=0.49,损失几乎不受压制,模型会重点优化这类样本;
  • 当γ=0时:调制系数为 1,Focal Loss 就退化为普通的带平衡系数αt的 BCE 损失,验证了其对 BCE 的继承性。

Focal Loss解决:本质通过加权重调节系数聚焦困难样本上,确保其效果更好。

1.类别不平衡问题:样本数少。

2.难觅样本:双胞胎,样本与背景有极高相似度的图。

1708.02002https://arxiv.org/pdf/1708.02002⭐⭐⭐YOLOv5中我们实现的focal loss是通过调控fl_gamma参数实现,论文数值是2。

hyp.scratch-low.yaml/hyp.scratch-med.yaml/hyp.scratch-high.yaml

fl_gamma=0关闭 Focal Loss(等价于 BCE),fl_gamma>0启用 Focal Loss(常用 2.0);


4.参数调整+部署

参数调整:

本质上是通过查看大量论文与做大量试验,将优秀论文中的摘抄有用的整合到自己的代码中,调整参数,并优化自己的训练策略,比方说冻结训练等操作,有针对性的调整参数,做试验去验证。

部署:

芯片+加速架构+推理代码

CUP部署:GPU上跑起来了

NPU部署:C++控制成本


6.推理代码实操(yolov5)

因为yolov5与yolov8的后处理推理过程代码大差不差,此处提供笔者自己总结时所实操的思路和相应的代码。

YOLOv5 模型加载到检测结果可视化的完整多目标检测闭环

1.模型的加载与初始化

2.图像的预处理

3.模型的前向传播

4.预测框的解码和初筛

5.NMS 非极大值抑制去重

6.结果可视化与保存

详解:

  • 模型加载与初始化 加载 YOLOv5 预训练权重文件,提取模型结构,设置为eval()推理模式(关闭训练相关层),转为半精度(half())提升推理效率,自动适配 CUDA/CPU 计算设备。

  • 图像预处理读取原始 BGR 图像→转换为 RGB 格式(符合模型输入要求)→缩放至 640×640(YOLOv5 标准输入尺寸)→转换为模型可接受的张量(通道置换、归一化、增加批次维度、转为半精度)。

  • 模型前向推理将预处理后的图像张量输入模型,获取输出结果(25200 个检测候选框),每个候选框包含「坐标信息 + 目标置信度 + 各类别得分」,最终转为 NumPy 数组方便后续数值处理。

  • 检测框解码与初筛

    • 设定置信度阈值(0.5),双重过滤低质量候选框:先过滤目标置信度(obj_conf)不达标者,再过滤综合置信度(obj_conf×类别最大得分)不达标者;
    • 将候选框的「中心坐标 + 宽高」格式,解码转换为「左上角 + 右下角」坐标格式;
    • 按原始图像与输入尺寸的比例,缩放坐标至原始图像尺寸,同时限制坐标在图像边界内,收集符合条件的有效检测框。
  • NMS 非极大值抑制去重对初筛后的检测框执行一次非极大值抑制(NMS):按置信度降序排序,计算框间交并比(IoU),过滤 IoU 超过阈值(0.5)的重复框,保留每个目标的最优检测框,解决多目标检测中的框重叠问题。

  • 结果可视化与保存加载目标类别名称,在原始图像上绘制 NMS 处理后的最终检测框(绿色矩形)和类别 + 置信度标签(红色文字),最终保存可视化结果图像,并输出「去重前 / 后目标数」用于验证效果。

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@Project :yolov5-7.0
@File :Post_processing.py
@IDE :PyCharm
@Author :wjj
@Date :2026/1/11
@Description :YOLOv5 正确后处理(支持多目标)
"""

import torch
import cv2
import numpy as np
from models.yolo import Model


def non_max_suppression(boxes, iou_threshold=0.5):
    if len(boxes) == 0:
        return []

    # 转换为numpy数组,保留所有字段(x1,y1,x2,y2,conf,cls)
    boxes = np.array(boxes, dtype=np.float32)

    x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
    confs = boxes[:, 4]  # 置信度仍用于排序

    # 按置信度降序排序
    order = np.argsort(confs)[::-1]
    keep = []

    while order.size > 0:
        i = order[0]
        keep.append(i)

        # 计算当前框与剩余框的交并比
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        w = np.maximum(0.0, xx2 - xx1)
        h = np.maximum(0.0, yy2 - yy1)
        inter = w * h

        area_i = (x2[i] - x1[i]) * (y2[i] - y1[i])
        area_j = (x2[order[1:]] - x1[order[1:]]) * (y2[order[1:]] - y1[order[1:]])

        iou = inter / (area_i + area_j - inter + 1e-6)  # 加小值避免除零

        # 保留IoU小于阈值的框
        inds = np.where(iou <= iou_threshold)[0]
        order = order[inds + 1]

    # 提取保留的框,转换为列表,同时后续将坐标转为int
    return boxes[keep].tolist()

if __name__ == '__main__':

    # 1. 加载模型
    model_path = "../yolov5s.pt"
    ckpt = torch.load(
        model_path,
        map_location=torch.device('cuda' if torch.cuda.is_available() else 'cpu'),
        weights_only=False
    )
    model = ckpt['model']
    model.eval()
    model.half()

    print("模型加载完成,已进入推理模式")

    # 2. 读取并预处理图片
    image_path = "./img.png"
    img_original = cv2.imread(image_path)
    if img_original is None:
        raise FileNotFoundError("未找到图片")

    img_h, img_w = img_original.shape[:2]
    img_rgb = cv2.cvtColor(img_original, cv2.COLOR_BGR2RGB)

    input_size = (640, 640)
    img_resized = cv2.resize(img_rgb, input_size)

    img_tensor = torch.from_numpy(img_resized).permute(2, 0, 1).float() / 255.0
    img_tensor = img_tensor.half().unsqueeze(0)

    # 3. 前向推理
    with torch.no_grad():
        # preds_ = model(img_tensor)
        preds = model(img_tensor)[0]  # (1, 25200, 85)
        preds_1 = model(img_tensor)[1]

    preds = preds.squeeze(0).cpu().numpy()
    print(f"预测输出形状: {preds.shape}")

    # 4. 正确解码
    conf_threshold = 0.5
    final_boxes = []

    scale_x = img_w / input_size[0]
    scale_y = img_h / input_size[1]

    for p in preds:
        obj_conf = p[4]
        if obj_conf < conf_threshold:
            continue

        cls_scores = p[5:]
        cls = np.argmax(cls_scores)
        conf = obj_conf * cls_scores[cls]
        if conf < conf_threshold:
            continue

        x, y, w, h = p[:4]

        x1 = int((x - w / 2) * scale_x)
        y1 = int((y - h / 2) * scale_y)
        x2 = int((x + w / 2) * scale_x)
        y2 = int((y + h / 2) * scale_y)

        x1 = max(0, min(x1, img_w - 1))
        y1 = max(0, min(y1, img_h - 1))
        x2 = max(0, min(x2, img_w - 1))
        y2 = max(0, min(y2, img_h - 1))

        final_boxes.append([x1, y1, x2, y2, conf, cls])

    # 5. NMS(只做一次)
    final_boxes_nms = non_max_suppression(final_boxes, iou_threshold=0.5)

    print(f"去重前目标数: {len(final_boxes)}")
    print(f"NMS后目标数: {len(final_boxes_nms)}")

    # 6. 可视化
    class_names = [
        'person', 'bicycle', 'car', 'motorcycle', 'airplane',
        'bus', 'train', 'truck', 'boat', 'traffic light'
    ]

    img_result = img_original.copy()

    for box in final_boxes_nms:
        # 核心修改:将浮点型坐标强制转换为int,conf保留浮点型,cls转换为int
        x1 = int(box[0])
        y1 = int(box[1])
        x2 = int(box[2])
        y2 = int(box[3])
        conf = box[4]
        cls = int(box[5])  # 类别转为整数索引

        cv2.rectangle(img_result, (x1, y1), (x2, y2), (0, 255, 0), 2)
        label = f"{class_names[cls] if cls < len(class_names) else cls}: {conf:.2f}"
        cv2.putText(
            img_result,
            label,
            (x1, max(y1 - 5, 0)),
            cv2.FONT_HERSHEY_SIMPLEX,
            0.5,
            (0, 0, 255),
            1
        )

    cv2.imwrite("detection_result.jpg", img_result)
    print("检测结果已保存:detection_result.jpg")

总结:

本文是笔者关于yolov5架构+参数详解+运行结果的可视化图像分析+以及优化YOLO算法。以及最后笔者总结的推理部分代码。

相关推荐
菜鸟‍2 小时前
【论文学习】MedDINOv3:如何将视觉基础模型适配于医学图像分割任务? || MACMD:基于多空洞上下文注意力与通道混合器解码的医学图像分割方法
深度学习·学习
查无此人byebye2 小时前
【深度学习保姆级教程】ViT 模型测试 CIFAR10 数据集:从权重加载到抽样验证全流程(附上资源)
人工智能·深度学习
红尘炼丹客2 小时前
DeepSeek 新作 mHC 解读:用流形约束(Manifold Constraints)重构大模型残差连接
人工智能·深度学习·大模型·mhc
盼小辉丶2 小时前
Transformer实战(34)——多语言和跨语言Transformer模型
深度学习·语言模型·transformer
乾元2 小时前
兵器谱——深度学习、强化学习与 NLP 在安全中的典型应用场景
运维·网络·人工智能·深度学习·安全·自然语言处理·自动化
2501_941418552 小时前
基于YOLOv8与特征金字塔共享卷积的蘑菇分类检测系统
yolo·分类·数据挖掘
光羽隹衡10 小时前
深度学习——卷积神经网络实现手写数字识别
人工智能·深度学习·cnn
莫非王土也非王臣10 小时前
深度学习之对比学习
人工智能·深度学习·学习
冰西瓜60011 小时前
国科大高级人工智能期末复习(四)联结主义(下)——深度学习
人工智能·深度学习