我将尽力在此处提供一个可重复的示例。
我有一张图片:
亚伦·埃克哈特(Aaron Eckhart)的这张照片是(150, 150)
我的目标是通过对像素进行数学运算来干扰此图像的ROI,但是问题是数学必须作为张量流张量进行,因为要进行的数学运算是将张量乘以张量比例梯度(也是张量(row_pixels,column_pixels,3))
这就是我想象的过程:
以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
使像素值介于0和1之间
img = (faces1 - min_pixel) / (max_pixel - min_pixel)
for i in range(steps):
(a)提取图像的ROI 这是我不知道该怎么做的部分
(b)计算较小的img ROI张量损失的梯度
loss = utils_tf.model_loss(y, preds, mean=False)
grad, = tf.gradients(loss, x)
(c)将img ROI张量乘以损耗梯度
scaled_grad = eps * normalized_grad
adv_img = img + scaled_grad
(d)将此新扰动的ROI张量放回与原始张量相同的位置这是我不知道如何做的另一部分
这将导致图像中只有一些像素值受到干扰,其余像素值保持不变
答案 0 :(得分: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]
)
获取与图像大小相同的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)
(b)在此示例中,我使用的是伪渐变,但您可以用真实的渐变代替。
fake_gradients = tf.ones_like(image_in) * 0.2
(c)遮盖渐变,以获取ROI所在的渐变,否则为0。
masked_gradients = tf.where(bool_mask[0], fake_gradients, mask_canvas[0])
(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)
您可以找到功能完善的Colab示例on GitHub。