TinyVision/DAMO-YOLO中TinyNAS-L18-Nm模型的配置解析与优化指南
概述
本文将深入解析TinyVision/DAMO-YOLO项目中TinyNAS-L18-Nm模型的配置文件(damoyolo_tinynasL18_Nm.py),帮助读者理解该模型的架构设计、训练参数配置以及数据增强策略。作为一款轻量级目标检测模型,TinyNAS-L18-Nm在保持较高检测精度的同时,显著降低了计算资源需求,适合在边缘设备上部署。
配置文件结构解析
该配置文件继承自DAMO-YOLO的基础配置类,主要包含以下几个关键部分:
- 基础训练参数:包括批次大小、学习率、优化器等
- 数据增强策略:Mosaic和MixUp等增强技术
- 模型架构:包含Backbone、Neck和Head三部分
- 数据集配置:指定训练和验证数据集
核心训练参数详解
self.train.batch_size = 256 # 较大的批次大小有助于稳定训练
self.train.base_lr_per_img = 0.001 / 64 # 基于图像的学习率
self.train.min_lr_ratio = 0.05 # 最小学习率比例
self.train.no_aug_epochs = 16 # 最后16个epoch不使用数据增强
self.train.warmup_epochs = 5 # 学习率预热epoch数
# 使用AdamW优化器,结合了Adam的优点和权重衰减
self.train.optimizer = {
'name': "AdamW",
'weight_decay': 1e-2, # 较强的权重衰减防止过拟合
'lr': 4e-3, # 初始学习率
}
这些参数经过精心调优,特别适合TinyNAS架构的训练。较大的批次大小(256)配合适当的学习率设置,能够在保证训练稳定性的同时提高收敛速度。
数据增强策略
# 图像尺寸固定为416x416,不保持宽高比
self.train.augment.transform.image_max_range = (416, 416)
self.train.augment.transform.keep_ratio = False
# Mosaic和MixUp增强参数
self.train.augment.mosaic_mixup.mixup_prob = 0.15 # MixUp概率
self.train.augment.mosaic_mixup.degrees = 10.0 # 旋转角度范围
self.train.augment.mosaic_mixup.translate = 0.2 # 平移范围
self.train.augment.mosaic_mixup.shear = 0.2 # 剪切范围
self.train.augment.mosaic_mixup.mosaic_scale = (0.1, 2.0) # 缩放范围
这些增强策略显著提高了模型对小目标和不同尺度目标的检测能力,同时最后的16个epoch不使用增强(no_aug_epochs=16),有助于模型收敛。
模型架构设计
Backbone: TinyNAS
structure = self.read_structure('./damo/base_models/backbones/nas_backbones/tinynas_nano_middle.txt')
TinyNAS = {
'name': 'TinyNAS_mob',
'net_structure_str': structure, # 从文件读取的NAS搜索出的结构
'out_indices': (2, 4, 5), # 输出特征图的索引
'with_spp': True, # 使用空间金字塔池化
'use_focus': False, # 不使用Focus模块
'act': 'silu', # 激活函数使用SiLU
'reparam': False, # 不使用重参数化
'depthwise': True, # 使用深度可分离卷积
'use_se': False, # 不使用SE注意力机制
}
TinyNAS Backbone通过神经架构搜索得到,在保持轻量化的同时提供了足够的特征提取能力。深度可分离卷积(depthwise=True)大大减少了参数量。
Neck: GiraffeNeckV2
GiraffeNeckV2 = {
'name': 'GiraffeNeckV2',
'depth': 0.5, # 深度缩放因子
'hidden_ratio': 0.5, # 隐藏层通道缩放因子
'in_channels': [64, 128, 256], # 输入通道数
'out_channels': [64, 128, 256], # 输出通道数
'act': 'silu', # 激活函数
'spp': False, # 不使用SPP
'block_name': 'BasicBlock_3x3_Reverse', # 使用的基础块类型
'depthwise': True, # 使用深度可分离卷积
}
GiraffeNeckV2是专门为轻量级模型设计的特征金字塔网络,通过深度可分离卷积和通道缩减实现了高效的多尺度特征融合。
Head: ZeroHead
ZeroHead = {
'name': 'ZeroHead',
'num_classes': 80, # COCO数据集80类
'in_channels': [64, 128, 256], # 输入通道数
'stacked_convs': 0, # 不堆叠卷积
'reg_max': 7, # 回归最大值
'act': 'silu', # 激活函数
'nms_conf_thre': 0.03, # NMS置信度阈值
'nms_iou_thre': 0.65, # NMS IoU阈值
'legacy': False, # 不使用传统模式
'last_kernel_size': 1, # 最后卷积核大小
}
ZeroHead设计极为简洁,没有堆叠卷积(stacked_convs=0),大大减少了计算量,但通过精心设计的回归策略仍能保持较好的检测性能。
数据集配置
使用COCO 2017数据集进行训练和验证:
self.dataset.train_ann = ('coco_2017_train', )
self.dataset.val_ann = ('coco_2017_val', )
包含80个常见物体类别,如人、车辆、动物等日常物品。
训练建议
- 学习率调整:可根据实际硬件条件调整batch_size和对应的base_lr_per_img
- 数据增强:在资源允许的情况下,可以适当增加mosaic_scale范围
- 模型微调:尝试调整neck的depth和hidden_ratio参数,平衡精度和速度
- 训练策略:no_aug_epochs和warmup_epochs可根据数据集大小适当调整
总结
TinyNAS-L18-Nm模型通过神经架构搜索得到的轻量级Backbone配合精心设计的Neck和Head,在COCO数据集上实现了良好的精度-速度平衡。该配置文件提供了完整的训练参数和模型架构定义,开发者可以直接使用或基于此进行进一步优化。特别适合需要在资源受限设备上部署目标检测功能的场景。