【视觉算法系列3】在自定义数据集上训练 YOLO NAS(下篇)

news2024/11/7 11:32:30

在这里插入图片描述

提示:免费获取本文涉及的完整代码与数据集,请添加微信peaeci122

YOLO-NAS是目前最新的YOLO目标检测模型,它在准确性方面击败了所有其他 YOLO 模型。与之前的 YOLO 模型相比,预训练的 YOLO-NAS 模型能够以更高的准确度检测更多目标。

如何在自定义数据集上训练 YOLO NAS?这将是我这两篇文章的目标。

目录:

1、用于训练 YOLO NAS 的物体检测数据集

2、在自定义数据集上训练 YOLO NAS

3、微调 YOLO NAS 模型

4、使用经过训练的 YOLO NAS 模型对测试图像进行推理

5、YOLO NAS 训练模型视频推理结果

6、结论

上篇讲到“微调 YOLO NAS 模型”中的“定义YOLO NAS训练的变换和增强”,本篇我们继续

YOLO NAS 训练参数、模型培训、分析微调结果。

YOLO NAS 训练参数

在我们开始微调过程之前,训练参数是最重要的组成部分。在这里,我们定义了要训练的epoch、要监控的验证指标和学习率等。

train_params = {
    'silent_mode': False,
    "average_best_models":True,
    "warmup_mode": "linear_epoch_step",
    "warmup_initial_lr": 1e-6,
    "lr_warmup_epochs": 3,
    "initial_lr": 5e-4,
    "lr_mode": "cosine",
    "cosine_final_lr_ratio": 0.1,
    "optimizer": "Adam",
    "optimizer_params": {"weight_decay": 0.0001},
    "zero_weight_decay_on_bias_and_bn": True,
    "ema": True,
    "ema_params": {"decay": 0.9, "decay_type": "threshold"},
    "max_epochs": EPOCHS,
    "mixed_precision": True,
    "loss": PPYoloELoss(
        use_static_assigner=False,
        num_classes=len(dataset_params['classes']),
        reg_max=16
    ),
    "valid_metrics_list": [
        DetectionMetrics_050(
            score_thres=0.1,
            top_k_predictions=300,
            num_cls=len(dataset_params['classes']),
            normalize_targets=True,
            post_prediction_callback=PPYoloEPostPredictionCallback(
                score_threshold=0.01,
                nms_top_k=1000,
                max_predictions=300,
                nms_threshold=0.7
            )
        ),
        DetectionMetrics_050_095(
            score_thres=0.1,
            top_k_predictions=300,
            num_cls=len(dataset_params['classes']),
            normalize_targets=True,
            post_prediction_callback=PPYoloEPostPredictionCallback(
                score_threshold=0.01,
                nms_top_k=1000,
                max_predictions=300,
                nms_threshold=0.7
            )
        )
    ],
    "metric_to_watch": 'mAP@0.50:0.95'
}

在训练时,输出将同时显示 50% Iou 和 5%-95% IoU 时的 mAP。不过,我们只监控主要指标(mAP@0.50:0.95 IoU),因此最好的模型将根据它被保存。、

YOLO NAS 模型培训

由于我们要训练三个不同的模型,因此需要将过程自动化一些,可以定义一个包含三个模型名称的列表,并根据该列表设置检查点目录。这也会加载适当的模型,因为列表中的模型名称与super-gradients API中的模型名称匹配。

models_to_train = [
    'yolo_nas_s',
    'yolo_nas_m',
    'yolo_nas_l'
]

CHECKPOINT_DIR = 'checkpoints'

for model_to_train in models_to_train:
    trainer = Trainer(
        experiment_name=model_to_train, 
        ckpt_root_dir=CHECKPOINT_DIR
    )

    model = models.get(
        model_to_train, 
        num_classes=len(dataset_params['classes']), 
        pretrained_weights="coco"
    )

    trainer.train(
        model=model, 
        training_params=train_params, 
        train_loader=train_data, 
        valid_loader=val_data
    )

三个训练实验将依次运行,所有的模型检查点将保存在各自的目录中。

分析 YOLO NAS 微调结果

在训练过程中,输出单元 / 终端显示训练过程的全面视图。

SUMMARY OF EPOCH 0
├── Training
│   ├── Ppyoloeloss/loss = 3.8575
│   ├── Ppyoloeloss/loss_cls = 2.3712
│   ├── Ppyoloeloss/loss_dfl = 1.1773
│   └── Ppyoloeloss/loss_iou = 0.3591
└── Validation
    ├── F1@0.50 = 0.0
    ├── F1@0.50:0.95 = 0.0
    ├── Map@0.50 = 0.0012
    ├── Map@0.50:0.95 = 0.0005
    ├── Ppyoloeloss/loss = 3.7911
    ├── Ppyoloeloss/loss_cls = 2.5251
    ├── Ppyoloeloss/loss_dfl = 0.9791
    ├── Ppyoloeloss/loss_iou = 0.3106
    ├── Precision@0.50 = 0.0
    ├── Precision@0.50:0.95 = 0.0
    ├── Recall@0.50 = 0.0
    └── Recall@0.50:0.95 = 0.0
.
.
.
SUMMARY OF EPOCH 50
├── Training
│   ├── Ppyoloeloss/loss = 1.4382
│   │   ├── Best until now = 1.433  (↗ 0.0053)
│   │   └── Epoch N-1      = 1.433  (↗ 0.0053)
│   ├── Ppyoloeloss/loss_cls = 0.6696
│   │   ├── Best until now = 0.6651 (↗ 0.0046)
│   │   └── Epoch N-1      = 0.6651 (↗ 0.0046)
│   ├── Ppyoloeloss/loss_dfl = 0.6859
│   │   ├── Best until now = 0.6846 (↗ 0.0013)
│   │   └── Epoch N-1      = 0.686  (↘ -0.0)
│   └── Ppyoloeloss/loss_iou = 0.1703
│       ├── Best until now = 0.17   (↗ 0.0003)
│       └── Epoch N-1      = 0.17   (↗ 0.0003)
└── Validation
    ├── F1@0.50 = 0.292
    │   ├── Best until now = 0.3025 (↘ -0.0104)
    │   └── Epoch N-1      = 0.2774 (↗ 0.0146)
    ├── F1@0.50:0.95 = 0.1859
    │   ├── Best until now = 0.1928 (↘ -0.007)
    │   └── Epoch N-1      = 0.1761 (↗ 0.0097)
    ├── Map@0.50 = 0.7631
    │   ├── Best until now = 0.7745 (↘ -0.0114)
    │   └── Epoch N-1      = 0.7159 (↗ 0.0472)
    ├── Map@0.50:0.95 = 0.4411
    │   ├── Best until now = 0.4443 (↘ -0.0032)
    │   └── Epoch N-1      = 0.4146 (↗ 0.0265)
    ├── Ppyoloeloss/loss = 1.5389
    │   ├── Best until now = 1.5404 (↘ -0.0015)
    │   └── Epoch N-1      = 1.5526 (↘ -0.0137)
    ├── Ppyoloeloss/loss_cls = 0.6893
    │   ├── Best until now = 0.687  (↗ 0.0024)
    │   └── Epoch N-1      = 0.6972 (↘ -0.0079)
    ├── Ppyoloeloss/loss_dfl = 0.7148
    │   ├── Best until now = 0.7136 (↗ 0.0012)
    │   └── Epoch N-1      = 0.7234 (↘ -0.0086)
    ├── Ppyoloeloss/loss_iou = 0.1969
    │   ├── Best until now = 0.1953 (↗ 0.0016)
    │   └── Epoch N-1      = 0.1975 (↘ -0.0006)
    ├── Precision@0.50 = 0.1828
    │   ├── Best until now = 0.1926 (↘ -0.0097)
    │   └── Epoch N-1      = 0.1718 (↗ 0.011)
    ├── Precision@0.50:0.95 = 0.1166
    │   ├── Best until now = 0.1229 (↘ -0.0063)
    │   └── Epoch N-1      = 0.1092 (↗ 0.0074)
    ├── Recall@0.50 = 0.8159
    │   ├── Best until now = 0.8939 (↘ -0.0781)
    │   └── Epoch N-1      = 0.8307 (↘ -0.0149)
    └── Recall@0.50:0.95 = 0.522
        ├── Best until now = 0.5454 (↘ -0.0234)
        └── Epoch N-1      = 0.5236 (↘ -0.0016)

===========================================================

我们可以查看 Tensorboard 日志并检查 mAP 图,以便比较三个训练全部过程。Tensorboard 日志位于检查点目录下的相应训练文件夹中。

下图显示了三个训练实验的主要AP对比:

   图 5.微调后的 YOLO NAS 小型、中型和大型模型对比

在上图中:

**红线:**YOLO NAS 大型模型训练

**蓝线:**YOLO NAS 中型模型训练

**橙线:**YOLO NAS 小型模型培训

YOLO NAS 大型模型在第 43 个epoch达到了最高 mAP 44.4%,这里注意一点, YOLO NAS 大型模型相对较快地达到了较高的 mAP,说明与 YOLO NAS 中型和小型模型相比,YOLO NAS 大型模型具有探测困难物体的能力。

super-gradients API为每个实验保存三个不同的检查点,一个最佳模型,一个最新模型,一个平均权重。

由于 YOLO NAS 大型模型在自定义数据集训练中表现最佳,我们将进一步使用该模型进行推理实验。

更长时间地训练 YOLO NAS 大模型

从上述实验中可以看出,YOLO NAS Large 模型的性能最好,为了获得更好的结果,我们可以对该模型进行 100 次历时训练。YOLO_NAS_Large_Fine_Tuning.ipynb 可以实现这一目标。

下图是在自定义数据集上对模型进行 100 次历时训练后的 mAP 图。

图 6.对 YOLO NAS Large 模型进行 100 次训练后的平均精度

在自定义数据集上对YOLO NAS Large模型进行微调,mAP达到45%以上。

四. 使用训练过的 YOLO NAS 模型对测试图像进行推理

数据集中包含一个测试分割,保留它用于推理目的,可以执行 inference.ipynb 笔记本中的代码单元来运行推理实验,完成以下几件事:

1、首先,它从检查点目录加载经过最佳训练的YOLO NAS权重。

2、然后对测试图像进行推理,执行此操作时,代码会将推理结果保存在 inference_results/images 目录中,并保留原始图像名称。

3、获得推理结果后,笔记本会将地面实况注释重叠到预测图像上,从而显示一组图像。

最后一步将告诉我们训练模型遗漏了哪些对象,以及模型是否做出了错误预测。

通过可视化一些推理预测来开始分析。

 图 7.使用微调后的 YOLO NAS 模型在自定义数据集上进行训练后的推理结果

从初步分析来看,这个模型几乎可以预测所有的物体,甚至是看起来非常小的人,但是,要在这里找出任何错误就比较困难了。

在预测的基础上可视化地面实况注释是一个更好的方法。

 图 8. 重叠 YOLO NAS 模型的预测和真实注释以进行更深入的分析

在上图中,真实注释以红色显示,类名称位于底部。

可以看到,在大多数情况下,模型缺少对Person类的检测。除此之外,它还检测到实际上不是汽车的汽车实例,并且还检测到其中一张图像中的自行车作为人。

总的来说,该模型表现良好,只是无法检测到非常难以识别的物体。

五. YOLO NAS 训练模型视频推理结果

我们还对无人机热成像视频进行了推理实验。

剪辑 1. 在自定义数据集上训练 YOLO NAS 模型后的视频预测

完整视频效果请前往微信公众号“计算机视觉与OpenCV”查看

从结果可以看出,尽管相机移动摇晃,该模型仍可以在几乎所有帧中检测到人和汽车。
视频推理在配备 GTX 1060 GPU 的笔记本电脑上运行,模型的平均运行速度为17 FPS,使用的是 YOLO NAS Large 机型,整体速度还不错。

六. 结论

这篇文章,主要探讨如何在自定义数据集上训练 YOLO NAS 模型。在实验中,我选择了一个极具挑战性的热成像数据集,包含 5 个类别。这个数据集中的物体很小,人类很难检测到,但是 YOLO NAS 经过微调后做得非常好,这显示了 YOLO NAS 模型在实时检测小物体的实际用例中的潜力。

从实验中可以推断,新的 YOLO NAS 模型为实时检测开辟了新天地,这些应用包括监控、交通监控和医疗成像等。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1114901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# Winform编程(7)文件处理技术

文件处理技术 System.IO命名空间File类的常用方法FileInfo类的常用方法文件夹类Directory的常用方法 System.IO命名空间 System.IO命名空间常用的类 类说明File提供用于创建,复制,删除,移动和打开文件的静态方法,并协助创建File…

python triangle库将一组闭合点转化为三角网格时网格过密的问题

输入点的格式: [[x1,y1], [x2,y2], … [xn,yn], ] segments 格式: 指示输入点的连接关系 三角化代码: t2 triangle.triangulate({vertices: path,segments: segments}, peq32.5a0.5)效果: 网格过密,根据文档&…

SystemVerilog Assertions应用指南 Chapter1.38在序列匹配时调用子程序

SVA可以在序列每次成功匹配时调用子程序。同一序列中定义的局部变量可以作为参数传给这些子程序。对于序列的每次匹配,子程序调用的执行与它们在序列定义中的顺序相同。 module sub;logic a, b, clk;initial $vcdpluson();initial begin clk 1b0; a1b0; b1b0; repeat(2) (pos…

代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II

代码随想录算法训练营第二十八天 | LeetCode 491. 递增子序列、46. 全排列、47. 全排列 II 文章链接:递增子序列 全排列 全排列II 视频链接:递增子序列 全排列 全排列II 目录 代码随想录算法训练营第二十八天 | LeetCode 4…

使用VGG框架实现从二分类到多分类

一.数据集的准备 与之前的不同,这一次我们不使用开源数据集,而是自己来制作数据集。重点需要解决的问题是对数据进行预处理,如每一个图片的大小均不同,需要进行resize,还需要对每一张图片打标签等操作。 数据集文件 …

根据pid查看jar包(windows)

打开jdk/bin/jvisualvm.exe,根据pid找到jar包的主启动类,jdk14以后不再默认使用,官网下载,也可以使用老版本的查看

虚拟机如何联网【NAT】

查看VMWARE的IP地址 #进入root用户 su -#更改虚拟网卡设置界面 vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改ONBOOT为yes BOOTPROTO为static IPADDR为前面的网段 192.168.211.xx (xx为自己设置的,可以随意设置,前面的为前面查看的IP地址的前…

黑客技术(自学方法)——网络安全

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学?如何学? 今天给大家分享一下,很多人上来就说想学习黑客&#xff0c…

jupternotebook和jupterLab有什么区别?

目录 1.jupternotebook 2.jupterLab 3.总结 Jupyter Notebook和JupyterLab是两个常用的交互式计算环境,都是基于Jupyter项目开发的。它们具有一些共同的特性,但也存在一些区别。 1.jupternotebook Jupyter Notebook是Jupyter项目的早期版本&#xff…

【数据结构】线性表的顺序存储结构

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 一.顺序存储定义 上篇文章中介绍了线性表一共分为两种数据结构——顺序存储结构和链式存储结构. 今天我们就来一起学习一下第一种——顺序存储结构. 线性表的顺序存储结构,指…

AUTOSAR AP硬核知识点梳理(1)

一 什么是 Adaptive AUTOSAR? Adaptive AUTOSAR是一种新的汽车软件框架,旨在满足现代汽车行业中不断增长的技术需求。随着汽车变得越来越智能,对处理器的性能要求也在不断增长。 Adaptive AUTOSAR旨在通过提供高性能计算和通信机制以及灵活的软件配置来满足这些需求,为车…

代码随想录算法训练营第五十三天 | 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 视频讲解: https://programmercarl.com/0309.%E6%9C%80%E4%BD%B3%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E6%97%B6%E6%9C%BA%E5%90%AB%E5%86%B7%E5%86%BB%E6%9C%9F.html (1)代码 714.买卖股票的最佳时机含手续费…

通过字符设备驱动并编写应用程序控制三盏灯亮灭

现象 键盘按1三灯全亮 按0三灯全灭 头文件.h #ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0X50007014#defin…

底层驱动day2作业

控制三盏灯亮灭 代码: //head.h#ifndef __HEAD_H__ #define __HEAD_H__ #define PHY_RCC 0x50000A28 #define PHY_GPIOE_MODER 0x50006000 #define PHY_GPIOF_MODER 0x50007000 #define PHY_GPIOE_ODR 0x50006014 #define PHY_GPIOF_ODR 0x50007014#endif //demo…

JAVA毕业设计100—基于Java+Springboot+Vue的WMS仓库管理系统+移动端微信小程序(源码+数据库+部署视频)

基于JavaSpringbootVue的WMS仓库管理系统移动端(源码数据库部署视频) 一、系统介绍 本系统前后端分离带小程序 本系统分为管理员、用户角色(角色权限可自行分配) 功能列表: 1、 数据管理:物料数据管理、物料Bom管理、物料组管理、物料分类管理、供应…

口袋参谋:如何提升宝贝的点击率?这两种方法超简单!

​如何提升宝贝的点击率?这是99.99%商家都在疑惑的问题。今天我说的两种方法,超简单,一起来看看吧! 1、找精准关键词 首先一定要选择适合自己店铺的关键词,一定要精准。 找关键词的方法如下: a.卖家可以…

Coreldraw2020最新64位电脑完整版本下载教程

安装之前所有的杀毒软件都要退出。无论是360,腾讯管家,或者电脑自带的安全中心,要不然会阻止安装。 CorelDRAW2020版win下载如下:https://wm.makeding.com/iclk/?zoneid55678 CorelDRAW2020版mac下载如下:https://wm.makeding.com/iclk/?…

2023年全球及中国溶瘤病毒治疗药物行业现状及发展趋势分析[图]

溶瘤病毒治疗肿瘤具有杀伤效率高、靶向性好、安全性高、不良反应小等特点,溶瘤病毒疗法已经成为肿瘤治疗研究领域的新热点。溶瘤病毒疗法经历了早期对于天然病毒的摸索,后期基因工程技术的进步提升OV靶向性及免疫致敏能力,推动其快速发展。 …

性能测试 —— 数据准备与基准场景设计!

基础性能脚本 延迟时间网络时间服务处理时间 主要使用监听器,通过两者的差值,判断响应时间消耗: jpgc - Connect Times Over Timejpgc - Response Times Over Time 调试脚本阶段,可以使用查看结果树等监听器来观察运行结果 正…

经典网络模型

Alexnet VGG VGG的启示 VGGNet采用了多次堆叠3x3的卷积核,这样做的目的是减少参数的数量。 例如,2个3x3的卷积核效果相当于1个5x5的卷积核效果,因为它们的感受野(输入图像上映射区域的大小)相同。但2个3x3卷积核的参数…