论文笔记:U-Net: Convolutional Networks for Biomedical Image Segmentation

前言

本文提出了一个分割网络——Unet,Unet借鉴了FCN网络,其网络结构包括两个对称部分:前面一部分网络与普通卷积网络相同,使用了3x3的卷积和池化下采样,能够抓住图像中的上下文信息(也即像素间的关系);后面部分网络则是与前面基本对称,使用的是3x3卷积和上采样,以达到输出图像分割的目的。此外,网络中还用到了特征融合,将前面部分下采样网络的特征与后面上采样部分的特征进行了融合以获得更准确的上下文信息,达到更好的分割效果。

论文链接:https://arxiv.org/pdf/1505.04597v1.pdf
github:https://github.com/milesial/Pytorch-UNet

1.网络详解

在这里插入图片描述

  • 1.输入是572x572的,但是输出变成了388x388,这说明经过网络以后,输出的结果和原图不是完全对应的,这在计算loss和输出结果都可以得到体现。
  • 2.蓝色箭头代表3x3的卷积操作,并且stride是1,padding策略是vaild,因此,每个该操作以后,featuremap的大小会减2。
  • 3.红色箭头代表2x2的maxpooling操作,需要注意的是,此时的padding策略也是vaild(same 策略会在边缘填充0,保证featuremap的每个值都会被取到,vaild会忽略掉不能进行下去的pooling操作,而不是进行填充),这就会导致如果pooling之前featuremap的大小是奇数,那么就会损失一些信息 。输入的大小最好满足一个条件,就是可以让每一层pooling操作前的featuremap的大小是偶数,这样就不会损失一些信息,并且crop的时候不会产生误差,这个条件也不难算,只要满足:在这里插入图片描述
    其中S是featuremap的大小,x是一个自变量,可以用来计算想要的某个范围内合理的输入图片大小。
  • 4.绿色箭头代表2x2的反卷积操作,这个只要理解了反卷积操作,就没什么问题,操作会将featuremap的大小乘2。(后面会详解反卷积)
  • 5.灰色箭头表示复制和剪切操作,可以发现,在同一层左边的最后一层要比右边的第一层要大一些,这就导致了,想要利用浅层的feature,就要进行一些剪切,也导致了最终的输出是输入的中心某个区域
  • 6.输出的最后一层,使用了1x1的卷积层做了分类。

U-net网络比较简单,前半部分也就是图中左边部分的作用是特征提取,后半部分也就是图中的右边部分是上采样。
在一些文献中也把这样的结构叫做编码器-解码器结构。由于此网络整体结构类似于大写的英文字母U,故得名U-net。
U-net与其他常见的分割网络有一点非常不同的地方:U-net采用了完全不同的特征融合方式:拼接,U-net采用将特征在channel维度拼接在一起,形成更厚的特征。而FCN融合时使用的对应点相加,并不形成更厚的特征。(后面详解两种特征维度融合操作add和concat)

2.图片切分

Unet的结构中没有全连接,这就表示Unet的输入图片的大小其实是可以不固定的。无论训练还是测试的时候,都可以放一整张图片进去。不过呢,通常来说,一张图片扔进去,对显存还是有一定挑战的,并且,Unet最开始是为了处理医疗图像的,一般医疗图像都非常大。

因此,还可以使用另一个方法,那就是用一个滑动窗口把原图扫一边,使用原图的切片进行训练或测试。

Unet使用一种称为overlap-tile的的策略,使得任意大小输入的图片都可以获得一个无缝分割。over-tile策略如下图所示:
在这里插入图片描述
该策略的思想是:对图像的某一块像素点(黄框内部分)进行预测时,需要该图像块周围的像素点(蓝色框内)提供上下文信息(context),以获得更准确的预测。

这样的策略会带来一个问题,图像边界的图像块没有周围像素,因此作者对周围像素采用了镜像扩充。下图中红框部分为原始图片,其周围扩充的像素点均由原图沿白线对称得到。这样,边界图像块也能得到准确的预测。

另一个问题是,这样的操作会带来图像重叠问题,即第一块图像周围的部分会和第二块图像重叠。因此作者在卷积时只使用有效部分(valid part of each convolution),虽然卷积的时候会用到周围的像素点(蓝色框内),但最终传到下一层的只有中间原先图像块(黄色框内)的部分(可理解为不加padding)。

至于为什么要对图像分块不输入整张图像则是因为内存的限制,有的机器内存比较小,需要分块输入。即便如此,相较之前的滑窗输入,Unet已经快非常多了,其一是因为不用取那么多块,其二是因为取块时候没有那么大的重叠。

3.损失函数

论文中的损失函数首先是用了个pixel-wise softmax,其实这个没什么特别的,就是每个像素对应的输出单独做softmax,也就是做了w*h个softmax。之后改进了一下得到如下的损失函数形式:一个交叉熵乘一个权重
在这里插入图片描述
其中, x x x可以看作是某一个像素点, l ( x ) l(x) l(x)表示 x x x这个点对应的类别label, p k ( x ) p_k(x) pk(x)表示在xxx这个点的输出在类别k的softmax的激活值,
P l ( x ) ( x ) P_{l(x)}(x) Pl(x)(x)代表点 x x x在对应的label给出的那个类别的输出的激活值。
回忆一下正常的交叉熵定义:在这里插入图片描述
可以发现除了 w ( x ) w(x) w(x)和负号(应该需要负号的,我猜想是隐含在 w ( x ) w(x) w(x)中了),在分类这个问题上,两个公式的意义其实是相同的,前面的直接选取了label对应的那个激活值,后面的公式在外面把非label对应的结果乘0了。所以就是一样的。

剩下的就是 w ( x ) w(x) w(x)是个什么玩意儿了。这东西在论文里有对应的解释,但是那个公式应该还是使用于论文中的场景的。在我看来,这个权重更类似于一个超参数,你可以调整图像中某个区域的重要程度,在论文的场景中,大概是分割细胞,作者认为细胞边缘需要更大的权重,于是设计了对应的权重map,实际情况中,应该是需要自己来设计或这调整这个权重的。
在这里插入图片描述

4.反卷积

4.1 上采样(Upsample)

在应用在计算机视觉的深度学习领域,由于输入图像通过卷积神经网络(CNN)提取特征后,输出的尺寸往往会变小,而有时我们需要将图像恢复到原来的尺寸以便进行进一步的计算(e.g.:图像的语义分割),这个采用扩大图像尺寸,实现图像由小分辨率到大分辨率的映射的操作,叫做上采样(Upsample)。

4.2 反卷积(Transposed Convolution)

上采样有3种常见的方法:双线性插值(bilinear),反卷积(Transposed Convolution),反池化(Unpooling),我们这里只讨论反卷积。这里指的反卷积,也叫转置卷积,它并不是正向卷积的完全逆过程,用一句话来解释:反卷积是一种特殊的正向卷积,先按照一定的比例通过补0 来扩大输入图像的尺寸,接着旋转卷积核,再进行正向卷积。

4.2.1 反卷积的数学推导

  • 正向卷积的实现过程
    在这里插入图片描述
  • 用矩阵乘法描述卷积
    在这里插入图片描述
  • 反卷积的输入输出尺寸关系
    在这里插入图片描述
    在这里插入图片描述
  • 反卷积在 FCN 中的应用
    在这里插入图片描述

5.深度特征融合—理解add和concat之多层特征融合

在各个网络模型中,ResNet,FPN等采用的element-wise add来融合特征,而DenseNet等则采用concat来融合特征。那add与concat形式有什么不同呢?事实上两者都可以理解为整合特征图信息。只不过concat比较直观,而add理解起来比较生涩。
在这里插入图片描述
从图中可以发现:

  • concat是通道数的增加;
  • add是特征图相加,通道数不变

你可以这么理解,add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的。而concatenate是通道数的合并,也就是说描述图像本身的特征数(通道数)增加了,而每一特征下的信息是没有增加。

concat每个通道对应着对应的卷积核。 而add形式则将对应的特征图相加,再进行下一步卷积操作,相当于加了一个先验:对应通道的特征图语义类似,从而对应的特征图共享一个卷积核(对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于concat之后对应通道共享同一个卷积核)。

因此add可以认为是特殊的concat形式。但是add的计算量要比concat的计算量小得多。

另解释:
对于两路输入来说,如果是通道数相同且后面带卷积的话,add等价于concat之后对应通道共享同一个卷积核。下面具体用式子解释一下。由于每个输出通道的卷积核是独立的,我们可以只看单个通道的输出。假设两路输入的通道分别为X1, X2, …, Xc和Y1, Y2, …, Yc。那么concat的单个输出通道为(*表示卷积):
在这里插入图片描述
而add的单个输出通道为:
在这里插入图片描述
因此add相当于加了一种prior,当两路输入可以具有“对应通道的特征图语义类似”(可能不太严谨)的性质的时候,可以用add来替代concat,这样更节省参数和计算量(concat是add的2倍)。FPN[1]里的金字塔,是希望把分辨率最小但语义最强的特征图增加分辨率,从性质上是可以用add的。如果用concat,因为分辨率小的特征通道数更多,计算量是一笔不少的开销

总结:
Resnet是做值的叠加,通道数是不变的,DenseNet是做通道的合并。你可以这么理解,add是描述图像的特征下的信息量增多了,但是描述图像的维度本身并没有增加,只是每一维下的信息量在增加,这显然是对最终的图像的分类是有益的而concatenate是通道数的合并,也就是说描述图像本身的特征增加了,而每一特征下的信息是没有增加。

6. 总结

  1. U-net建立在FCN的网络架构上,作者修改并扩大了这个网络框架,使其能够使用很少的训练图像就得到很 精确的分割结果。
  2. 添加上采样阶段,并且添加了很多的特征通道,允许更多的原图像纹理的信息在高分辨率的layers中进行传播。
  3. U-net没有FC层,且全程使用valid来进行卷积,这样的话可以保证分割的结果都是基于没有缺失的上下文特征得到的,因此输入输出的图像尺寸不太一样
  4. 使用了加权损失以使得网络更加重视边缘像素的学习。
  5. overlap-tile策略,解决了边缘区域没有上下文的问题

参考:

https://blog.csdn.net/qian99/article/details/85084686
https://blog.csdn.net/Formlsl/article/details/80373200
https://www.jianshu.com/p/a782aba60ede
https://www.jianshu.com/p/14641b79a672
https://www.zhihu.com/question/48279880
https://blog.csdn.net/xys430381_1/article/details/88355956

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值