Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
u013913216
mmyolo
提交
33de37a2
M
mmyolo
项目概览
u013913216
/
mmyolo
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
mmyolo
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
33de37a2
编写于
9月 18, 2022
作者:
M
MingJian.L
提交者:
GitHub
9月 18, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add data_flow.md (#23)
* Create data_flow.md * Update data_flow.md
上级
5242996d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
121 addition
and
0 deletion
+121
-0
docs/zh_cn/advanced_guides/data_flow.md
docs/zh_cn/advanced_guides/data_flow.md
+121
-0
未找到文件。
docs/zh_cn/advanced_guides/data_flow.md
0 → 100644
浏览文件 @
33de37a2
# 混合类图片数据增强更新
混合类图片数据增强是指类似 Mosaic 和 MixUp 一样,在运行过程中需要获取多张图片的标注信息进行融合。 在 OpenMMLab 数据增强 pipeline 中一般是获取不到数据集其他索引的。 为了实现上述功能,在 MMDetection 复现的 YOLOX 中提出了
[
MultiImageMixDataset
](
https://github.com/open-mmlab/mmdetection/blob/master/mmdet/datasets/dataset_wrappers.py#L338
)
数据集包装器的概念。
`MultiImageMixDataset`
数据集包装器会传入一个包括
`Mosaic`
和
`RandAffine`
等数据增强,而
`CocoDataset`
中也需要传入一个包括图片和标注加载的
`pipeline`
。通过这种方式就可以快速的实现混合类数据增强。其配置用法如下所示:
```
python
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
)
```
但是上述实现起来会有一个缺点:对于不熟悉 MMDetection 的用户来说,其经常会忘记 Mosaic 必须要和
`MultiImageMixDataset`
配合使用,而且这样会加大复杂度和理解难度。
为了解决这个问题,在 MMYOLO 中进一步进行了简化。直接让
`pipeline`
获取到
`dataset`
对象,此时就可以将
`Mosaic`
等混合类数据增强的实现和使用随机翻转的操作一样,不再需要数据集包装器。新的配置写法为:
```
python
pre_transform
=
[
dict
(
type
=
'LoadImageFromFile'
),
dict
(
type
=
'LoadAnnotations'
,
with_bbox
=
True
)
]
train_pipeline
=
[
*
pre_transform
,
dict
(
type
=
'Mosaic'
,
img_scale
=
img_scale
,
pad_val
=
114.0
,
pre_transform
=
pre_transform
),
dict
(
type
=
'mmdet.RandomAffine'
,
scaling_ratio_range
=
(
0.1
,
2
),
border
=
(
-
img_scale
[
0
]
//
2
,
-
img_scale
[
1
]
//
2
)),
dict
(
type
=
'YOLOXMixUp'
,
img_scale
=
img_scale
,
ratio_range
=
(
0.8
,
1.6
),
pad_val
=
114.0
,
pre_transform
=
pre_transform
),
...
]
```
一个稍微复杂点的包括 MixUp的 YOLOv5-m 配置如下所示:
```
python
mosaic_affine_pipeline
=
[
dict
(
type
=
'Mosaic'
,
img_scale
=
img_scale
,
pad_val
=
114.0
,
pre_transform
=
pre_transform
),
dict
(
type
=
'YOLOv5RandomAffine'
,
max_rotate_degree
=
0.0
,
max_shear_degree
=
0.0
,
scaling_ratio_range
=
(
1
-
affine_scale
,
1
+
affine_scale
),
border
=
(
-
img_scale
[
0
]
//
2
,
-
img_scale
[
1
]
//
2
),
border_val
=
(
114
,
114
,
114
))
]
# enable mixup
train_pipeline
=
[
*
pre_transform
,
*
mosaic_affine_pipeline
,
dict
(
type
=
'YOLOv5MixUp'
,
prob
=
0.1
,
pre_transform
=
[
*
pre_transform
,
*
mosaic_affine_pipeline
]),
dict
(
type
=
'mmdet.Albu'
,
transforms
=
albu_train_transforms
,
bbox_params
=
dict
(
type
=
'BboxParams'
,
format
=
'pascal_voc'
,
label_fields
=
[
'gt_bboxes_labels'
,
'gt_ignore_flags'
]),
keymap
=
{
'img'
:
'image'
,
'gt_bboxes'
:
'bboxes'
}),
dict
(
type
=
'YOLOv5HSVRandomAug'
),
dict
(
type
=
'mmdet.RandomFlip'
,
prob
=
0.5
),
dict
(
type
=
'mmdet.PackDetInputs'
,
meta_keys
=
(
'img_id'
,
'img_path'
,
'ori_shape'
,
'img_shape'
,
'flip'
,
'flip_direction'
))
]
```
其实现过程非常简单,只需要在 Dataset 中将本身对象传给 pipeline 即可,具体代码如下:
```
python
def
prepare_data
(
self
,
idx
)
->
Any
:
"""Pass the dataset to the pipeline during training to support mixed
data augmentation, such as Mosaic and MixUp."""
if
self
.
test_mode
is
False
:
data_info
=
self
.
get_data_info
(
idx
)
data_info
[
'dataset'
]
=
self
return
self
.
pipeline
(
data_info
)
else
:
return
super
().
prepare_data
(
idx
)
```
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录