论文名称:TransUNet: Transformers Make Strong Encoders for Medical Image Segmentation
论文地址:https://arxiv.org/pdf/2102.04306.pdf
代码地址:https://github.com/Beckschen/TransUNet


前言:

TransUNet将Transformer和U-Net结合了起来。由于卷积操作本身存在的局限性,U-Net不能很好地建模长距离依赖关系,而Transformer这种全局自注意力机制可以有效地获取全局信息,但其对于低层次细节信息获取不充分,导致其定位能力方面受到限制。所以作者将这两者结合起来,提出了TransUNet网络。同时为了能将高分辨率的特征图通过跳级连接与上采样后的特征图联合以获得充分的信息,作者没有像ViT那样将原图直接打成patch块输入到Transformer模块中,而是先通过CNN进行特征提取得到特征图,再将其变换后输入Transformer编码器模块,最后仿照U-Net解码器逐级上采样并进行跳级连接,最后得到分割结果。


总体结构:

TransUNet总体上还是一个U型的Encoder-Decoder结构。在编码器部分,将原图输入CNN进行特征提取,线性投影之后进行Patch Embedding将特征图序列化并加上位置编码,输入transformer编码器。在解码器部分,将编码器输出的序列进行reshape然后通过1x1卷积变换通道数之后进行级联上采样,中途通过编码器CNN的各级分辨率特征图进行跳级连接,最后得到分割结果,这部分与U-Net解码器类似。

在论文中作者说道刚开始是直接应用Transformer编码器对原图进行编码,然后将输出的特征图直接上采样到原分辨率,但效果并不是最好的。作者分析输入编码器的\frac{H}{P}\times \frac{H}{P}分辨率对于原图HxW的分辨率来说还是太小了,导致损失了一些低层次的细节信息,比如边界信息。因此作者应用了一个联合CNN-Transformer的结构作为编码器,并在解码器中加入可以获得精确位置信息的级联上采样操作。

作者选用CNN-Transformer这一混合结构设计的原因有两点:1)为了将中间高分辨率的CNN特征图加入到解码器路径中以获得更多的信息以及更精确的位置。2)作者发现使用CNN-Transformer编码器要比但纯的Transformer编码器效果要好。(个人不理解的地方:TransUNet和SETR基本都是受ViT启发,对比了 CNN-Transformer Hybrid 和pure Transformer,为什么TransUNet说混合模型更好而SETR说纯Transformer模型更好呢?)


编码器:

ViT+ResNet50

这里的ResNet50与原ResNet50有些不同,首先卷积采用的是StdConv2d而不是传统的Conv2d,然后是用GroupNorm层代替了原来的BatchNorm层,然后我在代码中看到BottleNeck层也变成了PreActivation版本,也就是将ReLU和Normalization层前置了。在原Resnet50网络中,stage1有3个重复堆叠的Block,stage2中是4个,stage3中是6个,stage4中是3个,但在这里的ResNet50中,把stage4中的3个Block移至stage3中,所以stage3中有9个重复堆叠的Block。还有原ResNet50输出的特征图分辨率是从224x224降低到了7x7,输出为原图的1/32,而TransUNet中输出特征图分辨率为14x14,只为原图的1/16,应该是在将stage4中的3个Block拿到stage3中的时候将stride=2改成了stride=1以去掉降采样操作。

维度变化:经过Stem,分辨率变为原图1/4,[224, 224, 3]-->[56, 56, 64]。经过Stage1,分辨率不变,[56, 56, 64]-->[56, 56, 256]。经过Stage2,变为原图1/8,[56, 56, 256]-->[28, 28, 512]。经过Stage3,变为原图1/16,[28, 28, 512]-->[14, 14, 1024]。然后通过一个1x1的卷积缩减维度后进行序列化输入Transformer,[14, 14, 1024]-->[14, 14, 768]-->[196, 768],这里的维度就是Transformer需要的序列的维度,也就是论文中由[H, W, 3]变为了[\frac{HW}{P^{2}}, P^{2}\cdot C]。N= \frac{HW}{P^{2}} = 196 即为序列的长度。

最后经过Patch Embedding和位置编码,经过Patch Embedding后,[196, 768] x [768, 768]-->[196, 768],也即[\frac{HW}{P^{2}}, P^{2}\cdot C] x [P^{2}\cdot C, D]-->[\frac{HW}{P^{2}}, D]。

这里的E\in R^{(P^{2}\cdot C)\times D}是一个线性投影,目的是将序列映射到[N, D]。

更多Transformer编码器的细节后续再记录。


解码器:

编码器输出的特征图为Z_{L}\in R^{\frac{HW}{P^{2}}\times D},将其进行Reshape,然后应用1x1卷积进行维度缩减。[196, 768]-->[14, 14, 768]-->[14, 14, 512],也即论文图中的[N, D]-->[\frac{H}{P}, \frac{H}{P},D]-->[\frac{H}{P}\frac{H}{P}, 512]。后续操作和U-Net几乎相同。

,


整体结构和代码对应图,感谢原作者!


由于本人水平非常有限,如有错误,恳请指正,欢迎大家一起交流学习!


参考:

(基础)CNN网络结构_Chan_Zeng的博客-CSDN博客

Vision Transformer详解_霹雳吧啦Wz-CSDN博客_wz框架

TransUnet: 结构解析_ripple970227的博客-CSDN博客_unet结构详解

TransUNet_zjiafbaodaozmj的博客-CSDN博客_transunet

【图像分割】TransUNet学习笔记相关推荐

  1. 贾志刚OpenCV3.2图像分割实战学习笔记

    OpenCV图像分割资料分享:贾志刚的OpenCV图像分割实战视频教程全套资料(包含配套视频.配套PPT的PDF文件.源码和用到的图片素材等):点这里 目录: 实例1:读取单张JPG图像(测试环境) ...

  2. opencv进阶学习笔记14:分水岭算法 实现图像分割

    基础版学习笔记目录: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版笔记目录链接: python+opencv进阶版学习笔记目录(适合有一定基础) 分水岭算法原理 分水岭算法 ...

  3. AI学习笔记(十四)CNN之图像分割

    AI学习笔记之CNN之图像分割 图像分割 问题引入 实现技术手段及分类 语义分割-FCN(Fully Convolutional Networks) FCN--deconv 反卷积的具体步骤 Unpo ...

  4. OpenCV4学习笔记(57)——基于GrabCut图像分割算法实现背景替换与背景虚化效果

    在上一篇笔记<OpenCV4学习笔记(56)>中,整理了关于在OpenCV中使用GrabCut图像分割算法的相关内容,那么本次笔记就以GrabCut算法为基础来实现对图像的背景替换和背景虚 ...

  5. OpenCV学习笔记(十二)——图像分割与提取

    在图像处理的过程中,经常需要从图像中将前景对象作为目标图像分割或者提取出来.例如,在视频监控中,观测到的是固定背景下的视频内容,而我们对背景本身并无兴趣,感兴趣的是背景中出现的车辆.行人或者其他对象. ...

  6. 如何用matlab分割颜色,Matlab图像处理学习笔记(二):基于颜色的图像分割

    在实际处理图像时,经常需要对图像进行分割,然后提取ROI,本学习笔记记录怎么用Matlab实现基于颜色的图像分割. 基于颜色的图像分割实现简单,算法简洁,具有很好的实时性. 实现代码的过程中,我参考了 ...

  7. 动态环境下的SLAM:DynaSLAM 论文学习笔记

    动态环境下的SLAM:DynaSLAM 论文学习笔记 这篇文章 论文摘要 系统流程 相关环节的实现方法 神经网络检测图中动态物体(Mask R-CNN) Low-Cost Tracking 使用多视图 ...

  8. 影像组学视频学习笔记(24)-文献导读:了解88种降维、分类器组合、Li‘s have a solution and plan.

    本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(24)主要讲解: 解读一篇文献,了解不同的降维.分类器组合方法 这篇文献2018年发表在European Radiology上: Rad ...

  9. Programming Computer Vision with Python (学习笔记一)

    转载自:http://segmentfault.com/a/1190000003941588 介绍 <Programming Computer Vision with Python>是一本 ...

最新文章

  1. C#趣味程序---个位数为6,且能被3整出的五位数
  2. ENTER键指定事件
  3. The hierarchy of the type UserOperateLogAdvisor is inconsistent
  4. 详解python中的yield(生成器)
  5. 人工智能python基础知识_AI 人工智能基础知识-习题
  6. 送货只服京东“特快送”:航空快件可送达近300个城市
  7. java http soap_在Spring中发布SOAP HTTP Webservice - Java杂家 - Blo...
  8. android 富文本编辑器_富文本编辑器,还是Tinymce好一点?Angular/Vue集成最新版
  9. perl查看文件,提取指定信息输出到文件
  10. Unity3d C# Socket 下载文件 (同步到)
  11. 嵌入式开发板硬件操作入门学习8——单片机的引脚功能(51单片机为例)
  12. php添加ico,PHP生成ICO图标的代码
  13. 互联网产品常用英语单词
  14. android设置状态栏字体颜色vivo,状态栏通知图标颜色统一_vivo Xplay3S_手机Android频道-中关村在线...
  15. SQL Server 2012 下载与安装
  16. 1427.分解质因数
  17. 数仓分层(ODS、DWD、DWS、DWT、ADS)和数仓建模
  18. 浅谈快件清关与邮关的区别
  19. 查看安卓系统的外接USB声卡
  20. linux l7,GitHub - windslinux/l7detect: Network application protocol detection software

热门文章

  1. 【AI创新者】小蚁首架张骏峰:让图像AI人尽可用
  2. querybuilder 排序_Elasticsearch高级搜索排序( 中文+拼音+首字母+简繁转换+特殊符号过滤)...
  3. u盘文件删除怎么恢复?解决方法很简单
  4. 《精通Android 5 多媒体开发》——第6章,第6.3节实现Overlay硬件抽象层
  5. Android 类似《金山电池医生》里的那些电量时间是如何计算的?具体看图
  6. 中国56个少数民族服饰图片及介绍,超级大全了
  7. 万字多图 | UML 入门指南
  8. python123填充颜色_Python:如何使用plotly制作着色区域或交替背景色?
  9. MySQL中 auto_increment如何修改初始值和步长【亲测】
  10. 多线程截取视频为每帧