Tensorflow API是否具有与OpenCV cv2.fillPoly等效的功能或可以在黑色背景上绘制填充边界框的另一个功能like this image。为了仅使用tf.bitwise_and
保留原始图像中的填充框。我已尝试使用tf.image.crop_to_bounding_box,但我需要使用此功能迭代我的框,因为形状为(None,4)
而无法进行迭代。
编辑: 这是我的代码的一部分
res = tf.gather(boxes,true_indices) #My boxes shape (None,4)
back = tf.get_variable("back", shape=image.shape, dtype=tf.uint8,
initializer=tf.zeros_initializer(), trainable=False) #Represent background
def my_func(x):
casted_boxes = tf.cast(x, dtype=tf.int32)
casted_img = tf.image.convert_image_dtype(image, dtype=tf.uint8)
cropped_image = tf.image.crop_to_bounding_box(casted_img, casted_boxes[1],casted_boxes[0],
casted_boxes[3] - casted_boxes[1], casted_boxes[2] - casted_boxes[0])
return back[casted_boxes[0]:, casted_boxes[1]:, :].assign(cropped_image) #Here I get a problem
r = tf.map_fn(my_func, res, tf.uint8)
使用上面的代码,我得到:AttributeError: 'Operation' object has no attribute '_c_op'
答案 0 :(得分:0)
我并不完全确定我会通过迭代你的方式来遵循你的意思,所以请澄清我是否错过了你的观点。
我相信您需要使用tf.map_fn
来执行多个框的操作。 tf.map_fn
会将一些张量流操作(通过将它们作为地图函数返回来定义)应用于数据中的每个元素。
https://www.tensorflow.org/api_docs/python/tf/map_fn
在这种情况下,您的边界框的形状为[None, 4]
。在运行时,如果你有42个边界框,它们将具有某种形状,例如,该形状将是[42, 4]
。
tf.map_fn
将沿着42个边界框的第一维解包边界框,并将从map函数返回的任何OP应用于每个边界框,并返回连接结果。