html img图片等比例缩放_mmdetection中的图片输入大小解析

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。那么就有(400*2, 600*2) -> (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
  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)
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值