赞
踩
数据读入的数据类型。
修改data的config中的dataset_type至自己的数据集名称,在初始化dataset的时候会会直接采用build_from_cfg(cfg, DATASETS, default_args)跳转至type=dataset_type名的类下读取,即第二段的内容。
当使用非mmseg数据类型的时候,需要重写数据读取部分,主要需要修改的是img_infos这一个变量参数,img_infos{[filename]=img_path,[ann_path]=ann_path},为了后面的模型能正常使用dataloader出来的数据,采用定义新的类class data (CustomDataset),继承父类,并复写地址信息读取部分的函数def load_annotations
读取的数据格式函数csv_segmentation_dataset,可以根据具体的数据类型更换,这里是csv的。此时还只是只有地址的list。
注:sample,mmseg仅提供了distributesample一个函数,但是mmseg底层仍然是pytorch,因此可以直接通过torch.utils.data.sample
def load_annotations(self, img_dir, img_suffix, ann_dir, seg_map_suffix,
split=None):
img_infos = []
#从csv里面读取数据地址#不用分train和val,用进程分开提取
#items.append((img_path, mask_path))
self.all_imgs = self.csv_segmentation_dataset(img_dir)
for i in range(len(self.all_imgs)):
img_info = dict(filename=self.all_imgs[i][0])
img_info['ann'] = dict(seg_map=self.all_imgs[i][1])
img_infos.append(img_info)
img_infos = sorted(img_infos, key=lambda x: x['filename'])
print_log(f'Loaded {len(img_infos)} images', logger=get_root_logger())
return img_infos
迭代器参数设置
img_norm_cfg = dict(
mean=[92.539,96.698,87.079], std=[37.640,29.517,26.452], to_rgb=False)
#支持波段数据因此可以设设置是否需要转RGB形式
crop_size = (512, 512)
train_pipeline = [
dict(type='LoadImageFromFile'),#读取images,array数据格式
dict(type='LoadAnnotations', reduce_zero_label=False),#读取images,array数据格式
dict(type='RandomFlip',prob=0),#是否进行随机翻转来增强数据,prob是随机的概率是多少
dict(type='Normalize', **img_norm_cfg),#根据均值和方差对images进行归一化
dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=0),#pading操作
dict(type='DefaultFormatBundle'),#这里是先修改通道数至1,DC(to_tensor(img), stack=True)
#ann做相同的处理,但转tensor.int64数据类型
dict(type='Collect', keys=['img', 'gt_semantic_seg']),#打包函数
]
其中DefaultFormatBundle在mmseg/datasets/pipelines/formatting.py中。
模型迁移至gpu
因此迭代器读到的最外层的数据类型实际上是datacontainer这种类型,对仅使用torch框架dp分布ddp分布还是直接.to(device=’cuda’)的model都无法直接读取。因此必须采用mmseg自己的build_dp()、build_ddp()的模型。与前者不同的是,单机单卡采用build_dp()。
训练
与之前的不同,mmseg采用的hook的形式完成循环训练,从apis/train.py里面可以很明显的看出来例如: runner.register_hook(eval_hook(val_dataloader, **eval_cfg),,priority='LOW'),runner.register_hook(hook, priority=priority),
又用 cfg.workflow确定当前工作状态。
mmcv/runner/epoch_based_runner.py中run_iter()函数是整个训练的大框架。
Log记录的参数:
使用tensorboard、interval的值为多久记录一次log
情况说明:
def losses(self, seg_logit, seg_label):定义中存在一句代码loss['acc_seg'] = accuracy(seg_logit,seg_label, ignore_index=self.ignore_index)
报错,访问了不允许的区域。
抽象说明:
函数A(self,a,b)中调用函数B(self,a,b),同时A、B调用时所需的变量名一致且AB不是同一个类,不能直接在A中传输采用变量名为a,b,此时出现B函数中调用时啊ab变量是一个指针类型,而并非原始a,b的数据类型了。分析原因是,A在调前时,无参数传入,a,b是以指针对象的形式存储在A 中,在模型编译过程中B则传入指针对象参数a,b在实际运行时就会一直报错。
py文件中调用不同级尤其是跨文件夹调用,或者调用上级文件的时候会报错。原因是文件运行的时候会环境定位在所在的文件夹,调用上层或者跨层就会有问题,需要在调用之前重新定位环境。
import pathlib
import sys
cwd_path = pathlib.Path(__file__).absolute()
parent_path = cwd_path.parent.parent.parent.as_posix()
#parent调用该文件夹所属路径的上一级目录就相当于调用第一级父目录
sys.path.append(parent_path)
或者:
cwd_path=os.getcwd()#获得当前工作目录
os.path.abspath('.')#获得当前工作目录
os.path.abspath('..')#获得当前工作目录的父目录
os.path.abspath(os.curdir)#获得当前工作目录
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。