编辑图像为tensorflow tensor python

jch*_*kow 7 python image-processing tensorflow

我会尽力在这里提供一个可重复的例子.

我有一张图片:

在此输入图像描述

这张Aaron Eckhart的照片是 (150, 150)

我的目标是在像素上做数学运算来扰乱这个图像的ROI,但是,问题是,数学必须作为一个tensorflow张量完成,因为做数学运算是由它的缩放梯度乘以张量(这也是一个大小的张量(row_pixels,column_pixels,3))

所以这是我想象的过程:

  1. 读入图像为numpy数组RGB大小:(1,150,150,3)(1是批量大小)

    w, h = img.shape

    ret = np.empty((w, h, 3), dtype=np.uint8)

    ret[:, :, 0] = ret[:, :, 1] = ret[:, :, 2] = img

  2. 使像素值介于0和1之间

    img = (faces1 - min_pixel) / (max_pixel - min_pixel)

  3. for i in range(steps):

(a)提取图像的ROI 这是我不明白该怎么做的部分

(b)计算较小的img ROI张量损失的梯度

loss = utils_tf.model_loss(y, preds, mean=False)
grad, = tf.gradients(loss, x)
Run Code Online (Sandbox Code Playgroud)

(c)通过损失梯度乘以img ROI张量

scaled_grad = eps * normalized_grad
adv_img = img + scaled_grad
Run Code Online (Sandbox Code Playgroud)

(d)将这个新扰动的ROI张量放回到原始张量中的相同位置这是另一部分我不明白该怎么做

这将导致图像中仅一些像素值被扰动而其余像素值保持不变

小智 5

给定一个图像:

全图:两只大象

(a)从图像中获取感兴趣的区域((440,240),(535,380)):

roi_slice = tf.slice(
  image_in,
  [top_left_x, top_left_y, top_left_z],
  [roi_len_x, roi_len_y, bottom_right_z]
)
Run Code Online (Sandbox Code Playgroud)

提取的感兴趣区域:小象

获取与图像大小相同的ROI布尔值蒙版

roi_mask = tf.ones_like(roi_slice)
mask_canvas = tf.image.pad_to_bounding_box(
  [roi_mask],
  top_left_x,
  top_left_y,
  np_image.shape[0],
  np_image.shape[1]
)
bool_mask = tf.cast(mask_canvas, tf.bool)
Run Code Online (Sandbox Code Playgroud)

投资回报率的面具

(b)就本示例而言,我使用的是伪渐变,但您可以用实际的渐变代替。

fake_gradients = tf.ones_like(image_in) * 0.2
Run Code Online (Sandbox Code Playgroud)

(c)遮盖渐变,以获取ROI所在的渐变,否则为0。

masked_gradients = tf.where(bool_mask[0], fake_gradients, mask_canvas[0])
Run Code Online (Sandbox Code Playgroud)

(d)制作图像的可编辑副本,并使用蒙版渐变对其进行更新

# Make an editable copy of the image
editable_image = tf.get_variable(
    name='editable_image', shape=image_in.shape, dtype=tf.float32)
init_op = tf.assign(editable_image, image_in)

# Make sure we don't update the image before we've set its initial value.
with tf.control_dependencies([init_op]):
  update_roi_op = tf.assign_add(editable_image, masked_gradients)
Run Code Online (Sandbox Code Playgroud)

突出的投资回报率

您可以在GitHub上找到完整的Colab示例。