RandomResizedCrop,默认scale=(0.08, 1.0)
0.08意味着在100×100的图像中,最小的crop_img约为28×28
get_params
函数中,输入参数img
为PIL Image
,img.size
对应(w, h)
计算img
的面积
area = img.size[0] * img.size[1]
从[0.08 * area, 1.0 * area]
采样crop_img
的面积
target_area = random.uniform(*scale) * area
从[3/4, 4/3]
采样crop_img
的宽高比
aspect_ratio = random.uniform(*ratio)
由此可以建立关于w
和h
的方程组
w * h = target_area
w / h = aspect_ratio
解得
w = int(round(math.sqrt(target_area * aspect_ratio)))
h = int(round(math.sqrt(target_area / aspect_ratio)))
以50%的概率交换w
和h
,因为宽高比的定义为
w / h = aspect_ratio
,h / w = aspect_ratio
均可
if random.random() < 0.5:
w, h = h, w
检查crop_img
的w
和h
是否超出img
的范围,如果未超出范围,则获得一组(i, j, h, w)
if w <= img.size[0] and h <= img.size[1]:
i = random.randint(0, img.size[1] - h)
j = random.randint(0, img.size[0] - w)
return i, j, h, w
如果超出范围,则重新做一遍,这一系列步骤总共尝试10次,对应for attempt in range(10):
如果10次尝试都失败了,则计算img
的短边,然后center crop一个正方形
w = min(img.size[0], img.size[1])
i = (img.size[1] - w) // 2
j = (img.size[0] - w) // 2
return i, j, w, w
最后根据(i, h, h, w)
裁剪出crop_img
,然后resize
为指定大小