谈一谈UNet图像分割
极市导读
这篇文章主要针对于图像分割的算法的一些理解,主要是一个比较经典的UNet系列的网络的认识。最后希望看完这篇文章的读者可以有所收获,对于一些个人的理解欢迎大家批评指正,希望可以和大家一起交流进步。
一、引言
yolov4、v5发布之后,在卷积上改进感觉也快达到一个顶峰了,在卷积神经网络的设计,在很多大佬的眼里估计都是一样的了,每一个新的改进或者检测框架的提出,可能都会看到之前框架的影子,也有人把在图像检测上的改进称之为“搭积木”;
在这之后,可能在图像上的各大论文都将重心放在Transformer上了,Transformer在CV上的论文也是变得越来越多了,图像分割做为图像的一个领域当然也不能落下,SwinUnet可以说终于让Transformer在图像分割中也得到了露脸的机会。
不过,基于Transformer在图像方面上的应用,具体在实际落地的中,可能也会很快了。本文可能还是要从最经典的图像分割网络UNet开始说一说这个比较古老的图像分割系列了。
虽然现在算法越来越依靠在数据上“做手脚”,但是也不能忽视网络的设计的技巧和思想,掌握一个优秀的设计思想,就可以天马行空、设计出飘逸的算法。
二、图像分割的絮叨
图像分割作为像素级的精细分类,可以让算法做一些精细活,这种精细活体现在医学上的应用(个人觉得医学领域是一个神奇也很有价值的领域),UNet在医学图像上的分割在当时有着不俗的表现力,整个网络的设计也是非常精妙的,其网络的设计的核心的思想在当年与yolov3有着相似之处,随着后面UNet的几个系列乃至现在YOLO的v4和v5,它们最核心的设计思想都有着异曲同工之妙,那就是:信息融合、位置不偏移。
其实,在对网络的设计的过程中,始终保持着这两点,就可以设计出一个比较好的网络。(但是,这也只是开始的一步,网络的设计还有很多的因素要考虑,这里就不一一叙述了,相信每个人都会有着经验性的理解)。
1. UNet网络的技巧和思想
终于进入正题了,铺垫了好多文字了,就从UNet的设计开始说起吧,相信网上也有比较多的图像分割结构设计的一些套路
A、上采样+下采样作为整体的网络结构(Encoder-Decoder)
B、多尺度的特征融合
C、信息流通的方式
D、获得像素级别的segment map
UNet最初的设计也是使用在医学影像的分割,通过经典的编解码结构、卷积、池化、ReLU激活函数,进行设计UNet的技巧
不用Padding,防止位置发生偏移 上采样使用插值法+conv,而不使用转置卷积等上采样方法,让特征图保持着均匀的色差 使用skip connection更好的进行信息融合
2. UNet++
从UNet++开始,网络的设计就开始注意原始图像的位置信息,还有就是整个网络的信息融合的能力。
所以,UNet++通过一系列尝试,最终设计成稠密连接,同时有长连接和短连接,并且将UNet中间空心的位置填满;
可以抓取不同层次的特征/不同大小的感受野。UNet++横向看可以看做一个稠密结构的DenseNet。
3. UNet3+
UNet++只是针对于同一尺度的稠密连接,而UNet3+则是跨尺度的稠密连接
UNet3+横纵信息互相交融,像极了国内高铁的“八横八纵”的高铁网,可以获得更大范围的信息融合与流通。又一次感觉很多算法上的设计思想都有异曲同工之妙,亦或者说是源于生活。
当然,UNet3+效果在医疗图像上分割有着不俗的效果,还有一部分是来源于其精心设计的损失函数MS-SSIM,其作为UNet3+组合损失函数的一部分,也会在提点上有着一定的作用(算法除了模型设计,当然还逃脱不了损失的设计)。
4. U2Net
这个网络的设计,给我的一个感觉就是很飘逸了,这是UNet系列改进的另一条路(我个人觉得,作者对于卷积、池化的使用达到了一个很高的水平,这是在一些常规的设计中还是比较难看到的,用简单的组件设计出一个很优秀的算法)。
嵌套UNet的方式,不可谓不是一种天秀的方法;同时通过膨胀卷积的使用,在不增加计算量的情况下,获得了很大的感受野,整个网络看起来变得很深,但是在参数量上的控制,已经达到了一种炉火纯青的地步。
不过,这篇论文的实验的数据集不在是针对医疗图像,也没有去做实验去比较;但是,U2Net为了获得更大的感受野,个人觉得在位置信息上丢失的还是比较多的,在对于位置信息的表现力,可能是有所欠缺的。
二、对于改进UNet的见解
上面说的内容没有说的特别繁琐,这些内容网上有着非常细致的解读(因为上面的技术也是2021年之前的知识点了,可能也算是相对来说比较古老的技术了,大家估计都听过或者看到过一些解读),本文就挑核心的点进行介绍,让大家在对上面的内容有了一个认识,并引出我下面的一些理解。
应该说很多人,其实都喜欢在UNet进行改进,换个优秀的编码器,然后自己在手动把解码器对应实现一下。至于为什么要选择UNet上进行改进,可能是因为UNet网络的结构比较简单,还是比较好进行改进的,而且UNet的效果,在很多场景下的表现力可能都是差强人意的。
但是,直接对UNet进行简单的替换编解码器,效果应该也是差强人意或者效果就是很差的;之前也有一些同事,在对UNet进行改进的时候,也会遇到效果不好的问题。直接对UNet改进,个人认为有两个本质的原因会影响网络的效果。
首先,原始的UNet在编码器的网路结构是很浅的,同时没有加padding,使得解码器获取编码器的信息时,位置信息丢失的不会很严重;但是一旦选择一个比较深的网络作为编码器(一般的特征提取的网络会加padding),使得位置信息丢失的相对来说是很严重的,在解码器获取到对应编码器的信息时,就已经产生了很大的偏移,再经过一个同样深的解码器,那么位置偏移就会变得更加严重,效果不好就可以解释的通了。
不过上面都是针对于直接用其他优秀的特征提取网络直接改进UNet的情况。
个人认为,UNet上的改进一定要认识到最原始的设计思路,以及它相对于后面系列的一个劣势,就是信息融合、位置不偏移。
其实,信息融合、位置偏移在yolov4、v5中也得到了体现,v4和v5对于网络的改进思路也是紧紧抓住了这两个点(当然也有其他非常重要或者新颖的点,但是这两点一定是核心的),后期对于UNet进行改进的网络都是在对信息融合上有着独到的理解,这也是后面改进的网络比较难以再进行优化的一个原因,要想对UNet有着非常独到的新颖的改进,还是比较有难度的(Swin-UNet是Transformer在图像上的表现,我也不太好评价)。
如果非要在UNet上通过替换编解码器的方式(用现有的优秀的特征提取器)进行改进时,可以借鉴UNet++和UNet3+的思想,横纵信息的流通,还有就是padding上的特殊处理、能不能更好的进行反向传播、位置偏移上的特殊处理、不要选择太深的网络、卷积核的大胆设计这几个方面出发;
最后,其实分割网络可以尝试其他的分割模型,Deeplab系列也是一个比较好的选择,对主干的修改也相对容易。
三、总结
个人的感觉对于这种网络的设计、代码的写法要有天马行空的想象力,代码写起来也像武侠小说中那种飘逸感;同时,算法设计思想是很重要的,如果单纯的替换主干这种事情,都可以当做算法的设计的话,那岂不是人人都可以做算法工程师了(这也是单纯的从模型的角度来说);不过优秀的算法设计的思想很往往是很困难的,因为不可能每个人都是“聪明绝顶”的高手,可能有时候需要像有机化学中苯环的结构图一样,需要做一个奇幻的美梦。 这篇文章,我的个人的理解比较多,可能也有不正确的理解,也欢迎大家批评指正,多多学习。