1.简介
最近在做分割任务,看了一篇《A ConvNet for the 2020s》里面提到一个upernet网络做分割任务,发现现在很多做分割的都基于mmsegmentation这个类似的工具箱做,所以我也尝试用它训练一下,也方便以后做对比实验。因为第一次使用mmsegmentation,所以不太熟练,经过几天努力终于跑通了,在这里记录和分享一下,免得以后自己忘记那个步骤,又跑不通了。
github的代码链接:https://github.com/open-mmlab/mmsegmentation
2.环境介绍
要根据自己的电脑或者服务器的配置(CUDA版本)来选择安装相应的pytorch版本。python我直接安装了3.7的版本(官方要求大于3.6就可以了)。
创建环境指令
conda create -n mmlab python=3.7
安装pytorch
pytorch的官网链接代码:https://pytorch.org/get-started/previous-versions
我电脑的cuda版本是10.2的,所以装的pytorch版本是1.5.1的(官方要求大于1.3的就可以了)。
# CUDA 10.2
conda install pytorch==1.5.1 torchvision==0.6.1 cudatoolkit=10.2 -c pytorch
我使用服务器的cuda版本是11.4的,所以装的1.7.1版本的pytorch。
# CUDA 11.0
conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch
3.安装mmcv
建议安装mmcv前先安装一下opencv(从别的代码得到的经验),反正后面也要装。
opencv安装指令
pip install opencv-python
1)使用mim安装mmcv(跟官网一样)
pip install -U openmim
mim install mmcv-full
我默认安装的mmcv-full版本是1.7.1。安装其它版本的话可以将上面的第二条指令换成下面的。(1.x.x表示版本,如mmcv-full==1.5.1)
mim install mmcv-full==1.x.x
2)使用pip安装mmcv
可以参考这个官方提供的网址:https://mmcv.readthedocs.io/en/latest/get_started/installation.html 这里面可以让你根据自己的系统,cuda版本,torch版本安装对应的mmcv-full版本。下面是一个例子:
pip install mmcv-full==1.5.0 -f https://download.openmmlab.com/mmcv/dist/cu111/torch1.8/index.html
网址一点内容截图
4.安装mmsegmentation
我是源码安装的
从github上下载代码,然后解压到自己的文件夹下。
然后在mmsegmentation目录下执行以下指令(注意最后那个点也是指令的一部分):
pip install -v -e .
下面是我在自己电脑下采用pycharm编译器运行的方式:
服务器上就更简单了,这里就不说了。
5.验证安装
这部分按照官网来就可以了,在windowsx下权重和配置的可能有点问题,我没下成功(我从服务器上下的)
验证推理那一步不想像官网那样需要将配置文件和权重的路径一起作为指令输入,可以按照下面方式改一下(其实就是把配置文件(configs),权重和输出的路径在代码中配置好,然后直接运行就可以了)。
6.按照voc格式准备自己的数据集。
7.使用自己的数据集训练upernet_convnext分割网络。
1)在mmsegmentation目录下的configs/base/datasets/下创建一个our_dataset.py文件。
我的our_dataset.py的文件内容如下(其实就是将mmsegmentation原有的pascal_voc12.py的内容复制过来,然后改一下dataset_type和data_root,懒的话可以直接在pascal_voc12.py上改):
# dataset settings
dataset_type = 'Our_Dataset'
data_root = '/semantic_Datasets/VOCdevkit/VOC2007'
img_norm_cfg = dict(
mean=[123.675, 116.28, 103.53], std=[58.395, 57.12, 57.375], to_rgb=True)
crop_size = (512, 512)
train_pipeline = [
dict(type='LoadImageFromFile'),
dict(type='LoadAnnotations'),
dict(type='Resize', img_scale=(2048, 512), ratio_range=(0.5, 2.0)),
dict(type='RandomCrop', crop_size=crop_size, cat_max_ratio=0.75),
dict(type='RandomFlip', prob=0.5),
dict(type='PhotoMetricDistortion'),
dict(type='Normalize', **img_norm_cfg),
dict(type='Pad', size=crop_size, pad_val=0, seg_pad_val=255),
dict(type='DefaultFormatBundle'),
dict(type='Collect', keys=['img', 'gt_semantic_seg']),
]
test_pipeline = [
dict(type='LoadImageFromFile'),
dict(
type='MultiScaleFlipAug',
img_scale=(2048, 512),
# img_ratios=[0.5, 0.75, 1.0, 1.25, 1.5, 1.75],
flip=False,
transforms=[
dict(type='Resize', keep_ratio=True),
dict(type='RandomFlip'),
dict(type='Normalize', **img_norm_cfg),
dict