YOLO-NAS
受启发于YOLOv6、YOLOv7以及YOLOv8,DECI的研究人员采用AutoNAC搜索比YOLOv8更优的架构,即"We used machine learning to find a new deep learning architecture!为什么要用AutoNAC呢?这是因为手工寻找"正确"结构过于低效且乏味,因此DECI的研究人员采用AutoNAC搜索新的目标检测模型,同时最小化在
YOLO-NAS达成目标检测任务新高度,取得了最佳的精度-延迟均衡。值得一提,YOLO-NAS与TensorRT推理引擎完全兼容,且支持INT8量化,达成前所未有的运行时性能。
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的性能
YOLO-NAS更新提供了领先其他模型(如YOLOv5、YOLOv6、YOLOv7和YOLOv8)的性能,具有无与伦比的准确性和速度的组合。如下图所示,YOLO-NAS的所有版本,即小型、中型和大型,无论是否进行量化,都实现了良好的准确性。此外,与先前的SOTA模型YOLOv8相比,map值有所提高。
训练详细信息
YOLO-NAS的多阶段训练过程包括在Object365、COCO Pseudo-Labeled数据、Roboflow100、Knowledge Distillation(KD)和Distribution Focal Loss(DFL)上进行预训练。预训练使用知识蒸馏从预测中学习并提高性能。教师模型生成预测,这些预测用作学生模型的软目标,后者试图匹配它并调整为原始标记的数据。这降低了过拟合并提高了准确性,特别是在标记数据有限的情况下。引入分布焦点损失(DFL)通过解决类别不平衡问题,提高了对少数类别的检测准确性。
亮点在哪里?
-
引入QARepVGG同时利用重参数与8-bit量化的优势;
-
采用AutoNAC搜索最优尺寸、每个stage的结构,含模块类型、数量以及通道数;
-
采用混合量化机制进行模型量化,既考虑了每一层对精度与延迟的影响,也考虑了8-bit与16-bit之间切换对整体延迟的影响;
-
预训练方案:automatically labeled data, self-distillation, and large datasets
总而言之,YOLO-NAS达成目标检测任务新高度,取得了最佳的精度-延迟均衡。值得一提,YOLO-NAS与TensorRT推理引擎完全兼容,且支持INT8量化,达成前所未有的运行时性能。
Model | mAP | Latency (ms) |
---|---|---|
YOLO-NAS S | 47.5 | 3.21 |
YOLO-NAS M | 51.55 | 5.85 |
YOLO-NAS L | 52.22 | 7.87 |
YOLO-NAS S INT-8 | 47.03 | 2.36 |
YOLO-NAS M INT-8 | 51.0 | 3.78 |
YOLO-NAS L INT-8 | 52.1 | 4.78 |
方案简介
受启发于YOLOv6、YOLOv7以及YOLOv8,DECI的研究人员采用AutoNAC搜索比YOLOv8更优的架构,即"We used machine learning to find a new deep learning architecture!"
为什么要用AutoNAC呢? 这是因为手工寻找"正确"结构过于低效且乏味,因此DECI的研究人员采用AutoNAC搜索新的目标检测模型,同时最小化在NVIDIA T4上的推理延迟。
为构建YOLO-NAS,作者构建了一个深不可测的搜索空间(10)以探索精度-延迟上限。最终,作者从中三样三个"前沿观察点"构建了YOLO-NAS-S,YOLO-NAS-M,YOLO-NAS-L。
训练简介
YOLO-NAS采用了多阶段训练方式,包含(1)预训练:Object365+COCO伪标签数据;(2)知识蒸馏;(3) DFL,即Distribution Focal Loss
在训练数据方面,作者基于RoboFlow100(由100个不同领域的数据集构成)进行训练以验证其处理复杂检测任务的能力。
下图对比了YOLO-NAS与YOLOv8、YOLOv5、YOLOv7在Roboflow100数据集上的性能。
量化感知
YOLO-NAS采用了量化感知模块与Selective量化以达成最优性能,即基于延迟-精度均衡考虑在特定层进行了"Skipping量化"。当转换为INT8量化模型后,YOLO-NAS具有更少的精度损失(L-M-S的损失分别为0.45,0.65,0.51mAP)。
YOLO-NAS架构和预训练权重定义了低延迟推理的新领域,也是微调下游任务的绝佳起点。
上手体验
看完上面的介绍有没有“一头雾水”的感觉,哈哈,上手体验一把。
Step 1. 安装super-gradients
conda create -n sg python=3.7
conda activate sg
pip install super-gradients
Step 2. 命令行测试
from super_gradients.training import models
from super_gradients.common.object_names import Models
net = models.get(Models.YOLO_NAS_S, pretrained_weights='coco')
net.predict("bus.jpg").show()
不出意外的话,你就可以看到下面的输出结果了。
当然,如果出了意外,可以试试用ONNX推理,导出只需一行代码。
models.convert_to_onnx(model=net, input_shape=(3, 640, 640), out_path='yolo-nas-s.onnx')
相关推理code可参考"YOLOv8-TensorRT"中的推理微调一下即可。需要注意以下两点,通过官方工具导出的"bboxes"已经是"xyxy"格式了,所以不需要再执行make_grid
, distance2bbox
等操作了,直接进行"NMS
"即可。但是,OpenCV的NMS要求输入的BBOXES格式为xywh
,所以还需要再改一下,^^哈哈哈^^ whaosoft aiot http://143ai.com
最后,附上YOLO-NAS的网络结构示意图,这里仅给出了YOLO-NAS-S的示意图,另外两个跟这个整体类似,区别在于Block改为了YOLOv7的ELAN且通道数更多。
开发一种新的基于 YOLO 的架构可以通过解决现有的局限性并结合深度学习的最新进展来重新定义最先进的 (SOTA) 对象检测。深度学习公司 Deci.ai 最近推出了 YOLO-NAS。这种深度学习模型提供卓越的实时对象检测能力和高性能,可用于生产。这些 YOLO-NAS 模型是使用 Deci 的 AutoNAC™ NAS 技术构建的,性能优于 YOLOv7 和 YOLOv8 等模型,包括最近推出的 YOLOv6-v3.0。
开发一种新的基于 YOLO 的架构可以通过解决现有的局限性并结合深度学习的最新进展来重新定义最先进的 (SOTA) 对象检测。
YOLO-NAS 是 Deci.ai 的一种新的对象检测基础模型。该团队结合了深度学习的最新进展,以找出并改进当前 YOLO 模型的一些关键限制因素,例如量化支持不足和准确度-延迟权衡不足。通过这样做,该团队成功地突破了实时对象检测功能的界限。
“NAS”代表“神经架构搜索”,这是一种用于自动化神经网络架构设计过程的技术。NAS 不依赖手动设计和人类直觉,而是采用优化算法来发现最适合给定任务的架构。NAS 的目标是找到一种在准确性、计算复杂性和模型大小之间实现最佳权衡的架构。
YOLO-NAS 模型的架构是使用 Deci 的专有 NAS 技术AutoNAC “发现”的。该引擎用于确定阶段的最佳大小和结构,包括块类型、块数和每个阶段中的通道数。
NAS 搜索空间中总共有10的14次方种可能的架构配置。作为硬件和数据感知,AutoNAC 引擎考虑了推理堆栈中的所有组件,包括编译器和量化,并磨练到称为“效率边界”的区域以找到最佳模型。所有三个 YOLO-NAS 模型都在搜索空间的这个区域中找到。
在整个NAS 过程中,Quantization-Aware RepVGG (QA-RepVGG) 块被合并到模型架构中,保证了模型与 Post-Training Quantization (PTQ) 的兼容性。
使用由 QA-RepVGG 块组成的量化感知“QSP”和“QCI”模块可提供 8 位量化和重新参数化优势,从而在 PTQ 期间实现最小的精度损失。
研究人员还使用了一种混合量化方法,可以选择性地量化特定层,以优化准确性和延迟权衡,同时保持整体性能。
YOLO-NAS 模型还使用注意力机制和推理时间重新参数化来提高目标检测能力。
YOLO-NAS模型训练小结
在撰写本文时,尚未公布整个训练方案的全部细节。一旦有论文或任何新信息可用,我们将更新此部分。从我们从他们的官方新闻稿中收集到的信息来看,这些模型经历了连贯且昂贵的训练过程。
这些模型在著名的 Object365 基准数据集上进行了预训练。由 2M 图像和 365 个类别组成的数据集。
“伪标记”123k COCO 未标记图像后的另一轮预训练。
还结合了知识蒸馏 (KD) 和分布焦点损失 (DFL) 以增强 YOLO-NAS 模型的训练过程。
在对模型进行预训练后,作为一项实验,该团队决定在 RoboFlow的“RoboFlow100 数据集”上测试性能,以展示其处理复杂物体检测任务的能力。不用说,YOLO-NAS 的性能大大优于其他 YOLO 版本。
如何使用YOLO-NAS进行推理
要使用YOLO-NAS模型,我们首先需要安装一些库。在新的开发环境中,执行以下Python安装命令:
pip install -qU super-gradients imutils
pip install -qU roboflow
pip install -qU pytube
“super-gradients”包将安装所有必需的包,例如 PyTorch 和 TorchVision,以及 Cuda 支持和其他必要的库。
对象检测推理
为了进行推理,首先,我们将导入两个必要的包:
import torch
from super_gradients.training import models
对图像进行推理非常容易。以下命令加载模型YOLO-NAS S小型模型。
device = torch.device("cuda:0") if torch.cuda.is_available() else torch.device("cpu")
model = models.get("yolo_nas_s", pretrained_weights="coco").to(device)
# "yolo_nas_m"
# "yolo_nas_l"
我们正在经典的对象检测测试图像上测试模型。我们需要调用模的.predict(...)方法来执行推理。
out = model.predict("test_1.jpg", conf=0.6)
最后,要可视化输出,只需运行:out.show()
要保存预测图像,请调用:
out.save("save_folder_path")
同样,为了对视频进行推理,API 调用保持不变。只有这一次,我们将使用最大的可用模型。
model = models.get("yolo_nas_l", pretrained_weights="coco").to(device)
model.predict("/test_videos/kitchen_small_items.mp4").save("kitchen_small_items_detections.mp4")
在免费的 Colab T4 GPU 上,该推理以约 22 次迭代/秒的速度运行,即 22 FPS。30 秒的视频大约需要 35 秒才能完全处理。
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
yolo_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()
请注意,(目前)我们没有将模型与 YOLOv8 和 YOLOv6 进行具体比较,因为尽管 YOLO-NAS 模型在数量上更好,但差距很小。我们尝试进行的任何比较在影响方面都是最小的。准确的比较将在 YOLO-NAS 系列的下一篇文章中进行,我们将在自定义任务上训练这些模型,并记录与当前巨头相比训练的难易程度和质量。
在计算机视觉和深度学习领域不懈的研究和创新的推动下,最先进的对象检测 (SOTA) 模型的前景在不断发展。最近,YOLOv6 和 YOLOv8 被认为是公开可用的最佳实时对象检测模型。最近,Deci.ai 的新竞争模型“YOLO-NAS”在提供更好的实时对象检测功能方面位居榜首。
在这探索了最新的 YOLO 模型,即 YOLO-NAS。简要介绍了这些新模型及其性能的探索和训练细节。此外,我们还对视频进行了推理。
Deci的AutoNAC神经架构搜索技术使得YOLO-NAS模型能够实现卓越的速度和准确性。该模型在市场上所有目标检测模型中脱颖而出,提供了准确性和延迟之间的最佳权衡。YOLO-NAS可以进行量化,并且可以使用TensorRT进行部署,使其完全适用于生产环境。
更多推荐
所有评论(0)