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进行部署,使其完全适用于生产环境。