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

news2024/9/24 1:27:00

在这里插入图片描述

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

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

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

 图 1.在自定义数据集上训练 YOLO NAS 模型后的输出示例

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对小物体的准确性。
该数据集包含 5 个物体类别的 2898 幅热图像:

1、人
2、汽车
3、自行车
4、其他车辆
5、不关心

数据集已包含训练、验证和测试三部分,有 2008 个训练样本、287 个验证样本和 571 个测试样本,数据集已采用 YOLO 注释格式。
以下是数据集中一些未经标注的地面实况图像。

 图 2. 无人机高空红外热数据集的未标注图像

很显然,除了汽车之外,如果没有适当的标注,人眼是无法看到地面上的其他物体的。

为了了解每个物体的位置,可以看一些有标注的图片。

   图 3.无人机热成像数据集的标注图像

上图有助于更好地了解数据集中的物体,可以看到,在这个数据集中,我们人眼很难检测到人和自行车等物体,但经过训练后的YOLO-NAS 模型却可以检测到。

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

接下来,开始深入研究本文的编码部分,如需下载完整本文代码,请添加老师微信 peaeci122

下面的代码将训练三个 YOLO NAS 模型:

YOLO NAS s(小型)

YOLO NAS m(中型)

YOLO NAS l(大型)

开始之前,需要先安装super-gradients,整个训练和推理过程中都需要它。

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

微调 YOLO NAS 模型

第一步是导入所有必要的包和模块。

from super_gradients.training import Trainer
from super_gradients.training import dataloaders
from super_gradients.training.dataloaders.dataloaders import (
    coco_detection_yolo_format_train, 
    coco_detection_yolo_format_val
)
from super_gradients.training import models
from super_gradients.training.losses import PPYoloELoss
from super_gradients.training.metrics import (
    DetectionMetrics_050,
    DetectionMetrics_050_095
)
from super_gradients.training.models.detection_models.pp_yolo_e import PPYoloEPostPredictionCallback
from tqdm.auto import tqdm

import os
import requests
import zipfile
import cv2
import matplotlib.pyplot as plt
import glob
import numpy as np
import random

检查上述代码块中所有的主要导入

1、Trainer:培训师启动培训过程并设置实验目录;

2、dataloaders:Super Gradients 提供自己的数据加载器,轻松训练 YOLO NAS 模型;

3、coco_detection_yolo_format_train, coco_detection_yolo_format_val: 帮助定义训练和验证数据集;

4、models:初始化YOLO NAS模型;

5、PPYoloELoss:YOLO NAS 在训练时使用 PPYoloELoss;

6、DetectionMetrics_050, DetectionMetrics_050_095:在训练时监控 mAP在50% IoU和主要度量。

数据集下载和目录结构

接下来的几个代码块将下载数据集并将其提取到当前目录,这里我们先跳过这些代码块。所有笔记本和数据集都在父数据集目录中,结构如下:

hit-uav
├── dataset.yaml
├── images
│   ├── test
│   ├── train
│   └── val
└── labels
    ├── test
    ├── train
    └── val

训练 YOLO NAS 的数据集参数

准备数据集,进行多次训练实验,然后定义所有数据集路径和类,以及数据集参数字典。

ROOT_DIR = 'hit-uav'
train_imgs_dir = 'images/train'
train_labels_dir = 'labels/train'
val_imgs_dir = 'images/val'
val_labels_dir = 'labels/val'
test_imgs_dir = 'images/test'
test_labels_dir = 'labels/test'
classes = ['Person', 'Car', 'Bicycle', 'OtherVechicle', 'DontCare']

dataset_params = {
    'data_dir':ROOT_DIR,
    'train_images_dir':train_imgs_dir,
    'train_labels_dir':train_labels_dir,
    'val_images_dir':val_imgs_dir,
    'val_labels_dir':val_labels_dir,
    'test_images_dir':test_imgs_dir,
    'test_labels_dir':test_labels_dir,
    'classes':classes 
}

使用 dataset_params,可以轻松创建所需格式的数据集。此外,还需要定义训练周期数、批量大小和数据处理的工作人员数量。


# Global parameters.
EPOCHS = 50
BATCH_SIZE = 16
WORKERS = 8

上述超参数和数据集参数将全部用于三个训练实验。

训练 YOLO NAS 的数据集准备

所有参数都准备就绪后,就可以定义训练数据集和验证数据集了。

train_data = coco_detection_yolo_format_train(
    dataset_params={
        'data_dir': dataset_params['data_dir'],
        'images_dir': dataset_params['train_images_dir'],
        'labels_dir': dataset_params['train_labels_dir'],
        'classes': dataset_params['classes']
    },
    dataloader_params={
        'batch_size':BATCH_SIZE,
        'num_workers':WORKERS
    }
)

val_data = coco_detection_yolo_format_val(
    dataset_params={
        'data_dir': dataset_params['data_dir'],
        'images_dir': dataset_params['val_images_dir'],
        'labels_dir': dataset_params['val_labels_dir'],
        'classes': dataset_params['classes']
    },
    dataloader_params={
        'batch_size':BATCH_SIZE,
        'num_workers':WORKERS
    }
)

在上面的代码块中,分别创建train_data和val_data用于训练和验证。

使用dataset_params字典来获取数据集路径和数据集类值,还为每个数据集定义了 dataloader_params,用于接受数据加载过程的批量大小和工人数量。

现阶段先排除测试分割,将其保留到以后使用,以便使用训练有素的 YOLO NAS 模型进行推理。

定义YOLO NAS训练的变换和增强

数据增强是训练任何深度学习模型的重要组成部分,可以让我们在不过度拟合的情况下训练更长时间的稳健模型。在训练过程中,模型还会学习到不同的特征,而这些特征可能并不属于原始数据集。

Super Gradients的数据转换管道为应用和控制增强提供了一种有效的方法。

下面将打印应用于数据集的所有默认转换。

  train_data.dataset.transforms

会看到以下输出


[DetectionMosaic('additional_samples_count': 3, 'non_empty_targets': False, 'prob': 1.0, 'input_dim': [640, 640], 'enable_mosaic': True, 'border_value': 114),

 DetectionRandomAffine('additional_samples_count': 0, 'non_empty_targets': False, 'degrees': 10.0, 
'translate': 0.1, 'scale': [0.1, 2], 'shear': 2.0, 'target_size': [640, 640], 'enable': True, 'filter_box_candidates': True, 'wh_thr': 2, 'ar_thr': 20, 'area_thr': 0.1, 'border_value': 114),

 DetectionMixup('additional_samples_count': 1, 'non_empty_targets': True, 'input_dim': [640, 640], 'mixup_scale': [0.5, 1.5], 'prob': 1.0, 'enable_mixup': True, 'flip_prob': 0.5, 'border_value': 114),
.
.
.
XYCoordinateFormat object at 0x7efcc5c07340>), ('labels', name=labels length=1)]), 'output_format': OrderedDict([('labels', name=labels length=1), ('bboxes', name=bboxes length=4 format=
<super_gradients.training.datasets.data_formats.bbox_formats.cxcywh.CXCYWHCoordinateFormat object at 0x7efcc5976170>)]), 'max_targets': 120, 'min_bbox_edge_size': 1, 'input_dim': [640, 640], 'targets_format_converter': 
<super_gradients.training.datasets.data_formats.format_converter.ConcatenatedTensorFormatConverter object at 0x7efcb956b5b0>)]

在众多增强技术中,MixUp 是其中之一,但是,如果处理不当,MixUp 会导致深度学习模型极难感知数据集。目前通过初步实验,发现数据集的 MixUp 增强会使数据集变得非常混乱,因为它会将一个图像重叠在另一个图像上,移除 Mixup 增强功能并保持其他功能不变会提高性能。

可以通过弹出索引 2 中的元素,从列表中删除 MixUp 增强。

############ An example on how to modify augmentations ###########
train_data.dataset.transforms.pop(2)

可以使用以下代码将转换后的图像可视化

train_data.dataset.plot(plot_transformed_data=True)

  图 4. 用于训练 YOLO NAS 模型的无人机热成像数据集的转换图像

除了 MixUp,还对图像进行了马赛克、旋转、放大和缩小等增强处理。

未完待续

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【三】kubernetes kuboard部署分布式系统

#服务器 #部署 #云原生 #k8s 目录 一、前言二、搭建docker私有仓库三、系统搭建1、NFS部署1)部署nfs server &#xff08;192.168.16.200&#xff09;2)部署nfs client &#xff08;全部节点&#xff09;3)在Kuboard中创建 NFS 存储类 2、创建命名空间3、添加docker密文4、创建…

Nginx 配置文件解读

一.配置文件解读 nginx配置文件主要分为四个部分&#xff1a; main{ #&#xff08;全局设置&#xff09;http{ #服务器配置upstream{} #&#xff08;负载均衡服务器设置&#xff09;server{ #&#xff08;主机设置&#xff1a;主要用于指定主机和端口&#xff09;location{} …

Flink学习之旅:(三)Flink源算子(数据源)

1.Flink数据源 Flink可以从各种数据源获取数据&#xff0c;然后构建DataStream 进行处理转换。source就是整个数据处理程序的输入端。 数据集合数据文件Socket数据kafka数据自定义Source 2.案例 2.1.从集合中获取数据 创建 FlinkSource_List 类&#xff0c;再创建个 Student 类…

5256C 5G终端综合测试仪

01 5256C 5G终端综合测试仪 产品综述&#xff1a; 5256C 5G终端综合测试仪主要用于5G终端、基带芯片的研发、生产、校准、检测、认证和教学等领域。该仪表具备5G信号发送功能、5G信号功率特性、解调特性和频谱特性分析功能&#xff0c;支持5G终端的产线高速校准及终端发射机…

Dev-C++ 软件安装教程

Dev-C 软件安装包https://download.csdn.net/download/W_Fe5/88446511&#xff08;软件包下载后&#xff0c;右键解压&#xff09; 一、打开文件夹&#xff0c;双击“Dev-C” 二、软件安装&#xff0c;点击“OK” 三、点击“I Agree” 四、点击“Next” 五、更改安装目录&…

虚拟机ubantu系统突然重启失去网络

1.进入 root用户 cd /var/lib/NetworkManager然后查看网络服务状态 如果网络状态和我一样不可用 ,就先停止网络服务 service ModemManager stop#删除状态rm networker.stateservice ModemManager start

基于Pytorch的CNN手写数字识别

作为深度学习小白&#xff0c;我想把自己学习的过程记录下来&#xff0c;作为实践部分&#xff0c;我会写一个通用框架&#xff0c;并会不断完善这个框架&#xff0c;作为自己的入门学习。因此略过环境搭建和基础知识的步骤&#xff0c;直接从代码实战开始。 一.下载数据集并加…

【遮天】最新预告,叶凡一怒报仇,导演再删减人物,还暴露一个严重问题

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析遮天国漫资讯。 《遮天》动漫第30集预告已出&#xff0c;叶凡被挟持进入荒古禁地&#xff01;这一集看下来&#xff0c;导演又删减人物了&#xff0c;还暴露一个问题。 在预告中&#xff0c;叶凡已经被姬家和姜家的人带往…

【C++ 学习 ㉙】- 详解 C++11 的 constexpr 和 decltype 关键字

目录 一、constexpr 关键字 1.1 - constexpr 修饰普通变量 1.2 - constexpr 修饰函数 1.3 - constexpr 修饰类的构造函数 1.4 - constexpr 和 const 的区别 二、decltype 关键字 2.1 - 推导规则 2.2 - 实际应用 一、constexpr 关键字 constexpr 是 C11 新引入的关键字…

Spring Boot学习笔记(1)

Spring Boot学习笔记&#xff08;1&#xff09; 1.环境1.win2.mac3. IDEA 2.知识点1.Record类2.Switch开关表达式3. var和sealed4.springboot5.启用lombok 学习资料&#xff1a; 官网&#xff0c; 手册&#xff0c; 视频。 1.环境 1.win 1.下载vscode 2.安装jdk&#xff0…

求助C语言大佬:C语言的main函数参数问题

最近在敲代码的过程中&#xff0c;突发奇想&#xff0c;产生了一个疑问&#xff1a; 为什么main函数可以任由我们定义&#xff1a;可以接收一个参数、两个参数、三个参数都接接收&#xff0c;或者可以不接收&#xff1f;这是如何实现的 int main(){retrun 0; } int main (int…

移动app安全检测报告有什么作用?

移动app安全测试是一项至关重要的任务&#xff0c;它能够帮助确保移动应用程序在使用过程中不会受到各种安全威胁的侵害。在如今移动应用程序日益普及的时代&#xff0c;移动app安全测试尤为重要。移动app安全检测报告是基于专业的安全测试团队进行的全面分析后生成的&#xff…

博客积分上一万了

博客积分上一万了 继续努力&#xff0c;勇往直前。

JOSEF约瑟 JD3-40/23 JD3-70/23漏电继电器 AC220V\0.05-0.5A

JD3系列漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压至1140V&#xff0c;频率为50Hz&#xff0c;该继电器与分励脱扣器或失压脱扣器的断路器、交流接触器、磁力启动器等组成漏电保护装置&#xff0c;作漏电和触电保护之用&#xff0c;可配备蜂鸣器、信号等…

短视频是“风口”还是“疯口”?

熟悉我的粉丝都知道&#xff0c;最近去追了下短视频的风口&#xff0c;折腾了几个视频出来。且不说视频效果如何&#xff0c;单单是制作视频的过程&#xff0c;就差点没要了童话的老命。看似短短的几分钟&#xff0c;真的应了那句话&#xff1a;台上一分钟&#xff0c;台下十年…

Ubuntu系统忘记Root用户密码-无法登录系统-更改Root密码-Ubuntu系统维护

一、背景 很多时候&#xff0c;我们总会设计复杂的密码&#xff0c;但是大多数时候&#xff0c;我们反而会先忘记我们的密码&#xff0c;导致密码不仅仅阻挡其他用户进入系统&#xff0c;同时也阻碍我们进入系统。 本文将介绍在忘记密码的情况下&#xff0c;如何进入系统并更改…

macOS Sonoma 桌面小工具活学活用!

macOS Sonoma 虽然不算是很大型的改版&#xff0c;但当中触目的新功能是「桌面小工具」&#xff08;Widget&#xff09;。如果我们的萤幕够大&#xff0c;将能够放更多不同的Widget&#xff0c;令用户无须开App 就能显示资讯&#xff0c;实在相当方便。 所有iPhone Widget 也能…

基于Springboot服装商品管理系统免费分享

基于Springboot服装商品管理系统 作者: 公众号(擎云毕业设计指南) 更多毕设项目请关注公众号&#xff0c;获取更多项目资源。如需部署请联系作者 注&#xff1a;禁止使用作者开源项目进行二次售卖&#xff0c;发现必究&#xff01;&#xff01;&#xff01; 运行环境&…

controller调用service层报错Invalid bound statement (not found)

报错信息&#xff1a; "Invalid bound statement (not found): com.gelei.system.service.TbUserFollowService.getMyUserFanList" 这个问题就很神奇&#xff0c;请看下图&#xff0c;我测试的时候就是这么个情况&#xff1b; 综上所述&#xff0c;解决方法如下&…

pragma once与ifndef的区别

概要 代码编译过程中&#xff0c;为了防止同一份代码被重复引用&#xff0c;通常有两种实现方式 方式一 #pragma once 方式二 #ifndef _TEST_H_ #define _TEST_H_ #endif // !TEST_H 通常情况下&#xff0c;使用上述两种方式中的任意一种都是可以的。最近工作中&#xff0c;代…