SketchMan 水记 (线稿增强)
https://github.com/LCXCUC/SketchMan2020
https://github.com/jerryli27/pixiv_dataset
https://doi.org/10.1145/3394171.3413720
这篇论文感觉写的不是很专业……
数据集
从pixiv上弄了 2120 张最受欢迎的线稿(可以说是很少了)
获得业余线稿
分成 30 个组,找了 30 个大学生来画了一遍
每张图片都有两种版本,
一种是徒手画图,在一两分钟内概括一下关键部分。眼睛就是椭圆,头发就是随机的稀疏的线。
一种是描图,允许放大描,在6-8分钟内描画。模拟手抖、断断续续、偏移、遗漏之类的。(然而似乎并没有用这个版本)
去背景、上色(用于 线稿→灰度图→线稿)
因为大部分真正的线稿都是没有背景的,为此,作者为图片创建了背景 mask (似乎是根据线稿创建的,没讲清楚)
专业的线稿是很少的,而且大部分都没有对应的上色版,作者使用了 PaintsChainer 和 Style2paint V3 给线稿自动上色(震惊,这么整不太好吧,唉,算了,确实这个也算是没有办法的办法,感觉能体会到作者内心的纠结)
获得区域分割图(用于 线稿→区域→线稿)
在专业线稿上用 SLIC 超像素,得到区域分割图
注意到单次的 SLIC 不能提取出完整的外轮廓,所以分别水平反转、逆时针转 90 度后做 SLIC ,三个结果结果叠起来作为最终结果。
于是我们得到一个干净而且准确的区域分割图。
业余线稿变形(数据增强)
可以通过图像变形[24]得到更多的业余线稿。
模型(试了5种)
结构似乎就是 cGAN,
把业余线稿作为条件,输入噪声,输出专业线稿
线稿→线稿
把输入的业余线稿当作条件,做 cGAN, G : { x , z } → y G:\{x, z\} \rightarrow y G:{x,z}→y
损失函数有三部分:cGAN 对抗损失、L1 损失、SSIM 损失、VGG 感知损失
VGG 感知损失使用的是 VGG-19 的 relu1_1, relu2_1, relu3_1, relu4_1, relu5_1 这些层。
线稿→线稿 + Huber 损失
用 Huber 损失 替换上面用的 L1 损失
-
查了一下 Huber 损失:
回归损失函数:Huber Loss_Peanut_范的博客-优快云博客_huber loss
可以看作 L1 损失和 L2 损失的融合。
特点是:
- 差不多就是 L1 损失,
当误差很小的时候,变为 L2 - 在 0 处可微分
- 当 δ→0 时,Huber损失会趋向于 L1;
当 δ→ ∞(很大的数字),Huber损失会趋向于 L2 - 对异常值的敏感程度:比 L1 敏感,没有 L2 敏感
为何使用 Huber 损失:
使用 L1 用于训练神经网络的一个大问题就是,它的梯度始终很大,这会导致使用梯度下降训练模型时,在结束时遗漏最小值。对于 L2 ,梯度会随着损失值接近其最小值逐渐减少,从而使其更准确。
在这些情况下,Huber损失函数真的会非常有帮助,因为它围绕的最小值会减小梯度。而且相比 L2,它对异常值更具鲁棒性。因此,它同时具备 L2和 L1 这两种损失函数的优点。不过,Huber损失函数也存在一个问题,我们可能需要训练超参数 δ,而且这个过程需要不断迭代。
- 差不多就是 L1 损失,
可以把 Huber 损失看作 L1 损失和 L2 损失的融合。
线稿→线稿 + 判别器感知损失
加入判别器的感知损失 L F M \mathcal{L}_{FM} LFM
这玩意和 PatchGAN 的差别就是 PatchGAN 的卷积层输出的是真假,这个的卷积层输出的是特征图,后面还要在判别器里继续卷,判断真假的
线稿→灰度图→线稿
分为两个阶段
第一个阶段是线稿生成灰度图 G S C : { x , z } → y ^ C G_{S C}:\{x, z\} \rightarrow \hat{y}_{C} GSC:{x,z}→y^C
灰度图的 groud truth 是由上色图灰度化得到的。
第二个阶段是一个 边缘提取 GAN, G C S : { y ^ C , z } → y G_{C S}:\left\{\hat{y}_C, z\right\} \rightarrow y GCS:{y^C,z}→y
(为啥这玩意也要 GAN)
线稿→形状→线稿
分为两个阶段
第一个阶段是业余线稿生成区域图, G S A : { x , z } → y A G_{S A}:\{x, z\} \rightarrow y_{A} GSA:{x,z}→yA
这里的区域图(或者说边缘图)就是前面用 SLIC 超像素弄出来的那个
第二个阶段输入区域图和业余线稿,生成专业线稿, G A S : { y A ^ , x , z } → y G_{A S}:\left\{\hat{y_{A}}, x, z\right\} \rightarrow y GAS:{yA^,x,z}→y
这里,作者的思路是,第一个阶段拟合外轮廓,第二个阶段拟合内部细节
实验
几个任务效果的直观对比,还顺便拉上了 pix2pix
看得出 线稿→线稿 比另外两个差远了
F-score 比较,似乎 线稿→灰度图→线稿 比 线稿→形状→线稿 要更好一点
(不过我感觉从上面的效果来看,差不太多,可能稍微好一点点吧)
如果用区域图的 IoU 来衡量,线稿→形状→线稿 比 线稿→灰度图→线稿 好一点,但是最好的是 线稿→线稿 + 判别器感知损失
还有实验,没仔细看了