MMYOLO:打破单一模式限制,多模态目标检测的革命性突破!
目录
MMYOLO算法结构说明
BaseBackbone
BaseYOLONeck
BaseDenseHead
MMYOLO 实现解析
MMYOLO支持的任务、系列算法、以及支持的数据集
目前支持的任务
目前支持的 YOLO 系列算法
目前支持的数据集
MMYOLOv5
YOLOv5开源库特点
网络结构
Backbone
Neck
Head
正负样本匹配策略
Loss 设计
优化策略和训练过程
MMYOLOv6
网络结构
Backbone
Neck
Head
正负样本匹配策略
Loss 设计
RTMDET
模型结构
Backbone
CSPNeXt Block
Neck
Head
正负样本匹配策略
Loss 设计
优化策略和训练过程
推理和后处理过程
MMYOLOv8
网络结构
Loss 计算
特征图可视化
Coovally AI模型训练与应用平台
总结
MMYOLO采用了模块化的设计,这使得研究人员和开发者可以轻松地组合不同的模型组件(如backbone、neck、head)以构建新的检测器。框架支持多种流行的卷积神经网络(CNNs),如YOLOv5, YOLOv6, YOLOX等,并提供了训练、验证和推理的一体化解决方案。MMYOLO定位为YOLO系列热门开源库以及工业应用核心库。
为了满足轻量化需求,MMYOLO对计算效率进行了优化,引入了混合精度训练、模型剪枝、量化等技术,可以在保持高精度的同时降低模型复杂度,从而在低功耗设备上实现更快的运行速度。
该框架支持多GPU训练,并提供了丰富的数据预处理选项,适应不同的数据集和应用场景。此外,MMDetectionYOLO还支持PyTorch和MMOCR等其他MMLab项目,便于与其他视觉任务集成。
模型算法下载
在Coovally AI Hub公众号后台回复「模型算法」,即可获取!
MMYOLO算法结构说明
YOLO系列算法大部分采用了统一的算法搭建结构,典型的如Darknet+PAFPN。为了让用户快速理解YOLO系列算法架构,我们特意设计了如上图中的BaseBackbone+BaseYOLONeck结构。
抽象BaseBackbone的好处包括:
子类不需要关心forward过程,只要类似建造者模式一样构建模型即可。
可以通过配置实现定制插件功能,用户可以很方便的插入一些类似注意力模块。
所有子类自动支持frozen某些stage和frozen bn功能。
抽象BaseYOLONeck也有同样好处。
-
BaseBackbone
对于P5而言,BaseBackbone为包含1个 stem层+4个stage层的类似 ResNet的基础结构。
对于P6而言,BaseBackbone为包含1个stem层+5个stage层的结构。
不同算法的主干网络继承BaseBackbone,用户可以通过实现内部的 build_xx方法,使用自定义的基础模块来构建每一层的内部结构。
-
BaseYOLONeck
与BaseBackbone的设计类似,我们为MMYOLO系列的Neck层进行了重构,主要分为Reduce层,UpSample层,TopDown层,DownSample 层,BottomUP层以及输出卷积层,每一层结构都可以通过继承重写 build_xx方法来实现自定义的内部结构。
-
BaseDenseHead
MMYOLO系列沿用MMDetection中设计的BaseDenseHead作为其 Head结构的基类,但是进一步拆分了HeadModule. 以YOLOv5为例,其 HeadModule中的forward实现代替了原有的forward实现。
MMYOLO 实现解析
常规的单图数据增强例如随机翻转等比较容易实现,而Mosaic类的混合数据增强则不太容易。在MMDetection复现的YOLOX算法中提出了 MultiImageMixDataset数据集包装器的概念,其实现过程如下:
对于Mosaic等混合类数据增强策略,会需要额外实现一个get_indexes方法来获取其他图片索引,然后用得到的4张图片信息就可以进行Mosaic增强了。以MMDetection中实现的YOLOX为例,其配置文件写法如下所示:
train_pipeline = [
dict(type='Mosaic', img_scale=img_scale, pad_val=114.0),
dict(
type='RandomAffine',
scaling_ratio_range=(0.1, 2),
border=(-img_scale[0] // 2, -img_scale[1] // 2)),
dict(
type='MixUp',
img_scale=img_scale,
ratio_range=(0.8, 1.6),
pad_val=114.0),
...
]
train_dataset = dict(
# use MultiImageMixDataset wrapper to support mosaic and mixup
type='MultiImageMixDataset',
dataset=dict(
type='CocoDataset',
pipeline=[
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True)
]),
pipeline=train_pipeline)
MMYOLO支持的任务、系列算法、以及支持的数据集
-
目前支持的任务
目标检测
旋转框目标检测
-
目前支持的 YOLO 系列算法
YOLOv5
YOLOX
RTMDet
RTMDet-Rotated
YOLOv6
YOLOv7
PPYOLOE
YOLOv8
-
目前支持的数据集
COCO Dataset
VOC Dataset
CrowdHuman Dataset
DOTA 1.0 Dataset
MMYOLO支持在Linux、Windows、macOS上运行, 支持PyTorch 1.7及其以上版本运行。它具有如下三个特性:
统一便捷的算法评测:MMYOLO统一了各类YOLO算法模块的实现,并提供了统一的评测流程,用户可以公平便捷地进行对比分析。
丰富的入门和进阶文档:MMYOLO提供了从入门到部署到进阶和算法解析等一系列文档,方便不同用户快速上手和扩展。
模块化设计:MMYOLO将框架解耦成不同的模块组件,通过组合不同的模块和训练测试策略,用户可以便捷地构建自定义模型。
MMYOLOv5
YOLOv5是一个面向实时工业应用而开源的目标检测算法,受到了广泛关注。我们认为让YOLOv5爆火的原因不单纯在于YOLOv5算法本身的优异性,更多的在于开源库的实用和鲁棒性。
MMYOLOv5实现配置:
https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov5/
-
YOLOv5开源库特点
1.友好和完善的部署支持;
2.算法训练速度极快,在300 epoch情况下训练时长和大部分one-stage 算法如RetinaNet、ATSS和two-stage算法如Faster R-CNN在12 epoch的训练时间接近;
3.框架进行了非常多的corner case优化,功能和文档也比较丰富。
YOLOv5有P5和P6两个不同训练输入尺度的模型,P6即为1280x1280输入的大模型,通常用的是P5常规模型,输入尺寸是640x640。如图1和2 所示,YOLOv5的P5和P6版本主要差异在于网络结构和图片输入分辨率。其他区别,如anchors个数和loss权重可详见配置文件。
-
网络结构
YOLOv5网络结构是标准的CSPDarknet+PAFPN+非解耦Head。
YOLOv5网络结构大小由deepen_factor和widen_factor两个参数决定。其中 deepen_factor控制网络结构深度,即CSPLayer中DarknetBottleneck模块堆叠的数量;widen_factor控制网络结构宽度,即模块输出特征图的通道数。以YOLOv5-l为例,其deepen_factor = widen_factor = 1.0 。
Backbone
在MMYOLO中CSPDarknet继承自BaseBackbone,整体结构和 ResNet类似。P5模型共5层结构,包含1个Stem Layer和4个Stage Layer:
Stem Layer是1个6x6 kernel的ConvModule,相较于v6.1版本之前的 Focus模块更加高效。
除了最后一个Stage Layer,其他均由1个ConvModule和1个CSPLayer 组成。如上图Details部分所示。其中ConvModule为3x3的Conv2d+ BatchNorm+SiLU激活函数。CSPLayer即YOLOv5官方仓库中的C3模块,由3个ConvModule+n个DarknetBottleneck(带残差连接) 组成。
最后一个Stage Layer在最后增加了SPPF模块。SPPF模块是将输入串行通过多个5x5大小的MaxPool2d层,与SPP模块效果相同,但速度更快。
P5模型会在Stage Layer 2-4之后分别输出一个特征图进入Neck结构。以 640x640输入图片为例,其输出特征为 (B,256,80,80)、(B,512,40,40) 和 (B,1024,20,20),对应的stride分别为 8/16/32。
P6模型会在Stage Layer 2-5之后分别输出一个特征图进入Neck结构。以 1280x1280输入图片为例,其输出特征为(B,256,160,160)、(B,512,80,80)、(B,768,40,40) 和 (B,1024,20,20),对应的stride分别为8/16/32/64。
Neck
YOLOv5官方仓库的配置文件中并没有Neck部分,为方便用户与其他目标检测网络结构相对应,我们将官方仓库的Head拆分成PAFPN和Head两部分。
基于BaseYOLONeck结构,YOLOv5 Neck也是遵循同一套构建流程,对于不存在的模块,我们采用nn.Identity代替。
Neck模块输出的特征图和Backbone完全一致。即P5模型为 (B,256,80,80)、(B,512,40,40)和(B,1024,20,20);P6模型为(B,256,160,160)、(B,512,80,80)、(B,768,40,40) 和 (B,1024,20,20)。
Head
YOLOv5 Head结构和YOLOv3完全一样,为非解耦Head。Head模块只包括3个不共享权重的卷积,用于将输入特征图进行变换而已。
前面的 PAFPN依然是输出3个不同尺度的特征图,shape为 (B,256,80,80)、 (B,512,40,40) 和 (B,1024,20,20)。由于YOLOv5是非解耦输出,即分类和bbox检测等都是在同一个卷积的不同通道中完成。以COCO 80类为例:
P5模型在输入为640x640分辨率情况下,其Head模块输出的shape分别为(B,3x(4+1+80),80,80),(B,3x(4+1+80),40,40)和(B, 3x(4+1+80),20,20)。
P6模型在输入为1280x1280分辨率情况下,其Head模块输出的shape分别为(B,3x(4+1+80),160,160),(B,3x(4+1+80),80,80),(B, 3x(4+1+80),40,40)和(B,3x(4+1+80),20,20)。其中3表示3个anchor,4表示bbox预测分支,1 表示obj预测分支,80表示COCO数据集类别预测分支。
-
正负样本匹配策略
正负样本匹配策略的核心是确定预测特征图的所有位置中哪些位置应该是正样本,哪些是负样本,甚至有些是忽略样本。匹配策略是目标检测算法的核心,一个好的匹配策略可以显著提升算法性能。
YOLOV5的匹配策略简单总结为:采用了anchor和gt_bbox的shape匹配度作为划分规则,同时引入跨邻域网格策略来增加正样本。其主要包括如下两个核心步骤:
对于任何一个输出层,抛弃了常用的基于Max IoU匹配的规则,而是直接采用shape规则匹配,也就是该GT Bbox和当前层的Anchor计算宽高比,如果宽高比例大于设定阈值,则说明该GT Bbox和Anchor匹配度不够,将该GT Bbox暂时丢掉,在该层预测中该GT Bbox对应的网格内的预测位置认为是负样本
对于剩下的GT Bbox(也就是匹配上的GT Bbox),计算其落在哪个网格内,同时利用四舍五入规则,找出最近的两个网格,将这三个网格都认为是负责预测该GT Bbox的,可以粗略估计正样本数相比之前的YOLO系列,至少增加了三倍。
-
Loss 设计
YOLOv5中总共包含3个Loss,分别为:
Classes loss:使用的是BCE loss
Objectness loss:使用的是BCE loss
Location loss:使用的是CIoU loss
-
优化策略和训练过程
YOLOv5对每个优化器的参数组进行非常精细的控制,简单来说包括如下部分。
优化器分组
将优化参数分成Conv/Bias/BN三组,在WarmUp阶段,不同组采用不同的lr以及momentum更新曲线。同时在WarmUp阶段采用的是iter-based更新策略,而在非WarmUp阶段则变成epoch-based更新策略,可谓是trick十足。
MMYOLO中是采用YOLOv5OptimizerConstructor优化器构造器实现优化器参数分组。优化器构造器的作用就是对一些特殊的参数组初始化过程进行精细化控制,因此可以很好的满足需求。
而不同的参数组采用不同的调度曲线功能则是通过 YOLOv5ParamSchedulerHook实现。而不同的参数组采用不同的调度曲线功能则是通过YOLOv5ParamSchedulerHook实现。
weight decay 参数自适应
作者针对不同的batch size采用了不同的weight decay策略,具体来说为:
当训练batch size<= 64时,weight decay不变
当训练batch size>64时,weight decay会根据总batch size进行线性缩放
MMYOLO也是通过YOLOv5OptimizerConstructor实现。
梯度累加
为了最大化不同batch size情况下的性能,作者设置总batch size小于64 时候会自动开启梯度累加功能。
训练过程和大部分YOLO 类似,包括如下策略:
没有使用预训练权重
没有采用多尺度训练策略,同时可以开启cudnn.benchmark进一步加速训练
使用了EMA策略平滑模型
默认采用AMP自动混合精度训练
需要特意说明的是:YOLOv5官方对于small模型是采用单卡v100训练,bs为128,而m/l/x等是采用不同数目的多卡实现的, 这种训练策略不太规范,为此在MMYOLO中全部采用了8卡,每卡16 bs的设置,同时为了避免性能差异,训练时候开启了SyncBN。
MMYOLOv6
YOLOv6提出了一系列适用于各种工业场景的模型,包括N/T/S/M/L,考虑到模型的大小,其架构有所不同,以获得更好的精度-速度权衡。本算法专注于检测的精度和推理效率,并在网络结构、训练策略等算法层面进行了多项改进和优化。
简单来说YOLOv6开源库的主要特点为:
统一设计了更高效的Backbone和Neck:受到硬件感知神经网络设计思想的启发,基于RepVGG style设计了可重参数化、更高效的骨干网络 EfficientRep Backbone和Rep-PAN Neck。
相比于YOLOX的Decoupled Head,进一步优化设计了简洁有效的 Efficient Decoupled Head,在维持精度的同时,降低了一般解耦头带来的额外延时开销。
在训练策略上,采用Anchor-free的策略,同时辅以SimOTA标签分配策略以及SIoU边界框回归损失来进一步提高检测精度。
MMYOLOv6实现配置:
https://github.com/open-mmlab/mmyolo/blob/main/configs/yolov6/
-
网络结构
YOLOv6 N/T/S模型的网络结构由EfficientRep+Rep-PAN+Efficient decoupled Head构成,M/L模型的网络结构则由CSPBep+ CSPRepPAFPN+Efficient decoupled Head构成。其中,Backbone 和Neck部分的结构与 YOLOv5较为相似,但不同的是其采用了重参数化结构RepVGG Block替换掉了原本的ConvModule,在此基础上,将 CSPLayer改进为了多个RepVGG堆叠的RepStageBlock(N/T/S 模型)或BepC3StageBlock(M/L模型);Head部分则参考了FCOS和 YOLOX的检测头,将回归与分类分支解耦成两个分支进行预测。YOLOv6-S和YOLOv6-L整体结构分别如图1和图2所示。
Backbone
已有研究表明,多分支的网络结构通常比单分支网络性能更加优异,例如 YOLOv5的CSPDarknet,但是这种结构会导致并行度降低进而增加推理延时;相反,类似于VGG的单分支网络则具有并行度高、内存占用小的优点,因此推理效率更高。而RepVGG则同时具备上述两种结构的优点,在训练时可解耦成多分支拓扑结构提升模型精度,实际部署时可等效融合为单个3×3卷积提升推理速度,RepVGG示意图如下。因此,YOLOv6基于 RepVGG重参数化结构设计了高效的骨干网络EfficientRep和CSPBep,其可以充分利用硬件算力,提升模型表征能力的同时降低推理延时。
在N/T/S模型中,YOLOv6使用了EfficientRep作为骨干网络,其包含1 个Stem Layer和4个Stage Layer,具体细节如下:
Stem Layer中采用stride=2的RepVGGBlock替换了stride=2的6×6 ConvModule。
Stage Layer结构与YOLOv5基本相似,将每个Stage layer的1个 ConvModule和1个CSPLayer分别替换为1个RepVGGBlock和1个 RepStageBlock,如上图Details部分所示。其中,第一个 RepVGGBlock会做下采样和Channel维度变换,而每个 RepStageBlock则由n个RepVGGBlock组成。此外,仍然在第4个 Stage Layer最后增加SPPF模块后输出。
在M/L模型中,由于模型容量进一步增大,直接使用多个RepVGGBlock 堆叠的RepStageBlock结构计算量和参数量呈现指数增长。因此,为了权衡计算负担和模型精度,在M/L模型中使用了CSPBep骨干网络,其采用 BepC3StageBlock替换了小模型中的RepStageBlock。如下图所示,BepC3StageBlock由3个1×1的ConvModule和多个子块(每个子块由两个RepVGGBlock残差连接)组成。
Neck
Neck部分结构仍然在YOLOv5基础上进行了模块的改动,同样采用 RepStageBlock或BepC3StageBlock对原本的CSPLayer进行了替换,需要注意的是,Neck中Down Sample部分仍然使用了stride=2的3×3 ConvModule,而不是像Backbone一样替换为RepVGGBlock。
Head
不同于传统的YOLO系列检测头,YOLOv6参考了FCOS和YOLOX中的做法,将分类和回归分支解耦成两个分支进行预测并且去掉了obj分支。同时,采用了hybrid-channel策略构建了更高效的解耦检测头,将中间 3×3的ConvModule减少为1个,在维持精度的同时进一步减少了模型耗费,降低了推理延时。此外,需要说明的是,YOLOv6在Backobone和 Neck部分使用的激活函数是ReLU,而在Head部分则使用的是SiLU。
由于YOLOv6是解耦输出,分类和bbox检测通过不同卷积完成。以COCO 80类为例:
P5模型在输入为640x640分辨率情况下,其Head模块输出的shape分别为(B,4,80,80), (B,80,80,80), (B,4,40,40), (B,80,40,40), (B,4,20,20), (B,80,20,20)。
-
正负样本匹配策略
YOLOv6采用的标签匹配策略与TOOD相同, 前4个epoch采用 ATSSAssigner作为标签匹配策略的warm-up, 后续使用 TaskAlignedAssigner算法选择正负样本, 基于官方开源代码, MMYOLO中也对两个assigner算法进行了优化, 改进为 Batch 维度进行计算, 能够一定程度的加快速度。
YOLOv6的BBox Coder采用的是DistancePointBBoxCoder。
网络bbox预测的值为(top, bottom, left, right),解码器将anchor point通过四个距离解码到坐标(x1,y1,x2,y2)。
MMYOLO中解码的核心源码:
def decode(points: torch.Tensor, pred_bboxes: torch.Tensor, stride: torch.Tensor) -> torch.Tensor:
"""
将预测值解码转化 bbox 的 xyxy
points (Tensor): 生成的 anchor point [x, y],Shape (B, N, 2) or (N, 2).
pred_bboxes (Tensor): 预测距离四边的距离。(left, top, right, bottom). Shape (B, N, 4) or (N, 4)
stride (Tensor): 特征图下采样倍率.
"""
# 首先将预测值转化为原图尺度
distance = pred_bboxes * stride[None, :, None]
# 根据点以及到四条边距离转为 bbox 的 x1y1x2y2
x1 = points[..., 0] - distance[..., 0]
y1 = points[..., 1] - distance[..., 1]
x2 = points[..., 0] + distance[..., 2]
y2 = points[..., 1] + distance[..., 3]
bboxes = torch.stack([x1, y1, x2, y2], -1)
return bboxes
-
Loss 设计
参与Loss计算的共有两个值:loss_cls和loss_bbox,其各自使用的Loss方法如下:
Classes loss:使用的是mmdet.VarifocalLoss
BBox loss:l/m/s使用的是GIoULoss, t/n用的是SIoULoss
权重比例是:loss_cls : loss_bbox=1 : 2.5
RTMDET
OpenMMLab在调研了当前YOLO系列的诸多改进模型后,MMDetection 核心开发者针对这些设计以及训练方式进行了经验性的总结,并进行了优化,推出了高精度、低延时的单阶段目标检测器RTMDet, Real-time Models for Object Detection (Release to Manufacture)。
RTMDet由tiny/s/m/l/x一系列不同大小的模型组成,为不同的应用场景提供了不同的选择。其中,RTMDet-x在52.6 mAP的精度下达到了300+FPS的推理速度。
而最轻量的模型RTMDet-tiny,在仅有4M参数量的情况下也能够达到40.9 mAP,且推理速度< 1 ms。
MMYOLO开源地址:
https://github.com/open-mmlab/mmyolo/blob/main/configs/rtmdet/README.md
-
模型结构
RTMDet模型整体结构和YOLOX几乎一致,由CSPNeXt+ CSPNeXtPAFPN+共享卷积权重但分别计算BN的SepBNHead构成。内部核心模块也是CSPLayer,但对其中的Basic Block进行了改进,提出了 CSPNeXt Block。
Backbone
CSPNeXt整体以CSPDarknet为基础,共5层结构,包含1个Stem Layer和4个Stage Layer:
Stem Layer是3层3x3 kernel的ConvModule ,不同于之前的Focus 模块或者1层6x6 kernel的ConvModule 。
Stage Layer总体结构与已有模型类似,前3个Stage Layer由1个ConvModule和1个CSPLayer组成。第4个Stage Layer在 ConvModule和CSPLayer中间增加了SPPF模块(MMDetection版本为 SPP 模块)。
如模型图Details部分所示,CSPLayer由3个ConvModule+n个CSPNeXt Block(带残差连接)+1个Channel Attention模块组成。ConvModule为1层3x3 Conv2d+BatchNorm+SiLU激活函数。Channel Attention模块为1层AdaptiveAvgPool2d+1层1x1 Conv2d +Hardsigmoid激活函数。CSPNeXt Block模块在下节详细讲述。
CSPNeXt Block
Darknet(图a)使用1x1与3x3卷积的Basic Block。YOLOv6、YOLOv7、PPYOLO-E(图b&c)使用了重参数化Block。但重参数化的训练代价高,且不易量化,需要其他方式来弥补量化误差。RTMDet则借鉴了最近比较热门的ConvNeXt 、RepLKNet的做法,为Basic Block加入了大kernel的depth-wise卷积(图d),并将其命名为CSPNeXt Block。
Neck
Neck模型结构和YOLOX几乎一样,只不过内部的block进行了替换。
Head
传统的YOLO系列都使用同一Head进行分类和回归。YOLOX则将分类和回归分支解耦,PPYOLO-E和YOLOv6则引入了 TOOD中的结构。它们在不同特征层级之间都使用独立的Head,因此Head在模型中也占有较多的参数量。
RTMDet参考了NAS-FPN中的做法,使用了SepBNHead,在不同层之间共享卷积权重,但是独立计算BN(BatchNorm)的统计量。
关于不同结构Head的实验结果,如下表所示。
-
正负样本匹配策略
正负样本匹配策略或者称为标签匹配策略Label Assignment是目标检测模型训练中最核心的问题之一, 更好的标签匹配策略往往能够使得网络更好学习到物体的特征以提高检测能力。
早期的样本标签匹配策略一般都是基于 空间以及尺度信息的先验 来决定样本的选取。典型案例如下:
FCOS中先限定网格中心点在GT内筛选后然后再通过不同特征层限制尺寸来决定正负样本。
RetinaNet则是通过Anchor与GT的最大IOU匹配来划分正负样本。
YOLOV5的正负样本则是通过样本的宽高比先筛选一部分, 然后通过位置信息选取GT中心落在的Grid以及临近的两个作为正样本。
但是上述方法都是属于基于先验的静态匹配策略, 就是样本的选取方式是根据人的经验规定的。不会随着网络的优化而进行自动优化选取到更好的样本, 近些年涌现了许多优秀的动态标签匹配策略:
OTA提出使用 Sinkhorn 迭代求解匹配中的最优传输问题;
YOLOX中使用OTA的近似算法SimOTA,TOOD将分类分数以及IOU相乘计算Cost矩阵进行标签匹配等等;
这些算法将预测的Bboxes与GT的IOU和分类分数或者是对应分类Loss和回归Loss拿来计算Matching Cost矩阵再通过top-k的方式动态决定样本选取以及样本个数。通过这种方式, 在网络优化的过程中会自动选取对分类或者回归更加敏感有效的位置的样本, 它不再只依赖先验的静态的信息, 而是使用当前的预测结果去动态寻找最优的匹配, 只要模型的预测越准确, 匹配算法求得的结果也会更优秀。但是在网络训练的初期, 网络的分类以及回归是随机初始化, 这个时候还是需要 先验 来约束, 以达到冷启动的效果。
RTMDet作者也是采用了动态的SimOTA做法,不过其对动态的正负样本分配策略进行了改进。之前的动态匹配策略(HungarianAssigner、OTA )往往使用与Loss完全一致的代价函数作为匹配的依据,但我们经过实验发现这并不一定是最优的。使用更多Soften的Cost以及先验,能够提升性能。
-
Loss 设计
参与Loss计算的共有两个值:loss_cls和loss_bbox,其各自使用的Loss 方法如下:
loss_cls:mmdet.QualityFocalLoss
loss_bbox:mmdet.GIoULoss
权重比例是:loss_cls : loss_bbox = 1 : 2
-
优化策略和训练过程
-
推理和后处理过程
MMYOLOv8
YOLOv8是一个SOTA模型,它建立在以前YOLO版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新的Ancher-Free检测头和一个新的损失函数,可以在从CPU 到 GPU 的各种硬件平台上运行。不过Ultralytics并没有直接将开源库命名为 YOLOv8,而是直接使用Ultralytics这个词,原因是Ultralytics将这个库定位为算法框架,而非某一个特定算法,一个主要特点是可扩展性。其希望这个库不仅仅能够用于YOLO系列模型,而是能够支持非YOLO模型以及分类分割姿态估计等各类任务。总而言之,Ultralytics开源库的两个主要优点是:
融合众多当前SOTA技术于一体;
未来将支持其他YOLO系列以及YOLO之外的更多算法。
-
网络结构
在暂时不考虑Head情况下,对比YOLOv5和YOLOv8的yaml配置文件可以发现改动较小。
骨干网络和Neck的具体变化为:
第一个卷积层的kernel从6x6变成了3x3;
所有的C3模块换成C2f,结构如下所示,可以发现多了更多的跳层连接和额外的Split操作。
YOLOv5 和 YOLOv8 模块对比
去掉了Neck模块中的2个卷积连接层;
Backbone中C2f的block数从3-6-9-3改成了3-6-6-3;
查看N/S/M/L/X等不同大小模型,可以发现N/S和L/X两组模型只是改了缩放系数,但是S/M/L等骨干网络的通道数设置不一样,没有遵循同一套缩放系数。如此设计的原因应该是同一套缩放系数下的通道设置不是最优设计,YOLOv7网络设计时也没有遵循一套缩放系数作用于所有模型。
Head部分变化最大,从原先的耦合头变成了解耦头,并且从YOLOv5的 Anchor-Based变成了Anchor-Free。其结构如下所示:
-
Loss 计算
Loss计算过程包括2个部分:正负样本分配策略和Loss计算。现代目标检测器大部分都会在正负样本分配策略上面做文章,如YOLOX的simOTA、TOOD的TaskAlignedAssigner、RTMDet的DynamicSoftLabelAssigner,这类Assigner大都是动态分配策略,而YOLOv5采用的依然是静态分配策略。考虑到动态分配策略的优异性,YOLOv8算法中则直接引用了TOOD的 TaskAlignedAssigner。TaskAlignedAssigner的匹配策略简单总结为:根据分类与回归的分数加权的分数选择正样本。
-
特征图可视化
MMYOLO中提供了一套完善的特征图可视化工具,可以帮助用户可视化特征的分布情况。为了和官方性能对齐,此处依然采用官方权重进行可视化。
以YOLOv8-s模型为例,第一步需要下载官方权重,然后将该权重通过 yolov8_to_mmyolo脚本将去转换到MMYOLO中,注意必须要将脚本置于官方仓库下才能正确运行,假设得到的权重名字为mmyolov8s.pth。
假设想可视化backbone输出的3个特征图效果,则只需要
cd mmyolo
python demo/featmap_vis_demo.py demo/demo.jpg
configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py
mmyolov8s.pth --channel-reductio squeeze_mean
需要特别注意,为了确保特征图和图片叠加显示能对齐效果,需要先将原先的test_pipeline替换为如下:
test_pipeline = [
dict(
type='LoadImageFromFile',
backend_args=_base_.backend_args),
dict(type='mmdet.Resize', scale=img_scale, keep_ratio=False), # 这里将 LetterResize 修改成 mmdet.Resize
dict(type='LoadAnnotations', with_bbox=True, _scope_='mmdet'),
dict(
type='mmdet.PackDetInputs',
meta_keys=('img_id', 'img_path', 'ori_shape', 'img_shape',
'scale_factor'))]
从上图可以看出不同输出特征图层主要负责预测不同尺度的物体。
我们也可以可视化Neck层的3个输出层特征图:
cd mmyolo
python demo/featmap_vis_demo.py demo/demo.jpg
configs/yolov8/yolov8_s_syncbn_fast_8xb16-500e_coco.py
mmyolov8s.pth --channel-reductio squeeze_mean
--target-layers neck
从上图可以发现物体处的特征更加聚焦。
Coovally AI模型训练与应用平台
Coovally AI模型训练与应用平台,它整合了整合30+国内外开源社区1000+模型算法。
在Coovally平台上,无需配置环境、修改配置文件等繁琐操作,可一键另存为我的模型,上传数据集,即可使用MMYOLO等热门模型进行训练与结果预测,全程高速零代码!而且模型还可分享与下载,满足你的实验研究与产业应用。
总结
MMYOLO系列模型凭借其创新的多模态融合技术、跨模态或高效注意力机制和推理性能,正在成为目标检测领域的重要发展方向。无论是自动驾驶、智能监控、医疗健康、工业检测,MMYOLO都催生了强大的应用潜力。随着多模态数据的不断增加,MMYOLO必将在更广泛的场景中发挥重要作用,引领目标检测技术向着更高的精准度和标准化发展。
如果你对多模态目标充满兴趣,MMYOLO无疑是值得深入了解的前沿技术,期待未来它能够带来更多的应用创新和突破。
如果您有兴趣了解更多关于模型算法的使用方法等,欢迎关注我们,我们将继续为大家带来更多干货内容!
别忘了点赞、留言、收藏哦!