0%

MMSegmentation框架简单使用-30min

自动摘要: 简介: 1.隶属于openmmlab旗下,专注于pytorch二维分割; 2.适用于Linux,Windows和macOS。它需要Python3.6+,CUDA9.2+和PyTorch1. ……..

简介:

  1. 隶属于openmmlab旗下,专注于pytorch二维分割;
  2. 适用于Linux,Windows和macOS。它需要Python 3.6+,CUDA 9.2+和PyTorch 1.3+;
  3. 官方教程地址:https://mmsegmentation.readthedocs.io/en/latest/get_started.html

安装:

  1. 安装核心**mmcv(默认认为已经安装好cuda-pytorch)**;

    1
    2
    pip install -U openmim
    mim install mmcv-full
  2. 从源码安装框架

    1. 不要想着用官方pip安装,不然修改文件需要到python包目录下,一些官方示例不好运行,因为用pip安装不好找到对应测试样本。
      1
      2
      git clone https://github.com/open-mmlab/mmsegmentation.git
      cd mmsegmentation
  3. 测试

    1. 需要下载配置和检查点文件。

      1
      mim download mmsegmentation --config pspnet_r50-d8_512x1024_40k_cityscapes --dest .
    2. 推理演示.

1
python demo/image_demo.py demo/demo.png configs/pspnet/pspnet_r50-d8_512x1024_40k_cityscapes.py pspnet_r50-d8_512x1024_40k_cityscapes_20200605_003338-2966598c.pth --device cuda:0 --out-file result.jpg
  • 将在当前文件夹中看到一个新图像,其中分割蒙版覆盖在所有对象上。result.jpg

训练自己的数据:

  • 官方https://mmsegmentation.readthedocs.io/en/latest/dataset_prepare.html上提供了各种类型开源数据集加载方式,原则上只要做成类似的就可以快速跑起来。
  • 因没有过多深入这个框架,也懒得学,因为只给我2个小时时间, 所以采用直接修改源码。
  • 数据可以用labelme(https://github.com/wkentaro/labelme)制作和生成。
  1. 准备数据:创建data文件夹,data内我们放入x(输入源),y(输出源)
    1. 注意:输入为灰度图,标签为8bit的标签图。

  2. 修改源码:我们尝试修改官方提供的cityscapes的数据加载器,让其适应我们的数据,从而达到cityscapes类就是我们需要的类,这样官方所有模型都可以跑;
    1. 思路:pytorch数据加载器一定是通过自身dataset加载,所以找到对应代码,把对应标签改成我们这样的3类(牙,牙龈,背景)即可,然后加载数据让其只认尾缀jpg,png加载,不用特定适应cityscapes名称;
    2. 本例默认使用HRNET,配置索引在:\configs\hrnet\fcn_hr18_512x1024_160k_cityscapes.py。
      1. **”datasets\cityscapes.py” **是mmseg框架的数据加载器;将其改为如下:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        @DATASETS.register_module()
        class CityscapesDataset(CustomDataset):
        """Cityscapes dataset.

        The ``img_suffix`` is fixed to '_leftImg8bit.png' and ``seg_map_suffix`` is
        fixed to '_gtFine_labelTrainIds.png' for Cityscapes dataset.
        """

        CLASSES = ('teeth', 'gum', 'background') # 类别

        PALETTE = [[128, 0, 0], [0, 128, 0], [0, 0, 0]] # 标签对应类别颜色

        def __init__(self,
        img_suffix='.jpg', # 输入源只认jpg尾缀
        seg_map_suffix='.png',# 输入源只认png尾缀
        **kwargs):
        super(CityscapesDataset, self).__init__(
        img_suffix=img_suffix, seg_map_suffix=seg_map_suffix, **kwargs)
      2. “configs_base_\datasets\cityscapes.py” 是mmseg框架的数据配置文件,将其修改如下,我这里图方便。如果还需改图片大小等,可以在里面自定义。

      3. “lib/models/bn_helper.py”,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
data = dict(
samples_per_gpu=1,#单GPU注意,设置为1,不然容易爆显存
workers_per_gpu=1,
train=dict(
type=dataset_type,
data_root=data_root,
img_dir='x', # 输入目录
ann_dir='y', # 标签目录
pipeline=train_pipeline),
val=dict(
type=dataset_type,
data_root=data_root,
img_dir='x',
ann_dir='y',
pipeline=test_pipeline),
test=dict(
type=dataset_type,
data_root=data_root,
img_dir='x',
ann_dir='y',
pipeline=test_pipeline))
  1. 开始训练
    1
    python .\tools\train.py   .\configs\hrnet\fcn_hr48_512x1024_160k_cityscapes.py    --work-dir ./sw/ --deterministic --no-validate

推理:

  • 需要修改mmseg\core\evaluation\class_names.py ,否则推理会默认按照开源数据的类别去推理,改成如下所示:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    def cityscapes_classes():
    """Cityscapes class names for external use."""
    # return [
    # 'road', 'sidewalk', 'building', 'wall', 'fence', 'pole',
    # 'traffic light', 'traffic sign', 'vegetation', 'terrain', 'sky',
    # 'person', 'rider', 'car', 'truck', 'bus', 'train', 'motorcycle',
    # 'bicycle'
    # ]
    return [
    'teeth', 'gum', 'background'
    ]


    # 137行也要改成下面这样
    def cityscapes_palette():
    """Cityscapes palette for external use."""
    # return [[128, 64, 128], [244, 35, 232], [70, 70, 70], [102, 102, 156],
    # [190, 153, 153], [153, 153, 153], [250, 170, 30], [220, 220, 0],
    # [107, 142, 35], [152, 251, 152], [70, 130, 180], [220, 20, 60],
    # [255, 0, 0], [0, 0, 142], [0, 0, 70], [0, 60, 100], [0, 80, 100],
    # [0, 0, 230], [119, 11, 32]]
    return [[128, 0, 0], [0, 128, 0], [0, 0, 0]]

    1
    python demo/image_demo.py .\data\cityscapes\x\aachen\merge_0.jpg .\sw\fcn_hr48_512x1024_160k_cityscapes.py .\sw\latest.pth --device cuda:0

欢迎关注我的其它发布渠道