pytorch torchvision.transforms.RandomResizedCrop 方法解读

1. 包含功能:

(1) Crop:随机大小和随机宽高比的裁剪,且随机的范围可以指定。

(2) Resize: Resize到指定的大小。

先进行随机大小和随机宽高比的Crop操作,再对Crop出来的区域进行Resize操作。

2. 参数介绍

下面使用的元组不是指的Python的tuple类型,就是一个二元组,可以是tuple类型,也可以是list类型。

size:该参数用于Resize功能,指定最终得到的图片大小。

如果size是一个Int值,如H,则最终图片大小为HxH,如果size是一个二元组,如(H,W),则最终图片大小为HxW。size参数跟crop功能完全没关系,crop出来的区域是个啥样子,跟size参数完全没关系。

scale:该参数用于Crop功能,指定裁剪区域的面积占原图像的面积的比例范围,是一个二元组,如(scale_lower, scale_upper),我们会在[scale_lower, scale_upper]这个区间中随机采样一个值。

假设随机采样的值为scale_a。假设原图片的size为(image_height, image_width),则原图片的面积S_origin=image_height * image_width。则裁剪区域的面积S_crop=S_origin * scale_a。 即scale_a表示从原图片中裁剪多大的一部分区域。而scale参数是scale_a的取值范围。

再举例:原图片面积为500,scale=(0.08, 1.0),在0.08-1.0之间随机采样的值scale_a = 0.5,则裁剪区域的面积S=500*0.5 = 250

ratio:该参数用于Crop功能,指定裁剪区域的宽高比范围,是一个二元组,如(ratio_lower,ratio_upper),我们会在[ratio_lower, ratio_upper]这个区间中随机采样一个值。

假设随机采样的值为ratio_a,则裁剪区域的宽 / 裁剪区域的高 = ratio_a。即宽高比。

根据scale我们可以确定裁剪区域的面积为S_crop,现在我们可以根据宽高比,求得裁剪区域的高 = sqrt(S_crop / ratio_a),裁剪区域的宽 = sqrt(S_crop * ratio_a)。sqrt是平方根函数。

interpolation:该参数用于Resize功能,指缩小或者扩大图像的时候,使用什么样的插值方法。

3. 方法举例

假设原图像尺寸为(300, 500),scale=(0.08,1.0),ratio=(3.0/4.0, 4.0/3.0)。

首先对scale和ratio的均匀分布区间进行随机采样,假设得到scale值为0.5,ratio值为3/4,则裁剪区域的高=sqrt(300*500*0.5/0.75),裁剪区域的宽=sqrt(300*500*0.5*0.75)。

最后通过:

i = torch.randint(0, height - h + 1)

j = torch.randint(0, width - w + 1).

的方式得到随机的左上角(i,j),就可以进行裁剪了。其中height和width是原图像的高和宽,h和w是裁剪区域的高和宽。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐