mindspore.ops.crop_and_resize

mindspore.ops.crop_and_resize(image, boxes, box_indices, crop_size, method='bilinear', extrapolation_value=0.0)[源代码]

对输入图像Tensor进行裁剪并调整其大小。

说明

当输出的shape依赖 crop_size 的时候,crop_size 必须为常量。 当前该算子的反向仅支持”bilinear”模式,其他模式将会返回0。

参数:
  • image (Tensor) - shape为 \((batch, image\_height, image\_width, depth)\) 的图像Tensor。数据类型:int8, int16, int32, int64, float16, float32, float64, uint8, uint16。

  • boxes (Tensor) - shape为 \((num\_boxes, 4)\) 的二维Tensor。其中,第 \(i\) 行指定对第 \(\text{box_indices[i]}\) 张图像裁剪时的归一化坐标 \([y1, x1, y2, x2]\),那么通过归一化的 \(y\) 坐标值可映射到的图像坐标为 \(y * (image\_height - 1)\),因此,归一化的图像高度 \([0, 1]\) 间隔映射到的图像高度间隔为 \([0, image\_height - 1]\)。我们也允许 \(y1 > y2\),这种情况下,就是对图像进行的上下翻转,宽度方向与此类似。同时,我们也允许归一化的坐标值超出 \([0, 1]\) 的区间,这种情况下,采用 \(\text{extrapolation_value}\) 进行填充。数据类型:float32。

  • box_indices (Tensor) - shape为 \((num\_boxes)\) 的一维Tensor,其中,每一个元素必须是 \([0, batch)\) 区间内的值。\(\text{box_indices[i]}\) 指定 \(\text{boxes[i, :]}\) 所指向的图像索引。数据类型:int32。

  • crop_size (Tuple[int]) - 2元组(crop_height, crop_width),该输入必须为常量并且均为正值。指定对裁剪出的图像进行调整时的输出大小,纵横比可与原图不一致。数据类型:int32。

  • method (str,可选) - 指定调整大小时的采样方法,取值为”bilinear”、 “nearest”或”bilinear_v2”,其中,”bilinear”是标准的线性插值算法,而在某些情况下,”bilinear_v2”可能会得到更优的效果。默认值:”bilinear”。

  • extrapolation_value (float,可选) - 指定外插时的浮点值。默认值: 0.0。

返回:

Tensor,shape为(num_boxes, crop_height, crop_width, depth),数据类型:float32 。

异常:
  • TypeError - imageboxesbox_indices 不是Tensor。

  • TypeError - crop_size 不是元素类型为int32的tuple,或 crop_size 的长度不为2。

  • TypeError - boxes 的数据类型不是float, 或者,box_indices 的数据类型不是int32。

  • TypeError - method 不是字符串。

  • TypeError - extrapolation_value 不是浮点值。

  • ValueError - image 的维度不是四维。

  • ValueError - boxes 的纬度不是二维。

  • ValueError - boxes 的第二维不是4。

  • ValueError - box_indices 的维度不是一维。

  • ValueError - box_indices 的第一维与 boxes 的第一维不相等。

  • ValueError - box_indices 存在元素不在 [0, batch) 的范围内.

  • ValueError - crop_size 的数据不是正整数.

  • ValueError - method 不是 “bilinear”、”nearest”、”bilinear_v2”之一。

支持平台:

Ascend GPU CPU

样例:

>>> BATCH_SIZE = 1
>>> NUM_BOXES = 5
>>> IMAGE_HEIGHT = 256
>>> IMAGE_WIDTH = 256
>>> CHANNELS = 3
>>> image = np.random.normal(size=[BATCH_SIZE, IMAGE_HEIGHT, IMAGE_WIDTH, CHANNELS]).astype(np.float32)
>>> boxes = np.random.uniform(size=[NUM_BOXES, 4]).astype(np.float32)
>>> box_indices = np.random.uniform(size=[NUM_BOXES], low=0, high=BATCH_SIZE).astype(np.int32)
>>> crop_size = (24, 24)
>>> output = ops.crop_and_resize(Tensor(image), Tensor(boxes), Tensor(box_indices), crop_size)
>>> print(output.shape)
 (5, 24, 24, 3)