def crop_and_resize(
image,
boxes,
box_ind,
crop_size,
method="bilinear",
extrapolation_value=0,
name=None
)
功能:从输入图像张量中提取固定大小的切片,并指定插值算法(method)resize成指定的输出大小(crop_size)
return : A Tensor of shape '[ num_boxes, crop_height, crop_width, depth]'
1、image:A 4-D tensor of shape `[batch, image_height, image_width, depth]`.;
A `Tensor`. Must be one of the following types: `uint8`, `uint16`, `int8`, `int16`, `int32`, `int64`, `half`, `float32`, `float64`.Both `image_height` and `image_width` need to be positive.
2、box_ind: box index,即boxes的索引。是一个形状为num_boxes的1D-Tensor, 里面的数值范围为[0, batch)。
box_ind[i] 指定boxes[i]在哪个batch图像中截取。num_boxes决定了输出Tensor的batch。
3、boxes: A 2-D tensor of shape `[num_boxes, 4]` ,float32,需要跟参数box_ind联系起来看。
1) boxes[i]对应box_ind[i], 每一行都是roi_iamge = [ ymin, xmin, ymax, xmax]。 boxes[i] 表示box_ind[i]对应batch 的截取区域。
2) [ ymin, xmin, ymax, xmax]: 值是归一化后的值, 假设截取[y1,x1,y2,x2],那么归一化的实际boxes[i]为[y1/H,x1/X,y2/H,x2/X]
因此boxes内的值的取值范围应为[0,1],映射到实际图像范围为[0, image_h-1],
如:当boxes[i]取值为[0,0,1,1],表示截取全图[0,0,image_h-1, iamge_w-1],
3)若boxes中的值大于1,截取范围就超过了有效图像的高度(image_h),是取不到图像中的值的。
但是该op支持大于1的情况,它的处理是自动补齐原图(相当于padding),补齐的值由extrapolation_value指定
4)当boxes的ymin>ymax时看作是上下翻转变换, xmin>xmax时看做左右翻转变换
4、crop_size:size=[crop_height, crop_width],是一个包含两个元素的1D-Tensor,int32类型,所有裁剪的图像都会调整为此大小,图像内容的宽高比不会被保留
5、extrapolation_value:外插值,boxes值>1时裁剪超出图像范围,自动补齐的填充值
image = [
[[[1,2,3,4], [2,3,4,1]],
[[1,2,9,4], [2,0,6,1]],
[[1,0,3,4], [2,3,5,1]]],
[[[0,5,5,0], [0,4,4,0]],
[[6,0,0,6], [3,0,0,3]],
[[0,5,5,0], [0,2,2,0]]]
] # 2x3x2x4
box_ind = [0, 1]
boxes = [[0, 0, 1, 0.5], # 对应batch0 [crop_h,crop_w] = [3, 1]
[0, 0, 1, 0.5]] # 对应batch1
crop_size = [3, 1] # 不缩放
# 为方便比较数据的取舍,method选择 nearest
car = tf.image.crop_and_resize(
image=np.array(image).astype(np.float32),
boxes=np.array(boxes).astype(np.float32),
box_ind=box_ind,
crop_size=crop_size,
method="nearest",
extrapolation_value=0,
name=None)
with tf.Session() as sess:
print(sess.run(car))
------------------------------------------------------ out1: box_ind = [0,1]
[[[[1. 2. 3. 4.]]
[[1. 2. 9. 4.]]
[[1. 0. 3. 4.]]]
[[[0. 5. 5. 0.]]
[[6. 0. 0. 6.]]
[[0. 5. 5. 0.]]]] (2x3x1x4)
------------------------------------------------------ out1: box_ind = [1,0]
[[[[0. 5. 5. 0.]]
[[6. 0. 0. 6.]]
[[0. 5. 5. 0.]]]
[[[1. 2. 3. 4.]]
[[1. 2. 9. 4.]]
[[1. 0. 3. 4.]]]] (2x3x1x4)
------------------------------------ out1: box_ind = [0,1]且extrapolation_value=-1
[[[[ 1. 2. 3. 4.]]
[[ 1. 0. 3. 4.]]
[[-1. -1. -1. -1.]]]
[[[ 0. 5. 5. 0.]]
[[ 0. 5. 5. 0.]]
[[-1. -1. -1. -1.]]]] (2x3x1x4)