mmyolo/docs/zh_cn/advanced_guides/module_combination.md

174 lines
5.2 KiB
Markdown
Raw Normal View History

# 算法组合替换教程
## Loss 组合替换教程
OpenMMLab 2.0 体系中 MMYOLO、MMDetection、MMClassification 中的 loss 注册表都继承自 MMEngine 中的根注册表。 因此用户可以在 MMYOLO 中使用来自 MMDetection、MMClassification 中实现的 loss 而无需重新实现。
### 替换 YOLOv5 Head 中的 loss_cls 函数
1. 假设我们想使用 `LabelSmoothLoss` 作为 `loss_cls` 的损失函数。因为 `LabelSmoothLoss` 已经在 MMClassification 中实现了,所以可以直接在配置文件中进行替换。配置文件如下:
```python
# 请先使用命令: mim install "mmcls>=1.0.0rc2",安装 mmcls
_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
model = dict(
bbox_head=dict(
loss_cls=dict(
_delete_=True,
_scope_='mmcls', # 临时替换 scope 为 mmcls
type='LabelSmoothLoss',
label_smooth_val=0.1,
mode='multi_label',
reduction='mean',
loss_weight=0.5)))
```
2. 假设我们想使用 `VarifocalLoss` 作为 `loss_cls` 的损失函数。因为 `VarifocalLoss` 在 MMDetection 已经实现好了,所以可以直接替换。配置文件如下:
```python
model = dict(
bbox_head=dict(
loss_cls=dict(
_delete_=True,
_scope_='mmdet',
type='VarifocalLoss',
loss_weight=1.0)))
```
3. 假设我们想使用 `FocalLoss` 作为 `loss_cls` 的损失函数。配置文件如下:
```python
_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
model = dict(
bbox_head=dict(
loss_cls= dict(
_delete_=True,
_scope_='mmdet',
type='FocalLoss',
loss_weight=1.0)))
```
4. 假设我们想使用 `QualityFocalLoss` 作为 `loss_cls` 的损失函数。配置文件如下:
```python
_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
model = dict(
bbox_head=dict(
loss_cls= dict(
_delete_=True,
_scope_='mmdet',
type='QualityFocalLoss',
loss_weight=1.0)))
```
### 替换 YOLOV5 Head 中的 loss_obj 函数
`loss_obj` 的替换与 `loss_cls` 的替换类似,我们可以使用已经实现好的损失函数对 `loss_obj` 的损失函数进行替换
1. 假设我们想使用 `VarifocalLoss` 作为 `loss_obj` 的损失函数
```python
model = dict(
bbox_head=dict(
loss_obj=dict(
_delete_=True,
_scope_='mmdet',
type='VarifocalLoss',
loss_weight=1.0)))
```
2. 假设我们想使用 `FocalLoss` 作为 `loss_obj` 的损失函数。
```python
_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
model = dict(
bbox_head=dict(
loss_cls= dict(
_delete_=True,
_scope_='mmdet',
type='FocalLoss',
loss_weight=1.0)))
```
3. 假设我们想使用 `QualityFocalLoss` 作为 `loss_obj` 的损失函数。
```python
_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
model = dict(
bbox_head=dict(
loss_cls= dict(
_delete_=True,
_scope_='mmdet',
type='QualityFocalLoss',
loss_weight=1.0)))
```
#### 注意
1. 在本教程中损失函数的替换是运行不报错的,但无法保证性能一定会上升。
2. 本次损失函数的替换都是以 YOLOv5 算法作为例子的,但是 MMYOLO 下的多个算法,如 YOLOv6YOLOX 等算法都可以按照上述的例子进行替换。
## model 和 loss 组合替换
在 MMYOLO 中model 即网络本身和 loss 是解耦的,用户可以简单的通过修改配置文件中 model 和 loss 来组合不同模块。下面给出两个具体例子。
(1) YOLOv5 model 组合 YOLOv7 loss配置文件如下
```python
_base_ = './yolov5_s-v61_syncbn_8xb16-300e_coco.py'
model = dict(
bbox_head=dict(
_delete_=True,
type='YOLOv7Head',
head_module=dict(
type='YOLOv5HeadModule',
num_classes=80,
in_channels=[256, 512, 1024],
widen_factor=0.5,
featmap_strides=[8, 16, 32],
num_base_priors=3)))
```
(2) RTMDet model 组合 YOLOv6 loss配置文件如下
```python
_base_ = './rtmdet_l_syncbn_8xb32-300e_coco.py'
model = dict(
bbox_head=dict(
_delete_=True,
type='YOLOv6Head',
head_module=dict(
type='RTMDetSepBNHeadModule',
num_classes=80,
in_channels=256,
stacked_convs=2,
feat_channels=256,
norm_cfg=dict(type='BN'),
act_cfg=dict(type='SiLU', inplace=True),
share_conv=True,
pred_kernel_size=1,
featmap_strides=[8, 16, 32]),
loss_bbox=dict(
type='IoULoss',
iou_mode='giou',
bbox_format='xyxy',
reduction='mean',
loss_weight=2.5,
return_iou=False)),
train_cfg=dict(
_delete_=True,
initial_epoch=4,
initial_assigner=dict(
type='BatchATSSAssigner',
num_classes=80,
topk=9,
iou_calculator=dict(type='mmdet.BboxOverlaps2D')),
assigner=dict(
type='BatchTaskAlignedAssigner',
num_classes=80,
topk=13,
alpha=1,
beta=6)
))
```