以DeepLabv3+架构为基础做图像分割(包含v1, v2, v3介绍)
DeepLab图像分割算分的发展过程
v1:
贡献: 首次把空洞卷积(dilated convolution) 引入图形分割领域
基本内容:
- 基于VGG16
- 将最后两个池化层改为卷积层(控制分辨率不要太小)
- 去掉全连接层(保留最后一个用于softmax分类)
- 后三个卷积改为空洞卷积(保证感受野与去掉池化层前接近)
- 对结果上采样后用CRF细化分割效果
空洞卷积(Dilated Convolution)
作用:
- 扩大感受野(pooling也可以增加感受野, 但缺点是空间分辨率也降低了)
- 捕获多尺度上下文信息(通过调节dilation rate)
v2
贡献: 引入带空洞卷积的空间金字塔池化(ASPP)
基本内容:
- 基础网络由VGG16 --> ResNet
- 多尺度空洞卷积并行, 获得更好的分割效果(feature map尺寸不变)
- 采用多项式lr衰减
- 与v1一样, 对结果上采样后用CRF细化分割效果
v3
贡献: 优化ASPP
基本内容:
- 提出了获取多尺度信息的并行与串行结构
- ASPP中应用了BN层
- 考虑了dilation rate 的意义, 重新设置了rate 不能过大(rate过大, filter中有效权重减少, 更难捕获远距离信息)
- ASPP中加入全局平均池化, 获取全局尺度信息
- 去掉了CRF后处理
v3+
贡献: 引入编码–解码结构
基本内容:
- v3作为编码部分, 添加了一个解码部分
- 尝试了用Xception作为基础网络(ResNet仍然使用)
基本架构
- tf.estimator API定义网络
- 数据读取(将MRI图像制作成TFRecord)
- 得到prdict classes(如果是预测过程, 直接输出结果)
- 设置loss计算方式
- 设置learning rate和优化方式(如果是验证过程, 跳过此步骤)
- 计算accuracy和mean_iou
- 写入日志信息到Tensorboard, 可视化训练过程, 如accuracy, loss, learning_rate等的变化过程
- 开始训练
遇到的问题
- 制作并读取TFRecord: 源码是从TFRecord中读取按jpg格式读取image, MRI数据集为png格式, 修改源码使deeplab读取tfrecord并按png格式解析image.
后来发现没有做map, label范围不对. 尝试在TFRecord解析出png后把数据转成ndarray进 行 map, 发现这样效率特别低, 放弃.
重新制作TFRecord, 在制作TFRecord之前, 先做好map - 数据不平衡, 需要ixi调整权重(batch/整体, class0的权重)
- 修改loss, 加入mean_iou(不包括背景)做优化
- learning_rate的初值及衰减方式
- 源码是每个epoch做一次验证, 我们数据集很大, 这样不合适, 调整为每1/4个epoch做一次验证
- 数据类型错误, label从tfrecord读出来是uint8格式, 范围是0~255, 然后做padding的过程 中有个-255, 再转换成float然后+255的操作, 导致数据出错
- 经过几天训练, 发现模型有些欠拟合, 因为不同区域间的分界线分割效果不是很好, 所以停止 训练, 修改模型. 1. 只对input做224*224的随机裁剪, 不进行rescale和flip等操作 2. 减小 weight_decay, 即减小正则化项的权重. 3. 用卷积核找到label中不同class的边界, 增大边界像素的 分类权重, 使得网络着重分类边界的学习
- 等等…
训练过程
实验结果
未来打算
6.1 修改网络结构:
- 尝试范围空间卷积
- ASPP全局平均池化如果是要传递全局尺度信息, 直接传原feature map会不会又更好的效果
- 解码部分尝试U-Net结构, 结合不同分辨率下提取到的信息进行分割
6.2 用集成学习提高模型效果(模型融合)
- 同轴位下, 相同模型不同参数做平均
- 同轴位下, 不同模型之间做集成
- 三个轴位, 各自训练模型, 然后集成
6.3 尝试用手工标注数据对网络进行微调