Image Tensorflow中的动态图像裁剪

Image Tensorflow中的动态图像裁剪,image,python-3.x,tensorflow,Image,Python 3.x,Tensorflow,我想弄清楚如何拍摄Tensorflow中动态确定的图像。下面是我试图完成的一个例子,但我似乎无法让它工作。基本上,我希望在图形中输入图像和该图像的裁剪值,然后继续对这些裁剪的片段进行其他计算。我目前的尝试: import tensorflow as tf from matplotlib import pyplot as plt import numpy as np sess = tf.InteractiveSession() img1 = np.random.random([400, 600

我想弄清楚如何拍摄Tensorflow中动态确定的图像。下面是我试图完成的一个例子,但我似乎无法让它工作。基本上,我希望在图形中输入图像和该图像的裁剪值,然后继续对这些裁剪的片段进行其他计算。我目前的尝试:

import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np

sess = tf.InteractiveSession()

img1 = np.random.random([400, 600, 3])
img2 = np.random.random([400, 600, 3])
img3 = np.random.random([400, 600, 3])

images = [img1, img2, img3]

img1_crop = [100, 100, 100, 100]
img2_crop = [200, 150, 100, 100]
img3_crop = [150, 200, 100, 100]

crop_values = [img1_crop, img2_crop, img3_crop]

def crop_image(img, crop):
    tf.image.crop_to_bounding_box(img,
                                  crop[0],
                                  crop[1],
                                  crop[2],
                                  crop[3])


image_placeholder = tf.placeholder("float", [None, 400, 600, 3])
crop_placeholder = tf.placeholder(dtype=tf.int32)
sess.run(tf.global_variables_initializer())

cropped_image = tf.map_fn(lambda img, crop: crop_image(img, crop), elems=[image_placeholder, crop_placeholder])
result = sess.run(cropped_image, feed_dict={image_placeholder: images, crop_placeholder:crop_values})

plt.imshow(result)
plt.show()
/Users/p111/anaconda/bin/python/Users/p111/PycharmProjects/analysis\u code/testing.py 回溯(最近一次呼叫最后一次): 文件“/Users/p111/PycharmProjects/analysis_code/testing.py”,第31行,在 裁剪图像=tf.map\fn(lambda img,裁剪:裁剪图像(img,裁剪),元素=[image\u占位符,裁剪占位符]) 文件“/Users/p111/anaconda/lib/python3.5/site packages/tensorflow/python/ops/functional_ops.py”,第390行,在map_fn中 交换内存=交换内存) while\u循环中的文件“/Users/p111/anaconda/lib/python3.5/site packages/tensorflow/python/ops/control\u flow\u ops.py”,第2636行 结果=context.BuildLoop(cond、body、loop\u vars、shape\u不变量) BuildLoop中的文件“/Users/p111/anaconda/lib/python3.5/site packages/tensorflow/python/ops/control\u flow\u ops.py”,第2469行 pred、body、原始循环变量、循环变量、形状不变量) 文件“/Users/p111/anaconda/lib/python3.5/site packages/tensorflow/python/ops/control\u flow\u ops.py”,第2419行,在BuildLoop中 body\u result=body(*packeted\u vars\u for\u body) 文件“/Users/p111/anaconda/lib/python3.5/site packages/tensorflow/python/ops/functional_ops.py”,第380行,在compute中 压缩值=fn(压缩值) TypeError:()缺少1个必需的位置参数:“裁剪”
编辑:元素似乎只接受一个张量。这意味着我需要以某种方式将我的两个张量组合成一个,然后在我的函数中解压以得到值。我不确定我将如何执行这种张量操作。我已经找到了“一瞥”的方法,而且确实有效,但是我想知道,这种特定的方法是否也可以做到同样的效果。大多数情况下,我想知道如何组合然后拆分一对张量,以便在这种方法中使用。

tf.map\u fn(f,l)为列表l中的每个张量运行函数f。在本例中,函数需要两个参数,但由于提供了一个平面列表,map_fn()会逐个发送它们。根据文档,map_fn()支持变量arity,所以您应该这样做

tf.map_fn(lambda img, crop: crop_image(img, crop), elems=([image_placeholder, crop_placeholder], )) tf.map_fn(lambda img,裁剪:裁剪图像(img,裁剪), 元素=([图像占位符,裁剪占位符],) 因此,您传递给map_fn的列表包含成对的参数。

我从中看到了这段代码

可以使用元组或列表将多个元素打包成一个元素,所以我尝试了这个方法

import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np

sess = tf.InteractiveSession()

img1 = np.random.random([400, 600, 3])
img2 = np.random.random([400, 600, 3])
img3 = np.random.random([400, 600, 3])
images = np.array([img1, img2, img3])
# images = tf.convert_to_tensor(images)  # it can be uncommented.

img1_crop = [100, 100, 100, 100]
img2_crop = [200, 150, 100, 100]
img3_crop = [150, 200, 100, 100]
crop_values = np.array([img1_crop, img2_crop, img3_crop])
# crop_values = tf.convert_to_tensor(crop_values)  # it can be uncommented.

def crop_image(img, crop):
    return tf.image.crop_to_bounding_box(img,
                                         crop[0],
                                         crop[1],
                                         crop[2],
                                         crop[3])

fn = lambda x: crop_image(x[0], x[1])
elems = (images, crop_values)

cropped_image = tf.map_fn(fn, elems=elems, dtype=tf.float64)
result = sess.run(cropped_image)

print result.shape

plt.imshow(result[0])
plt.show()
它在我的机器上使用tf版本0.11和python2。希望这能对您有所帮助。

两件事:

  • crop_image
    函数中没有
    return
    语句
  • map\u fn
    接受单个参数
  • 我强烈建议您将图形定义和会话使用分开
--


你目前的尝试出了什么问题?如果有回溯,请完整发布!很抱歉。添加了堆栈跟踪。我只是假设,因为这似乎是一个如此简单的问题,这个问题将是显而易见的。我不完全确定我是否以最好的方式进行此操作。TypeError:()缺少1个必需的位置参数:“crop”我的示例运行时不需要任何其他参数。因此,您可以使用我上面发布的代码来尝试您的方法,如果这使事情变得更简单的话。这是python 3,如果这在这方面有所不同的话。错误表明lambda函数得到一个参数,而不是两个。您需要确保map_fn成对传递参数,而不是逐个传递参数。我目前还没有一个系统可以测试这个。看起来elems只接受一个张量。我不知道为什么我不能自己解决这个问题。你让它看起来很简单!谢谢
elems = (np.array([1, 2, 3]), np.array([-1, 1, -1]))
alternate = map_fn(lambda x: x[0] * x[1], elems, dtype=tf.int64)
# alternate == [-1, 2, -3]
import tensorflow as tf
from matplotlib import pyplot as plt
import numpy as np

sess = tf.InteractiveSession()

img1 = np.random.random([400, 600, 3])
img2 = np.random.random([400, 600, 3])
img3 = np.random.random([400, 600, 3])
images = np.array([img1, img2, img3])
# images = tf.convert_to_tensor(images)  # it can be uncommented.

img1_crop = [100, 100, 100, 100]
img2_crop = [200, 150, 100, 100]
img3_crop = [150, 200, 100, 100]
crop_values = np.array([img1_crop, img2_crop, img3_crop])
# crop_values = tf.convert_to_tensor(crop_values)  # it can be uncommented.

def crop_image(img, crop):
    return tf.image.crop_to_bounding_box(img,
                                         crop[0],
                                         crop[1],
                                         crop[2],
                                         crop[3])

fn = lambda x: crop_image(x[0], x[1])
elems = (images, crop_values)

cropped_image = tf.map_fn(fn, elems=elems, dtype=tf.float64)
result = sess.run(cropped_image)

print result.shape

plt.imshow(result[0])
plt.show()
# Graph def
def crop_image(img, crop):
    return tf.image.crop_to_bounding_box(img,
                                  crop[0],
                                  crop[1],
                                  crop[2],
                                  crop[3])

image_placeholder = tf.placeholder(tf.float32, [None, 400, 600, 3])
crop_placeholder = tf.placeholder(dtype=tf.int32)
cropped_image = tf.map_fn(lambda inputs: crop_image(*inputs), elems=[image_placeholder, crop_placeholder], dtype=tf.float32)


# Session
sess = tf.InteractiveSession()

img1 = np.random.random([400, 600, 3])
img2 = np.random.random([400, 600, 3])
img3 = np.random.random([400, 600, 3])

images = [img1, img2, img3]

img1_crop = [100, 100, 100, 100]
img2_crop = [200, 150, 100, 100]
img3_crop = [150, 200, 100, 100]

crop_values = [img1_crop, img2_crop, img3_crop]

sess.run(tf.global_variables_initializer())

result = sess.run(cropped_image, feed_dict={image_placeholder: images, crop_placeholder:crop_values})

plt.imshow(result[0])
plt.show()