openmmlab 数据预处理讲解

Resize

1.单尺度输入:
train_pipeline = [
    ......
    dict(
        type='Resize',
        img_scale=(1333, 800),
        keep_ratio=True),
    ......
    dict(type='Pad', size_divisor=32),
]

实际输入缩放计算方式:

max_long_edge = max(img_scale)
max_short_edge = min(img_scale)

取值方式: 大值/长边 小值/短边 谁的比值小 按谁来计算缩放比例取值方式: 大值/长边 小值/短边 谁的比值小 按谁来计算缩放比例

scale_factor = min(max_long_edge / max(h, w), max_short_edge / min(h, w))
keep_ratio表示是否保持图片原始比例

keep_ratio=True时,通过上面计算方式找到缩放因子,最终

scale_w = int(w * float(scale_factor ) + 0.5),
scale_h = int(h * float(scale_factor ) + 0.5)
简要概括就是: 利用 (小值/短边) 和 (大值/长边) 的比值小的为基准,然后通过图片比例来计算另一边的长度。

举例:

假设我的真实图片大小是(400, 600),那么按照上面的方式1333/600 = 2.22, 800/400=2,显然,按照800的缩放系数更小,因此以800的缩放系数为基准resize。那么就有(4002, 6002) -> (800, 1200) ,此时shape(400, 600)的图片,被resize成了 (800, 1200),这样操作的好处是图片在被resize的同时,尽量靠近原图的大小。

但是,还没有结束,在Resize之后,注意配置文件里还有个Pad操作,将Resize之后的图片Pad成size_divisor=32的倍数,具体逻辑是

pad_h = int(np.ceil(img.shape[0] / divisor)) * divisor
pad_w = int(np.ceil(img.shape[1] / divisor)) * divisor

经过pad操作之后,将(800,1200)变成了(800, 1216),这步操作的目的是避免卷积时,特征损失。

keep_ratio=False时,直接按照config配置中的img_scale来缩放图片,大值代表长边,小值代表短边,不会保持原有图片比例。

2.多尺度输入:

假设配置信息为

train_pipeline = [
    ......
    dict(
        type='Resize',
        img_scale=[(1333, 640), (1333, 800), (600,1080), (1200, 1000), (416,700)],
        multiscale_mode='value',
        # multiscale_mode='range', 
        keep_ratio=True),
    ......
]

多尺度输入的训练方式有两种指定模式 value和range

value:

从img_scale中随机一个turple,作为img_scale

伪代码:

img_scales相当于config中的img_scale img_scales相当于config中的img_scale
  num = len(img_scales)
  scale_idx = np.random.randint(num )
  img_scale = img_scales[scale_idx]
range:

long_edge: 每个turple中的大值,作为一个集合,上例中的就是:

[1333,1333,1080,1200, 700]

short_edge: 每个turple中的大值,作为一个集合,上例中的就是:

[640,800,600,1000, 416]

然后,从long_edge和short_edge中分别随机一个值作为新的img_scale,得到img_scale后,输入大小计算方式同单尺度。

伪代码:

img_scales相当于config中的img_scale
 long_edge = [max(s) for s in img_scales]
 short_edge= [min(s) for s in img_scales]
 l_edge = np.random.randint(long_edge)
 s_edge = np.random.randint(short_edge)
 img_scale = (l_edge, s_edge)
posted @ 2023-01-15 22:52  SXQ-BLOG  阅读(145)  评论(0)    收藏  举报