solo2试跑报错记录
跑自己训练集前,注意自己的gpu个数和选用的训练文件对应!
1.solov2训练自己数据集
1.1先跑通demo
demo跑通说明环境配置没有问题
出现UserWarning: This overload of nonzero is deprecated,说torch的nonzero要用个as_type的参数(nonzero(*, bool as_tuple))
跳到相应文件下把inds = inds.nonzero
改成inds = inds.nonzero(as_type=false)
就行
1.2整理自己的数据集
1.2.1数据集格式
labelme标注后转为coco格式(annotations下放labelme转coco后的合并json文件,train和val里面放的是你用来训练的原图!),路径如下
1.2.2添加上自己的数据集
-
路径:SOLO-master/mmdet/core/evaluation/class_names.py
-
路径:SOLO-master/mmdet/datasets/coco.py
1.2.3修改配置文件
按照自己的需求选择配置文件,我用的是SOLO-master\configs\solov2\solov2_r50_fpn_8gpu_3x.py,对应的权重文件是SOLO-master\checkpoints\SOLOv2_R50_3x.pth(要自己下载放到对应路径,solo项目里给出了)
# model settings model = dict( type='SOLOv2', pretrained='torchvision://resnet50', backbone=dict( type='ResNet', depth=50, num_stages=4, out_indices=(0, 1, 2, 3), # C2, C3, C4, C5 frozen_stages=1, style='pytorch'), neck=dict( type='FPN', in_channels=[256, 512, 1024, 2048], out_channels=256, start_level=0, num_outs=5), bbox_head=dict( type='SOLOv2Head', num_classes=2, in_channels=256, stacked_convs=4, seg_feat_channels=512, strides=[8, 8, 16, 32, 32], scale_ranges=((1, 96), (48, 192), (96, 384), (192, 768), (384, 2048)), sigma=0.2, num_grids=[40, 36, 24, 16, 12], ins_out_channels=256, loss_ins=dict( type='DiceLoss', use_sigmoid=True, loss_weight=3.0), loss_cate=dict( type='FocalLoss', use_sigmoid=True, gamma=2.0, alpha=0.25, loss_weight=1.0)), mask_feat_head=dict( type='MaskFeatHead', in_channels=256, out_channels=128, start_level=0, end_level=3, num_classes=256, norm_cfg=dict(type='GN', num_groups=32, requires_grad=True)), ) # training and testing settings train_cfg = dict() test_cfg = dict( nms_pre=500, score_thr=0.1, mask_thr=0.5, update_thr=0.05, kernel='gaussian', # gaussian/linear sigma=2.0, max_per_img=100) # dataset settings dataset_type = 'my_data' data_root = 'D:/view/things/SOLO-master/mmdet/datasets/coco/' # data_root = 'mmdet/datasets/coco/'# 自己的数据集路径 img_norm_cfg = dict( mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True) train_pipeline = [ dict(type='LoadImageFromFile'), dict(type='LoadAnnotations', with_bbox=True, with_mask=True), dict(type='Resize', img_scale=[(548,192),],# 自己要训练的图片大小 # img_scale=[(1333, 800), (1333, 768), (1333, 736), # (1333, 704), (1333, 672), (1333, 640)], multiscale_mode='value', keep_ratio=True), dict(type='RandomFlip', flip_ratio=0.5), dict(type='Normalize', **img_norm_cfg), dict(type='Pad', size_divisor=32), dict(type='DefaultFormatBundle'), dict(type='Collect', keys=['img', 'gt_bboxes', 'gt_labels', 'gt_masks']), ] test_pipeline = [ dict(type='LoadImageFromFile'), dict( type='MultiScaleFlipAug', img_scale = (548,192), # img_scale=(1333, 800), flip=False, transforms=[ dict(type='Resize', keep_ratio=True), dict(type='RandomFlip'), dict(type='Normalize', **img_norm_cfg), dict(type='Pad', size_divisor=32), dict(type='ImageToTensor', keys=['img']), dict(type='Collect', keys=['img']), ]) ] data = dict( imgs_per_gpu=2, workers_per_gpu=2, train=dict( type=dataset_type, ann_file=data_root + 'annotations/train.json', img_prefix=data_root + 'train/', pipeline=train_pipeline), val=dict( type=dataset_type, ann_file=data_root + 'annotations/val.json', img_prefix=data_root + 'val/', pipeline=test_pipeline), test=dict( type=dataset_type, ann_file=data_root + 'annotations/val.json', img_prefix=data_root + 'val/', pipeline=test_pipeline)) # optimizer optimizer = dict(type='SGD', lr=0.00125, momentum=0.9, weight_decay=0.0001) optimizer_config = dict(grad_clip=dict(max_norm=35, norm_type=2)) # learning policy lr_config = dict( policy='step', warmup='linear', warmup_iters=500, warmup_ratio=0.01, step=[27, 33]) checkpoint_config = dict(interval=1) # yapf:disable log_config = dict( interval=50, hooks=[ dict(type='TextLoggerHook'), # dict(type='TensorboardLoggerHook') ]) # yapf:enable # runtime settings total_epochs = 36 device_ids = range(8) dist_params = dict(backend='nccl') log_level = 'INFO' work_dir = './work_dirs/solov2_release_r50_fpn_8gpu_3x' load_from = None resume_from = None workflow = [('train', 1)]
python tools/train.py configs/solov2/solov2_r50_fpn_8gpu_3x.py
2.一堆报错
2.1 KeyError: Caught KeyError in DataLoader worker process 0.KeyError: -2
是torch报错:在迭代过程中,测试集没有重置索引,索引混乱
看到
我初次接触这种图像分割的内容,参考了
后来我修改workers_per_gpu=0,成为报错gt_labels.append(self.cat2label[ann['category_id']]),不再是torch的报错
跳转,锁定到
这里的category_id对应错误,我打开annotations下的json文件查看
print(ann)发现category_id不同
是我曾在labelme转化coco格式的脚本中修改了category_id的定义,之前有个博文说这里-1能将背景也作为一个标记出来,先改回原来的默认值
2.2 File "<array_function internals>", line 6, in concatenate.ValueError: need at least one array to concatenate
出现这个问题一定是和数据集有关的错误(路径、标签格式)【对,路径错误也会报这个错】
说标签错误,跳到实现迭代的函数下康康,在循环最后输出indices发现为空,在循环中间输出indice康康,这里发现print(indice)
却没有任何输出
调了半天发现是flag为空list,上翻flag的定义,发现flag是在自定义的Sampler下,且已检查flag为存在,说明整理数据集时,flag就没有做好。但是我找了加载数据的地方,并没有提到flag,这里是第一次定义,也就是说数据本身是存在flag标签的,但是我用来训练的数据没有
重新把数据集整理后,可以看到每张图单个的json文件里出现了flag
不必要添加background,有人想把背景和标签分隔开,如果只是做前景的标签识别,不用
检查数据集每一个部分的读取是否对应
解决方案:
再把数据集的绝对路径改为相对路径(
注意用的数据集,train和val文件夹下放的都是标注前的原图!不要用经过标注中的图像->也会导致相应错误!!
2.3 OSError: symbolic link privilege not held
解决方案:尝试用管理员权限打开pycharm再跑一遍
其他可能:参考这篇
题外话,可算是跑起来了,只能说在跑网络前多检查几遍自己数据集的配置,以免训练自己数据集的时候因为它配置不对而报错(尤其是这时候的报错信息很难让人联想到本身的数据集出错了,error列出的内容和实际有问题的地方偏差会很大)
调试工具
除了pycharm自带的调试功能,推荐一个也很方便的