马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目录
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也有同样好处。
对于P5而言,BaseBackbone为包含1个 stem层+4个stage层的类似 ResNet的基础结构。
对于P6而言,BaseBackbone为包含1个stem层+5个stage层的结构。
不同算法的主干网络继承BaseBackbone,用户可以通过实现内部的 build_xx方法,使用自界说的基础模块来构建每一层的内部结构。
与BaseBackbone的设计类似,我们为MMYOLO系列的Neck层举行了重构,重要分为Reduce层,UpSample层,TopDown层,DownSample 层,BottomUP层以及输出卷积层,每一层结构都可以通过继承重写 build_xx方法来实现自界说的内部结构。
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支持的任务、系列算法、以及支持的数据集
目的检测
旋转框目的检测
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/
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权重可详见配置文件。
图 1:YOLOv5-l-P5 模型结构 图 2:YOLOv5-l-P6 模型结构
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系列,至少增加了三倍。
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/
图 1:YOLOv6-S 模型结构 图 2:YOLOv6-L 模型结构
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_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_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计算过程包括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'))]
复制代码 图featmap 从上图可以看出不同输出特征图层重要负责预测不同尺度的物体。
我们也可以可视化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
复制代码 图featmap 从上图可以发现物体处的特征更加聚焦。
Coovally AI模型训练与应用平台
Coovally AI模型训练与应用平台,它整合了整合30+国内外开源社区1000+模型算法。
平台已部署MMYOLO系列模型算法 在Coovally平台上,无需配置环境、修改配置文件等繁琐操作,可一键另存为我的模型,上传数据集,即可使用MMYOLO等热门模型举行训练与结果预测,全程高速零代码!而且模型还可分享与下载,满意你的实验研究与产业应用。
总结
MMYOLO系列模型依附其创新的多模态融合技术、跨模态或高效注意力机制和推理性能,正在成为目的检测范畴的紧张发展方向。无论是自动驾驶、智能监控、医疗健康、工业检测,MMYOLO都催生了强盛的应用潜力。随着多模态数据的不断增加,MMYOLO必将在更广泛的场景中发挥紧张作用,引领目的检测技术向着更高的精准度和尺度化发展。
如果你对多模态目的充满爱好,MMYOLO无疑是值得深入了解的前沿技术,期待未来它可以或许带来更多的应用创新和突破。
如果您有爱好了解更多关于模型算法的使用方法等,接待关注我们,我们将继承为各人带来更多干货内容!
别忘了点赞、留言、收藏哦!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |