超声波神经分割:使用 TensorFlow 的 U-Net 项目介绍
项目概述
本项目旨在为 Kaggle 超声波神经分割比赛提供一个深度学习教程,主要使用 Keras 库来搭建深度神经网络,用于超声波图像的神经分割。这种神经网络在测试图像上的得分约为 0.57,是进一步优化的良好基础。网络架构受到 U-Net 的启发,该网络是一种专门用于生物医学图像分割的卷积神经网络。
数据处理
比赛提供的数据通过 data.py
脚本进行处理。该脚本的功能是加载图像并将其保存为 NumPy 的二进制格式文件,以便后续更快地加载。图像经过缩放处理至 64x80 的大小,但并未做其他预处理。输出图像(掩码)的像素值被缩放至 [0, 1] 范围内。
模型结构
该项目提供的模型基本上是一个卷积自编码器,具有从编码器层到相同级别解码器层的跳跃连接。这种设计使得模型能够更有效地捕捉图像的细节。网络的输出是一张大小为 64x80 的图像,代表需学习的掩码,并通过 Sigmoid 激活函数确保掩码像素值在 [0, 1] 范围内。
模型训练
模型训练运行 20 个周期,每个周期约需 30 秒(在 Titan X 上),占用大约 800MB 的内存空间。经过 20 个训练周期后,计算出的 Dice 系数约为 0.68,对应的排行榜得分约为 0.57。这表明模型存在过拟合现象。
训练损失函数基本上是 Dice 系数的负数,并使用 Keras 的后端实现自定义损失函数。为了平滑损失,添加了一个 smooth = 1
的因子。使用 Adam 优化器来更新权重,学习率为 1e-5。在训练过程中,模型权重保存在 HDF5 格式文件中。
项目使用指南
依赖
该项目依赖以下库:
- cv2 (OpenCV)
- Theano 和/或 TensorFlow
- Keras >= 1.0
代码兼容 Python 2.7-3.5 版本。
准备数据
为了提取原始图像并保存为 .npy 文件,首先需要准备其结构。确保项目根目录下有 raw
目录,且目录结构如下:
-raw
|
---- train
| |
| ---- 1_1.tif
| |
| ---- …
|
---- test
|
---- 1.tif
|
---- …
然后运行 python data.py
。该脚本将创建训练和测试图像并保存为 .npy 文件。
定义模型
参考 train.py
中的 get_unet()
可对模型、优化器和损失函数进行修改。
训练模型并生成测试图像掩码
运行 python train.py
开始训练模型。可以在 train_predict()
中修改训练周期数、批量大小等参数。训练完成后,imgs_mask_test.npy
中应该生成与 imgs_test.npy
对应的掩码。建议检查这些掩码以进一步了解模型性能。
生成提交文件
运行 python submission.py
生成 submission.csv
文件用于提交。可查看 submission()
和 run_length_enc()
函数以获取更多细节。
关于 Keras
Keras 是一个简约且高度模块化的神经网络库,用 Python 编写,能够在 TensorFlow 或 Theano 上运行。其开发的重点是支持快速实验,使研究人员能够从想法到结果尽可能快地迭代。Keras 适用于需要一个简单且快速原型化的深度学习库,同时支持卷积网络和循环网络,以及不同的连接结构,也能在 CPU 和 GPU 上无缝运行。兼容 Python 2.7-3.5 版本。