U-net及其TensorFlow的实现

本文将介绍U-net模型,以及其tensorflow的实现,保存在Github上

U-net 结构

U-net及其TensorFlow的实现_第1张图片
U-net顾名思义,其结构是一个U型的网络
左侧为一个下采样过程,分4组卷积操作(蓝色箭头)进行。每组卷积操作后进行一次maxpool操作(红色箭头),将图片进一步缩小为原来的 1/2 1 / 2 。通过4组操作将 572×572×1 572 × 572 × 1 大小的输入图片,计算为 32×32×1024 32 × 32 × 1024 大小。
右侧的上采样过程。上采样过程使用的是4组反卷积(浅绿色箭头),TensorFlow使用的函数是tf.nn.conv2d_transpose(),每次上采样将图片扩展为原来的 2 2 倍, 然后将对应层的图片(特征图)进行剪裁和复制,然后concat到上卷积的结果上(灰色箭头)。
上采样过程结束后,得到 388×388×64 388 × 388 × 64 大小的图, 最后用一个 1×1 1 × 1 的卷积核将通道数减到2(深绿色箭头),即label上的两种颜色。

tensrflow实现

我按照上述的结构实现后,发现效果不行,感觉是copy and crop处出现了问题,应该不能直接剪裁,因此我做了小部分修改。即:

  1. 我在作 3×3 3 × 3 卷积(蓝色箭头)时没有缩小大小。(例如:第一个下采样,图中是 572×572570×570568×568 572 × 572 ⇒ 570 × 570 ⇒ 568 × 568 , 而我的是 572×572572×572572×572 572 × 572 ⇒ 572 × 572 ⇒ 572 × 572 )这样做的好处是省去了剪裁(crop)操作,因为对应层的大小是一样的(例如: 64maxpool323232upsample64 64 ⇒ m a x p o o l ⇒ 32 ⇒ 32 ⇒ 32 ⇒ u p s a m p l e ⇒ 64 ),这样能保留卷积操作提取到的全部信息(当然,用一个卷积核替代crop改变图片大小也可以)
  2. 我减小了输入图片的大小,图中是 572×572 572 × 572 ,我减少成了 512×512 512 × 512

此外,我还加上了batch_normal,效果挺好的,loss降得很快(详见unet-TF-withBatchNormal.py中的函数batch_norm( )

效果

某幅图片的预测结果,准确度 96.88% 96.88 %

image ground_truth prediction
U-net及其TensorFlow的实现_第2张图片 U-net及其TensorFlow的实现_第3张图片 U-net及其TensorFlow的实现_第4张图片

测试30张图片,准确率平均 96.55% 96.55 % ,就是耗时比较长,花了 37.0466s 37.0466 s

数据

数据使用的是ISBI Challenge 2012中的数据集。Github地址中的data_set文件夹中包含train、label 和 test数据

参考文献

1.《U-net Convolutional networks for biomedical image segmentation》

你可能感兴趣的:(Tensorflow,深度学习)