感受:代码、路径方面有点混乱,需要大改,怎么改的过程未及时记录,记录改完后的一些思考,还在慢慢更新中,写的比较乱,还存在许多问题为想明白,已在文中标红,欢迎大佬们评论区或者私信帮我答答疑惑 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. 查看特征图
torch、torchvision、torchaudio的安装参考:
Anaconda虚拟环境中安装cuda和cuDNN
其他包:
(写在前面)如果有下载不下来的包,可以在后面加上国内镜像地址(Anaconda镜像源整理与使用_ligous的博客-CSDN博客),具体操作可以参考6
1. tqdm
pip install tqdm
2. matplotlib
pip install matplotlib
3. pillow
pip install pillow
4. tensorboardX
pip install tensorboard
pip install tensorboardX
5. prefetch_generator
pip install prefetch_generator
如果下载不下来,可以使用豆瓣的镜像源,也可以使用其他源
pip install torchsummary -i https://pypi.douban.com/simple/
6. cv2
# windows
conda install -c conda-forge opencv
# linux
pip install opencv-python
7. scikit-image
pip install prefetch_generator
如果下载不下来,可以使用豆瓣的镜像源,也可以使用其他源
pip install torchsummary -i https://pypi.douban.com/simple/
安装完这些包应该就没什么问题了。
进入crops文件夹的结构
train时
(1)需要修改mypath.py中的return路径
(2)修改train.py中的
(3)修改init中的
1. 修改test.py
(1)修改“ --ckpt "
ckpt指向的是训练好的模型,所在的位置,即你要用哪个模型去test
(2)修改test结果保存的地址
2. 修改dataloaders中的_init_.py
换成修改好的test时使用的代码段
(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的设置
(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,但是后面好像没有用到
RandomScaleCrop是随机重新剪裁了吗,可是读取的数据就是512大小的呀
在他的源码里,在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)把model换成查看feature_map的model,会导致引用medel的加载语句有问题,需要修改成medeling。(目前没问题了)
(2)运行的是test_feature_map.py
修改 '--ckpt' 模型的地址
(3)修改 draw_feature.py中特征图保存的路径
(4)修改val_feature_map.txt中要检测的文件名字
(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分别挑出来
(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集混在一起