OpenMMLab-AI实战营第二期——5-2. MMSegmentation代码课

news2024/11/27 8:48:40

文章目录

  • 1. 自定义数据集
    • 1.0 整理数据集为特定格式
    • 1.1 持久化运行(用文件定义)
    • 1.2 运行时生效(直接运行时定义一个class)
    • 1.3 注意事项
  • 2. 配置文件
  • 3. 运行训练和测试
  • X. 其他语义分割数据集

视频链接:MMSegmentation代码课
教程链接:MMSegmentation_Tutorials/20230612

1. 自定义数据集

参考文档:https://mmsegmentation.readthedocs.io/en/main/advanced_guides/add_datasets.html

1.0 整理数据集为特定格式

── data
│   ├── my_dataset
│   │   ├── img_dir # 这个名字最好也改成一样的,因为config里data_root那些也用的是这个
│   │   │   ├── train
│   │   │   │   ├── xxx{img_suffix}
│   │   │   │   ├── yyy{img_suffix}
│   │   │   │   ├── zzz{img_suffix}
│   │   │   ├── val
│   │   ├── ann_dir
│   │   │   ├── train
│   │   │   │   ├── xxx{seg_map_suffix}
│   │   │   │   ├── yyy{seg_map_suffix}
│   │   │   │   ├── zzz{seg_map_suffix}
│   │   │   ├── val

1.1 持久化运行(用文件定义)

主要对两个文件进行操作:

  1. 自定义一个数据集类,比如要对西瓜进行语义分割,则可以创建一个watermelon.py类,要放在mmsegmentation/mmseg/datasets/watermelon.py,里面要实现一个WatermelonDataset(BaseSegDataset)类,继承mmcv里的默认base数据集类
  2. mmsegmentation/mmseg/datasets/__init__.py进行修改,把刚刚定义的那个WatermelonDataset索引到这里面
  3. 保证把这两个文件放到对应的位置,
    • 如果是在本地等比较方便的地方操作,可以直接文件管理器操作;
    • 如果是jupyter环境等不太方便可视化操作的远程环境,可以
    # 使用三组双引号,就是保留这个字符串里所有格式(包括回车),所以三组双引号里的内容会被原样写入文件中
    	watermelon = """ watermelon.py文件里的内容 """
    	watermelon_save_path = "/content/mmsegmentation/mmseg/datasets/watermelon.py"
    	with open(watermelon_save_path,'w') as f:
    	    f.write(watermelon)
    # 同理,__init__文件也是
    	initModified=""" __init__.py文件里的内容 """
    	init_path = "/content/mmsegmentation/mmseg/datasets/__init__.py"
    with open(init_path,'w') as f:
      f.write(initModified)
    
"""
文件内容举例,西瓜语义分割,
红色:瓜瓤;绿色:瓜皮;白色:里面的靠近瓜皮的那些白瓤;白色种子;黑色种子;tabBlue(除西瓜之外的背景部分),是unlabeled的
"""

<!----mmsegmentation/mmseg/datasets/watermelon.py------>

from .basesegdataset import BaseSegDataset
from mmseg.registry import DATASETS
@DATASETS.register_module()
class WatermelonDataset(BaseSegDataset):
    METAINFO = dict(
    	# 注意,unlabeled放最后
        classes=('red', 'green', 'white',
                 'seed-black', 'seed-white', 'tabBlue'),
        # 颜色是RGB顺序的
        palette=[[214, 39, 40], [44, 160, 44], [255, 255, 255],
                 [0, 0, 0], [255, 255, 255], [31, 119, 180]])

    def __init__(self,
                 img_suffix='.jpg', # 图像的后缀
                 seg_map_suffix='.png', # mask语义分割标签的后缀
                 reduce_zero_label=False, # 是否要移除ID为0的标签
                 **kwargs) -> None:
        super().__init__(
            img_suffix=img_suffix,
            seg_map_suffix=seg_map_suffix,
            reduce_zero_label=reduce_zero_label,
            **kwargs)

<!-------mmsegmentation/mmseg/datasets/__init__.py>
# 添加import
from .watermelon import WatermelonDataset
# 把WatermelonDataset加到__all__数组的最后
__all__ = [
    'BaseSegDataset', 'BioMedical3DRandomCrop', 'BioMedical3DRandomFlip',
    'CityscapesDataset', 'PascalVOCDataset', 'ADE20KDataset',
    'PascalContextDataset', 'PascalContextDataset59', 'ChaseDB1Dataset',
    'DRIVEDataset', 'HRFDataset', 'STAREDataset', 'DarkZurichDataset',
    'NightDrivingDataset', 'COCOStuffDataset', 'LoveDADataset',
    'MultiImageMixDataset', 'iSAIDDataset', 'ISPRSDataset', 'PotsdamDataset',
    'LoadAnnotations', 'RandomCrop', 'SegRescale', 'PhotoMetricDistortion',
    'RandomRotate', 'AdjustGamma', 'CLAHE', 'Rerange', 'RGB2Gray',
    'RandomCutOut', 'RandomMosaic', 'PackSegInputs', 'ResizeToMultiple',
    'LoadImageFromNDArray', 'LoadBiomedicalImageFromFile',
    'LoadBiomedicalAnnotation', 'LoadBiomedicalData', 'GenerateEdge',
    'DecathlonDataset', 'LIPDataset', 'ResizeShortestEdge',
    'BioMedicalGaussianNoise', 'BioMedicalGaussianBlur',
    'BioMedicalRandomGamma', 'BioMedical3DPad', 'RandomRotFlip',
    'SynapseDataset', 'REFUGEDataset', 'MapillaryDataset_v1',
    'MapillaryDataset_v2', 'WatermelonDataset'
]

例如:
在这里插入图片描述
也可以直接去这里看:
https://github.com/open-mmlab/mmsegmentation/blob/main/mmseg/datasets/cityscapes.py
,这个文件夹中所有支持的数据集都是以上面类似的格式定义的。

注意

  • 这里虽然也是METAINFO,和之前MMPretrain里属性名称一样,但是MMPretrain只需要在py文件里写上这个属性,不需要额外定义一个数据集类,是因为其提供了一个自定义数据集类。
  • 而MMSegmentation需要自己提供数据集类,两个库并不一样。MMPretrain是针对分类任务的,MMSegmentation是语义分割任务

1.2 运行时生效(直接运行时定义一个class)

直接在代码中运行以下内容:

# 只有第一行引用的时候变了
from mmseg.datasets.basesegdataset import BaseSegDataset
from mmseg.registry import DATASETS

@DATASETS.register_module()
class WatermelonDataset(BaseSegDataset):
    METAINFO = dict(
        classes=('red', 'green', 'white','seed-black', 'seed-white','tabBlue'),
        palette=[[214, 39, 40], [44, 160, 44], [255, 255, 255],[0, 0, 0],
         [255, 255, 255],[31, 119, 180],])

    def __init__(self,
                 img_suffix='.jpg',
                 seg_map_suffix='.png',
                 reduce_zero_label=False,
                 **kwargs) -> None:
        super().__init__(
            img_suffix=img_suffix,
            seg_map_suffix=seg_map_suffix,
            reduce_zero_label=reduce_zero_label,
            **kwargs)

1.3 注意事项

①记得用的时候要注册:

from mmengine.runner import Runner
from mmseg.utils import register_all_modules

# register all modules in mmseg into the registries
# do not init the default scope here because it will be init in the runner
register_all_modules(init_default_scope=False)

②确认环境:
一般认为有两种安装方式,git源码安装,pip/mim安装

git clone https://github.com/open-mmlab/mmsegmentation.git -b dev-1.x
cd mmsegmentation && pip install -v -e .

pip install "mmsegmentation>=1.0.0"

由于会对具体文件进行操作,所以其实建议走git源码安装,如果运行报错这个数据类没有注册,考虑一下自己现在运行的是git源码安装的环境,还是pip/mim安装的环境

2. 配置文件

一般都是基于预训练模型对应的配置文件进行修改

from mmengine import Config
raw_config_path ="/content/mmsegmentation/configs/pspnet/pspnet_r18-d8_4xb4-80k_potsdam-512x512.py"
cfg = Config.fromfile(raw_config_path)

①可以利用代码进行修改

cfg.train_dataloader.dataset.type='WatermelonDataset'
cfg.val_dataloader.dataset.type='WatermelonDataset'
cfg.test_dataloader.dataset.type='WatermelonDataset'

cfg.train_dataloader.dataset.data_root='/content/Watermelon87_Semantic_Seg_Mask'
cfg.val_dataloader.dataset.data_root='/content/Watermelon87_Semantic_Seg_Mask'
cfg.test_dataloader.dataset.data_root='/content/Watermelon87_Semantic_Seg_Mask'

cfg.test_dataloader = cfg.val_dataloader

②保存成文件再修改

  • 由于MMengine的config都是继承的,所以上面原始的config文件里都是引用其它文件的内容,想要查看完整的配置,可以
from mmengine import Config
# 查看完整的配置文件(包括继承的)
print(cfg.pretty_text)

config_file_path = '/content/drive/MyDrive/OpenMMLab/Exercise_4/pspnet-watermelon_20230618.py'
cfg.dump(config_file_path)
  • 然后直接在保存的有完整配置的那个py文件里进行修改

3. 运行训练和测试

可以用脚本模式,也可以用提供的API

可以

# 使用脚本命令行,看起来要稍微复杂一点
# 测试精度评估
!python /content/mmsegmentation/tools/test.py \
/content/drive/MyDrive/OpenMMLab/Exercise_4/pspnet-watermelon_20230618.py\
/content/drive/MyDrive/OpenMMLab/workdir/PSPNet/iter_1000.pth\
--work-dir /content/drive/MyDrive/OpenMMLab/workdir/PSPNet

# 测试速度评估
!python /content/mmsegmentation/tools/analysis_tools/benchmark.py \
/content/drive/MyDrive/OpenMMLab/Exercise_4/pspnet-watermelon_20230618.py\
/content/drive/MyDrive/OpenMMLab/workdir/PSPNet/iter_1000.pth\
--work-dir /content/drive/MyDrive/OpenMMLab/workdir/PSPNet

也可以

from mmengine import Config

config_file_path = '/content/drive/MyDrive/OpenMMLab/Exercise_4/pspnet-watermelon_20230618.py'
cfg = Config.fromfile(config_file_path)

from mmengine.runner import Runner
from mmseg.utils import register_all_modules
register_all_modules(init_default_scope=False)
runner = Runner.from_cfg(cfg) 
# 这步其实就会打印出配置信息,创建work_dirs文件夹了,
# 同时这步就会把数据文件路径那些读进来,所以如果数据有问题,就要从这步重新开始执行

runner.train() # 训练
runner.test() # 直接使用上面runner的训练结果权重进行test,config也是同一个

X. 其他语义分割数据集

  • kaggle:Glomeruli (HuBMAP external) 1024x1024-小鼠肾小球组织病理切片语义分割
  • kaggle:Semantic segmentation of aerial imagery-迪拜卫星航拍多类别语义分割
    • 所以kaggle不仅有竞赛,也有没有竞赛的单纯的数据集。。。

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

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

相关文章

ThreadPoolExecutor源码

介绍 ThreadPoolExecutor 是 Java 中实现线程池的一个类&#xff0c;它是 ExecutorService 接口的一个实现类。线程池可以用来优化线程的使用&#xff0c;避免频繁地创建和销毁线程&#xff0c;以及限制并发线程的数量&#xff0c;从而提高应用程序的性能。 public class Thr…

读发布!设计与部署稳定的分布式系统(第2版)笔记06_用户

1. 系统的人类用户天生就具备进行创造性破坏的本事 1.1. 用户会消耗内存 1.2. 用户会做奇怪和随机的事情 1.2.1. fuzzing工具箱、基于属性的测试或模拟测试 1.3. 恶意用户总是存在的 1.3.1. 灾祸总会发生&#xff0c;坏人肯定存在 1.4. 用户会合伙对付你 2. 难伺候的用户…

【linux】opencv修改摄像头分辨率

起因 发现linux系统下调用opencv修改摄像头分辨率&#xff0c;一直修改不成功。 原本 正常在window下面读取摄像头数据是如下代码&#xff1a; # capture from web camcap cv2.VideoCapture(0)# set widthcap.set(3, 1280)# set heightcap.set(4, 720)while self._run_flag…

武职302303笔记-day01

这里写自定义目录标题 开发永和小票开发步骤1、对页面进行需求分析 使用CSS的方式 Order.html问题&#xff1a;html代码和css样式代码交织 idea开发后端程序使用chatGPT给我们打工QRCreate.java 开发永和小票 开发步骤 1、对页面进行需求分析 页面是很多文字组成&#xff0c;…

虹科分享丨如何保证我们的数据安全?|数据保护

一、数据安全 你可能已经正在寻找加密服务来帮助保护你的组织的数据&#xff0c;但如果你是一个不熟悉实践或管理数据的人员&#xff0c;"数据加密 "这个短语可能会感觉像技术术语或只是像一个模糊的概念&#xff0c;没有具体的解决方案。 但事实上&#xff0c;数据…

git、axios、模块化导出引入、promise、webpack、

GIT总结 git config --global user.name "你的用户名" git config --global user.email "你的邮箱" git config -l 命令来查看配置信息 git init 仓库初始化 touch index.html 创建index.html文件 git add index.html 文件加入暂存区 git add -A 将全部文件…

车载以太网 - 网络层 - IPv4/IPv6

目录 一、网络层基本信息介绍 1、网络协议适用范围 2、IPv4和IPv6的地址 3、Ethernet Frames 的类型 二、两种类型IP地址的定义: ECU通信的几种方式 路由器(Router)和IP 地址的概念 路由实例介绍 三、IPv4地址介绍 地址分类&#xff1a; 各类型IP可支持的最大网络数…

C语言实现移位密码

一.移位密码 移位密码(Caesar Cipher)也叫凯撒密码是一种简单的加密技术&#xff0c;它通过将明文中的每个字母按照指定的位数进行移位&#xff0c;从而生成密文。例如&#xff0c;在一个"左移3位"的移位密码中&#xff0c;文中的每个字母都向左移动3个位置&#xff…

7.2 SpringBoot实现上传图片API + url映射本地路径registry.addResourceHandler

文章目录 前言一、url映射本地路径二、上传图片API2.1 接口UploadService2.2 实现类UploadServiceImpl2.3 上传图片Controller 三、测试最后 前言 在图书借阅系统里&#xff0c;有很多图片需要前端展示&#xff0c;这些图片大都是由用户上传&#xff0c;保存在服务端&#xff…

chatgpt赋能python:Python拆数程序:如何快速分解数字?

Python拆数程序&#xff1a;如何快速分解数字&#xff1f; 在计算机编程中&#xff0c;数字拆分是一个非常重要的概念。拆分数字可以让我们更好地理解数字格式&#xff0c;进行计算和分析。而Python作为一种功能强大的编程语言&#xff0c;提供了许多高效的工具来帮助我们快速…

【备战秋招】每日一题:华东师范大学保研机试-2022-罗马数字

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客罗马数字 题目内容 罗马数字是古罗马使用的记数系统&#xff0c;现今仍很常见。 罗马数字有七个基本符号: I,V,X,L,C,D,M。 罗马数字IVXLCDM对应的阿拉伯数字1510501005001000 需要注意的是罗马数字与十进位数字的…

chatgpt赋能python:Python拆分语句,让数据处理更有效率

Python 拆分语句&#xff0c;让数据处理更有效率 Python是一种强大的编程语言&#xff0c;不仅支持各种应用开发&#xff0c;而且非常适合数据处理。Python的易用性和灵活性使其成为了数据科学家和工程师首选的编程语言之一。Python的字符串拆分功能能够轻松处理数据的分割和组…

从C语言到C++_20(仿函数+优先级队列priority_queue的模拟实现+反向迭代器)

目录 1. priority_queue的模拟实现 1.1 未完全的priority_queue 1.2 迭代器区间构造和无参构造 1.3 仿函数的介绍和使用 1.4 完整priority_queue代码&#xff1a; 1.5 相关笔试选择题 答案&#xff1a; 2. 反向迭代器 2.1 反向迭代器的普通实现 reverse_iterator.h&a…

性能测试基础知识(一)性能测试策略

性能测试策略 一、什么是性能测试&#xff1f;二、性能测试的目的三、性能测试策略1、基准测试2、并发测试3、负载测试4、压力测试5、其他测试 一、什么是性能测试&#xff1f; 性能测试是在一定的负载1条件下&#xff0c;系统的响应时间等特性是否满足特定的性能需求。需要有…

软考A计划-系统集成项目管理工程师-信息化知识(二)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

【高危】Apache Nifi JMS组件存在JNDI反序列化漏洞

漏洞描述 Apache NiFi 是一个开源的数据流处理和自动化工具&#xff0c; JndiJmsConnectionFactoryProvider 控制器组件用于配置 JMS 连接地址。 Apache NiFi 1.8.0 至 1.21.0 版本中&#xff0c;由于 JndiJmsConnectionFactoryProvider 控制器服务允许已授权的用户配置 URL…

NUCLEO-F411RE RT-Thread 体验 (3) - GCC环境 uart驱动的移植以及console的使用

NUCLEO-F411RE RT-Thread 体验 (3) - GCC环境 uart驱动的移植以及console的使用 1、准备工作 在第一节里&#xff0c;我们用stm32cubemx将pa2 pa3管脚配置成usart2&#xff0c;用于跟st-link虚拟串口的打印用&#xff0c;那么我们先重定向printf函数&#xff0c;看这条通道是…

创建 Python 脚本以在 Linux 中打开新终端并运行命令

文章目录 创建在 Linux 中打开新终端并运行命令的 Python 脚本在 Linux 中创建 Python 脚本来检查 Python 版本使打开的终端保持活动状态并在其中运行命令的 Python 脚本在 Linux 中使用 Python 子模块 subprocess() 将命令传递到新终端总结 Linux 操作系统以其程序员广泛使用的…

PB9如何实现datawindow打印导出PDF,PB导出PDF

PB9如何实现datawindow打印导出PDF&#xff0c;PB导出PDF&#xff1f; 之前的saveas导出pdf&#xff0c;设置非常麻烦。需要 1. 安装gs705w32.exe 2. 安装虚拟打印机 Sybase\Shared\PowerBuilder\drivers\ADIST5.INF 手动添加打印机 这个方法现在对于win64不支持。 今天客…

window11 + python3.7+NVDIA11.7 +pytorch GPU 加速环境配置

window11 python3.7NVDIA11.7 pytorchGPU 加速环境配置 关于pytorch配置GPU环境我在网上看了很多&#xff0c;其实现在基本上没有windows 11 版本环境的配置但是其实没必要担心这个&#xff0c;这没有影响。 对于博主呢&#xff0c;其实不太像配置GPU的&#xff0c;因为其实…