mask-rcnn 学习笔记(图像预处理--图像缩放)

  论文下载地址:http://cn.arxiv.org/pdf/1703.06870v3
  介绍时所采用的Mask-RCNN源码(python版本)来源于GitHub:https://github.com/matterport/Mask_RCNN

1.图像缩放

  数据预处理在构建网络模型时非常重要,往往能够决定训练结果,因此需要我们根据网络结构仔细设计输入数据的处理方式。通常数据预处理包含两部分:图像缩放、图像增强。
  图像缩放,就是改变图像大小。这里的缩放不同于图像增强的缩放,是指缩放到网络可接受的图像大小。一方面由于网络结构和硬件的限制,需要特定尺寸大小的输入图像;另一方面,不同大小的图像对训练速度、特征提取也有一定的影响。
  图像增强,就是对图像进行随机变换。这种变换不仅仅包括平移、旋转、缩放、白平衡等操作,还可以根据图像特性自定义一些变换方法。
  本文介绍的是Mask-RCNN中关于第一部分图像缩放的具体流程及方法。

2.主要涉及参数

  在mrcnn的配置文件config.py中可设定图像缩放的相关参数,其中与图像缩放有关的参数共4个,分别为:

  • min_dim: 较短边缩放长度;
  • max_dim: 较长边缩放长度;
  • min_scale: 最小缩放比例;
  • mode: 图像调整模式,[none,square,pad64,crop]共4种。

3.基本流程

  源码对图像只进行放大,不进行缩小操作(只有一种情况可能会进行缩小,后面会有介绍),源码作者没有解释这样做的原因。我个人理解,如果对图像进行缩小,必然对图像长宽两个维度都要进行像素填充。如果把填充像素当做噪声,这是一种信噪比低的做法。所以为了保证调整后图像最大程度的保留原图信息,至少要有一边不进行像素填充。
在这里插入图片描述

图1 图像缩放流程

4.缩放系数

  • 缩放系数的计算主要由min_dim和min_scale得出,缩放后图像较短边的长度为scale_len,具体计算方法见图2。
  • 放大采用的插值方法为双边线性插值。
  • 特别注意:
  1. 当调整模式为square时,必须指定max_dim。如果放大后图像的较长边大于max_dim,则按照max_dim重新计算缩放系数。当原图较长边大于max_dim,则会对原图进行缩小。
  2. 当调整模式为pad64时,min_dim必须被64整除。

mask-rcnn 学习笔记(图像预处理--图像缩放)_第1张图片

图2 缩放系数计算流程

5.调整模式

  • 像素填充
      square和pad64模式需要进行像素填充,源码采用的填充为0,且在图像两侧均匀填充至指定长度。如图3,原图等比例缩放后大小为640*768,而我们要求输出768*768的图像,垂直方向两边各填充64像素,得到最终的图像。
    mask-rcnn 学习笔记(图像预处理--图像缩放)_第2张图片

    图3 图像填充

  • none
    不进行上述缩放操作,直接返回原图。

  • square
    长、宽填充至max_dim。如图4。

mask-rcnn 学习笔记(图像预处理--图像缩放)_第3张图片

图4 square调整模式

  补充说明:前文提到了至少有一边不需要进行填充,这里为什么两边都要进行填充。看过源码的朋友应该能想到,当原图放大后,如果较长边小于max_dim,则长、宽两个方向就都需要进行像素填充。我感觉是程序的一个bug,改为直接将较长边缩放至max_dim应该更合适。个人观点。

  • pad64
    长、宽填充至64的倍数。如图5。
    mask-rcnn 学习笔记(图像预处理--图像缩放)_第4张图片
    图5 pad64调整模式

  补充说明:源码中即使长、宽能被64整除,仍然要在两边各填充32像素。此外,源码中还强制要求min_dim能被64整除,并不能保证放大后图像的较短边一定能被64整除,还可能受到min_scale的影响。

  • crop:裁剪
    在放大后图像内随机裁剪一块min_dim* min_dim大小的图像。如图6。
    mask-rcnn 学习笔记(图像预处理--图像缩放)_第5张图片
图6 crop调整模式

6.总结

  • 源码基本实现了常用的几种图像缩放功能,大家可以根据自己的需要选择合适的图像缩放方法。
  • 关于输出图像尺寸,之前看不少博客介绍输出图像大小为min_dim*min_dim,我觉得有些不太严谨。只有crop模式确定输出min_dim*min_dim大小的图像;square模式输出尺寸为max_dim*max_dim;而pad64模式要由原图的大小、min_dim、min_scale共同决定最终的尺寸。

你可能感兴趣的:(深度学习)