打开网易新闻 查看更多图片

来源 | Jack Cui

头图 | CSDN下载自视觉中国

今年提出的 U^2-Net 显著性检测算法,刷爆了 reddit 和 twitter,号称是 2020 年「地表最强」的静态背景分割算法,可以看下效果:

你以为今天要讲分割?错!

U^2-Net 这两天又出新活,在 U^2-Net 网络架构基础上,实现了人物肖像画的生成,细节「完美」复刻。

打开网易新闻 查看更多图片

我用自己的「歪脖子照」测试了下效果。

万年不变老规矩,继续手把手教学。

算法原理、环境搭建、效果实现,一条龙服务,尽在下文!

U^2-Net

受 U-Net 网络的启发,U^2-Net 也是一种类似编码-解码(Encoder-Decoder)的网络结构。

研究者在此基础上,提出了新型残差 U-block(ReSidual U-block, RSU),融合不同尺寸接受野的特征,以捕获更多不同尺度的上下文信息。

RSU 网络与现有卷积块的结构对比如下:

最右边的结构,就是 RSU-L,L 表示编码器中的层数,C_in、C_out 分别表示输入和输出通道,M 表示 RSU 内层通道数。

具体而言,RSU 主要有三个组成部件,分别是一个输入卷积层、一个高度为 L 的类 U-Net 对称编码器 - 解码器结构以及一个通过求和来融合局部和多尺度特征的残差连接。

为了更好地理解设计理念,研究者在下图中对 RSU 与原始残差块进行了比较。

打开网易新闻 查看更多图片

结果显示,RSU 与原始残差块的最大区别在于 RSU 通过一个类 U-Net 的结构替换普通单流卷积,并且通过一个由权重层转换的局部特征替换原始特征。

更值得注意的是,得益于 U 形结构,RSU 的计算开销相对较少,因为大多数运算在下采样特征图中应用。下图展示了 RSU 与其他特征提取模块的计算成本曲线图:

U^2-Net 的整体网络架构如下:

U^2-Net 主要由三部分组成:

  • 6 阶段编码器;

  • 5 阶段解码器;

  • 与解码器阶段和最后编码器阶段相连接的显著图融合模块。

说完网络结构,再看下损失函数,研究者使用了类似于整体嵌套边缘检测(HED)的深度监督算法:

其中,M=6, 为 U^2-Net 的 Sup1, Sup2, ..., Sup6 stage。

为 Sup1, Sup2, ..., Sup6 输出的显著图, 的损失函数;

为最终融合输出的显著图, 的损失函数; 为每个损失函数的权重。

对于每个 l ,采用标准的二值交叉熵损失函数:

打开网易新闻 查看更多图片

其中,(r, c) 为像素坐标;(H, W) 为图像尺寸,height 和 width。

分别表示 GT 像素值和预测的显著概率图。

总的来说,U^2-Net 的设计构建了具有丰富多尺度特征以及较低计算和内存成本的深度架构。

更详细的内容,可以直接看 paper:

https://arxiv.org/pdf/2005.09007.pdf

效果测试

Github 项目地址:

https://github.com/NathanUA/U-2-Net

第一步:搭建测试环境。

很简单,没啥特殊的库,安装好 Pytorch、Numpy、Skimage 等基础第三方库即可。

第二步:下载训练好的模型权重文件。

我将程序和权重文件都进行了打包,嫌麻烦,可以下载直接使用。

第三步:在工程目录,运行程序。

python u2net_portrait_test.pybr

在 u2net_portrait_test.py 可以查看输入图片路径和输出图片路径:

最后再看下运行效果: