本文将介绍U-net模型,以及其tensorflow的实现,保存在Github上
U-net 结构
U-net顾名思义,其结构是一个U型的网络
左侧为一个下采样过程,分4组卷积操作(蓝色箭头)进行。每组卷积操作后进行一次maxpool操作(红色箭头),将图片进一步缩小为原来的。通过4组操作将大小的输入图片,计算为 大小。
右侧的上采样过程。上采样过程使用的是4组反卷积(浅绿色箭头),TensorFlow使用的函数是tf.nn.conv2d_transpose(),每次上采样将图片扩展为原来的 倍, 然后将对应层的图片(特征图)进行剪裁和复制,然后concat到上卷积的结果上(灰色箭头)。
上采样过程结束后,得到 大小的图, 最后用一个 的卷积核将通道数减到2(深绿色箭头),即label上的两种颜色。
tensrflow实现
我按照上述的结构实现后,发现效果不行,感觉是copy and crop处出现了问题,应该不能直接剪裁,因此我做了小部分修改。即:
- 我在作卷积(蓝色箭头)时没有缩小大小。(例如:第一个下采样,图中是 , 而我的是 )这样做的好处是省去了剪裁(crop)操作,因为对应层的大小是一样的(例如:),这样能保留卷积操作提取到的全部信息(当然,用一个卷积核替代crop改变图片大小也可以)
- 我减小了输入图片的大小,图中是,我减少成了
此外,我还加上了batch_normal,效果挺好的,loss降得很快(详见unet-TF-withBatchNormal.py中的函数batch_norm( ))
效果
某幅图片的预测结果,准确度
| image | ground_truth | prediction |
|---|---|---|
测试30张图片,准确率平均,就是耗时比较长,花了
数据
数据使用的是ISBI Challenge 2012中的数据集。Github地址中的data_set文件夹中包含train、label 和 test数据
参考文献
1.《U-net Convolutional networks for biomedical image segmentation》