/Deeplabv3_Pytorch

基于矿区无人机影像的地物提取实验

Primary LanguagePython

Deeplabv3_Pytorch

  • 基于矿区无人机影像的地物提取实验

1. 实验数据介绍

  • 一副无人机拍摄的高分辨率矿区影像图
  • 实验室进行标注的对应label
  • v0219版本:进行裁剪后的640 x 640的图像与label数据
  • v0225&v0301版本及之后:进行裁剪后的320 x 320的图像与label数据,并更换测试集

2. 实验环境介绍

  • GPU等服务器资源不加介绍
  • Python3.6、Pytorch、OpenCV、torchvision、numpy等必备环境
  • 图像切割工具包GDAL:仅在win系统下可运行

3. 实验流程介绍

  • 原图数据和标注好的label数据,label是灰度的图像,且每个像素属于该类(0-3)共四类
  • 切割原图和相应的label数据为640 x 640的图像,后期改为320大小进行实验
  • 将切割好的原图和label对应好,使用代码进行可视化(因为标注的label是灰度,直观上看是黑色一片)
  • 对数据进行数据增强,切割完成才有对应的几百张数据,增强至几千张
  • 增强后的数据也要一对一对应好,建议一开始就取两者相同的图像名,使用可视化进行测试
  • 数据划分,分为训练集、验证集、测试集;按照6:2:2的比例
  • 搭建网络代码,使用Pytorch搭建deeplabv3网络(基于ResNet)
  • 编写train.py训练代码,写好训练流程、保存模型、保存loss等信息
  • 训练完成之后,使用保存的模型进行预测,对预测出的图片进行涂色,使之可视化
  • 根据预测结果进行kappa系数、mIoU指标的计算

4. 实验详细流程

5. 实验数据记录

  • 基于ResNet-152的deeplabv3训练epoch=200得到的具体参数及有关结果如下:
    • 使用图像增强进行训练集的生成,640大小的图像:训练集1944张、验证集648张、测试集162张
    • v0225版本&v0301版本,320大小的图像:训练集9072张、验证集2268张、测试集378张
    • 图像的预处理:无标准化、只进行了归一化
    • 损失函数:CrossEntropyLoss
    • 优化器:SGD、lr=1e-3、动量=0.9; v0219版本测试Adam优化器、lr=1e-3
    • v0225版本&v0301版本:Adam优化器、lr=1e-3
    • v0225版本:deeplabv3-resnet152
    • v0301版本:deeplabv3-resnet50
    • v0304版本:deeplabv3-resnet152,将简单留出验证改为5折交叉验证
    • V3p-101: deeplabv3+-resnet101 + 5折交叉验证
    • V3p-152: deeplabv3+-resnet152 + 5折交叉验证
    • DANet_res:danet-resnet152 + 5折交叉验证
    • Deeplabv3_dan:deeplabv3-dan-resnet152 + 5折交叉验证
    • CCNet0403:ccnet-resnet152 + 5折交叉验证
    • CCNet0509:deeplabv3-ccnet-resnet152 +5折交叉验证
  • 待实现想法
    • Pytorch求出所以训练图像的mean和std值,加入实验
      • 存在疑问:见到的标准化都是采用的在线数据增强,离线增强数据该如何使用该tips
    • 数据增强加入随机裁剪操作,并双线性插值pad至320大小(不能pad,标签pad就不是真实值),投入训练
      • 随机裁剪数据至192大小,没有pad,和320大小的数据一起当做训练集,出现错误提示:一个batch的数据,[B,C,H,W]必须一致,由于320和192大小的数据掺杂,所以报错。因为实验使用离线的数据增强
    • 使用CCNet单独训练
      • v0403版本:只使用了ccnet注意力模块的输出上采样,结果为不收敛,但是使用epoch-8.pth测试有点效果
      • 后期测试:将x与x_dsn特征融合,进行测试,测试结果如下,可以看出较danet单独训练结果稍好,车辆acc例外
    • CCNet与deeplabv3共同使用,将注意力模块加入deeplabv3
      • v0509版本:将ccnet模块与aspp模块并行,cat两个结果,最后进行分割。整体Acc、MIoU、Kappa都达到了最高
      • v0509版本:只有道路和车辆的准确率低于以往的实验
    • DAN网络单独训练
      • danet_drn_v0408版本:output包括feat_sum、pam_out、cam_out,采用辅助loss训练,结果一塌糊涂
      • danet_v0408版本:更换backbone网络为resnet-152,替换deeplabv3的aspp模块,不使用辅助loss,使用feat_sum进行结果的分割,结果详见下表Danet0408
    • DAN模块并行加入deeplabv3网络中,实验数据如下所示

5.1 test测试数据集-v0219

5.1.1 SGD与Adam整体平均像素acc及miou对比-下为Adam

acc MIoU
0.9263767325704164 0.4807448577750288
0.9337385405707201 0.47286513489126114

5.1.2 类别平均像素acc-v0219

类别 SGD Adam
地面 0.9280041488314654 0.9393157770328366
房屋 0.8031034186590591 0.8322606620969475
道路 0.522966884580534 0.7378283121400184
车辆 0.6060759535374916 0.7527768185633605

5.2 test测试数据集-各版本结果对比

版本&指标 Acc MIoU Kappa 地面 房屋 道路 车辆
V0225 0.9562 0.7864 0.8477 0.9847 0.8531 0.8898 0.7269
V0301 0.9545 0.7740 0.8429 0.9815 0.8849 0.9037 0.6313
V0304 0.9555 0.7777 0.8470 0.9816 0.8529 0.9086 0.7151
V3p-101 0.9544 0.7706 0.8427 0.9785 0.8704 0.9165 0.5758
V3p-152 0.9525 0.7582 0.8317 0.9860 0.8235 0.9111 0.6009
Danet0408 0.9294 0.6762 0.7347 0.9818 0.5991 0.8409 0.4458
Danet0420 0.9497 0.7611 0.8276 0.9732 0.8232 0.9101 0.6559
CCnet0403 0.9412 0.6846 0.7845 0.9876 0.7803 0.9252 0.4353
CCnet0509 0.9593 0.7947 0.8593 0.9863 0.8818 0.8856 0.6740

6. 实验分割结果展示

  • 整体效果不行,如下,v0217版本已解决,详见下方优化结果:

  • 单张的效果还可以,如下:

7. 实验待优化问题-MIoU-已解决v0217

  • MIoU数据:MIoUData.py:读取label和predict图像,以tensor形式,batch_size=4传入----v0210
  • MIoU的计算:testMIoU.py:将传入的tensor转为np的array,再执行flatten()进行一维化,每4个图像进行计算miou,最后求平均的miou
  • 问题:计算得到的MIoU都为1.0,怀疑原因,中间的float强转int,最后得到的数值都为1
  • 解决v0217:修改读入方式,使用CV2直接读入,不变为tensor,详见MIoUCalv0217.pyMIoUDatav0217.py

8. 实验待优化问题-预处理

  • MyData_v0211版本,cv2以BGR模式读入训练集,先改为RGB图像,再进行nomalize初始化,使用的mean和std数值都为Imagenet数据集预训练得到的,但是训练完成之后,预测结果有偏差,如下: v0211predict

9. 预测问题-已解决v0217

  • v0217版本:修改预测方法,以一张一张读入进行预测,解决之前的大部分涂色失败问题。效果如下:

10. SGD与Adam优化器预测效果对比

  • v0219:仅仅改动优化器为Adam,lr=1e-3