语义分割模型试验记录
2020.10.27
pytorch-encoding
配置pytorch-encoding,编译什么的都正常了,运行测试代码也没有错误,结果没想到测试代码跑的时间有点久(要下载预训练模型,下完一个又有一个,我忘了笔记本没接电源结果息屏休眠了),与服务器连接断了,再连上代码就报错了,import encoding 失败
因为前面明明能正常跑,所以也不敢动其他的修改,只能按照之前的方法重新装环境编译,结果还是不行,先搁置吧
2020.10.28
pytorch-segment
pytorch_segmentation
{
"name": "PSPNet", // training session name
"n_gpu": 1, // number of GPUs to use for training.
"use_synch_bn": true, // Using Synchronized batchnorm (for multi-GPU usage)
"arch": {
"type": "PSPNet", // name of model architecture to train
"args": {
"backbone": "resnet50", // encoder type type
"freeze_bn": false, // When fine tuning the model this can be used
"freeze_backbone": false // In this case only the decoder is trained
}
},
"train_loader": {
"type": "VOC", // Selecting data loader
"args":{
"data_dir": "data/", // dataset path
"batch_size": 32, // batch size
"augment": true, // Use data augmentation
"crop_size": 380, // Size of the random crop after rescaling
"shuffle": true,
"base_size": 400, // The image is resized to base_size, then randomly croped
"scale": true, // Random rescaling between 0.5 and 2 before croping
"flip": true, // Random H-FLip
"rotate": true, // Random rotation between 10 and -10 degrees
"blur": true, // Adding a slight amount of blut to the image
"split": "train_aug", // Split to use, depend of the dataset
"num_workers": 8
}
},
"val_loader": { // Same for val, but no data augmentation, only a center crop
"type": "VOC",
"args":{
"data_dir": "data/",
"batch_size": 32,
"crop_size": 480,
"val": true,
"split": "val",
"num_workers": 4
}
},
"optimizer": {
"type": "SGD",
"differential_lr": true, // Using lr/10 for the backbone, and lr for the rest
"args":{
"lr": 0.01, // Learning rate
"weight_decay": 1e-4, // Weight decay
"momentum": 0.9
}
},
"loss": "CrossEntropyLoss2d", // Loss (see utils/losses.py)
"ignore_index": 255, // Class to ignore (must be set to -1 for ADE20K) dataset
"lr_scheduler": {
"type": "Poly", // Learning rate scheduler (Poly or OneCycle)
"args": {}
},
"trainer": {
"epochs": 80, // Number of training epochs
"save_dir": "saved/", // Checkpoints are saved in save_dir/models/
"save_period": 10, // Saving chechpoint each 10 epochs
"monitor": "max Mean_IoU", // Mode and metric for model performance
"early_stop": 10, // Number of epochs to wait before early stoping (0 to disable)
"tensorboard": true, // Enable tensorboard visualization
"log_dir": "saved/runs",
"log_per_iter": 20,
"val": true,
"val_per_epochs": 5 // Run validation each 5 epochs
}
}
直接复制其主页的配置文件,语法报错。后来在issue上找到一个人的配置文件也还是这个错误。(还是在print上报错,感觉不靠谱)
没有解决。
10.29更新 得到博主回复,问题很坑。。
作者在github上回复我了,原来是我的python版本问题,不知道服务器的conda抽什么风给我默认装了2.7的python,装其他的环境时默认都是3.8,看来conda新建环境时指定python版本这个习惯很重要,明天重新装一下再次尝试
semseg
执行 sh tool/train.sh ade20k pspnet50时出现:
但在该环境中已经安装了opencv,并且打开python import成功
尝试解决办法有 修改文件中的import cv2为import opencv as cv2 无效
尝试办法失败
问题应该出现在错误第二行,找不到conda环境pt140 出现原因不明,使用的环境已经是semseg,不知道为什么会弹这个错误
尝试直接创一个该环境,再回到原环境跑试试
该方法解决,原理不明白,似乎在semseg环境跑的代码都会默认跑到pt140去跑 原因不明
接下来继续解决这些路径配置错误吧,有问题继续更
2020.10.29
根据昨天错误应该是数据集路径有问题,但我下载的ade20k里面并没有这两个txt,其训练配置文件如下:
DATA:
data_root: dataset/ade20k
train_list: dataset/ade20k/list/training.txt
val_list: dataset/ade20k/list/validation.txt
classes: 150
TRAIN:
arch: psp
layers: 50
sync_bn: True # adopt sync_bn or not
train_h: 473
train_w: 473
scale_min: 0.5 # minimum random scale
scale_max: 2.0 # maximum random scale
rotate_min: -10 # minimum random rotate
rotate_max: 10 # maximum random rotate
zoom_factor: 8 # zoom factor for final prediction during training, be in [1, 2, 4, 8]
ignore_label: 255
aux_weight: 0.4
train_gpu: [0, 1, 2, 3, 4, 5, 6, 7]
workers: 16 # data loader workers
batch_size: 16 # batch size for training
batch_size_val: 8 # batch size for validation during training, memory and speed tradeoff
base_lr: 0.01
epochs: 100
start_epoch: 0
power: 0.9
momentum: 0.9
weight_decay: 0.0001
manual_seed:
print_freq: 10
save_freq: 1
save_path: exp/ade20k/pspnet50/model
weight: # path to initial weight (default: none)
resume: # path to latest checkpoint (default: none)
evaluate: False # evaluate on validation set, extra gpu memory needed and small batch_size_val is recommend
Distributed:
dist_url: tcp://127.0.0.1:6789
dist_backend: 'nccl'
multiprocessing_distributed: True
world_size: 1
rank: 0
TEST:
test_list: dataset/ade20k/list/validation.txt
split: val # split in [train, val and test]
base_size: 512 # based size for scaling
test_h: 473
test_w: 473
scales: [1.0] # evaluation scales, ms as [0.5, 0.75, 1.0, 1.25, 1.5, 1.75]
has_prediction: False # has prediction already or not
index_start: 0 # evaluation start index in list
index_step: 0 # evaluation step index in list, 0 means to end
test_gpu: [0]
model_path: exp/ade20k/pspnet50/model/train_epoch_100.pth # evaluation model path
save_folder: exp/ade20k/pspnet50/result/epoch_100/val/ss # results save folder
colors_path: data/ade20k/ade20k_colors.txt # path of dataset colors
names_path: data/ade20k/ade20k_names.txt
开头路径的txt不知道在哪,数据集中没看到,可能得阅读源码自己写txt?暂时先考虑一下别的数据集,把模型跑通。这里选择voc2012
下载的过程中找了一下当前比较厉害的网络结构,决定尝试一下HRnet+OCR,顺便看一下这两篇论文。
HRnet-OCR官方
HRnet-OCR由openseg-pytorch支持实现
HRnet OCR
HRNet
传统或者说通常的SOTA模型一般都是高分辨率到低分辨率卷积流,通过低分辨表示重构高分辨来进行语义分割等任务,HRNet的创新点是没有串联高分辨-低分辨卷积流,而是并联,因此,HRNet能够保持高分辨率,而不是从低分辨率中恢复高分辨率,因此学习的表现可能在空间上更精确。现有的大多数融合方案(特征融合)都是通过对低分辨率表示的上采样来聚合高分辨率低水平和高水平表示。相反,HRNet在低分辨率表示的帮助下重复多分辨率融合以增强高分辨率表示,反之亦然。
先看一个主要结构(4个并行):
并行的多分辨率卷积流(也就是上图)
主要结构分四个阶段,从高分辨卷积流开始,逐步将高至低分辨率流逐个添加,形成新的阶段,然后并行连接多分辨率流。因此,下一阶段并行流的分辨率包括前一级的分辨率和一个较低的分辨率。
重复多分辨率融合
3种分辨率融合的例子
表示头或者说输出层
根据其推出不同版本的HRNet,不同结果:
2020.10.31
搞了一天百度的aistudio,学了一会paddle和他们的语义分割库。
2020.11.1
导师又丢了一篇新论文,这两天主要更论文内容。
2020.11.2
论文基本看完,感觉这篇论文质量比较高,值得一读。传送门
2020.11.3
试一试自步对比学习的代码。git主页
其主页讲的还是很详细的,对我这种菜鸡来说比较友好,唯一一个就是这些重识别的数据集有点乱,之前也没怎么涉及过,作者给的下载链接有的下起来也比较麻烦。举个例子:譬如personx这个数据集,其主页网站应该是俩版本?总之也在issue里面看到有人提类似的问题,先尝试再说,其余的东西主页都讲的比较清楚了。 这里我搭建的环境就是最新版的pytorch,官网复制下载代码就行,编译也都正常通过。
CUDA_VISIBLE_DEVICES=0,1,2\
python examples/spcl_train_uda.py \
-ds personx -dt market1501 --logs-dir logs/spcl_uda/personx2market_resnet50
用以上指令尝试运行,结果出错:
No module named 'numpy.core._multiarray_umath'
根据错误信息得知这是编译numpy C-拓展发生了错误
2020.11.4
我发现上面的问题以及之前的问题很可能跟conda的环境使用pip安装到全局有关,去查了一下这个问题,解决方法大都是修改配置文件的环境变量问题。但我导师这个服务器不知道为啥我没有权限修改,明明之前改过。经过一系列骚操作,包括在github上提这个沙雕问题,最后以另一种方式解决。以昨天的numpy编译为例,包括我今天出现的sklearn等等一系列问题,我都是通过一个方法解决(该方法只适用于conda下的虚拟环境用pip安装到全局,导致跑代码的时候各种混乱import):
比如昨天的错误,numpy有问题,该问题一般搜索到的解决方案是升级numpy或者重装numpy指定版本什么的,我这里的解决办法是pip uninstall numpy,把全局的卸载了,问题就消失了。包括后来的等等各种库,只要pip安装过都可以卸载,用conda在当前的虚拟环境重新装,而且必须要卸载,如果不卸载,只用conda重新装,跑代码的时候还是瞎逼import。
该方法可能治标不治本,所以有相同困扰的同学可以试试修改配置文件中的环境变量尝试,我这里没有权限只能通过该方法解决了。
最后成功代码截图如下:
并且我现在十分怀疑我前面几天那些个语义分割的模型配置问题也是跟这有关,有机会会继续尝试。
2020.11.5
昨天的代码跑了一晚上,还在目标域聚类中心初始化那里停着…也不知道是为啥,去git上问问吧。 今天继续尝试语义分割的代码,把之前的重新尝试。 首先尝试了HRNET+OCR,
其环境安装完毕,还没测试,主要是自己的数据集得重新编写json文件等等,明日尝试。
2020.11.6
该项目主页 其主页的get start文档有一个链接教学了如何训练自己的数据集,主要是更改json文件等。 那么今天编写了json文件与其脚本文件,我的数据是2020 BDCI的一个遥感数据集语义分割。 就根据自己的数据集修改相应的json对应一些变量,以及有一个config.profile,要填上自己的数据集路径和python解释器路径,脚本文件其链接上也说了要修改,但我不太懂sh文件的编写,不太知道要修改哪里,就没有修改,仍然使用的其示例的sh文件。 我的脚本文件名称叫run.sh 因此我的运行代码是
bash scripts/BDCI/run.sh train 1
结果提示没有预训练模型,忘记下了…
去其model.zoo下载预训练模型,很奇怪的是链接全部失效了只有一个能用,没办法再修改,看看怎么用吧。
二更
原来不是链接失效了,可能当时网络有点问题,回宿舍用网线就打开了,并且作者也给了另一个link下pretrained.pth
下预训练模型的时候我也顺便仔细检查了json,sh等等,也算是大概明白了要怎么写,又重新细写了一下,但发现我这个数据集没有验证集,我干脆从训练集分一部分出来吧…,所以又得重新传服务器,今天先到这吧。
2020.11.8
七号八号一起更吧,上了一次讨论班讲了一下自步对比学习,想稍微休息一下。
主要还是6号的那个模型,修改过json等文件之后,下载了正确的预训练模型之后跑起来了,但是报了很多size misbatch错误
emmmm这里可能是我没有理解他配置文件里面inputsize和cropsize吧?因为原本这个HRnet输入是1024*512来着,我的数据集是256*256的,所以我修改了一下,造成了misbatch的错误,现在尝试改回去试试,因为我看json文件中也有padding的一些做法。
2020.11.9
又仔细检查了一下json文件等,把尺寸改成原本的大小,看看我的数据进去的时候能不能被padding吧…后来发现testjson文件里面有对应的索引色要改,这里又看了半天遥感图片自己标注了一下索引色。运行代码如下
bash scripts/BDCI/hr+ocr/RUN.sh train 1
结果还是这样,那么就非常不理解了,看起来是加载模型的时候显示模型里面size batch什么的参数不匹配。我去看了其主页的issue也有人问类似的问题,但不了了之,我先提问吧,看看后续怎么解决。
那么再尝试一下其官方自己实现的代码吧。
2020.11.10
今天直接试了一下百度的paddle来做语义分割。教程在此 paddle封装应该还是非常到位的,使用起来按照教程蛮简单的,只不过其给的gpu特斯拉100已经很厉害了,训练起来还是很慢,俩小时估计就跑了8个epoch。又学习了一下其后台跑程序的教程。教程在此
现在放在后台跑了,但是百度这个框架还在起步测试阶段,这放在后台跑不能看,也不知道我操作的对不对,只能先试试了。
在自己服务器上我也尝试了多卡训练,但是paddle也很诡异的有多卡训练问题:
paddleseg的issue有人问这个问题,我去看了一下:
后续没有人回答该问题,并且我也尝试了几次,每次都失败了。懒得继续试了,用服务器也单卡跑着吧。并且在学习paddle的这段时间,顺便将hrnet+ocr的官方代码安装到服务器上尝试吧。
2020.11.11
今天作者回复我了,就是11.9的missize问题,原来是model与pretrained 权重选择不符,我还以为一个model对应多个权重文件可选择呢…看来还是我搞错了,把pretrained model 改为W48那个后,成功开始训练。
不过显卡有限,先把paddle那个跑完吧。(显卡还有别的同学一起用)
等到显卡空出来再试试多卡跑这个模型,这里就存个档。
今天老师又分了一篇论文,加上忙着打印开题报告论文综述等杂事,今天也没研究太多模型上的问题,明后天再把新论文更新一下吧。
2020.11.17
这次老师给的论文有点难,涉及到CRF条件随机场这个概念,要回顾学习一些随机过程、概率论知识,并且也比较难理解该模型,因此花费比较久时间看完。