《U^2-Net:Going Deeper with Nested U-Structure for Salient Object Detection》论文笔记
参考代码:U-2-Net
1. 概述
导读:这篇文章针对图片显著性目标检测(分割或许更为妥当)提出一种新的网络结构U^2-Net,该网络结构从整体上看由两层的U型结构组成,即是由U型的子模块(ReSidual U-blocks,RSU-L)构建一个更大的U型网络。文章指出这样做可以带来两点好处:1)可以极大提升网络在不同scale上获取上下文信息的能力,这是靠网络混合不同特征图尺寸下感受野得到的;2)由于在RSU中引入了池化操作因而可以加深网络,而不会带来巨大的计算开销。此外,文章还从具体任务出发提出不需要ImageNet预训练模型,直接从头开始训练,从而节省了预训练的开销,而且效果从文章效果来说也是不错的。文章提出的U^2大模型(176.3Mb)在1080Ti上为30FPS(320*320大小输入),小模型(4.7MB)为40FPS。
对于在ImageNet上训练得到的预训练模型其往往 更加注意的是提取输入图片的语义信息,从而更好完成分类任务,但是对于显著性目标检测来说局部细节和全局对比度信息更为重要。 这篇文章直接提出定义好适应显著性目标检测的网络之后直接从头开始训练,其最后的结果也显示该方式能获取性能近似的结果,省去了预训练过程。
为了能够获得更好的性能,对于显著性目标检测其需要更多尺度的特征图,以及在不同尺度下更好地特征图抽取方式(网络结构),对此文章提出了由RSU模块构建的U型结构,使得其在花费相对来说较小计算量的情况下获得更佳的性能表现,文章的大小模型相对于其它方法,其性能比较见下图所示:
2. 方法设计
2.1 RSU-L模块
现在的网络结构都是采用模块堆叠的形式构建的,根据其结构设计文章将其与RSU模块进行对比,见下图所示:
文章的RSU-L
(
C
i
n
,
M
,
C
o
u
t
)
(C_{in},M,C_{out})
(Cin,M,Cout),其中的三个参数分别代表输入的channel/中间层的channel/输出的channel。其运算流程大体可以分为3个过程:
- 1)通过一个 3 ∗ 3 3*3 3∗3的卷积生成一个与输出channel( C o u t C_{out} Cout)一致的特征图,其过程描述为 F 1 ( x ) F_1(x) F1(x);
- 2)使用其定义的参数 L L L表示进行层级采样的次数,从而实现在block内部多层次的特征图提取,也使得网络变深,获取跟大的感受野和更丰富的局部及全局特征。这部分计算过程描述为 U ( F 1 ( x ) ) \mathcal{U}(F_1(x)) U(F1(x));
- 3)使用残差网络将其与之前的特征图相加,从而融合局部与多尺度信息, F 1 ( x ) + U ( F 1 ( x ) ) F_1(x)+\mathcal{U}(F_1(x)) F1(x)+U(F1(x));
将文章的结构与ResNet中的残差结构进行比较,它们的区别见下图所示:
此外,将图2中不同模块的结构与文章设计的RSU模块进行计算量的比较,其对比见下图所示:
文章设计的模块结构与其它类型的模块结构性能进行比较:
2.2 U^2-Net网络结构
文章提出的网络结构是多层U型结构嵌套得到的,从消耗的计算量与显存权衡,文章将其限制为2,从而得到下图中的网络结构:
上述的网络结构按照其组成结构划分可以划分为3个组成部分:
- 1)编码模块 E n _ 1 , E n _ 2 , E n _ 3 , E n _ 4 En\_1,En\_2,En\_3,En\_4 En_1,En_2,En_3,En_4其使用的RSU模块分别为RSU-7/RSU-6/RSU-5/RSU-4,其中的参数(7/6/5/4)代表的是RSU模块的高度,这是由输入特征图的分辨率决定的(因为可以进行更多次下采样操作)。对于编码模块 E n _ 5 , E n _ 6 En\_5,En\_6 En_5,En_6由于其特征图分辨率已经比较小了,这里就使用RSU-4F模块,代表的是使用膨胀卷积去替换其中的上下采样操作,因而该类型模块的输入输出特征图大小是一致的;
- 2)对于解码器模块,从图5可以看到其结构与编码器部分相似,只是多了与对应层级的藤正进行融合以及尺寸匹配的上采样操作;
- 3)在上面的编解码模块中已经将输入图像划分成为了不同尺度的特征图: E n _ 6 , D e _ 5 , D e _ 4 , D e _ 3 , D e _ 2 , D e _ 1 En\_6,De\_5,De\_4,De\_3,De\_2,De\_1 En_6,De_5,De_4,De_3,De_2,De_1,文章在这些特征图上使用 3 ∗ 3 3*3 3∗3的卷积和sigmoid函数去估计在这些尺度上的显著性目标输出: S s i d e ( 6 ) , S s i d e ( 5 ) , S s i d e ( 4 ) , S s i d e ( 3 ) , S s i d e ( 2 ) , S s i d e ( 1 ) S_{side}^{(6)},S_{side}^{(5)},S_{side}^{(4)},S_{side}^{(3)},S_{side}^{(2)},S_{side}^{(1)} Sside(6),Sside(5),Sside(4),Sside(3),Sside(2),Sside(1)。之后这些输出经过上采样到原始图像尺寸大小concat起来,经过一个 1 ∗ 1 1*1 1∗1卷积和sigmoid函数得到融合之后的输出 S f u s e S_{fuse} Sfuse。
文章根据任务的需要设计了两个类型的U^2-Net,一大一小,见表1所示:
2.3 网络损失函数
由于网络在多个尺度上均有输出,自然网络的损失函数是由多个部分组成的:
L
=
∑
m
=
1
M
w
s
i
d
e
(
m
)
l
s
i
d
e
(
m
)
+
w
f
u
s
e
l
f
u
s
e
L=\sum_{m=1}^Mw_{side}^{(m)}l_{side}^{(m)}+w_{fuse}l_{fuse}
L=m=1∑Mwside(m)lside(m)+wfuselfuse
而对于在每个分量上损失函数的具体计算,其描述为交叉熵的形式:
l
=
−
∑
(
r
,
c
)
(
H
,
W
)
[
P
G
(
r
,
c
)
l
o
g
P
S
(
r
,
c
)
+
(
1
−
P
G
(
r
,
c
)
)
l
o
g
(
1
−
P
S
(
r
,
c
)
)
]
l=-\sum_{(r,c)}^{(H,W)}[P_{G(r,c)}logP_{S(r,c)}+(1-P_{G(r,c)})log(1-P_{S(r,c)})]
l=−(r,c)∑(H,W)[PG(r,c)logPS(r,c)+(1−PG(r,c))log(1−PS(r,c))]
3. 实验结果
结果1:
结果2:
相关文章
- asp.net core 3.1 cookie httpOnly 登录验证
- ASP.Net MVC – What are the uses of Display, DisplayName, DisplayFormat and ScaffoldColumn attributes
- Is it possible to get a good stack trace with .NET async methods?
- List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac
- 连表查询都用Left Join吧 以Windows服务方式运行.NET Core程序 HTTP和HTTPS的区别 ASP.NET SignalR介绍 asp.net—WebApi跨域 asp.net—自定义轻量级ORM C#之23中设计模式
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- 百度地图和高德地图坐标系的互相转换 四种Sandcastle方法生成c#.net帮助类帮助文档 文档API生成神器SandCastle使用心得 ASP.NET Core
- 通俗易懂,什么是.NET?什么是.NET Framework?什么是.NET Core? .Net Web开发技术栈
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
- C#编译器优化那点事 c# 如果一个对象的值为null,那么它调用扩展方法时为甚么不报错 webAPI 控制器(Controller)太多怎么办? .NET MVC项目设置包含Areas中的页面为默认启动页 (五)Net Core使用静态文件 学习ASP.NET Core Razor 编程系列八——并发处理
- C# 插件热插拔 .NET:何时应该 “包装异常”? log4.net 自定义日志文件名称
- ASP.Net Core异步编程
- ASP.NET Web API中把分页信息放Header中返回给前端
- net.sf.json.JSONException: 'object' is an array. Use JSONArray instead
- asp.net-Creating JavaScript objects from ASP.NET objects
- ASP.NET关于Session_End触发与否的问题
- (译)利用ASP.NET加密和解密Web.config中连接字符串