SLBR-Visible-Watermark-Removal
SLBR-Visible-Watermark-Removal copied to clipboard
自定义CLWD训练集
使用预训练模型去水印,发现没有透明度的水印,完全没有去除效果。打算自己加入图片到训练集中来训练模型,请问CLWD训练集打水印的图片和mask是怎样生成的呢,能否提供下代码呢
找些没有水印的图片,按照水印公式:J = I * (1-alpha) + W * alpha 生成, I为原始图片,alpha为alpha map, W为水印。mask可以自己找纯水印图片生成。
假如我的水印没有透明度, 也就是alpha=1, 那么公式就是 J = W * alpha, 效果体现就是w在I上的一片遮挡。这样训练出来的模型,能够去除没有透明度的水印吗?不知道您尝试过没有
“找1000张图片,打上不透明的水印,加入训练集训练, 然后测试去水印“,我正在尝试,有结果发上来
假如我的水印没有透明度, 也就是alpha=1, 那么公式就是 J = W * alpha, 效果体现就是w在I上的一片遮挡。这样训练出来的模型,能够去除没有透明度的水印吗?不知道您尝试过没有
取png图像的alpha通道,随机生成alpha值,乘以原始的alpha通道即可
请问 CLWD/train/Alpha 目录中的图片是怎样生成的?因为我不知道 Alpha里图片怎么生成的,所以我修改代码,不使用alpha目录里的数据来训练模型,有用吗?
请问 CLWD/train/Alpha 目录中的图片是怎样生成的?因为我不知道 Alpha里图片怎么生成的,所以我修改代码,不使用alpha目录里的数据来训练模型,有用吗?
- 这个是CLWD数据集作者制作数据集时对mask乘以随机alpha值获得的;
- 我们的模型不依赖alpha数据
但是我跑train.py时 如果alpha为空 会报错。可能算法里面没有用到Alpha数据吧,只是外围读取了。
这里说明下模型训练步骤、测试效果以及问题。希望能对本项目改进有帮助。
1、各目录图片生成方式
watermark_logo
透明背景, 256x256
Watermark_free_image
clwd数据集选取, 256x256
Watermark
watermark_logo图 随机位置旋转角度,尺寸固定, 叠加到黑色纯色图片上生成
Mask
由Watermark 二值化生成
Watermarked_image
watermark_logo 图叠加Watermark_free_image 图上生成, 叠加时没有给透明度,因为测试图片水印是没有透明度的,后面会说明
Alpha
直接拷贝的Watermark
train和test目录 数量上1:1, 比如2000张图片,按上面的方式生成好各目录图片,然后对半切分成train和test
训练参数 两次训练都如下,只是--dataset_dir不同,一个2000张 一个4000张
--epochs 100 --schedule 65 --lr 1e-3 --gpu_id 0 --checkpoint C:/luli/slbr/slbr_checkpoint --dataset_dir C:/luli/slbr/CLWD_2000_256_256 --nets slbr --sltype vggx --mask_mode res --lambda_content 2.5e-1 --lambda_style 2.5e-1 --lambda_iou 0.25 --lambda_l1 1 --lambda_primary 0.01 --masked True --loss-type hybrid --models slbr --preprocess resize --name slbr_v1 --k_center 2 --dataset CLWD --use_refine --k_refine 3 --k_skip_stage 3 --input-size 256 --crop_size 256 --train-batch 10 --test-batch 10
2、两次训练模型和测试效果 2-1、第一次选取clwd2000张,按“1、各目录图片生成方式”生成数据集,训练模型,测试。 总的来说,识别的效果还不错
原图1
原图1去除后和Mask
原图2
原图2去除后和Mask
原图3
原图3去除后和Mask
2-2、第二次选取clwd4000张,按“1、各目录图片生成方式”生成数据集,训练模型,测试
总的来说,本次识别效果反而不如2000张时
原图1去除后和Mask
原图2去除后和Mask
原图3去除后和Mask
3、问题 3-1、为什么训练规模变大了,反而识别效果变差了呢?4000张不如2000张 3-2、整个生成训练集和训练过程中有什么错误和改进的地方呢? 3-3、我测试的水印是不带透明度的,本项目怎样改进可以支持去掉或者识别出来呢?还是说不支持不带透明度的水印?
3、问题
- 训练与测试所用的水印最好没有交集,不然你相当于训练时见过测试集的水印了,测试的识别肯定很好;训练所用图片为256x256,测试图片1尺度达到1200x900,分辨率不匹配;最好训练与测试的分辨率大致匹配;训练与测试的数据分布需要一致。
- 不带透明度的就用该模型识别也可以,去除可以使用inpainting模型;
按您说的进行新一次模型训练、测试去水印,本次数据集train和test彼此独立。用来去水印的图和logo也不在train和test中。 识别的效果很差, 详细说明如下:
1、各目录图片生成方式
watermark_logo
透明背景,文字不透明, 256x256,
注:红框处是windows资源管理器显示问题,实际和其他logo一样都是透明背景
Watermark_free_image
clwd数据集选取, 256x256
Watermark
watermark_logo图 位置、旋转、尺寸随机, 叠加到黑色纯色图片上生成
Mask
由Watermark 二值化生成
Watermarked_image
watermark_logo 图叠加Watermark_free_image 图上生成, 叠加时没有给透明度
Alpha 直接拷贝的Watermark train和test目录 1-1、logo30张, train:20张,test:10张,train和test彼此独立 1-2、clwd数据集 2000张, train:1000张,test:1000张 256x256,train和test彼此独立 1-3、按上面的方式生成好各目录图片
2、去水印效果
1200x900
330x589
1920x2037
3、问题 3-1、这一次测试train、test、要去水印的图3者彼此独立,但是效果反而最差,我推测的原因可能有:Mask生成,二值化处理过于粗糙,有些连在了一起。请问哪里需要改进? 3-2、之前您说过训练数据集图片尺寸最好和去水印的图尺寸差不多,那是不是意味着,我来了一批尺寸和训练模型尺寸差别很大的图片,那么就需要重新训练对应尺寸的模型?如果这样的话,那收集对应尺寸图片集就是一个不小的工作量
3-1、这一次测试train、test、要去水印的图3者彼此独立,但是效果反而最差,我推测的原因可能有:Mask生成,二值化处理过于粗糙,有些连在了一起。请问哪里需要改进?
- train与test水印独立是为了验证你训练的模型的泛化性,如果你仅针对特定几个水印去除,可以训练集与测试集不独立;效果差大概是因为训练图片数目不够,至少一万张以上;其次训练集与测试集的背景图分布也要一致,不能训练集是clwd的从pascal爬来的数据,测试集是其他cg图片。
3-2、之前您说过训练数据集图片尺寸最好和去水印的图尺寸差不多,那是不是意味着,我来了一批尺寸和训练模型尺寸差别很大的图片,那么就需要重新训练对应尺寸的模型?如果这样的话,那收集对应尺寸图片集就是一个不小的工作量
可以训练多个模型,针对低分辨率,中分辨率,高分辨率分别处理。模型的训练与测试应保持分布一致,否则需要引入迁移学习的内容。
感谢赐教,我再试试,晚些发结果上来
有几个细节还需要确定一下,麻烦您了 1、针对您说的:训练集与测试集, 指的就是train目录和test目录吧? 2、针对您说的:“如果你仅针对特定几个水印去除,可以训练集与测试集不独立”,以2000张原图和30个Logo为例, 意思是说30个logo打在2000原图上,然后数量1:1随机分成训练集和测试集? 3、针对您说的:“其次训练集与测试集的背景图分布也要一致”,本批次测试,是从clwd选取2000张按数量1:1分成训练集和测试集,这就是“背景图分布也要一致”吧?
针对您说的:训练集与测试集, 指的就是train目录和test目录吧?
是的
2、针对您说的:“如果你仅针对特定几个水印去除,可以训练集与测试集不独立”,以2000张原图和30个Logo为例, 意思是说30个logo打在2000原图上,然后数量1:1随机分成训练集和测试集?
是的,数目比例可以是7:3
- 这就是“背景图分布也要一致”吧?
对的,如果你要测试cg图的水印去除,训练集需要加入cg图作为背景的水印图。
为方便描述,有下面几个概念统一一下: 1、每次训练模型和测试以“日期-序号”作为批次号加以区分, 之前汇报过2次,3个批次,就叫批次1、2、3, 其中批次1效果最好,和批次2对比汇报。 2、train目录:训练集,test目录:测试集, 一般描述时使用"test目录“和"train目录" 3、自定义测试图:独立于test目录和train目录、需使用训练好的模型来去除水印的图片。不是从clwd选取,我自己随便找的。
新的20220405-1批次 这次和批次2所有的操作一样,只是图片数量增加为2w张,但是效果很不理想。有以下几点疑问: 1、本批次test目录、train目录使用的30logo和自定义测试图使用的logo是不同的,之前批次1效果好,是把自定义测试图使用的logo也用来生成test目录、train目录。那就意味着:要去除自定义测试图的水印logo, 训练模型时必须test目录、train目录包含自定义测试图的水印logo? 2、因为2w张图,这次训练耗时28个小时。可以的话,能否具体给出修改点,进行下一次训练,以免因我知识欠缺造成时间浪费,十分感谢
- 跟之前说的一样,如果你之后的目的只是想去除自定义测试图的水印,那就train可以包含要去除的水印;否则想做通用一点的去除,应该从train训练的水印入手,增加水印的样式,与你的自定义测试图水印类型、风格一致,使得模型更鲁棒;
- 数据集大的时候有资源就用多个gpu一起训练,没有的话,先用5000张这样的量级验证可行性。