使用TensorFlow进行超声波神经分割
GitHub - yihui-he/u-net: U-Net: 用于生物医学图像分割的卷积网络
使用Keras进行Kaggle超声波神经分割比赛的深度学习教程
本教程展示了如何使用Keras库构建深度神经网络进行超声波图像神经分割。更多关于此Kaggle比赛的信息,请参见https://www.kaggle.com/c/ultrasound-nerve-segmentation。
基于测试图像,该深度神经网络在排行榜上取得了约0.57的得分,可以作为进一步、更严谨方法的良好起点。
该体系结构受到了U-Net: 用于生物医学图像分割的卷积网络的启发。
概述
数据
提供的数据由data.py
脚本处理。这个脚本只是加载图像并将它们保存为NumPy二进制格式文件**.npy**,以便后续更快加载。
预处理
除了将图像调整为64 x 80的大小外,没有进行任何预处理。由于图像相当嘈杂,我预计一些深思熟虑的预处理可能会提高模型的性能。
输出图像(掩码)被缩放到[0, 1]区间。
模型
提供的模型基本上是一个卷积自动编码器,但有所不同——它具有从编码器层到同一级解码器层的跳跃连接。见下图(请注意,本教程中的图像大小和卷积滤波器数量与原始U-Net架构不同)。
该深度神经网络使用Keras函数API实现,使得尝试不同有趣的架构变得非常容易。
网络输出是一个64 x 80的掩码,应该被学习。Sigmoid激活函数确保掩码像素在[0, 1]范围内。
训练
模型训练了20个epoch,每个epoch在Titan X上大约耗时30秒。模型的内存占用约800MB。
在20个epoch之后,计算的Dice系数约为0.68,达到了排行榜上的约0.57分,所以显然这个模型过拟合了(有人愿意提交交叉验证的pull请求吗?;))。
训练的损失函数基本上只是Dice系数的负数(它被用作比赛中的评价指标),并且用Keras后端实现为自定义损失函数——有关更多细节,请查看train.py
中的dice_coef()
和dice_coef_loss()
函数。此外,为使损失函数平滑,添加了一个因子smooth = 1
。
权重通过Adam优化器更新,学习率为1e-5。在训练期间,模型权重保存为HDF5格式。
如何使用
依赖项
本教程依赖于以下库:
- cv2 (OpenCV)
- Theano和/或Tensorflow
- Keras >= 1.0
此外,此代码应与Python版本2.7-3.5兼容。
准备数据
为了提取原始图像并将其保存为*.npy*文件,你应该首先准备其结构。确保raw
目录位于本项目的根目录中。此外,raw
目录的树结构应如下所示:
-raw
|
---- train
| |
| ---- 1_1.tif
| |
| ---- …
|
---- test
|
---- 1.tif
|
---- …
- 现在运行
python data.py
。
运行此脚本将创建训练和测试图像,并将它们保存为**.npy**文件。
定义模型
- 查看
train.py
中的get_unet()
以修改模型、优化器和损失函数。
训练模型并为测试图像生成掩码
- 运行
python train.py
以训练模型。
查看train_predict()
以修改迭代次数(epoch)、批量大小等。
该脚本结束后,应为imgs_test.npy
中的相应图像生成掩码,并保存在imgs_mask_test.npy
中。我建议你检查这些掩码以进一步了解你模型的性能。
生成提交
- 运行
python submission.py
为生成的掩码生成提交文件submission.csv
。
查看函数submission()
和run_length_enc()
(感谢woshialex)以了解详细信息。
关于Keras
Keras是一个简约的、高度模块化的神经网络库,用Python编写,并能够运行在TensorFlow或Theano之上。它的开发重点是实现快速试验。从想法到结果的最短延迟是进行良好研究的关键。
如果你需要一个这样的深度学习库,请使用Keras:
- 允许轻松快速的原型开发(通过完全模块化、简约和可扩展性)。
- 支持卷积网络和递归网络,以及这两者的组合。
- 支持任意连接方案(包括多输入和多输出训练)。
- 无缝运行在CPU和GPU上。
阅读文档Keras.io
Keras与以下版本兼容:Python 2.7-3.5。