YOLO-NAS:面向目标检测的下一代模型

本文涉及的产品
文件存储 NAS,50GB 3个月
简介: YOLO-NAS:面向目标检测的下一代模型

YOLO-NAS(You Only Look Once Neural Architecture Search)通过快速准确的实时检测功能彻底改变了目标检测,适用于生产环境。YOLO(You Only Look Once)是一系列计算机视觉模型,自从Joseph Redmon、Santosh Divvala、Ross Girshick和Ali Farhadi于2016年在CVPR(计算机视觉与模式识别)上引入这一新颖架构以来,就引起了很大的关注。


YOLO的故事


让我给你讲一个关于YOLO(You Only Look Once)的故事,这是计算机视觉中一个令人难以置信的目标检测模型。


一切始于Joseph Redmon于2016年创建了最初的YOLO。他使用了一个名为Darknet的自定义框架,以其灵活性和强大的实时目标检测能力而闻名。YOLO是开创性的,因为它将绘制边界框和识别对象类别的任务结合到了一个端到端可微分的网络中。在YOLO之前,许多目标检测模型采用了两阶段的方法。首先,它们识别可能存在对象的兴趣区域,然后对这些区域进行分类。然而,YOLO通过将目标检测视为单一回归问题,使其更有效率和更快速。Joseph Redmon继续改进YOLO并发布了YOLOv2和YOLOv3。这些版本进一步提高了模型的准确性和性能。但是YOLO的故事并没有在Joseph Redmon那里结束。新的作者加入了这个旅程,推出了YOLOv4、YOLOv5、YOLOv6、YOLOv7、YOLOv8和YOLO-NAS。这些后续版本有不同的目标,反映了各自作者的愿景。这种单通道的方法启发了其他模型,如Faster RCNN,也取得了令人瞩目的成果。


因此,这就是YOLO的故事——一个变革了目标检测的开创性模型,继续激发计算机视觉领域的进步。


YOLO-NAS


在这篇文章中,我将讨论最近开发的YOLO-NAS模型。在先前的YOLO版本中,人类专家手动设计了神经网络结构,依赖于他们的专业知识和直觉。然而,这种方法——需要探索包含许多可能架构的庞大设计空间——仍然过于繁重和耗时。


YOLO-NAS是由Deci-AI开发的一种新型基础模型。它在目标检测领域改变了游戏规则,提供了准确性和延迟之间的最佳平衡。Deci-AI使用的AutoNAC技术是由Deci开发的一种优化引擎。AutoNAC将神经架构搜索(NAS)应用于已经训练好的模型,以在特定硬件上运行时提高模型的性能,同时保持其原始准确性作为基准。通过这样做,Deci-AI可以最大限度地利用硬件,使他们的深度学习加速平台变得更加出色。

您可以利用AutoNAC™引擎输入任务、数据属性(无需访问数据)、推理设置和性能目标。该引擎将引导您找到最适合在您的独特应用中在精度和推理速度之间取得平衡的架构。除了考虑数据和硬件外,AutoNAC引擎还考虑推理堆栈中的其他组件,包括量化和编译器。


在AI研究中,深度学习模型变得越来越复杂,导致应用程序的增加。然而,在云平台上运行这些模型需要大量的计算能力,使开发人员面临着在保持准确性的同时减小模型大小的任务。


YOLO-NAS还包括用于优化性能的量化感知块和选择性量化。这里,量化是指将神经网络的权重、偏差和激活从浮点转换为整数值(INT8),从而使模型更有效。转换为其INT8量化版本时,精度下降较小。


量化感知训练是一种允许开发人员在不损失准确性的情况下应用量化的方法。这是在模型训练过程中完成的,模型大小通常减少了两到四倍甚至更多。后训练量化是一种在模型完成训练后应用量化的方法。超梯度支持选择性和部分量化,即跳过量化模块或将其替换为友好的量化对应物。

这些方法的应用产生了在识别对象和提供卓越性能方面表现卓越的设计。


训练详细信息


YOLO-NAS的多阶段训练过程包括在Object365、COCO Pseudo-Labeled数据、Roboflow100、Knowledge Distillation(KD)和Distribution Focal Loss(DFL)上进行预训练。预训练使用知识蒸馏从预测中学习并提高性能。教师模型生成预测,这些预测用作学生模型的软目标,后者试图匹配它并调整为原始标记的数据。这降低了过拟合并提高了准确性,特别是在标记数据有限的情况下。引入分布焦点损失(DFL)通过解决类别不平衡问题,提高了对少数类别的检测准确性。


YOLO-NAS的性能


YOLO-NAS更新提供了领先其他模型(如YOLOv5、YOLOv6、YOLOv7和YOLOv8)的性能,具有无与伦比的准确性和速度的组合。如下图所示,YOLO-NAS的所有版本,即小型、中型和大型,无论是否进行量化,都实现了良好的准确性。此外,与先前的SOTA模型YOLOv8相比,map值有所提高。

YOLO-NAS

YOLO-NAS已发布了三个不同版本,即小型、中型和大型,分为量化和非量化两种情况。明显可以看到,在应用量化时map值略有下降。

Deci-AI YOLO-NAS

YOLO-NAS的实施


步骤1:要尝试YOLO-NAS,我们首先需要安装super-gradients库,这是Deci的基于PyTorch的计算机视觉库。


pip install super-gradients

步骤2:安装所有必需的库。


pip install imutils
pip install roboflow
pip install pytube --upgrade
pip install --upgrade pillow

步骤3:导入super-gradients库,然后获取模型的任何版本,即yolo_nas_l、yolo_nas_m或yolo_nas_s。


from super_gradients.training import models
_nas_s = models.get("yolo_nas_s", pretrained_weights="coco").to(device)

您可以使用以下代码片段将device声明为CPU或GPU。

import torch
device = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")

步骤4:在图像上进行推理。


yolo_nas_s.predict("img.jpg").show()

以下是我们模型的输出图像:

结果

正如您在结果图片中看到的那样,所有的椅子都被检测到。桌子上的小物体,如杯子和笔记本电脑,也被检测到了。


在自定义数据集上进行YOLO-NAS的微调


步骤1:使用单个GPU实例化训练器。


from super_gradients.training import Trainer
CHECKPOINT_DIR = 'checkpoints'
trainer = Trainer(experiment_name='my_first_yolonas_run', ckpt_root_dir=CHECKPOINT_DIR)

步骤2:安装所有必需的库。


from roboflow import Roboflow
rf = Roboflow(api_key="<your-roboflow-key-here>")
project = rf.workspace("atathamuscoinsdataset").project("u.s.-coins-dataset-a.tatham")
dataset = project.version(5).download("yolov5")

步骤3:导入super-gradients库,然后获取模型的任何版本,即yolo_nas_l、yolo_nas_m或yolo_nas_s。


from super_gradients.training import dataloaders
from super_gradients.training.dataloaders.dataloaders import coco_detection_yolo_format_train, coco_detection_yolo_format_val

您可以使用以下代码片段将device声明为CPU或GPU。

步骤4:在图像上进行推理。


dataset_params = {
    'data_dir':'/content/U.S.-Coins-Dataset---A.Tatham-5',
    'train_images_dir':'train/images',
    'train_labels_dir':'train/labels',
    'val_images_dir':'valid/images',
    'val_labels_dir':'valid/labels',
    'test_images_dir':'test/images',
    'test_labels_dir':'test/labels',
    'classes': ['Dime', 'Nickel', 'Penny', 'Quarter']
}

步骤5:在这里,我们将dataset_params的值传递给dataset_params参数。我们将批处理大小设置为16,将num_workers设置为2,如下所示。

from IPython.display import clear_output
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':16,
        'num_workers':2
    }
)
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':16,
        'num_workers':2
    }
)
test_data = coco_detection_yolo_format_val(
    dataset_params={
        'data_dir': dataset_params['data_dir'],
        'images_dir': dataset_params['test_images_dir'],
        'labels_dir': dataset_params['test_labels_dir'],
        'classes': dataset_params['classes']
    },
    dataloader_params={
        'batch_size':16,
        'num_workers':2
    }
)
clear_output()

步骤6:SuperGradients添加了转换器。


train_data.dataset.transforms

步骤7:在此步骤中,我们正在实例化我们的模型。在这里,我们需要添加一个num_classes参数。


from super_gradients.training import models
model = models.get('yolo_nas_l', 
                   num_classes=len(dataset_params['classes']), 
                   pretrained_weights="coco"
                   )


步骤8:您可以定义一些训练参数,如max_epochs、loss、optimizer、train_metrices_list、vallid_metrices_list和metric_to_watch。您可以选择不同的优化器,例如Adam、AdamW、SGD、Lion或RMSProps。

from super_gradients.training.losses import PPYoloELoss
from super_gradients.training.metrics import DetectionMetrics_050
from super_gradients.training.models.detection_models.pp_yolo_e import PPYoloEPostPredictionCallback
train_params = {
    # ENABLING SILENT MODE
    'silent_mode': True,
    "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"},
    # ONLY TRAINING FOR 10 EPOCHS FOR THIS EXAMPLE NOTEBOOK
    "max_epochs": 10,
    "mixed_precision": True,
    "loss": PPYoloELoss(
        use_static_assigner=False,
        # NOTE: num_classes needs to be defined here
        num_classes=len(dataset_params['classes']),
        reg_max=16
    ),
    "valid_metrics_list": [
        DetectionMetrics_050(
            score_thres=0.1,
            top_k_predictions=300,
            # NOTE: num_classes needs to be defined here
            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'
}

步骤9:现在,我们可以使用SuperGradients训练器启动模型训练。

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

步骤10:使用最佳权重,我们可以在不同的测试图像上执行检测。


img_path = 'your image path'
best_model.predict(img_url).show()


通过这种方式,您可以为自己的数据集微调YOLO-NAS。


结论

Deci的AutoNAC神经架构搜索技术使得YOLO-NAS模型能够实现卓越的速度和准确性。该模型在市场上所有目标检测模型中脱颖而出,提供了准确性和延迟之间的最佳权衡。YOLO-NAS可以进行量化,并且可以使用TensorRT进行部署,使其完全适用于生产环境。

相关实践学习
基于ECS和NAS搭建个人网盘
本场景主要介绍如何基于ECS和NAS快速搭建个人网盘。
阿里云文件存储 NAS 使用教程
阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例、HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。 产品详情:https://www.aliyun.com/product/nas
相关文章
|
7月前
|
监控 数据可视化 API
yolo-nas无人机高空红外热数据小目标检测(教程+代码)
yolo-nas无人机高空红外热数据小目标检测(教程+代码)
|
存储 人工智能 Serverless
将Stable Diffusion模型文件转存到FC环境的NAS
本文将会指导你开通基于NAS的Stable Diffusion 函数计算FC环境,并且可以将SD模型库的模型转存下载到FC应用下的NAS存储空间
3451 2
将Stable Diffusion模型文件转存到FC环境的NAS
|
4月前
|
消息中间件 存储 Serverless
函数计算产品使用问题之怎么访问网络附加存储(NAS)存储模型文件
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
弹性计算 运维 Serverless
函数计算产品使用问题之更换NAS模型后遇到问题,该如何排查
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
存储 运维 Serverless
函数计算产品使用问题之模型存放在NAS中,如何删除NAS中的模型文件
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
人工智能 文件存储
体验阿里云NAS+PAI-ECS部署Stable Diffusion文生图模型
当下,AIGC在生活中无处不见。作为一种新型的内容生产方式,AIGC在传媒、电商、影视等行业的作用可谓是卓有成效。我们可以用AI自主生成创造新的文本、图像、音乐、视频、3D交互内容,一定程度上为日常工作带来了很大的便利。
438 12
体验阿里云NAS+PAI-ECS部署Stable Diffusion文生图模型
|
存储 机器学习/深度学习 人工智能
玩转AIGC | 使用阿里云NAS+PAI-EAS部署Stable Diffusion文生图模型
阿里云的AIGC存储解决方案是覆盖了数据收集、模型训练以及模型推理整个生命周期,本实验场景主要覆盖模型推理过程,介绍如何使用模型在线服务(PAI-EAS)以及文件存储NAS部署AIGC应用,快速生成图片。
13038 10
玩转AIGC | 使用阿里云NAS+PAI-EAS部署Stable Diffusion文生图模型
|
存储 网络安全 文件存储
通过在线迁移转存Stable Diffusion模型库到NAS
本文将会指导您将流行的Stable Diffusion模型库迁移到您自有的文件存储NAS空间里
|
存储 Serverless 网络安全
热门Stable Diffusion模型库快速转存至个人NAS与加载训练
本实验介绍如何使用阿里云在线迁移服务,将热门模型库从国内镜像站点转存到个人文件存储NAS中,并且可将NAS里的模型挂载到FC函数计算或PAI平台进行推理和训练。
|
存储 机器学习/深度学习 文件存储
在PAI-EAS(阿里云机器学习平台扩展智能计算服务)上使用存储在NAS中的模型
在PAI-EAS(阿里云机器学习平台扩展智能计算服务)上使用存储在NAS中的模型
268 0

热门文章

最新文章