1.2.3 数据预处理
在语义分割中,我们一般是将图像裁剪为固定尺寸(使用图像增广中的随机裁剪transforms.RandomCrop,裁剪输入图像和标签(图片)的相同区域)
之所以要RandomCrop裁剪是因为图片大小不一样。图片分类中我们可以把图片resize到统一大小。但是语义分割的标签是包含一个个像素的标签的,resize之后需要将预测的像素类别重新映射回原始尺寸的输入图像。 这样的映射可能不够精确,尤其在不同语义的分割区域。(resize拉伸的时候中间多的像素是通过插值法插进去的。而标号是不好插值的,飞机中间拉伸的标粉红色还是啥都不好操作,所以语义分割的图像不用resize)
#@save
def voc_rand_crop(feature, label, height, width):
"""随机裁剪特征feature和标签图像label"""
"""
get_params允许裁剪之后的区域返回边框的坐标数值(边界框)
*rect就是把边界框四个坐标展开,这样对图片和标号做同样的裁剪
"""
rect = torchvision.transforms.RandomCrop.get_params(
feature, (height, width))
feature = torchvision.transforms.functional.crop(feature, *rect)
label = torchvision.transforms.functional.crop(label, *rect)
return feature, label
imgs = []
for _ in range(n):
#随机裁剪出200*300的区域
imgs += voc_rand_crop(train_features[0], train_labels[0], 200, 300)
imgs = [img.permute(1, 2, 0) for img in imgs]
d2l.show_images(imgs[::2] + imgs[1::2], 2, n);
原文链接:https://blog.csdn.net/qq_56591814/article/details/124934701