目录
《深入剖析 mmdet 中的数据预处理模块》
在目标检测任务中,数据预处理起着至关重要的作用,它能够将原始数据转换为模型可接受的格式,并进行必要的增强和规范化操作,以提高模型的性能和泛化能力。
一、模块概述
mmdet/models/data_preprocessors/data_preprocessor.py
是mmdetection
框架中的一个重要模块,它提供了多种数据预处理功能,以满足不同目标检测任务的需求。这些类继承自mmengine
中的相关基类,并针对目标检测任务进行了特定的扩展和优化。
二、主要类解析
1. DetDataPreprocessor
- 继承关系与作用:
- 继承自
ImgDataPreprocessor
,是专门为目标检测任务设计的数据预处理类。它在图像预处理的基础上,针对目标检测任务添加了特定的功能,如处理实例掩码和语义分割图的填充,以及将边界框类型转换为张量等操作。
- 继承自
- 初始化参数:
mean
:图像像素的均值,用于标准化操作。默认为None
。std
:图像像素的标准差,用于标准化操作。默认为None
。pad_size_divisor
:图像填充时,确保填充后的图像尺寸能够被该值整除。默认为1
。pad_value
:图像填充时使用的像素值。默认为0
。pad_mask
:是否对实例掩码进行填充。默认为False
。mask_pad_value
:实例掩码填充时使用的像素值。默认为0
。pad_seg
:是否对语义分割图进行填充。默认为False
。seg_pad_value
:语义分割图填充时使用的像素值。默认为255
。bgr_to_rgb
:是否将图像从 BGR 颜色空间转换为 RGB。默认为False
。rgb_to_bgr
:是否将图像从 RGB 颜色空间转换为 BGR。默认为False
。boxtype2tensor
:是否将边界框类型转换为张量。默认为True
。non_blocking
:在将数据传输到设备时,是否阻塞当前的掩码目标处理。默认为False
。batch_augments
:批量增强操作的列表,可在训练时对批量数据进行增强。默认为None
。
- 关键方法:
forward
:- 首先调用父类的
forward
方法进行基本的图像预处理操作,包括标准化、填充、颜色空间转换等。 - 根据输入数据确定批量图像的填充形状,并更新数据样本中的图像尺寸信息和填充形状信息。
- 如果
boxtype2tensor
为True
,将数据样本中的边界框类型转换为张量。 - 如果
pad_mask
为True
且处于训练模式,调用pad_gt_masks
方法填充实例掩码。 - 如果
pad_seg
为True
且处于训练模式,调用pad_gt_sem_seg
方法填充语义分割图。 - 如果处于训练模式且有定义的批量增强操作,依次应用这些增强操作。
- 首先调用父类的
_get_pad_shape
:- 根据输入数据的类型,分别处理使用
pseudo_collate
和default_collate
的数据。 - 对于使用
pseudo_collate
的数据,遍历每个输入张量,计算其填充后的高度和宽度,确保能够被pad_size_divisor
整除。 - 对于使用
default_collate
的数据,直接根据输入张量的形状计算填充后的高度和宽度。
- 根据输入数据的类型,分别处理使用
pad_gt_masks
:- 遍历批量数据样本,对每个数据样本中的实例掩码进行填充,使其形状与批量输入形状一致。
- 使用
masks.pad
方法进行填充,并设置填充值为mask_pad_value
。
pad_gt_sem_seg
:- 遍历批量数据样本,对每个数据样本中的语义分割图进行填充,使其形状与批量输入形状一致。
- 使用
F.pad
方法进行填充,并设置填充值为seg_pad_value
。
2. BatchSyncRandomResize
- 作用:
- 实现了批量随机尺寸调整功能,并且在不同进程之间同步随机尺寸,以确保在分布式训练中所有进程使用相同的随机尺寸。
- 初始化参数:
random_size_range
:多尺度随机范围,用于确定随机生成的图像尺寸范围。interval
:迭代间隔,表示每隔多少个迭代步骤更新一次随机尺寸。默认为10
。size_divisor
:图像尺寸的除数,确保调整后的图像尺寸能够被该值整除。默认为32
。
- 关键方法:
forward
:- 根据当前的输入尺寸和上一次生成的目标尺寸,对输入图像和数据样本中的边界框进行调整。
- 如果当前输入尺寸与目标尺寸不一致,使用
F.interpolate
方法对输入图像进行插值调整。 - 对于每个数据样本,更新其图像形状、填充形状和批量输入形状信息,并根据比例因子调整边界框的坐标。
- 如果当前迭代步骤是
interval
的倍数,生成新的随机尺寸,并在所有进程之间进行同步。
3. BatchFixedSizePad
- 作用:
- 用于将批量图像填充到固定尺寸。
- 初始化参数:
size
:固定的填充尺寸,期望的填充形状为(h, w)
。img_pad_value
:图像填充时使用的像素值。默认为0
。pad_mask
:是否对实例掩码进行填充。默认为False
。mask_pad_value
:实例掩码填充时使用的像素值。默认为0
。pad_seg
:是否对语义分割图进行填充。默认为False
。seg_pad_value
:语义分割图填充时使用的像素值。默认为255
。
- 关键方法:
forward
:- 首先判断输入图像的尺寸是否小于目标尺寸,如果是,则使用
F.pad
方法对输入图像进行填充,设置填充值为img_pad_value
。 - 如果有数据样本,更新每个数据样本中的批量输入形状和填充形状信息。
- 如果
pad_mask
为True
,对每个数据样本中的实例掩码进行填充,使其形状与目标尺寸一致。 - 如果
pad_seg
为True
,对每个数据样本中的语义分割图进行填充,使其形状与目标尺寸一致。
- 首先判断输入图像的尺寸是否小于目标尺寸,如果是,则使用
4. MultiBranchDataPreprocessor
- 作用:
- 这是一个用于多分支数据预处理的包装器类。在半监督目标检测等场景中,可能存在多个分支的数据,每个分支的数据可能需要不同的预处理操作。这个类可以将不同分支的数据分别进行预处理,然后再将结果重新组合成多分支的格式。
- 初始化参数:
data_preprocessor
:一个DetDataPreprocessor
的配置参数,用于初始化内部的数据预处理对象。
- 关键方法:
forward
:- 如果处于非训练模式,直接使用内部的数据预处理对象对输入数据进行处理,并返回结果。
- 如果处于训练模式,首先过滤掉值为
None
的分支数据。 - 然后将数据按分支进行分组,对每个分支的数据进行预处理。
- 最后将结果重新格式化为多分支的格式,并返回。
5. BatchResize
- 作用:
- 在训练过程中对批量图像进行尺寸调整和填充操作。它首先将所有图像调整到一个目标尺寸,然后根据需要进行填充,以确保图像尺寸能够被指定的除数整除。
- 初始化参数:
scale
:图像尺寸调整的范围。pad_size_divisor
:图像填充时,确保填充后的图像尺寸能够被该值整除。默认为1
。pad_value
:图像填充时使用的像素值。默认为0
。
- 关键方法:
forward
:- 根据输入图像的高度和宽度,以及指定的尺寸调整范围,计算目标尺寸和比例因子。
- 使用
F.interpolate
方法对输入图像进行插值调整,使其尺寸接近目标尺寸。 - 使用
get_padded_tensor
方法对调整后的图像进行填充,确保其尺寸能够被pad_size_divisor
整除。 - 对于每个数据样本,更新其图像形状、批量输入形状、填充形状和比例因子等信息,并根据比例因子调整边界框的坐标。
6. BoxInstDataPreprocessor
- 作用:
- 这是一个用于
BoxInst
算法的特定数据预处理类。它在DetDataPreprocessor
的基础上,生成伪掩码并计算图像在 LAB 颜色空间中的颜色相似度。
- 这是一个用于
- 初始化参数:
- 除了接受与
DetDataPreprocessor
相同的参数外,还接受一些特定于BoxInst
的参数:mask_stride
:掩码输出步长,在BoxInst
中用于生成伪掩码。默认为4
。pairwise_size
:邻域大小,用于计算图像颜色相似度。默认为3
。pairwise_dilation
:邻域扩张,用于计算图像颜色相似度。默认为2
。pairwise_color_thresh
:颜色相似度阈值,用于生成伪掩码。默认为0.3
。bottom_pixels_removed
:底部像素移除数量,用于处理一些图像数据集中的标注错误。默认为10
。
- 除了接受与
- 关键方法:
get_images_color_similarity
:- 计算图像在 LAB 颜色空间中的颜色相似度,并考虑邻域权重。
- 首先使用
unfold_wo_center
方法对输入图像进行展开操作,得到邻域像素的差异。 - 然后计算差异的范数,并使用指数函数计算颜色相似度。
- 最后使用
unfold_wo_center
方法对图像掩码进行展开操作,得到邻域权重,并将颜色相似度与邻域权重相乘,得到最终的颜色相似度。
forward
:- 首先调用父类的
forward
方法进行常规的数据预处理操作。 - 在训练模式下,生成图像掩码并移除底部像素,计算下采样图像的颜色相似度。
- 根据颜色相似度生成伪掩码和成对掩码,并更新数据样本中的实例掩码和成对掩码信息。
- 首先调用父类的
三、结语
mmdet/models/data_preprocessors/data_preprocessor.py
文件提供了丰富的数据预处理功能,满足了目标检测任务在不同场景下的需求。通过这些数据预处理类,可以有效地提高模型的性能和泛化能力,为目标检测任务的成功实现提供了有力的支持。
每个类都有其特定的作用和功能,并且通过合理的参数设置和方法调用,可以灵活地应用于不同的目标检测任务中。在实际使用中,可以根据具体的需求选择合适的数据预处理类,并进行适当的参数调整,以获得最佳的性能。
希望本文对大家理解mmdet
中的数据预处理模块有所帮助。如果有任何问题或建议,欢迎在评论区留言交流。