博主目前在基于mmdet做HD Map的相关工作,因此需要从数据集、pipline以及模型结构各个方面都需要进行重构,而在pipline中,对于之前Detection通用的pipline,需要对Box的GT处理进行变化,以此记录。
首先贴上mmdet官方对pipline的讲解:教程 3: 自定义数据预处理流程
其次贴上另一个大神带图讲解:mmdetection中数据增强的可视化
这里我们仅对train_pipline
进行讲解:
train_pipline
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations', with_bbox=True),
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
dict(type='RandomFlip', flip_ratio=0.5),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size_divisor=32),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels']),
]
-
LoadImageFromFile
和LoadAnnotations
- 从名字就可以知道,这两个method分别是读取
image
和annotation
。 - 一般
LoadImageFromFile
不需要更改; - 如果你的GT不是
Object Detection
中的box
,那么就要重点要更改一下LoadAnnotations
函数。
- 从名字就可以知道,这两个method分别是读取
例如我这里的GT是点的形式,那么我就把原先的_load_bboxes
改成了_load_pts
,同时对里边,只需要把点保存成numpy.array
的形式,放进results
里边就行了。
def _load_pts(self, results):
"""Private function to load points annotations.
Args:
results (dict): Result dict from :obj:`mmdet.CustomDataset`.
Returns:
dict: The dict contains loaded points annotations.
"""
pts_ego3d_list = []
for pts_anno in results['ann_info']:
if self.pts_type == '2D':
pts_ego3d_list.append(np.array(pts_anno['pts_ego3d'], dtype=np.float32)[:, :2])
else:
pts_ego3d_list.append(np.array(pts_anno['pts_ego3d'], dtype=np.float32))
results['gt_pts'] = np.stack(pts_ego3d_list, axis=0)
return results
def __call__(self, results):
"""Call function to load multiple types annotations.
Args:
results (dict): Result dict from :obj:`mmdet.CustomDataset`.
Returns:
dict: The dict contains loaded bounding box, label, mask and
semantic segmentation annotations.
"""
if self.with_pts:
results = self._load_pts(results)
if self.with_label:
results = self._load_labels(results)
return results
-
Resize
-
Resize
是对所有的info
进行resize,例如image
、gt_bboxes
等; - 主要说一下几个参数:
-
img_scale
:配合keep_ratio
一起使用;可以是个list
,例如img_scale=[(736, 1333), (768, 1333), (800, 1333)]
,如果keep_ratio=True
,那么image和其他的GT都会按照给定img_scale
中能够保证图像最大的参数去resize;如果为keep_ratio=False
,那么就是按照给定的img_scale
分别去resize长和宽。总之,最终的image的对应边尺寸不会大于img_scale
给定的任意一边。 - 参考理解:目标检测中的resize
- MMDetection 图像缩放 Resize 详细说明
-
-
dict(type='Resize', img_scale=(1333, 800), keep_ratio=True),
-
RandomFlip
-
RandomFlip
是对所有的info
进行flip,例如image
、gt_bboxes
等; - 主要说一下几个参数:
-
flip_ratio
:每张image做flip的概率。
-
-