SLBR-Visible-Watermark-Removal icon indicating copy to clipboard operation
SLBR-Visible-Watermark-Removal copied to clipboard

confusion about output add input in training

Open locusbear opened this issue 2 years ago • 13 comments

reconstructed_image = (reconstructed_image + synthesized).clamp(0,1) refine_bg = (torch.tanh(refine_bg) + synthesized).clamp(0,1)

About above code,Idon't understand why add the input image, it is different about train and infer,i worry the output is different

locusbear avatar Jul 19 '22 08:07 locusbear

reconstructed_image = (reconstructed_image + synthesized).clamp(0,1) refine_bg = (torch.tanh(refine_bg) + synthesized).clamp(0,1)

About above code,Idon't understand why add the input image, it is different about train and infer,i worry the output is different

In fact, this equation means y = f(x) + x, in which it is the famous idea about residual learning referred in ResNet. This residual learning will help the network learn to reconstruct original image better.

There is no difference between training and infer stage in terms of the forward process, and we just use the same code.

jimleungjing avatar Jul 19 '22 15:07 jimleungjing

好的,非常感谢。我能明白y=f(x)+x的含义,但resnet似乎在中间层的feature map上进行的,在输出的地方进行我感觉非常奇特。看起来似乎是鼓励f(x)在非mask区域为0,而在mask区域鼓励f(x)+x变成接近附近非水印区域的像素值,可以这样理解吗?

locusbear avatar Jul 20 '22 02:07 locusbear

好的,非常感谢。我能明白y=f(x)+x的含义,但resnet似乎在中间层的feature map上进行的,在输出的地方进行我感觉非常奇特。看起来似乎是鼓励f(x)在非mask区域为0,而在mask区域鼓励f(x)+x变成接近附近非水印区域的像素值,可以这样理解吗?

鼓励 f(x)在带水印的输入图像的上 做出些许改动,接近去水印的原始图像:鼓励非mask区域不改原图,mask区域趋向于去水印的像素

jimleungjing avatar Jul 20 '22 16:07 jimleungjing

好的,非常感谢。我能明白y=f(x)+x的含义,但resnet似乎在中间层的feature map上进行的,在输出的地方进行我感觉非常奇特。看起来似乎是鼓励f(x)在非mask区域为0,而在mask区域鼓励f(x)+x变成接近附近非水印区域的像素值,可以这样理解吗?

鼓励 f(x)在带水印的输入图像的上 做出些许改动,接近去水印的原始图像:鼓励非mask区域不改原图,mask区域趋向于去水印的像素

非常巧妙的思路,祝你们的研究越来越好!

locusbear avatar Jul 21 '22 03:07 locusbear

另外我还有几个问题想向你请教: 1 pixel_loss += self.masked_l1_loss(pred_ims[-1], target, mask) recov_imgs = [ self.denorm(pred_im*mask + (1-mask)*self.norm(target)) for pred_im in pred_ims ]
pixel_loss += sum([self.l1_loss(im,target) for im in recov_imgs]) * 1.5
我想知道为什么要这么做呢,前后pixel_loss的区别似乎是使用mask区域还是使用全图区域做l1 loss。我对这个的 猜想是因为标签mask边缘不够精细,需要放到全局图像中做loss以修复边缘?如果是这样,那么权重为什么不设置为2(2个feature map输出)甚至更大,而是设置为1.5? 2 如果我想训练一个通用的模型,输入的图像尺寸可能是从256到3000等不同的输入大小,在只使用一个模型的情况下,是 采用resize到1000左右的尺度进行训练和推理好,还是randomcrop到256,用原图尺寸推理好,或者是用将大图crop到256的尺寸,依次输入训练和推理好? 3 在训练过程中,发现alpha x watermark,如果alpha接近1,会使得watermark区域难以去除,这有什么好的方法改进吗?

4 在训练过程中,发现即使mask区域预测得很好,仍然会出现水印颜色退化成了和背景颜色相近的颜色,颜色相近的话用l1 算平均Loss应该难以分辨。有什么好的方法可以改进吗?

locusbear avatar Jul 21 '22 09:07 locusbear

另外我还有几个问题想向你请教: 1 pixel_loss += self.masked_l1_loss(pred_ims[-1], target, mask) recov_imgs = [ self.denorm(pred_im*mask + (1-mask)*self.norm(target)) for pred_im in pred_ims ] pixel_loss += sum([self.l1_loss(im,target) for im in recov_imgs]) * 1.5 我想知道为什么要这么做呢,前后pixel_loss的区别似乎是使用mask区域还是使用全图区域做l1 loss。我对这个的 猜想是因为标签mask边缘不够精细,需要放到全局图像中做loss以修复边缘?如果是这样,那么权重为什么不设置为2(2个feature map输出)甚至更大,而是设置为1.5? 2 如果我想训练一个通用的模型,输入的图像尺寸可能是从256到3000等不同的输入大小,在只使用一个模型的情况下,是 采用resize到1000左右的尺度进行训练和推理好,还是randomcrop到256,用原图尺寸推理好,或者是用将大图crop到256的尺寸,依次输入训练和推理好? 3 在训练过程中,发现alpha x watermark,如果alpha接近1,会使得watermark区域难以去除,这有什么好的方法改进吗?

4 在训练过程中,发现即使mask区域预测得很好,仍然会出现水印颜色退化成了和背景颜色相近的颜色,颜色相近的话用l1 算平均Loss应该难以分辨。有什么好的方法可以改进吗?

  1. masked_l1_loss是mask区域的加权 L1 loss,根据mask面积动态调整惩罚力度;l1_loss 分母成了整张图片面积,是固定的分母,较为稳定,当时对它增大权重是想稳定loss,你可以根据你的数据集去掉 l1_loss 或者调整权重
  2. resize 到1000 进行训练比较好,但不建议多尺度图片用同一模型,可能会因为resolution带来的pattern差异,造成模型训练不稳定,测试质量不好保证
  3. alpha接近于1的时候,原始图像信息丢失,此时问题转换为inpainting 问题,应使用inpainting 方法解决
  4. 可以使用GAN Loss 增加图像细节

jimleungjing avatar Jul 25 '22 15:07 jimleungjing

GAN loss 是指还要训练一个判别器然后使用GAN loss吗?

locusbear avatar Jul 27 '22 09:07 locusbear

GAN loss 是指还要训练一个判别器然后使用GAN loss吗?

是的,将这个去除网络作为G,然后在加一个D,使用GAN Loss

jimleungjing avatar Jul 29 '22 15:07 jimleungjing

GAN loss 是指还要训练一个判别器然后使用GAN loss吗?

是的,将这个去除网络作为G,然后在加一个D,使用GAN Loss

非常感谢

locusbear avatar Aug 01 '22 02:08 locusbear

还想请教下,为什么没有考虑WDNet中彩色的mask,alpha*w等操作呢

locusbear avatar Aug 02 '22 09:08 locusbear

还想请教下,为什么没有考虑WDNet中彩色的mask,alpha*w等操作呢

  1. 彩色mask即 alpha map,走alpha map估测的路线,至少需要估测alpha map,watermark,wateramrk-free image; 由公式 J = I * (1-alpha) + W * alpha 可知,从单一等式同时估测三个未知变量本身是个病态方程,每一个像素对应三个未知量,估测难度较大。
  2. 对于简单的灰白水印,可以视全局图像的 alpha 为单一变量,此时估算的未知量只有wateramrk-free image,watermark,以及一个alpha 变量,此时走 alpha map 估测较为简单;
  3. 实际上对于复杂的彩色水印,alpha map区域内存在多个alpha,需要估测的变量增多,你可以从WDNet的实验中发现这样的alpha map往往有较多出入,此时问题便成了同时 估测alpha map 足够准确 以及 wateramrk-free image足够好 的问题,我们为了简化问题而只估算mask 和 watermark-free image;
  4. alpha map 不仅包含mask边界,而且包含mask区域内的每一个像素的alpha信息,显然估测alpha map比估测mask难度更大,因此我们只估算mask 和 watermark-free image;

jimleungjing avatar Aug 07 '22 04:08 jimleungjing

谢谢你的回答,还有几个问题,想和你探讨一下

1 有没有一些优化水印mask分割的方法呢,看起来去水印效果的好坏主要和mask的分割相关 2 据我的观察,二阶段网络有一定的去除水印的效果。但去掉它只使用一阶段的网络,似乎也能接受。主要的问题还是 有的水印mask无法被识别出来 3 mask分支位于网络的最前端,后面的网络都受其结果的影响和约束,但其本身是不受后面网络的影响和约束的,有没有办法能让后面的结果也能监督前面的mask分支呢 4 除去一些将水印框作为先验条件的方法,有没有先目标检测定位水印框再在该区域去除水印的方法呢

locusbear avatar Aug 09 '22 09:08 locusbear

谢谢你的回答,还有几个问题,想和你探讨一下

1 有没有一些优化水印mask分割的方法呢,看起来去水印效果的好坏主要和mask的分割相关 2 据我的观察,二阶段网络有一定的去除水印的效果。但去掉它只使用一阶段的网络,似乎也能接受。主要的问题还是 有的水印mask无法被识别出来 3 mask分支位于网络的最前端,后面的网络都受其结果的影响和约束,但其本身是不受后面网络的影响和约束的,有没有办法能让后面的结果也能监督前面的mask分支呢 4 除去一些将水印框作为先验条件的方法,有没有先目标检测定位水印框再在该区域去除水印的方法呢

  1. 可以看一下二分类分割的方法
  2. 只要mask参与了后面的loss 计算,没有成为计算图的叶子节点,它是可以在反向传播的时候获得后面分支的监督信号的
  3. 你可以试试用 yolo,mask-rcnn这些经典的方法

jimleungjing avatar Aug 13 '22 06:08 jimleungjing

还想请教下,为什么没有考虑WDNet中彩色的mask,alpha*w等操作呢

  1. 彩色mask即 alpha map,走alpha map估测的路线,至少需要估测alpha map,watermark,wateramrk-free image; 由公式 J = I * (1-alpha) + W * alpha 可知,从单一等式同时估测三个未知变量本身是个病态方程,每一个像素对应三个未知量,估测难度较大。
  2. 对于简单的灰白水印,可以视全局图像的 alpha 为单一变量,此时估算的未知量只有wateramrk-free image,watermark,以及一个alpha 变量,此时走 alpha map 估测较为简单;
  3. 实际上对于复杂的彩色水印,alpha map区域内存在多个alpha,需要估测的变量增多,你可以从WDNet的实验中发现这样的alpha map往往有较多出入,此时问题便成了同时 估测alpha map 足够准确 以及 wateramrk-free image足够好 的问题,我们为了简化问题而只估算mask 和 watermark-free image;
  4. alpha map 不仅包含mask边界,而且包含mask区域内的每一个像素的alpha信息,显然估测alpha map比估测mask难度更大,因此我们只估算mask 和 watermark-free image;

大佬,这个可不可以理解为,如果预测彩色alpha,需要三通道的预测量,所以是三个未知数。如果只预测黑白的mask,相当于默认三通道的alpha数值是一样的,这样更加简单?

locusbear avatar Jan 10 '23 02:01 locusbear

还想请教下,为什么没有考虑WDNet中彩色的mask,alpha*w等操作呢

  1. 彩色mask即 alpha map,走alpha map估测的路线,至少需要估测alpha map,watermark,wateramrk-free image; 由公式 J = I * (1-alpha) + W * alpha 可知,从单一等式同时估测三个未知变量本身是个病态方程,每一个像素对应三个未知量,估测难度较大。
  2. 对于简单的灰白水印,可以视全局图像的 alpha 为单一变量,此时估算的未知量只有wateramrk-free image,watermark,以及一个alpha 变量,此时走 alpha map 估测较为简单;
  3. 实际上对于复杂的彩色水印,alpha map区域内存在多个alpha,需要估测的变量增多,你可以从WDNet的实验中发现这样的alpha map往往有较多出入,此时问题便成了同时 估测alpha map 足够准确 以及 wateramrk-free image足够好 的问题,我们为了简化问题而只估算mask 和 watermark-free image;
  4. alpha map 不仅包含mask边界,而且包含mask区域内的每一个像素的alpha信息,显然估测alpha map比估测mask难度更大,因此我们只估算mask 和 watermark-free image;

大佬,这个可不可以理解为,如果预测彩色alpha,需要三通道的预测量,所以是三个未知数。如果只预测黑白的mask,相当于默认三通道的alpha数值是一样的,这样更加简单?

locusbear avatar Jan 10 '23 02:01 locusbear

还想请教下,为什么没有考虑WDNet中彩色的mask,alpha*w等操作呢

  1. 彩色mask即 alpha map,走alpha map估测的路线,至少需要估测alpha map,watermark,wateramrk-free image; 由公式 J = I * (1-alpha) + W * alpha 可知,从单一等式同时估测三个未知变量本身是个病态方程,每一个像素对应三个未知量,估测难度较大。
  2. 对于简单的灰白水印,可以视全局图像的 alpha 为单一变量,此时估算的未知量只有wateramrk-free image,watermark,以及一个alpha 变量,此时走 alpha map 估测较为简单;
  3. 实际上对于复杂的彩色水印,alpha map区域内存在多个alpha,需要估测的变量增多,你可以从WDNet的实验中发现这样的alpha map往往有较多出入,此时问题便成了同时 估测alpha map 足够准确 以及 wateramrk-free image足够好 的问题,我们为了简化问题而只估算mask 和 watermark-free image;
  4. alpha map 不仅包含mask边界,而且包含mask区域内的每一个像素的alpha信息,显然估测alpha map比估测mask难度更大,因此我们只估算mask 和 watermark-free image;

大佬,这个可不可以理解为,如果预测彩色alpha,需要三通道的预测量,所以是三个未知数。如果只预测黑白的mask,相当于默认三通道的alpha数值是一样的,这样更加简单?

可以这么认为

jimleungjing avatar Jan 14 '23 11:01 jimleungjing