mmsegmentation训练自己的数据集

news2024/11/6 0:48:30

文章目录

  • 前言
  • 一、安装MMSegmentation
  • 二、数据集转换
    • 1.labelme标签数据转化为voc数据
  • 三、训练设置
    • 1.建立数据集文件,并存入数据集
    • 2.设置训练配置文件
  • 四、使用官方权重
    • 1、选择预测的方法
    • 2、查看方法支持的预训练数据集和权重
      • 权重位置
      • 找到对应的数据集
      • 下载权重
    • 3、使用代码进行预测


前言

mmsegmentation
labelme
中文博客:labelme的使用

一、安装MMSegmentation

步骤 0.从官方网站下载并安装 miniconda(https://docs.conda.io/en/latest/miniconda.html)
步骤 1.创建 conda 环境并激活它。

conda create --name openmmlab python=3.8 -y
conda activate openmmlab

步骤 2。按照官方说明安装 PyTorch,例如在 GPU 平台上:

conda install pytorch torchvision -c pytorch

在 CPU 平台上:

conda install pytorch torchvision cpuonly -c pytorch

二、数据集转换

1.labelme标签数据转化为voc数据

可以修改custom_colors 中的颜色,自定义自己的颜色顺序。可以复制替换
labelme:github
在这里插入图片描述

#!/usr/bin/env python

# 导入未来模块中的print_function,确保即使在Python 2.x环境下也能使用Python 3.x的print函数特性  
from __future__ import print_function  
  
# 导入必要的库  
import argparse  # 用于解析命令行参数  
import glob  # 用于查找符合特定规则的文件路径名  
import os  # 提供了一种方便的使用操作系统功能的方式  
import os.path as osp  # os.path模块主要用于路径操作  
import sys  # 提供对一些变量和函数,这些变量和函数与Python解释器紧密相关  
  
import imgviz  # 一个用于图像可视化的库  
import numpy as np  # 用于进行科学计算的基础库  
  
import labelme  # 一个图形图像注释工具,用于图像分割等任务  
import PIL.Image
custom_colors = {  
    1: (0, 0, 0),      # 黑色   背景色
    2: (255, 0, 0),   # 红色    第一个类别
    3: (0, 255, 0),   # 绿色    第二个类别
    4: (0, 0, 255),   # 蓝色    第三个类别
    5: (255, 255, 0), # 黄色  
    6: (255, 255, 255), # 白色 
    7: (128, 128, 0), # 黄褐色 
    8: (0, 255, 255), # 青色(蓝绿色)  
    9: (255, 0, 255), # 品红色(洋红色)  
    10: (128, 0, 0),   # 深红色(棕色)    
    11: (0, 128, 0),   # 深绿色(橄榄绿)  
    12: (0, 0, 128),   # 深蓝色(海军蓝)  
}

  
def main():  
    # 创建一个ArgumentParser对象,用于处理命令行参数  
    parser = argparse.ArgumentParser(  
        formatter_class=argparse.ArgumentDefaultsHelpFormatter  # 使用帮助信息格式化器  
    )  
    # 添加命令行参数  
    parser.add_argument("input_dir", help="输入注释目录")  
    parser.add_argument("output_dir", help="输出数据集目录")  
    parser.add_argument(  
        "--labels", help="标签文件或逗号分隔的文本", required=True  # 必填参数  
    )  
    parser.add_argument(  
        "--noobject", help="不生成对象标签的标志", action="store_true"  # 布尔标志  
    )  
    parser.add_argument(  
        "--nonpy", help="不生成.npy文件的标志", action="store_true"  # 布尔标志  
    )  
    parser.add_argument(  
        "--noviz", help="禁用可视化的标志", action="store_true"  # 布尔标志  
    )  
    # 解析命令行参数  
    args = parser.parse_args()  
  
    # 检查输出目录是否存在,如果存在则退出程序  
    if osp.exists(args.output_dir):  
        print("输出目录已存在:", args.output_dir)  
        sys.exit(1)  
    # 创建必要的目录结构  
    os.makedirs(args.output_dir)  
    os.makedirs(osp.join(args.output_dir, "JPEGImages"))  
    os.makedirs(osp.join(args.output_dir, "SegmentationClass"))  
    if not args.nonpy:  
        os.makedirs(osp.join(args.output_dir, "SegmentationClassNpy"))  
    if not args.noviz:  
        os.makedirs(osp.join(args.output_dir, "SegmentationClassVisualization"))  
    if not args.noobject:  
        os.makedirs(osp.join(args.output_dir, "SegmentationObject"))  
        if not args.nonpy:  
            os.makedirs(osp.join(args.output_dir, "SegmentationObjectNpy"))  
        if not args.noviz:  
            os.makedirs(osp.join(args.output_dir, "SegmentationObjectVisualization"))  
    print("正在创建数据集:", args.output_dir)  
  
    # 读取标签文件或解析标签字符串  
    if osp.exists(args.labels):  
        with open(args.labels) as f:  
            labels = [label.strip() for label in f if label]  
    else:  
        labels = [label.strip() for label in args.labels.split(",")]  
  
    # 处理标签,生成类名和类ID的映射  
    class_names = []  
    class_name_to_id = {}  
    for i, label in enumerate(labels):  
        class_id = i - 1  # 类ID从-1开始  
        class_name = label.strip()  
        class_name_to_id[class_name] = class_id  
        if class_id == -1:  
            assert class_name == "__ignore__"  # 忽略标签  
            continue  
        elif class_id == 0:  
            assert class_name == "_background_"  # 背景标签  
        class_names.append(class_name)  
    class_names = tuple(class_names)  
    print("类名:", class_names)  
    print("id:", class_name_to_id) 
    
    # 提取字典的值(颜色元组的列表)  
    colors_list = list(custom_colors.values())  
  
    # 将颜色列表转换为NumPy数组,指定数据类型为uint8  
    colormap = np.array(colors_list, dtype=np.uint8) 
    #colormap = np.array(custom_colors, dtype=np.uint8) 
    # 保存类名到文件  
    out_class_names_file = osp.join(args.output_dir, "class_names.txt")  
    with open(out_class_names_file, "w") as f:  
        f.writelines("\n".join(class_names))  
    print("已保存类名:", out_class_names_file)  
  
    # 遍历输入目录中的每个JSON文件  
    for filename in sorted(glob.glob(osp.join(args.input_dir, "*.json"))):  
        print("正在从:", filename, "生成数据集")  
  
        # 加载LabelFile对象  
        label_file = labelme.LabelFile(filename=filename)  
  
        # 提取文件名和生成输出文件的路径  
        base = osp.splitext(osp.basename(filename))[0]  
        out_img_file = osp.join(args.output_dir, "JPEGImages", base + ".jpg")  
        out_clsp_file = osp.join(args.output_dir, "SegmentationClass", base + ".png")  
        if not args.nonpy:  
            out_cls_file = osp.join(  
                args.output_dir, "SegmentationClassNpy", base + ".npy"  
            )  
        if not args.noviz:  
            out_clsv_file = osp.join(  
                args.output_dir,  
                "SegmentationClassVisualization",  
                base + ".jpg",  
            )  
        if not args.noobject:  
            out_insp_file = osp.join(  
                args.output_dir, "SegmentationObject", base + ".png"  
            )  
            if not args.nonpy:  
                out_ins_file = osp.join(  
                    args.output_dir, "SegmentationObjectNpy", base + ".npy"  
                )  
            if not args.noviz:  
                out_insv_file = osp.join(  
                    args.output_dir,  
                    "SegmentationObjectVisualization",  
                    base + ".jpg",  
                )  
  
        # 加载图像数据  
        img = labelme.utils.img_data_to_arr(label_file.imageData)  
        imgviz.io.imsave(out_img_file, img)  
  
        # 将形状转换为标签  
        cls, ins = labelme.utils.shapes_to_label(  
            img_shape=img.shape,  
            shapes=label_file.shapes,  
            label_name_to_value=class_name_to_id,  
        )  
        ins[cls == -1] = 0  # 将忽略标签的实例标签设置为0  
        print("cls:" ,cls)
        # 保存类标签  
        #labelme.utils.lblsave(out_clsp_file, cls)  
        
        if osp.splitext(out_clsp_file)[1] != ".png":
            out_clsp_file += ".png"
        # Assume label ranses [-1, 254] for int32,
        # and [0, 255] for uint8 as VOC.
        if cls.min() >= -1 and cls.max() < 255:
            lbl_pil = PIL.Image.fromarray(cls.astype(np.uint8), mode="P")
            #colormap = imgviz.label_colormap()
            lbl_pil.putpalette(colormap.flatten())
            lbl_pil.save(out_clsp_file)
        else:
            raise ValueError(
                "[%s] Cannot save the pixel-wise class label as PNG. "
                "Please consider using the .npy format." % filename
            )
        
        if not args.nonpy:  
            np.save(out_cls_file, cls)  
        if not args.noviz:  
            # 可视化类标签  
            clsv = imgviz.label2rgb(  
                cls,  
                imgviz.rgb2gray(img),  
                label_names=class_names,  
                colormap=colormap,
                font_size=15,  
                loc="rb",  
            )  
            imgviz.io.imsave(out_clsv_file, clsv)  
  
        if not args.noobject:  
            # 保存实例标签  
            labelme.utils.lblsave(out_insp_file, ins)  
            if not args.nonpy:  
                np.save(out_ins_file, ins)  
            if not args.noviz:  
                # 可视化实例标签  
                instance_ids = np.unique(ins)  
                instance_names = [str(i) for i in range(max(instance_ids) + 1)]  
                insv = imgviz.label2rgb(  
                    ins,  
                    imgviz.rgb2gray(img),  
                    label_names=instance_names,  
                    font_size=15,  
                    loc="rb",  
                )  
                imgviz.io.imsave(out_insv_file, insv)  
  
  
if __name__ == "__main__":  
    main()

执行指令:

python labelme2voc.py br brvoc  --labels labels.txt

labelme2voc.py为以上这个python文件
br为自己使用labelme打过标签的数据集
brvoc为VOC数据集格式,需要生成的格式
labels.txt为标签文件

这里我的标签文件
在这里插入图片描述

结果:
在这里插入图片描述
在这里插入图片描述

三、训练设置

1.建立数据集文件,并存入数据集

这里选择以ADE数据集的格式训练DeepLabV3+。
新建一个data文件,二级目录如下,用于存放训练的数据集

mmsegmentation
├── mmseg
├── tools
├── configs
├── data
│   ├── ade
│   │   ├── ADEChallengeData2016
│   │   │   ├── annotations
│   │   │   │   ├── training
│   │   │   │   ├── validation
│   │   │   ├── images
│   │   │   │   ├── training
│   │   │   │   ├── validation

将刚才打过标签的文件分为训练集和测试集
在这里插入图片描述

  • annotations放的是segmentationclass,分别是训练集和测试集,自己按照自己的需求将训练集分为训练集和测试集
    在这里插入图片描述
    在这里插入图片描述

- images放的是原始图片,分别是训练集和测试集

在这里插入图片描述
在这里插入图片描述

2.设置训练配置文件

选择以下模型文件,该模型文件的位置:
在这里插入图片描述
从文件名字可以看出,选择了训练80k次的DeepLabV3+的ADE数据集

在这里插入图片描述
这里主要是四个文件:
在这里插入图片描述
分别打开这几个文件:

  • models/deeplabv3plus_r50-d8.py文件

在这里插入图片描述

    • /schedules/schedule_160k.py文件
      可以适当修改总轮数,和保存的参数文件的次数,根据自己的样本调整
      在这里插入图片描述
  • 类别颜色设置
    在这里插入图片描述
    将原来的注释掉,更改为自己的颜色和类别:在这里插入图片描述
    b5a83fecb908689e.png)

  • 开始训练,并记住这个位置
    在这里插入图片描述

在这里插入图片描述
修改部分:
在这里插入图片描述

点击运行。

四、使用官方权重

1、选择预测的方法

官方支持的方法:github
在这里插入图片描述
比如我这里选择DeepLabV3+

2、查看方法支持的预训练数据集和权重

权重位置

找到configs下具体的方法,这里我选择的是DeepLabV3+。
在这里插入图片描述

找到对应的数据集

在这里插入图片描述

下载权重

这里选择ade20k-512*512的权重
在这里插入图片描述
建立一个文件夹存放下载的文件,位置自定义,记住位置就行。命令行执行以下语句,首先的激活你的虚拟环境并安装 mmsegmentation.

conda activate openmmlab
mim download mmsegmentation --config deeplabv3plus_r50-d8_4xb4-160k_ade20k-512x512 --dest .

这里会生成两个文件:
在这里插入图片描述

3、使用代码进行预测

在这里插入图片描述

这里我填写的位置:
在这里插入图片描述
点击运行。

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

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

相关文章

LeetCode994. 腐烂的橘子(2024秋季每日一题 54)

在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元格中没有…

Pinctrl子系统中Pincontroller构造过程驱动分析:imx_pinctrl_soc_info结构体

往期内容 本专栏往期内容&#xff1a; Pinctrl子系统和其主要结构体引入Pinctrl子系统pinctrl_desc结构体进一步介绍Pinctrl子系统中client端设备树相关数据结构介绍和解析 input子系统专栏&#xff1a; 专栏地址&#xff1a;input子系统input角度&#xff1a;I2C触摸屏驱动分析…

地理信息科学专业想搞GIS开发:学前端还是后端?

地理信息科学专业的同学是学前端开发比较好呢还是学后端开发比较好呢&#xff1f; 部分网友&#xff1a;学前端更好 主修前端更好&#xff0c;因为地信学后端&#xff0c;是卷不赢学计算机的 本科卷前端&#xff0c;硕士阶段可以卷后端 甚至有网友直呼&#xff0c;地信根本没有…

批处理之for语句从入门到精通--呕血整理

文章目录 一、前言二、for语句的基本用法三、文本解析显神威&#xff1a;for /f 用法详解四、翻箱倒柜遍历文件夹&#xff1a;for /r五、仅仅为了匹配第一层目录而存在&#xff1a;for /d六、计数循环&#xff1a;for /l后记 for语句从入门到精通 一、前言 在批处理中&#…

第8章利用CSS制作导航菜单(第八次作业)

效果图如下&#xff1a; Html代码如下&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>山水之间</title><style type"text/css">import url("../css/work1.css");</style…

Ubuntu22.04 安装图形界面以及XRDP教程

一、准备环境 1.一台服务器安装系统ubuntu&#xff08;这里大部分ubuntu系统可以同用&#xff09; 2.安装的ubuntu系统未安装图形界面 二、操作步骤 1.远程ssh或者直接登录服务器命令行界面 ssh -p 远程端口 rootIP 2.更新系统软件包 sudo apt update # 更新本地的软件包…

深度学习基础知识-编解码结构理论超详细讲解

编解码结构&#xff08;Encoder-Decoder&#xff09;是一种应用广泛且高效的神经网络架构&#xff0c;最早用于序列到序列&#xff08;Seq2Seq&#xff09;任务&#xff0c;如机器翻译、图像生成、文本生成等。随着深度学习的发展&#xff0c;编解码结构不断演变出多种模型变体…

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM)

扫描电镜的超低温冷冻制样及传输技术(Cryo-SEM) 扫描电镜&#xff08;Scanning Electron Microscope&#xff0c;简称SEM&#xff09;是一种利用聚焦电子束扫描样品表面&#xff0c;通过检测二次电子或反射电子等信号来获取样品表面形貌信息的显微观察技术&#xff1b;然而&…

JS手写:从0开始认识【柯里化】【支持占位符的柯里化】

柯里化 功能介绍 柯里化是拆分函数的一种手段&#xff0c;允许我们以偏函数的方式调用这个函数。 比如说&#xff0c;原来的函数A必须传入三个参数才能运行。经过柯里化处理之后的函数KA传入三个参数&#xff0c;能成功运行&#xff1b;传入两个参数也能&#xff0c;但是会返…

WebSocket 连接频繁断开的问题及解决方案

文章目录 WebSocket 连接频繁断开的问题及解决方案1. 引言2. 什么是 WebSocket&#xff1f;2.1 WebSocket 的优势2.2 WebSocket 的工作原理 3. WebSocket 连接频繁断开的常见原因3.1 服务器端问题3.1.1 服务器负载过高3.1.2 服务器配置不当3.1.3 超时设置 3.2 网络问题3.2.1 网…

openGauss开源数据库实战十二

文章目录 任务十二 openGauss逻辑结构:表管理任务目标实施步骤一、准备工作二、创建表1.新建表默认保存在public模式中2.在一个数据库的不同模式下创建表3.创建表的时候定义约束4.创建表时使用自增数据类型5.使用现有的表创建新表 三、查看表的信息1.在gsql中查看表的定义2.查看…

ADI仿真连接有效性检查方法

1、确认仿真器引脚接插OK. A、检查电脑正常连接 B、确认仿真器引脚定义匹配与上电正确连接 2、打开CCES&#xff0c;打开Debug Configurations 3、连接芯片类型选择 4、点击Configuratior… 5、选择Test…,在点Start&#xff0c;确认状态都OK&#xff0c;即可开始仿真调…

docker部署nginx+nacos+redis+java镜像和容器

nginx镜像制作 Dockerfile内容&#xff1a; # 基础镜像 FROM nginx # author MAINTAINER ruoyi# 挂载目录 VOLUME /home/ruoyi/projects/ruoyi-ui # 创建目录 RUN mkdir -p /home/ruoyi/projects/ruoyi-ui # 指定路径 WORKDIR /home/ruoyi/projects/ruoyi-ui # 复制conf文件到路…

SAP RFC 用户安全授权

一、SAP 通讯用户 对于RFC接口的用户&#xff0c;使用五种用户类型之一的“通讯”类型&#xff0c;这种类型的用户没有登陆SAPGUI的权限。 二、对调用的RFC授权 在通讯用户内部&#xff0c;权限对象&#xff1a;S_RFC中&#xff0c;限制进一步可以调用的RFC函数授权&#xff…

Uniapp的H5以及App不支持后端传FormData类型参数的解决方案

在uniapp中不支持FormData的传参&#xff0c;这就很恶心&#xff1b;如果强行传的话会提示&#xff0c;请求失败的报错信息。 因为后端必须要FormData类型的传参&#xff0c;所以在查阅一系列方案后&#xff0c;有一种解决办法可以完美解决。 代码&#xff1a; init() {const…

PyTorch 训练集、验证集、测试集、模型存档、正则化项

为什么要将数据集划分为三个部分&#xff1f;三个部分的作用&#xff1f;三个部分数据集的比例应如何设定&#xff1f; 另外一种常见的数据集划分方法是将数据集划分为两个部分&#xff08;训练集和测试集&#xff09;&#xff0c;这种划分方法存在的问题在于&#xff0c;模型…

Flask轻松上手:从零开始搭建属于你的Web应用

目录 一、准备工作 二、安装Flask 三、创建你的第一个Flask应用 创建一个新的Python文件 编写Flask应用代码 运行Flask应用 四、创建一个简单的博客系统 定义路由和文章列表 创建模板文件 运行并测试博客系统 五、使用数据库存储用户信息 安装Flask-SQLAlchemy 修…

游戏启动失败:8种修复xinput1_3.dll错误的几种方法教程,轻松解决xinput1_3.dll错误

当你准备好在一天的工作后放松一下&#xff0c;启动你最爱的游戏&#xff0c;却突然收到一个“xinput1_3.dll 丢失”的错误消息&#xff0c;这无疑是令人沮丧的。幸运的是&#xff0c;xinput1_3.dll丢失问题通常可以通过几个简单的步骤来解决。本文将详细介绍这些步骤&#xff…

Halcon-模板匹配(WPF)

halcon的代码 dev_open_window (0, 0, 512, 512, black, WindowHandle) read_image (Image, C:/Users/CF/Desktop/image.jpg) dev_display (Image)draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2) gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2) r…

《AI从0到0.5》之提示工程

参考资料&#xff1a;《AI提示工程&#xff1a;基础 应用 实例》万欣 主要内容&#xff1a; 该文章是对《AI提示工程&#xff1a;基础 应用 实例》这本书的浓缩整理&#xff0c;旨在让读者快速的了解AI提示工程的概念和设计原则、策略和技巧、部分应用案例。并结合笔者自…