【调试总结1】mmseg调试问题

mmseg用自己数据调试

  1. 数据读入的数据类型。

    修改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
    
  2. 迭代器参数设置

    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中。

  3. 模型迁移至gpu

    因此迭代器读到的最外层的数据类型实际上是datacontainer这种类型,对仅使用torch框架dp分布ddp分布还是直接.to(device=’cuda’)的model都无法直接读取。因此必须采用mmseg自己的build_dp()、build_ddp()的模型。与前者不同的是,单机单卡采用build_dp()。

  4. 训练

    与之前的不同,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()函数是整个训练的大框架。

  5. Log记录的参数:

    使用tensorboard、interval的值为多久记录一次log
    【调试总结1】mmseg调试问题_第1张图片

函数调用时传参变成了对象数据

情况说明:

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)#获得当前工作目录

你可能感兴趣的:(pytorch,python,深度学习)