跑通代码---2021_TIP_CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery

感受:代码、路径方面有点混乱,需要大改,怎么改的过程未及时记录,记录改完后的一些思考,还在慢慢更新中,写的比较乱,还存在许多问题为想明白,已在文中标红,欢迎大佬们评论区或者私信帮我答答疑惑 orz  orz  orz !

paper:CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery | IEEE Journals & Magazine | IEEE Xplore

使用的源代码仓库:GitHub - mj129/CoANet: CoANet: Connectivity Attention Network for Road Extraction From Satellite Imagery


目录

一、前期准备

1. 环境、安装包

2. 根据操作形成的文件夹结构

二、训练与测试过程

1. train

2. test过程

三、遇到的问题

1. train时,关于网络结构

2. test时的一些操作

(8)test.py中对每个batch里的数据进行操作的流程

3. 关于训练和测试时所使用的数据的疑问

四、其他操作

1. 查看特征图

2. 生成新的crop文件,且按阈值提出全黑的图像


PS:里面加了一些我的理解和部分代码

一、前期准备

1. 环境、安装包

 torch、torchvision、torchaudio的安装参考:

Anaconda虚拟环境中安装cuda和cuDNN

其他包:

(写在前面)如果有下载不下来的包,可以在后面加上国内镜像地址Anaconda镜像源整理与使用_ligous的博客-CSDN博客),具体操作可以参考5

1. tqdm

pip install tqdm

2. matplotlib

pip install matplotlib

3. pillow

pip install pillow

4. tensorboardX

pip install tensorboard -i https://pypi.douban.com/simple/
pip install tensorboardX -i https://pypi.douban.com/simple/

 5. prefetch_generator

pip install prefetch_generator -i https://pypi.douban.com/simple/

如果下载不下来,可以使用豆瓣的镜像源,也可以使用其他源

6. cv2

# windows

conda install -c conda-forge opencv

# linux

pip install opencv-python -i https://pypi.douban.com/simple/

  7. scikit-image

pip install scikit-image -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

8. torchsummary

pip install torchsummary -i https://pypi.douban.com/simple/

         安装完这些包应该就没什么问题了。

额外的:

timm

pip install timm -i https://pypi.tuna.tsinghua.edu.cn/simple

2.数据准备

1.运行create_crops.py,对原始的1024图像进行裁剪,训练时使用的就是裁剪后的图像,即生成的crops文件夹里的数据。

2.运行create_connection.py,对crops中的gt生成connection_d1和connection_d3,这个是用来计算连通性loss的。

根据操作形成的文件夹结构:

 进入crops文件夹的结构

二、训练与测试过程

1. train

train时

(1)需要修改mypath.py中的return路径

(2)修改train.py中的

(3)修改 dataloaders/_init_.py 中的 train 或者 test 模式

2. test过程

1. 修改test.py

(1)修改文件夹地址

(2)修改“ --ckpt "

        ckpt指向的是训练好的模型,所在的位置,即你要用哪个模型去test

(3)修改test结果保存的地址

 2. 修改dataloaders中的_init_.py

         换成修改好的test时使用的代码段

3.修改 mypath.py

三、遇到的问题

1. train时,关于网络结构

(1)损失分支与损失函数设计

 (2)优化器的设计

 (3) 是否使用类别平衡权重

        代码中没有使用

 

 (4)做一系列图像增强

        在生成dalaloader后,逐batchsize获取数据时,不同的数据集进行不同的数据增强操作。

        train和val的图像增强都在deepglobe_crop.py中,即训练过程采用的是裁剪后的512×512大小的图进行训练。

        训练集的操作

        使用的图像增强方法:随机旋转、水平翻转、高斯模糊、归一化。

        使用的tr.Normalize()中的参数是Imagenet数据集的均值和方差

        验证集的操作(比训练集的操作少,只做了归一化)

        test(采用的是val集的数据)的图像增强操作在deepglobe.py中,即测试过程采用的是原图1024×1024大小的图。

        测试集的操作

        normalize的参数是怎么获得的呢?这个是在数据输入网络前做的normalize,可以预先自己算一下数据集的mean和std,在填入其中,本次的训练中,可以直接用源码中提供的参数,如果要训练自己的私有数据集,可以自己算一下这个参数,换一下。

(5)BN的设置

2. test时的一些操作

(6)test.py读取数据后的操作,不太明白

        读取的图像是原图像,1024的,读取了image,target(gt),con0,con1,con2这三个是d=1时的connection图,没看到读取d=3时的,不知道是想干嘛

与train.py中读取数据的操作对比

读取了image,target(gt)

con0,con1,con2 这三个是d=1时的connection图

con_d1_0,con_d1_1,con_d1_2 这三个是d=3时的connection图(比test时多读取的部分)

(7)test.py对输入图像的操作以及输入模型得到结果

虽然读取了图片的connection信息图像connect_label,但是后面好像没有用到

(8)test.py中对每个batch里的数据进行操作的流程

  1. 读取image,gt,connection(d=1)
  2. 对image一系列操作得到三种结果,并将与原来的image连接起来

         它在测试时候,读取完image后,对它做了很多操作,img[batch, channel, height, weight]],第一行应该是垂直翻转【这里面的不对:水平翻转】,第二个是水平翻转【这里面的不对:对batchsize里的每个图片反向排列一下】,第三个是第一第二的结合,【这里面的应该不对:其实它代码里,测试的时候,batchsize设置的是1,也就是说它有效的只进行了翻转】。在这些操作进行完,计算完结果后,还是要再恢复的,具体的,就是在5,6,7中,list的append操作
         这里对image进行一系列的操作,是为了“测试时图像增强”(TTA)可以了解一下。
  3. 将读取到的三个d=1时的connection连接起来
  4. 使用model,对连接起来的image预测,得到output,out_connect(d=1),out_connect(d=3)
  5. 对out_connect(d=1)进行一系列操作(4种),并添加到一个out_connect_full的list中,对列表中的4种out_connect进行sum相加操作,形成pred_connect,对其判断,阈值小于0.9的设为0,大于等于0.9的设为1
  6. 与5相似,对out_connect_d1(d=3)进行一系列操作(4种),并添加到一个out_connect_d1_full的list中,将列表中的4种out_connect_d1进行sum相加操作,形成pred_connect_d1,对其判断,阈值小于2.0的设为0,大于等于2.0的设为1,不太懂为什么
  7. 将ouput变成numpy生成pred,将target变成numpy生成target_n,对pred进行一系列操作(4种),并添加到一个pred_full的list中,将列表中的4种pred进行mean平均操作,形成pred_full,对其判断,阈值小于0.1的设为0,大于0.1的设为1
  8. 对5,6,7中生成的pred_connect,pred_connect_d1,pred_full相加+,形成su,对其判断,阈值大于0的设为1
  9. make_grid操作
    将image(也就是一开始读取进来后进行了一系列变换的image),保存至out_image图像
    将target(也就是一开始读取进来的没有进行一系列变换的target),保存至out_GT图像
    将su(也就是8中生成的最终图像),保存至out_pred_label_sum图像

RandomScaleCrop是随机重新剪裁了吗,可是读取的数据就是512大小的呀

3. 关于训练和测试时所使用的数据的疑问

           在他的源码里,在train.py中,读取了train_crops.txt和val_crop.txt里的数据,在test.py中,读取了val.txt里的数据,而val_crop.txt也就是进行了分割的val.txt,也就是,他这个代码里的val集就是他所说的test集,整个数据集中就只有tain和val,在测试计算评估指标时,用的是在train.py训练时所用来验证的val集,如果真的是这样的话,那么在训练时,所选取获得的模型,就已经偏向于测试集了,也不算是test(也作为val)影响了训练过程,只是在训练阶段,选择了一个对test集最好的模型。这样就和平时的不太一样,是在刷指标叭。测试集原本应该是看不到的数据,或许应该在划分出来的train里再划分一个val。train:val:test=7:1:2 ?

四、其他操作

1. 查看特征图

步骤:

(1)把model换成查看feature_map的model,会导致引用medel的加载语句有问题,需要修改成medeling。(目前没问题了)

(2)运行的是test_feature_map.py

        修改 '--ckpt' 模型的地址  

(3)修改 draw_feature.py中特征图保存的路径

(4)修改val_feature_map.txt中要检测的文件名字

2. 生成新的crop文件,且按阈值剔除全黑的图像

(1)生成crop文件

        运行image_process中的create_crops_***_***.py,在train/crops_***_***文件夹中生成带有overlap的裁剪图像,images和gt文件夹,这两个文件夹里是全部的train+val的图像。同时在train下生成train_***_***_crops.txt,和val_***_***_crops.txt两个文件,里面分别是train、val的图像名称。

(2)从train/***_***_crops文件夹中把train、val分别挑出来

  • 运行image_process/copy_to_another_file.py,修改路径,读取train/train_***_***_crops.txt,把train的图像转移到新的文件夹中
  • 运行image_process/copy_to_another_file.py,修改路径,读取train/val_***_***_crops.txt,把val的图像转移到新的文件夹中
  • 这就生成了一个crops_***_***_all

(3)按照阈值将符合条件的crops中的train集图像,移到另一个文件夹中crops_***_***_剔除阈值

        运行move_proportion_of_white_pixels.py,将train中符合阈值的图像复制转移,并生成新的train_***_***_tichu_crops.txt,这些图片转移到另一个命名为crops_***_***_剔除阈值/train_gt,train_images,untrain_gt,untrain_images

(4)将生成的符合阈值的train集和只经过裁剪的val集混在一起,因为val集不需要剔除阈值

评论 71
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值