u2net是目前stable-diffusion-webui默认的抠图算法,但是在电商图场景实测下来,效果是很一般的。
1.introduction
1.能否设计一个新的网络用语SOD,允许从头训练;2.保持高分辨率特征图的同时网络更深。U2net是一种为SOD设计的两级嵌套U结构,不使用图像分类的预训练骨干网络,在底层设计了一种新颖的Residual U-blocks,能够提取多尺度特征而不降低特征图分辨率,在顶层,有一个类似UNET的结构,每个极端都由RSU填充。U2net 176.3M,U2netp 4.7Mb。
2.Proposed method
2.1 Residual U-blocks
局部和全局特征非常重要,大小为1x1或3x3的小型卷积是常用的特征提取组件,浅层的输出特征图仅包含局部特征,因为1x1或3x3卷积的感受野太小,无法捕获全局信息。为了在浅层的高分辨率特征图中获得更多的全局信息,最直接的想法是扩大感受野。
图2中d用了inception结构,通过扩张卷积来扩大感受野,受unet启发,RSU用于捕捉阶内多尺度特征,RSU和残差连结最大的不同在于,RSU使用了一个类似于UNET的结构来替换单一流的普通卷积,并用一个权重层转换的局部特征来代替原始特征。这种设计变化使得网络可以直接从每个残差块中提取多尺度的特征,由于大部分操作是在下采样的特征图上进行的,因此U结构带来的计算开销是很小的。
2.2 Architecture of u2net
U2net是嵌套的unet,不是级联的,是一个2级嵌套结构,其顶层由11个stage组成的大型unet,每个stage是一个RSU,6个阶段的编码器,5个解码器和一个显著图融合模块。
2.3 Supervision
交叉熵监督sup0-6,
def muti_bce_loss_fusion(d0, d1, d2, d3, d4, d5, d6, labels_v):
loss0 = bce_loss(d0, labels_v)
loss1 = bce_loss(d1, labels_v)
loss2 = bce_loss(d2, labels_v)
loss3 = bce_loss(d3, labels_v)
loss4 = bce_loss(d4, labels_v)
loss5 = bce_loss(d5, labels_v)
loss6 = bce_loss(d6, labels_v)
loss = loss0 + loss1 + loss2 + loss3 + loss4 + loss5 + loss6
# print("l0: %3f, l1: %3f, l2: %3f, l3: %3f, l4: %3f, l5: %3f, l6: %3f\n"%(loss0.data.item(),loss1.data.item(),loss2.data.item(),loss3.data.item(),loss4.data.item(),loss5.data.item(),loss6.data.item()))
return loss0, loss
4.Experimental results
4.1 Datasets
DUTS-TR:10533张图