Tensorflow 关于使用tf.image.crop\u和调整大小
我正在研究用于快速rcnn的ROI池层,我习惯于使用tensorflow。我发现Tensorflow 关于使用tf.image.crop\u和调整大小,tensorflow,machine-learning,Tensorflow,Machine Learning,我正在研究用于快速rcnn的ROI池层,我习惯于使用tensorflow。我发现tf.image.crop\u和\u 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.i
tf.image.crop\u和\u 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])
我交上了我的来源和结果:,如果我错了,谁能教我如何使用这个函数?谢谢。似乎
tf.image.crop\u和_resize
要求像素值在[0,1]范围内
将代码更改为
test = tf.image.crop_and_resize(image=image_np_expanded/255., ...)
为我解决了这个问题。实际上,这里的Tensorflow没有问题 从
tf.image.crop\u和_resize
(重点是我的):
框:float32型张量。形状为[num_-box,4]的二维张量。
张量的第i行指定了
框指示[i]图像,并在标准化坐标中指定,
y2,x2]。y的标准化坐标值映射到图像
坐标在y*(图像高度-1)处,因此
标准化图像高度映射到图像中的[0,图像高度-1]
高度坐标。我们允许y1>y2,在这种情况下
裁剪是原始图像的上下翻转版本。宽度
维度的处理方式类似标准化坐标在[0,
1] 范围是允许的,在这种情况下,我们使用外推_值
外推输入图像值。
Box参数需要标准化坐标。这就是为什么第一组坐标[100100300300]
(未标准化,也未提供外推值)会出现一个黑框,而第二组坐标[0.5,0.1,0.9,0.5]
然而,这就是为什么matplotlib在第二次尝试时显示出胡言乱语的原因,这只是因为您使用了错误的数据类型。
引用plt.imshow
的matplotlib(重点是我的):
浮点数的所有值应在[0..1]或[0..255]范围内
对于整数超出范围的值将被剪裁到这些边界
当您在[0,1]
范围之外使用float时,matplotlib将您的值绑定到1
。这就是为什么会得到这些彩色像素(纯红色、纯绿色或纯蓝色,或者它们的混合)。将数组投射到uint_8
以获得有意义的图像
plt.imshow( a[1].astype(np.uint8))
编辑: 根据要求,我将进一步深入探讨
tf.image.crop\u和_resize
[当提供非标准化坐标且没有外推值时],为什么我只得到一个空白结果
引用文件:
允许[0,1]范围之外的标准化坐标,其中
在这种情况下,我们使用外推_值来外推输入图像值
因此,允许[0,1]之外的标准化坐标。但它们仍然需要正常化!
在您的示例中,[100100300300]
,您提供的坐标构成红方块。您的原始图像是左上角的小绿点!参数外推\u value
的默认值为0
,因此原始图像帧外的值被推断为[0,0,0]
,因此为黑色。但是如果您的用例需要另一个值,您可以提供它。在每个通道上,像素的RGB值为
外推值%256
。如果需要裁剪的区域未完全包含在原始图像中,则此选项非常有用。(例如,一个可能的用例是滑动窗口)。另一个变体是使用函数。下面是tf.image.crop\u和\u resize
API的具体实现。tf版本1.14
import tensorflow as tf
import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
tf.enable_eager_execution()
def single_data_2(img_path):
img = tf.read_file(img_path)
img = tf.image.decode_bmp(img,channels=1)
img_4d = tf.expand_dims(img, axis=0)
processed_img = tf.image.crop_and_resize(img_4d,boxes=
[[0.4529,0.72,0.4664,0.7358]],crop_size=[64,64],box_ind=[0])
processed_img_2 = tf.squeeze(processed_img,0)
raw_img_3 = tf.squeeze(img_4d,0)
return raw_img_3, processed_img_2
def plot_two_image(raw,processed):
fig=plt.figure(figsize=(35,35))
raw_ = fig.add_subplot(1,2,1)
raw_.set_title('Raw Image')
raw_.imshow(raw,cmap='gray')
processed_ = fig.add_subplot(1,2,2)
processed_.set_title('Processed Image')
processed_.imshow(processed,cmap='gray')
img_path = 'D:/samples/your_bmp_image.bmp'
raw_img, process_img = single_data_2(img_path)
print(raw_img.dtype,process_img.dtype)
print(raw_img.shape,process_img.shape)
raw_img=tf.squeeze(raw_img,-1)
process_img=tf.squeeze(process_img,-1)
print(raw_img.dtype,process_img.dtype)
print(raw_img.shape,process_img.shape)
plot_two_image(raw_img,process_img)
谢谢,一切都成功了。但我还有一个问题。正如你在第一句话中所强调的,“允许[0,1]范围外的标准化坐标,在这种情况下,我们使用外推_值来外推输入图像值。”实际剂量是什么意思?为什么我只得到一个空白结果?检查我的更新答案。如果您需要更多信息,请随时询问!是的,它起作用了。当坐标超出[0,1]范围时
tf
尝试推断冗余。我得到的是裁剪后的图像和白色区域,对吗?无论如何,非常感谢!