MICCAI-2015
文章目录
1 Background and Motivation
最近一两年,deep CNN 在许多视觉识别任务(visual recognition)中表现出最好的结果,典型的应用例子是 classification task,然而,在生物医学图像处理方面的应用中,往往需要网络的输出包含定位信息,例如给每个像素都打上标签,而不是只对一个图片打一个标签,而且,生物医学图像处理领域,成千上万的训练集过于奢侈!
Ciresan等人采用滑动窗口的方法,以patch做为输入,扩充训练集的同时,能进行像素级分类(定位)
缺点:
- 慢,多patch,每个pathc接一个网络,有 overlap,会重复计算
- 大 patch 中过多的 max-pooling 操作会影响 localization 能力,小 patch 的话上下文信息不足(关于语意分割中“上下文”的理解可以参考: 语义分割上下文信息的定义是什么?)
最近的一些方法考虑了 features from multiple layers,能很好的兼顾到定位能力(localization)和上下文信息(context)
作者在 FCN 的基础上(successive layer 来恢复分辨率),提出了 U-Net 结构
U-Net 采用 overlap-tile strategy,可以 seamless segmentation of arbitrarily large images,具体图2所示
假设原始图片是左图中间的白色区域,现在要对黄色区域进行分割(GPU显存有限,不可能把很大的图片直接丢进GPU来训练),直接把黄色区域输入到网络中会损失边界位置的上下文信息,不利于边界区域的分割,作者通过镜像复制(沿里面的白线复制,沿白色线是镜像对称的)来扩充边界区域的上下文信息!
这样的话,对黄色区域进行分割,首先镜像复制,然后将蓝色区域输入到网络中,采用无 padding 的 Conv(多个 valid Conv,空间分辨率会越卷积越小),就能输出右图中只包含有黄色区域的分割结果
touching objects of the same class(对抱团粘黏在一起的同类别细胞进行分割) 是细胞分割任务中的一项重大挑战!U-Net 中采用了 weighted loss,来增大细胞轮廓的 loss 权重,更好的学习出分离边界(separation border)!
2 Advantages / Contributions
- 设计提出了 U-Net 网络,在三个公开数据集上,取得了最好的结果
- 采用了弹性形变的数据增强方法,可以在样本比较少的生物医学图像应用场景下,采用少量的图片,取得很好的效果
- 在 512×512的图片上,1s以内能分割出结果
3 Method
3.1 Network Architecture
-
左边 :contracting path to capture context
-
右边:symmetric expanding path that enables precise localization
下采样,通道数翻倍,上采样,通道数减半!注意 cropping 操作!
采用无 padding 的 Conv,空间分辨率会越卷越小
网路初始化采用高斯分布,标准差为
2
/
N
\sqrt{2/N}
2/N,
N
N
N denotes the number of incoming nodes of one neuron(这是恺明大神的 he_normal 初始化方法!!!he_normal 15年提出,BN也是15年提出,两个观点有些相似耶)
3.2 Loss Function
Fig 可以看到,输出特征图的大小为 388×388×2,任务是二分类,所以在2的维度上做每个像素的 softmax,配合 cross-entropy 损失!softmax 对应公式如下
p
k
(
x
)
=
e
a
k
(
x
)
∑
k
′
=
1
K
e
a
k
′
(
x
)
p_k(x) = \frac{e^{a_k(x)}}{\sum_{k'=1}^{K}e^{a_{k'}(x)}}
pk(x)=∑k′=1Keak′(x)eak(x)
- x ∈ R 2 x \in \mathbb{R}^2 x∈R2:横纵坐标
- k k k 是特征图的 k k k-th 通道, K K K 是类别数(二分类中 K = 2 K=2 K=2,前景和背景)
- a k ( x ) a_k(x) ak(x) 是特征图第 k k k-th 通道的像素点 x x x 的activation 的值(上一层卷积,Relu 后的)
配合加权了的 cross-entropy 损失(写成损失的话要多个负号,注意和论文里的区别,参考 softmax损失函数理解
)
E = − ∑ x ∈ R 2 w ( x ) l o g ( p l ( x ) ( x ) ) E=-\sum_{x \in \mathbb{R}^2}w(x)log(p_{l(x)}(x)) E=−x∈R2∑w(x)log(pl(x)(x))
对 x x x 进行了加权,损失中多了一项 w ( x ) w(x) w(x)
- l ( x ) l(x) l(x) 属于 { 1 , … , K } \{1,…,K\} {1,…,K},表示每个像素 x x x 的类别标签(二分类问题的话,背景类为0,前景类别为1,只有前景类在计算 loss,参考损失函数softmax_cross_entropy、binary_cross_entropy、sigmoid_cross_entropy之间的区别与联系)
-
w
(
x
)
∈
R
w(x) \in \mathbb{R}
w(x)∈R:是一个权重图,让一些像素在训练的时候,权重更大!根据 GT计算得到,计算方式如下
w ( x ) = w c ( x ) + w 0 ⋅ e − ( d 1 ( x ) + d 2 ( x ) ) 2 2 σ 2 w(x) = w_c(x)+w_0·e^{-\frac{(d_1(x)+d_2(x))^2}{2\sigma^2}} w(x)=wc(x)+w0⋅e−2σ2(d1(x)+d2(x))2 - w c ( x ) w_c(x) wc(x) 是不同类别的基础权重值
- d 1 ( x ) ∈ R d_1(x) \in \mathbb{R} d1(x)∈R 表示当前像素离最近细胞边界的距离
- d 2 ( x ) ∈ R d_2(x) \in \mathbb{R} d2(x)∈R 表示当前像素离第二近的细胞边界的距离
- w 0 = 10 , σ = 5 w_0 = 10,\sigma = 5 w0=10,σ=5
可以观察到,如果当前像素离细胞边界比较近, d 1 d_1 d1 和 d 2 d_2 d2 很小,公式 w ( x ) w(x) w(x)值很大!反之,如果当前像素离细胞边界比较远, d 1 d_1 d1 和 d 2 d_2 d2 很大,公式 w ( x ) w(x) w(x)值很小!达到了加大边界像素点的权重的目的!
3.3 Data Augmentation
采用 elastic deformations 做为数据增强(因为在生物医学图像处理领域, deformation 是非常常见的 variation,而 elastic deformations 又比较容易在计算机中仿真)
下面这组图总结的比较好
参考 U-Net:基于小样本的高精度医学影像语义分割模型
而直接看论文描述看着比较懵圈
大概的意思就是,把图片划分为 3×3的网格,每个网格根据高斯分布(标准差是10像素)抽样来产生扭曲量,最后用 bicubic interpolation 来补上形变后的像素空缺!
关键字是扭曲形变,OK!再看下面这组图
图一划分网格(假设网格是橡皮筋,有弹性),图二借助外力让网格扭曲,图片不动,图三,网格和图片合体,撤去外力,扭曲的网格恢复成方形,图片也跟着变形了!!!
图四,蓝色是扭曲前的图片,绿色是扭曲后的,没有覆盖到的位置需要用插值方法补上!!!
参考 图象扭曲算法
4 Experiments
4.1 Datasets
- EM segmentation challenge(官网,电子显微镜场景):segmentation of neuronal structures in electron microscopic recordings,ISBI 2012 开始,30 images (512x512 pixels),评价指标,warping error、Rand error、pixel error。
- a cell segmentation task in light microscopic images(光学显微镜场景):part
of the ISBI cell tracking challenge 2014 and 2015- PhC-U373 数据集,35 partially annotated training images,评价指标 IoU(预测的和GT的交并比)
- DIC-HeLa 数据集,20 partially annotated training images,评价指标 IoU
4.2 EM segmentation challenge
IDSIA 就是Ciresan等人提出的基于滑动窗口的方法
4.3 PhC-U373 and DIC-HeLa
HeLa 是人类宫颈癌细胞的意思耶,666
5 Conclusion(own)
-
successive layer,localization 和 context
-
镜像复制padding,给边缘的分割提供上下文信息,提供了一种无缝分割高分辨率的图像的解决思路
-
图像处理中的扭曲形变了解一下,双三线性差值就算了,哈哈哈!插值方法千千万
-
采用恺明的 he_normal 初始化,和 BN有点像哟
-
encode 和 decode 的思想来自 Hinton,06年就发在 Nature 上了,这种开山级别的幕后 BOSS 接触的还是太少了,反倒是恺明大神在心中的地位比较高,哈哈哈哈
图片来自 研习U-Net -
注意 U-Net 和同年的 FCN 的区别:1)skip connection,一个add一个concatenate;2)decoder,一个一层,一个对称的 U 形,有多层
-
keras 的代码:这个版本输出特征图用的是单 channel 配合 sigmoid activation function 的
6 附录
BCELoss 不等于 mIoU
怎么去直接优化 IoU 呢
论文:Lovász-Softmax!A tractable surrogate for the optimization of the intersection-over-union measure in neural networks
代码:https://github.com/bermanmaxim/LovaszSoftmax
技巧,loss 双倍快乐
def symmetric_lovasz(outputs, targets):
return (lovasz_hinge(outputs, targets) + lovasz_hinge(-outputs, 1 - targets)) / 2
加 OHEM + focal loss
def focal_loss(self, output, target, alpha, gamma, OHEM_percent):
output = output.contiguous().view(-1)
target = target.contiguous().view(-1)
max_val = (-output).clamp(min=0)
loss = output - output * target + max_val + ((-max_val).exp() + (-output - max_val).exp()).log()
# This formula gives us the log sigmoid of 1-p if y is 0 and of p if y is 1
invprobs = F.logsigmoid(-output * (target * 2 - 1))
focal_loss = alpha * (invprobs * gamma).exp() * loss
# Online Hard Example Mining: top x% losses (pixel-wise). Refer to http://www.robots.ox.ac.uk/~tvg/publications/2017/0026.pdf
OHEM, _ = focal_loss.topk(k=int(OHEM_percent * [*focal_loss.shape][0]))
return OHEM.mean()