感受:代码、路径方面有点混乱,需要大改,怎么改的过程未及时记录,记录改完后的一些思考,还在慢慢更新中,写的比较乱,还存在许多问题为想明白,已在文中标红,欢迎大佬们评论区或者私信帮我答答疑惑 orz orz orz !
目录
(8)test.py中对每个batch里的数据进行操作的流程
PS:里面加了一些我的理解和部分代码
一、前期准备
1. 环境、安装包
torch、torchvision、torchaudio的安装参考:
其他包:
(写在前面)如果有下载不下来的包,可以在后面加上国内镜像地址(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里的数据进行操作的流程
- 读取image,gt,connection(d=1)
- 对image一系列操作得到三种结果,并将与原来的image连接起来
它在测试时候,读取完image后,对它做了很多操作,img[batch, channel, height, weight]],第一行应该是垂直翻转【这里面的不对:水平翻转】,第二个是水平翻转【这里面的不对:对batchsize里的每个图片反向排列一下】,第三个是第一第二的结合,【这里面的应该不对:其实它代码里,测试的时候,batchsize设置的是1,也就是说它有效的只进行了翻转】。在这些操作进行完,计算完结果后,还是要再恢复的,具体的,就是在5,6,7中,list的append操作。
这里对image进行一系列的操作,是为了“测试时图像增强”(TTA)可以了解一下。 - 将读取到的三个d=1时的connection连接起来
- 使用model,对连接起来的image预测,得到output,out_connect(d=1),out_connect(d=3)
- 对out_connect(d=1)进行一系列操作(4种),并添加到一个out_connect_full的list中,对列表中的4种out_connect进行sum相加操作,形成pred_connect,对其判断,阈值小于0.9的设为0,大于等于0.9的设为1
- 与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,不太懂为什么
- 将ouput变成numpy生成pred,将target变成numpy生成target_n,对pred进行一系列操作(4种),并添加到一个pred_full的list中,将列表中的4种pred进行mean平均操作,形成pred_full,对其判断,阈值小于0.1的设为0,大于0.1的设为1
- 对5,6,7中生成的pred_connect,pred_connect_d1,pred_full相加+,形成su,对其判断,阈值大于0的设为1
- 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集不需要剔除阈值