〖MMDetection〗解析文件:mmdet/models/data_preprocessors/data_preprocessor.py

《深入剖析 mmdet 中的数据预处理模块》

在目标检测任务中,数据预处理起着至关重要的作用,它能够将原始数据转换为模型可接受的格式,并进行必要的增强和规范化操作,以提高模型的性能和泛化能力。

一、模块概述

mmdet/models/data_preprocessors/data_preprocessor.pymmdetection框架中的一个重要模块,它提供了多种数据预处理功能,以满足不同目标检测任务的需求。这些类继承自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方法进行基本的图像预处理操作,包括标准化、填充、颜色空间转换等。
      • 根据输入数据确定批量图像的填充形状,并更新数据样本中的图像尺寸信息和填充形状信息。
      • 如果boxtype2tensorTrue,将数据样本中的边界框类型转换为张量。
      • 如果pad_maskTrue且处于训练模式,调用pad_gt_masks方法填充实例掩码。
      • 如果pad_segTrue且处于训练模式,调用pad_gt_sem_seg方法填充语义分割图。
      • 如果处于训练模式且有定义的批量增强操作,依次应用这些增强操作。
    • _get_pad_shape
      • 根据输入数据的类型,分别处理使用pseudo_collatedefault_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_maskTrue,对每个数据样本中的实例掩码进行填充,使其形状与目标尺寸一致。
      • 如果pad_segTrue,对每个数据样本中的语义分割图进行填充,使其形状与目标尺寸一致。

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中的数据预处理模块有所帮助。如果有任何问题或建议,欢迎在评论区留言交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值