Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 关于使用tf.image.crop\u和调整大小_Tensorflow_Machine Learning - Fatal编程技术网

Tensorflow 关于使用tf.image.crop\u和调整大小

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

我正在研究用于快速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.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
尝试推断冗余。我得到的是裁剪后的图像和白色区域,对吗?无论如何,非常感谢!