我正在研究ROI池层,它适用于快速rcnn,并且我习惯使用tensorflow。我发现tf.image.crop_and_resize可以充当ROI池层。
但是我尝试了很多次,却无法得到我expected.Or所做的结果--真正的结果就是我得到了什么?
这是我的密码
import cv2
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
img_path = r'F:\IMG_0016.JPG'
img = cv2.imread(img_path)
img = img.reshape([1,580,580,3])
img = img.astype(np.float32)
#img = np.concatenate([img,img],axis=0)
img_ = tf.Variable(img) # img shape is [580,580,3]
boxes = tf.Variable([[100,100,300,300],[0.5,0.1,0.9,0.5]])
box_ind = tf.Variable([0,0])
crop_size = tf.Variable([100,100])
#b = tf.image.crop_and_resize(img,[[0.5,0.1,0.9,0.5]],[0],[50,50])
c = tf.image.crop_and_resize(img_,boxes,box_ind,crop_size)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
a = c.eval(session=sess)
plt.imshow(a[0])
plt.imshow(a[1])如果我错了,有人能教我如何使用这个函数吗?谢谢。
发布于 2018-08-14 15:19:53
实际上,丹索尔·弗洛在这里没有问题。
来自文档 of tf.image.crop_and_resize (重点是我的):
盒子: float32类型的张量。num_boxes形状的二维张量,4.张量的第1行指定box_indi图像中框的坐标,并在归一化坐标 y1、x1、y2、x2中指定。将y的一个归一化坐标值映射到y* (image_height - 1)上的图像坐标,从而在图像高度坐标中将归一化图像高度的0,1间隔映射到0,image_height -1。我们确实允许y1 > y2,在这种情况下,采样的作物是原始图像的向上翻转版本。宽度维度被类似地对待。允许在0,1范围外的归一化坐标,在这种情况下,我们使用extrapolation_value外推输入图像值。
boxes参数需要归一化坐标。这就是为什么您得到了第一组坐标[100,100,300,300] (没有标准化,也没有提供外推值)的黑匣子,而不是第二组[0.5,0.1,0.9,0.5]。
然而,这就是matplotlib在第二次尝试中显示出胡言乱语的原因,这仅仅是因为您使用了错误的数据类型。引用matplotlib 文档 of plt.imshow (重点是我的):
所有的值都应该在0 .1表示浮动或0 ..255表示整数。超出范围的值将被裁剪到这些边界。
当您在[0,1]范围外使用float时,matplotlib将您的值绑定到1。这就是为什么你会得到那些彩色像素(要么是纯红色,要么是实心绿色,要么是蓝色,或者是这些像素的混合)。将数组转换为uint_8以获得有意义的图像。
plt.imshow( a[1].astype(np.uint8))编辑:根据的要求,我将更深入地研究tf.image.crop_and_resize。
当提供非归一化坐标和没有外推值时,为什么我只得到一个空白的结果?
引用医生的话:
允许在0,1范围外的归一化坐标,在这种情况下,我们使用extrapolation_value外推输入图像值。
因此,在0,1之外的归一化坐标是允许的。但他们仍然需要规范化!用你的例子[100,100,300,300],你提供的坐标就成了红色的正方形。你原来的形象是左上角的小绿点!参数extrapolation_value的默认值是0,因此原始图像框架外的值被推断为[0,0,0],因此是黑色的。

但如果您的usecase需要另一个值,您可以提供它。像素将在每个通道上接受extrapolation_value%256的RGB值。如果您需要裁剪的区域未完全包含在原始图像中,则此选项非常有用。(例如,一种可能的用法是滑动窗口)。
发布于 2018-08-14 15:09:05
tf.image.crop_and_resize似乎期望0,1范围内的像素值。
将代码更改为
test = tf.image.crop_and_resize(image=image_np_expanded/255., ...)帮我解决了这个问题。
发布于 2019-07-03 20:33:56
还有一个变体是使用裁剪函数。
https://stackoverflow.com/questions/51843509
复制相似问题