MMSegmentation使用记录

news2024/11/22 22:11:01

一、官网下载文件:

当前最新版本为1.0.0rc2

https://github.com/open-mmlab/mmsegmentation/releases/tag/v1.0.0rc2

下载源码解压文件可得到最新版的代码

二、配置环境:

这部分省略:按照给的README文件很快就配置好了

https://github.com/open-mmlab/mmsegmentation/blob/master/docs/en/get_started.md#installation

三、配置自己的dataset文件

1.首先进入到:mmseg/datasets文件夹下,在这里复制一份voc.py 命名为mydata.py

a.更改类名为MyDataset:

b.更改classes和palette为自己的类别和像素值

c.在__init__更改自己的图片和label后缀名

@DATASETS.register_module()
class MyDataset(BaseSegDataset):
    """Pascal VOC dataset.

    Args:
        split (str): Split txt file for Pascal VOC.
    """
    METAINFO = dict(
        # classes=('background', 'aeroplane', 'bicycle', 'bird', 'boat',
        #          'bottle', 'bus', 'car', 'cat', 'chair', 'cow', 'diningtable',
        #          'dog', 'horse', 'motorbike', 'person', 'pottedplant', 'sheep',
        #          'sofa', 'train', 'tvmonitor'),
        # palette=[[0, 0, 0], [128, 0, 0], [0, 128, 0], [128, 128, 0],
        #          [0, 0, 128], [128, 0, 128], [0, 128, 128], [128, 128, 128],
        #          [64, 0, 0], [192, 0, 0], [64, 128, 0], [192, 128, 0],
        #          [64, 0, 128], [192, 0, 128], [64, 128, 128], [192, 128, 128],
        #          [0, 64, 0], [128, 64, 0], [0, 192, 0], [128, 192, 0],
        #          [0, 64, 128]]

        classes=('wall', 'ceiling', '改为自己的类别'),
        palette=[[157, 25, 239], [172, 57, 105], '改为自己的类别',]

    )

    def __init__(self,
                 ann_file,
                 img_suffix='.png',
                 seg_map_suffix='.png',
                 **kwargs) -> None:
                     super().__init__(
                         img_suffix=img_suffix,
                         seg_map_suffix=seg_map_suffix,
                         ann_file=ann_file,
                         **kwargs)
                     assert self.file_client.exists(
                         self.data_prefix['img_path']) and osp.isfile(self.ann_file)

d.在mmseg/datasets/__init__.py中加入自己的数据名称

四、配置configs文件:

1.更改__base__

进入到configs/_base_/datasets

复制pascal_voc12.py一份命名为my_data.py

更改my_data.py中的

data_type : 为自己的数据类型,也就是"MyDataset"

data_root : 为自己的数据集的父文件夹路径

train_loader:

更改train_dataloader、val_dataloader、test_dataloader中的dataset['data_prefix']

由于我的目录结构如下,所以更改项目路径如下

(其他参数根据需要自己更改即可)

train_dataloader = dict(
    batch_size=4,
    num_workers=4,
    persistent_workers=True,
    sampler=dict(type='InfiniteSampler', shuffle=True),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        data_prefix=dict(
            img_path='img', seg_map_path='mask'),
        ann_file='train.txt',
        pipeline=train_pipeline))
val_dataloader = dict(
    batch_size=1,
    num_workers=4,
    persistent_workers=True,
    sampler=dict(type='DefaultSampler', shuffle=False),
    dataset=dict(
        type=dataset_type,
        data_root=data_root,
        data_prefix=dict(
            img_path='img', seg_map_path='mask'),
        ann_file='val.txt',
        pipeline=test_pipeline))
test_dataloader = val_dataloader

2.建立configs

复制configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_ade20k-512x512.py

到configs/knet/knet-s3_r50-d8_fcn_8xb2-adamw-80k_mydata-512x512.py

更改自己的配置文件:

a.修改__base__继承的文件,删除原本的ade20k,改为刚刚添加的my_data.py

b.将model中所有的num_classes=150替换为自己的数据类别,当前版本有3处

c.以下可选:

如果需要更改其他的默认设置,可参考 官网说明:

五、执行训练:

在完成上面的配置之后就可以进行模型的训练了

训练脚本:python + train.py+ configs文件地址

如下:

python .\tools\train.py configs\knet\knet-s3_r50-d8_fcn_8xb2-adamw-80k_mydata-512x512.py

六、执行预测:

训练完成之后,如果没有设置自己的work_dir参数,默认所有的文件会保存在work_dirs文件夹下,

新建测试脚本infer.py如下:

from mmseg.apis import inference_model, init_model, show_result_pyplot
from mmseg.utils import register_all_modules

register_all_modules()

# 配置文件和权重的路径
config_file = r'configs\knet\knet-s3_r50-d8_fcn_8xb2-adamw-80k_mydata-512x512.py'
checkpoint_file = r'work_dirs\knet-s3_r50-d8_fcn_8xb2-adamw-80k_mydata-512x512\iter_8000.pth'

model = init_model(config_file, checkpoint_file, device='cuda:0')

# 需要进行预测的图片地址
img = r'.\img\00019.png'

result = inference_model(model, img)

# out_file为预测结果的保存路径
show_result_pyplot(model, img, result, out_file='result.jpg', opacity=0.5)

如果训练集没有问题的话可以进行正常的预测,本人在这里遇到了一个问题,预测的色卡和训练集的色卡无法形成对应,比如在训练集中:物体A对应的颜色为a,物体B对应的颜色为b,在预测的时候会发现物体A的颜色为b,物体B的颜色为c。最后查找原因是:训练集Mask的调色板每一张都不相同,在这里需要注意的是,按照上述方式进行,训练集的mask必须是8bit的格式,调色板必须根据自己的类别进行添加到图片中。下边提供函数可以帮助有此问题的朋友:

检查数据集调色板是否一致(脚本):

def read_palatte(img_path=None):
    img = Image.open(img_path)
    # print(type(img.getpalette()))
    print(img.getpalette())
    print(len(img.getpalette()))

用这个函数去读取每个mask,如果打印的值每次都不一样或者其中的颜色值和自己的类别相差较大的话说明数据集是有问题的。下边会介绍调整数据集

七、深度学习图像分割Mask制作(不是从零):

制作的工具和方式有很多,可以进行分割的mask种类也很多,这里仅介绍8位伪彩图的核心的几个步骤,以下提到的mask均为8位伪彩图:

1.获取看起来正常的mask

a.不管使用任何工具:尽可能先得到从表面看起来比较正常的mask(各个物体颜色正常,放大之后没有斑点,),分割用的mask一般是png且mode为P格式的,如果得到的是jpg的或者mode非P,通常是需要进行转化的。

查看图片的mode:

msk = Image.open(msk_path)
assert msk.mode == 'P', "mode error"

2.将mask转为数字类别图

这里采用中间格式的形式,先将原始的mask转为小数字类别灰度图,再将小数字的单通道图转为训练用8位伪彩图(我对灰度图有需求所以分为两步,但是这里可以合并成一步,有需要请自行合并)

def src_2_gray(src_mask_path, sv_gray_path):
    # 注意将palette改为自己的调色板
    palette = { 0: (157, 25, 239),
                1: (172, 57, 105),
                2: (166, 232, 11),
                3: (86, 203, 240)}
    src_mask = mmcv.imread(src_mask_path, channel_order='rgb')
    gray_mask = np.zeros((src_mask.shape[0], src_mask.shape[1]), dtype=np.uint8)

    for c, i in palette.items():
        m = np.all(src_mask == np.array(c).reshape(1, 1, 3), axis=2)
        gray_mask[m] = i
    mmcv.imwrite(gray_mask, sv_gray_path)

3.将数字类别图转为训练用的8位伪彩图:

def gray2color(img_path, save_path):
    # '''
    # img+path:类别灰度图
    # save_path:存储路径
    # '''
    # 注意将PALETTE改为自己的调色板
    PALETTE=[[157, 25, 239], [172, 57, 105], [166, 232, 11], [86, 203, 240]]
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    img = Image.fromarray(img)
    palette = []
    for i in range(256):
        palette.extend((i, i, i))
        
    palette[:3*len(PALETTE)] = np.array(
        lette, dtype='uint8').flatten()
    
    img.putpalette(palette)
    img.save(save_path)

经过上边两步得到的就是正常可训练的mask了

八、提取预测Mask

使用官方提供的预测脚本将将opacity设置为1.0 最终输出的是在原始rgb图上进行涂色之后的图像,因此生成的颜色值是不纯的,如果想提取比较纯净的mask,需要额外进行处理:

这里定义一个函数:

def gray2color(img, save_path='out_color_mask.png'):
    PALETTE=[[157, 25, 239], [172, 57, 105], [166, 232, 11], [86, 203, 240]]
    lette = PALETTE
    img = Image.fromarray(img)
    palette = []
    for i in range(256):
        palette.extend((i, i, i))

    # 此处乘的是种类数量
    palette[:3*len(lette)] = np.array(
        lette, dtype='uint8').flatten()

    img.putpalette(palette)
    img.save(save_path)

更改:mmseg/visualizatio/local_visualizer.py 中的SegLocalVisualizer类的_draw_sem_seg方法:引用这个函数即可生成纯净的mask图了

最终生成效果如下(只用了几张图训练,效果就一般般了):

(mmlab系列的工具大体上步骤都差不多,后边有空再更下其他几个的,希望能够帮助到需要的伙伴😊) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101685.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vuetify中的v-pagination如何实现分页

大家好,我是雄雄。 前言 昨天在改一个系统的时候遇到了个技能点,观察解决了好久,终于解决了,趁热打铁,今天来记录一下。 这个系统是个个人博客,目前我也在使用,但是有个地方用的很不舒服。就是…

32 CPP多态

注意: 1 只需要在基类的函数声明中加上virtual关键字,函数定义时不能加; 2 在派生类中重定义虚函数时,函数特征要相同; 3 当在基类中定义了虚函数时,如果派生类没有重定义该函数,那么将使用基类的虚函数…

设计模式原则 - 接口隔离原则(二)

接口隔离原则一 官方定义二 案例演示普通方案案例分析解决方案解决方案案例总结三 与单一职责原则对比一 官方定义 接口隔离原则(Interface Segregation Principle),又称为ISP原则,官方定义为: Clients should not be…

docker安装seata单节点的详细教程

一、环境部署 1、在自己的数据库新建seata数据库 2、利用seata官方提供的seata数据库sql脚本创建所需数据库seata以及表,脚本地址如下: seata/mysql.sql at 1.4.1 seata/seata GitHub 3、查看docker官方镜像仓库版本 4、拉取seata安装镜像 docker…

【机器学习实战】基于代价敏感学习的AdaCost方法用于信用卡欺诈检测

1. 数据集 数据集地址:Credit Card Fraud Detection 数据集整体浏览: 284807个样本,30个特征,1个分类标签Class Class为0的是多数类,一共有284315个样本。 Class为1的是少数类,一共有492个样本&#xff…

写给Python社群的第11课:Python线程,进程,协程,3个毫无关系的兄弟

文章目录⛳️ 线程、进程与协程🔥 进程与线程简介⛳️ Python 多线程模块🔥 threading 模块🔥 threading 模块实践⛳️ Python 并发进程模块🔥 Process 创建多进程⛳️ 线程、进程与协程 线程、进程、协程 这三个名称相似的概念&…

大话设计模型 Task03:工厂、制造、观察

目录一、建造者模式问题描述问题分析模式定义代码实现二、观察者模式问题描述问题分析模式定义代码实现一、建造者模式 问题描述 我的要求是你用程序画一个小人,这在游戏程序里非常常见,现在简单一点,要求是小人要有头、身体、两手、两脚就可…

左偏树原理详解

一 点睛 左偏树(leftist tree 或 leftist heap)也叫作左偏堆、左倾堆、左式堆,是计算机科学中的一种树,也是一种优先队列实现方式,属于可并堆,在信息学中十分常见,在统计、最值、模拟、贪心等类…

Win11安装WSL2和Nvidia驱动(2022-12-19)

文章目录前言系统环境WSL 1和WSL 2功能对比安装WSL2更新和升级包配置VSCode配置GPU加速安装Nvidia驱动安装Cuda Toolkit通过PyTorch安装CUDA Toolkit测试Nvcc参考链接前言 以前捣鼓过wsl,即Windows下的Linux子系统,但兼容性依然比不过原生的Linux系统&a…

【Linux】进程间通信之管道

目录🌈前言🌸1、IPC介绍🍢1.1、进程间通信的目的🍡1.2、背景和发展🍠1.3、进程间通信的分类🌷2、管道🍡2.1、概念🍢2.2、管道的原理🍣2.3、匿名管道🍤2.4、管…

DOM算法系列004-判断给定节点是否为body元素

UID: 20221218221939 aliases: tags: source: cssclass: created: 2022-12-18 如果我们要判定给定的一个节点是不是页面body与元素节点,该如何判断呢? 一般来说, 一个HTML页面内只有一个body元素 但是,如果我们非要在页面内写超过…

Spring boot 整合 redis

Spring boot 整合 redis一、Spring boot 整合redis1.1 启动redis1.2 redis desktop manager1.3 常用命令二、操作2.1 依赖包2.2 配置2.3 简单测试2.4 StringRedisTemplate一、Spring boot 整合redis 1.1 启动redis 命令行启动 redis-server redis-cli1.2 redis desktop mana…

基于electronbot作品bootLoader设计

文章目录 前言 一、芯片程序区规划和流程 1、flash区规划 2、两区运行流程 3、bootLoader代码体现 4、electronbot代码体现: 二、bootLoader代码设计 1.下载程序步骤 2.通讯协议格式 三、libusb开发及需要注意的事情 1、bootLoader复合设备 2、electronbot复合设备…

基础算法系列--[基本数据结构KMP]

文章目录前言链表单链表双链表栈和队列栈队列单调KMP前言 今天要搞的是基本的一些数据结构,当然咱们这个不是那么“正经”。当然今天也没啥代码,因为太简单了(其实我也想水一下~) 链表 单链表 单链表这个东西,应该…

Prometheus+Grafana

K8S prometheusK8S1.Prometheus(普罗米修斯)2.Prometheus可以做什么3.Prometheus的特点4.prometheus 相关组件二、prometheus与zabbix的区别zabbix架构区别三、prometheus架构分析1.TSDB2.时间序列数据库的特点3.prometheus 相关组件1.prometheus 核心组…

【计算机网络】实验五 网络层与链路层协议分析(PacketTracer)

一、实验目的 通过本实验,进一步熟悉PacketTracer的使用,学习路由器与交换机的基本配置,加深对网络层与链路层协议的理解。 二、实验内容: 4.1 路由器交换机的基本配置 打开下面的实验文件,按提示完成实验。 4.2…

直流微电网中潮流(Matlab代码实现)

目录 1 概述 1.1 直流电网中的潮流 1.2 创新点和相关工作 1.3 本文结构 2 数学/网络模型 2.1 主-从操作 2.2 孤岛运行 3 牛顿法 4 案例及Matlab代码实现 1 概述 潮流是一个非线性问题,需要用牛顿法求解具有恒定功率端子的直流微电网。本文提出了牛顿法在…

曙光来临!Nature终于发现了新冠特效药?或将彻底终结新冠时代!

百趣代谢组学文献分享:2022年即将过去,随着疫苗的全面接种和三年以来“动态清零”的坚持,我们在应对新冠病毒如潮水般的攻击中取得了阶段性成果。虽然大家陆陆续续投入到正常的工作生活中,但是我们都知道新冠并未被“打败”&#…

MySQL中这14个有用的小知识,快学起来吧

前言 我最近用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。 1.group_concat 在我们平常的工作中,使用group by进行分组的场景,是非常多的。 比如想统计出用户表中&…

如何在产品开发中讨论概念设计?

每当你看到一辆在路上行驶的汽车、书桌上的笔记本电脑、工业包装生产线、医院设备、家用仪器和其他形式的概念设计创意产品会感到难以置信,这就是我们在产品开发中讨论概念设计的原因。 概念设计是一个尚未解决或到目前为止尚未令人满意的问题。这是一个深思熟虑的解…