我正在做一个ROI池层,它是为fast-rcnn工作的,我习惯于使用tensorflow 。我发现tf.image.crop_and_resize
可以作为ROI池层。
但是我试了很多次,都没有得到我期望的结果。还是说真正的结果正是我得到的?
这是我代码
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])
5条答案
按热度按时间dpiehjr41#
实际上,Tensorflow在这里没有问题。
从doc到
tf.image.crop_and_resize
(重点是我的):框中:float 32类型的Tensor。shape [num_boxes,4]的2-DTensor。Tensor的第i行指定box_ind[i]图像中的框的坐标,并且在归一化坐标[y1,x1,y2,x2]中指定。y的归一化坐标值被Map到y * 处的图像坐标(image_height - 1),因此归一化图像高度的[0,1]区间被Map到图像高度坐标中的[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 documentation的
plt.imshow
(重点是我的):所有值都应在[0.. 1]范围内(浮点型)或[0.. 255]范围内(整数型)。超出范围的值将被剪切到这些边界。
当你在
[0,1]
范围之外使用float时,matplotlib会将你的值绑定到1
。这就是为什么你会得到那些彩色像素(纯红色、纯绿色或纯蓝色,或者它们的混合)。将你的数组转换为uint_8
,得到一个有意义的图像。**编辑:**按照要求,我将深入研究
tf.image.crop_and_resize
。引用文档:
允许[0,1]范围之外的归一化坐标,在这种情况下,我们使用extrapolation_value来外推输入图像值。
因此,[0,1]之外的归一化坐标是允许的。但是它们仍然需要被归一化!在您的示例
[100,100,300,300]
中,您提供的坐标构成了红色正方形。您的原始图像是左上角的小绿色!参数extrapolation_value
的默认值是0
。因此原始图像的帧之外的值被推断为[0,0,0]
,因此为黑色。但是如果你的用例需要另一个值,你可以提供它。像素将在每个通道上采用
extrapolation_value%256
的RGB值。如果你需要裁剪的区域没有完全包含在你的原始图像中,这个选项很有用。(一个可能的用例是滑动窗口)。xhv8bpkk2#
tf.image.crop_and_resize
似乎期望像素值在范围[0,1]内。将代码更改为
帮我解决了问题。
cpjpxq1n3#
还有一个变体是使用tf.central_crop函数。
a1o7rhls4#
下面是
tf.image.crop_and_resize
API.tf版本1.14的具体实现dfuffjeb5#
下面是我的工作代码,同样输出的图像也不是黑色的,这个可以对别人有所帮助