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

2024-02-26 22:30

本文主要是介绍【视觉算法系列3】在自定义数据集上训练 YOLO NAS(下篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

提示:免费获取本文涉及的完整代码与数据集,请添加微信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 模型为实时检测开辟了新天地,这些应用包括监控、交通监控和医疗成像等。

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

这篇关于【视觉算法系列3】在自定义数据集上训练 YOLO NAS(下篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/750355

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费