1.1【Mask-RCNN训练自己的数据集】---- Part One:制作数据集(全部流程总结+部分释义)

2023-11-19

写在前面

该实现基于Tensorflow、Keras框架,在Ubuntu16.04下运行。

官方github MaskRCNN demo

一.制作数据集

1.1 下载安装Labelme

Labelme用来制作图像分割数据集,在安装Labelme之前需要安装下载其所需要的一些依赖库,具体的安装方式见这篇博客
Labelme安装
Labelme github链接
由于笔者之前已经安装过所需要的依赖库,所以在ubuntu终端下直接运行pip install labelme即可,这里就不在赘述。
启动Labelme

labelme

1.2 标注数据集

  • 在正式标注数据集之前最好对自己的数据集进行一定的处理。样本量如果太小则需进行数据增强,其次在制作数据集时需要考虑所训练网络对input image的需求,就MaskRcnn而言需要保证输入图片是square。官方解释
    (在阅读部分博客时有的博主说输入图片需要保证是64的倍数,这个笔者暂时还无法给出确定的答案,有待求证。欢迎有明白的博友们留言,不胜感激。)本次训练笔者所使用的数据resize为960*960。
  • 接下来就是漫长的手动标注数据的工作了,需要提醒的是,在标注数据集时, 倘若你的一张照片当中包含有多个同类物体,在标注时需要对其进行编号。 以标注apple为例,倘若image中只有一个apple,仅许对其打上apple的标签即可,倘若image中有三个apple,则需要分别打上apple1, apple2, apple3的标签。
  • labelme标注数据集之后会在所保存的文件路径下生成一系列的json文件,这些json文件无法直接送入网络进行训练,需要对其进行一定的转换,Labelme提供了一定的脚本可以对json文件进行转换。
labelme_json_to_dataset  ***.json #***表示文件名

该脚本位于"/usr/local/lib/python3.5/dist-packages/labelme/cli/"

转换之后会得到***_json这样一个文件夹,文件夹下存放有下述文件。
在这里插入图片描述
后续要用到的主要有label.png 和 info.yaml文件
(温馨提示:打开某个yaml文件查看一下其格式是否正确,正确格式如下:)

label_names:
- _background_
- apple

原始labelme_json_to_dataset脚本只能对单个json文件进行转换,比较繁琐,so,修改脚本文件使其可以进行批量转换

  • json_to_dataset.py 批量转换json文件
# -*- coding: utf-8 -*-
import argparse
import json
import os
import os.path as osp
import warnings
 
import imgviz 
import PIL.Image
import yaml
 
from labelme.logger import logger
from labelme import utils
import base64

def main():
    # warnings.warn("This script is aimed to demonstrate how to convert the\n"
    #               "JSON file to a single image dataset, and not to handle\n"
    #               "multiple JSON files to generate a real-use dataset.")
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()
 
    json_file = args.json_file
    if args.out is None:
        out_dir = osp.basename(json_file).replace('.', '_')
        out_dir = osp.join(osp.dirname(json_file), out_dir)
    else:
        out_dir = args.out
    if not osp.exists(out_dir):
        os.mkdir(out_dir)
 
    count = os.listdir(json_file) 
    for i in range(0, len(count)):
        path = os.path.join(json_file, count[i])
        if os.path.isfile(path):
            data = json.load(open(path))
            
            if data['imageData']:
                imageData = data['imageData']
            else:
                imagePath = os.path.join(os.path.dirname(path), data['imagePath'])
                with open(imagePath, 'rb') as f:
                    imageData = f.read()
                    imageData = base64.b64encode(imageData).decode('utf-8')
            img = utils.img_b64_to_arr(imageData)
            label_name_to_value = {'_background_': 0}
            for shape in data['shapes']:
                label_name = shape['label']
                if label_name in label_name_to_value:
                    label_value = label_name_to_value[label_name]
                else:
                    label_value = len(label_name_to_value)
                    label_name_to_value[label_name] = label_value
            
            # label_values must be dense
            label_values, label_names = [], []
            for ln, lv in sorted(label_name_to_value.items(), key=lambda x: x[1]):
                label_values.append(lv)
                label_names.append(ln)
            assert label_values == list(range(len(label_values)))
            
            lbl = utils.shapes_to_label(img.shape, data['shapes'], label_name_to_value)
            
            captions = ['{}: {}'.format(lv, ln)
                for ln, lv in label_name_to_value.items()]
            lbl_viz = imgviz.label2rgb(label=lbl, img=imgviz.rgb2gray(img), label_names=label_names, loc='rb')
            # lbl_viz = utils.draw_label(lbl, img, captions)
            
            out_dir = osp.basename(count[i]).replace('.', '_')
            save_folder_name = out_dir #文件夹名称
            split_file_name = osp.basename(count[i]).split('.')#分隔文件名和文件类型
            save_file_name = split_file_name[0]

            out_dir = osp.join(osp.dirname(count[i]), out_dir)

            if not osp.exists(json_file + '/' + 'labelme_json'):
                os.mkdir(json_file + '/' + 'labelme_json')
            labelme_json = json_file + 'labelme_json'
            out_dir1 = labelme_json + '/' + save_folder_name
            if not osp.exists(out_dir1):
                os.mkdir(out_dir1)
 
            PIL.Image.fromarray(img).save(osp.join(out_dir1, 'img.png'))#save_file_name文件名
            #PIL.Image.fromarray(lbl).save(osp.join(out_dir1, save_file_name+'_label.png'))
            utils.lblsave(osp.join(out_dir1, 'label.png'), lbl)
            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir1, 'label_viz.png'))

            if not osp.exists(json_file + '/' + 'cv2_mask'):
                os.mkdir(json_file + '/' + 'cv2_mask')
            mask_save2png_path = json_file + '/' + 'cv2_mask'

            if not osp.exists(json_file + '/' + 'pic'):
                os.mkdir(json_file + '/' + 'pic')
            img_save2png_path = json_file + '/' + 'pic'

            utils.lblsave(osp.join(mask_save2png_path, save_file_name+'.png'), lbl)
            PIL.Image.fromarray(img).save(osp.join(img_save2png_path, save_file_name+'.png'))


            with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
                for lbl_name in label_names:
                    f.write(lbl_name + '\n')
 
            # warnings.warn('info.yaml is being replaced by label_names.txt')
            info = dict(label_names=label_names)
            with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
                yaml.safe_dump(info, f, default_flow_style=False)
 
            print('Saved to: %s' % out_dir1)
if __name__ == '__main__':
    main()

用上述demo代替”/usr/local/lib/python3.5/dist-packages/labelme/cli/“下的json_to_dataset.py即可。
彩蛋: 上述demo除了可以进行批量转换,还可以直接将我们后续所需要用到的数据分别整理到各自的文件夹下,如图所示:
在这里插入图片描述
其中cv2_mask下存放的是每张图片的掩码,labelme_json文件夹下存放的是批量转换后各个json文件生成的文件夹,pic下存放的是原始数据图片。
Tip:json文件转换之后所生成的掩码图象必须保证是8位的,如果不是8位则需要进行转换。(如果你用的是最新版的labelme,则不需要考虑这个问题,因为其生成的json文件转换得到的掩码图就是8位。)
可利用下述代码查看图片的位数

import cv2
img = cv2.imread('***.jpg')
print(img.dtype)

参考博客1
参考博客2
复习内容1:python对文件夹或文件的操作
复习内容2:python对文件夹或文件的操作

1.3 下载MaskRCNN模型并制作一定的数据格式

github 下载MaskRCNN demo
在MaskRCNN文件夹下新建一个文件命名为train_data
在这里插入图片描述
在该文件夹下新建四个文件夹,分别命名为cv2_mask、json、labelme_json、pic;其中cv2_mask、labelme_json、pic是之前生成的三个文件夹,直接放进来即可。json是labelme标注之后得到的json文件。
在这里插入图片描述
到此为止,MaskRCNN的数据格式已经准备就绪,接下来就可以开始进行训练了。

2.2 Mask-RCNN训练自己的数据集【Part Two: 模型训练】(全部流程总结+部分释义)
2.3 Mask-RCNN训练自己的数据集【Part Three: 用自己训练的模型进行测试】(全部流程总结+部分释义)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1.1【Mask-RCNN训练自己的数据集】---- Part One:制作数据集(全部流程总结+部分释义) 的相关文章

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • 将数据从 python pandas 数据框导出或写入 MS Access 表

    我正在尝试将数据从 python pandas 数据框导出到现有的 MS Access 表 我想用已更新的数据替换 MS Access 表 在 python 中 我尝试使用 pandas to sql 但收到错误消息 我觉得很奇怪 使用 p
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • PyUSB 1.0:NotImplementedError:此平台不支持或未实现操作

    我刚刚开始使用 pyusb 基本上我正在玩示例代码here https github com walac pyusb blob master docs tutorial rst 我使用的是 Windows 7 64 位 并从以下地址下载 z
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • SQLALchemy .query:类“Car”的未解析属性引用“query”

    我有一个这里已经提到的问题https youtrack jetbrains com issue PY 44557 https youtrack jetbrains com issue PY 44557 但我还没有找到解决方案 我使用 Pyt
  • 如何在Python中获取葡萄牙语字符?

    我正在研究葡萄牙语 角色看起来很奇怪 我怎样才能解决这个问题 代码 import feedparser import random Vou definir os feeds feeds conf feedurl http pplware s
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 有人用过 Dabo 做过中型项目吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们正处于一个新的 ERP 风格的客户端 服务器应用程序的开始阶段 该应用程序是作为 Python 富客户端开发的 我们目前正在评估 Dabo
  • Rocket UniData/UniVerse:ODBC 无法分配足够的内存

    每当我尝试使用pyodbc连接到 Rocket UniData UniVerse 数据时我不断遇到错误 pyodbc Error 00000 00000 Rocket U2 U2ODBC 0302810 Unable to allocate
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 如何使用 Pycharm 安装 tkinter? [复制]

    这个问题在这里已经有答案了 I used sudo apt get install python3 6 tk而且效果很好 如果我在终端中打开 python Tkinter 就可以工作 但我无法将其安装在我的 Pycharm 项目上 pip
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2

随机推荐

  • struts property escape 输出 html 标签

    有时 在数据取出一大段文字要输出到页面上 如果有回车符号 在页面会显示不出来 要显示要用到escape参数 escape false
  • Qt边框border概述

    border概述 每个边框有3个方面 样式 或外观 颜色 以及其宽度 粗细 下面我们分别重点解释这三项 边框样式 border style 设置元素所有边框的样式 或者单独地为各边设置边框样式 它有10个属性值 分别是 none 无样式 h
  • 程序员必备:一款知识管理利器+效率工具

    回复 1024 送你一个特别推送 今天给大家推荐一款知识管理利器 其实也是一个不错的效率工具 我自己感觉确实很方便 也不错 所以才推荐给大家的 我比较喜欢这款工具的亮点是 它可以把我们自己记得笔记自动生成思维导图 这款工具是什么呢 它就叫
  • 无监督和有监督算法的区别

    无监督和有监督的理解方法有很多 主要可以从以下几方面来理解 1 无监督与监督学习的区别在于一个无教学值 一个有教学值 但是 个人认为他们的区别在于无监督学习一般是采用聚簇等算法来分类不同样本 而监督学习一般是利用教学值与实际输出值产生的误差
  • 机器学习——贝叶斯网络

    贝叶斯网络 贝叶斯网络 Bayesian Networks 也被称为信念网络 Belif Networks 或者因果网络 Causal Networks 是描述数据变量之间依赖关系的一种图形模式 是一种用来进行推理的模型 贝叶斯网络为人们提
  • JavaScript对象——数学对象

    说到JavaScript对象首先需要说一下内置对象 1 内置对象 内置对象 就是js语言自带的一些对象 这些对象供开发者使用 并提供了一些常用的或是最基本而必要的功能 属性或者方法 内置对象的优点 就是帮助开发者更快的进行开发 2 数学对象
  • 数字信号处理第五次试验:FIR数字滤波器设计与软件实现

    数字信号处理第五次试验 FIR数字滤波器设计与软件实现 前言 一 实验目的 二 实验原理与方法 三 实验环境 四 实验内容及步骤 五 实验结果截图 含分析 六 思考题 前言 为了帮助同学们完成痛苦的实验课程设计 本作者将其作出的实验结果及代
  • win10安装mujoco200,mujoco_py2.0.2.9,gym

    win10安装mujoco200 mujoco py2 0 2 9 gym 最近在学习强化学习 要用到这几个组件和引擎 尝试了很多方法才成功 于是写了两篇win10系统下安装mujoco和gym的总结 本文介绍的是在Win10系统下安装gy
  • 合并两个有序链表

    编程题 合并两个有序链表 保持链表顺序 例如 输入 链表1 1 gt 3 gt 5 gt 7 链表2 2 gt 4 gt 6 gt 8 输出 链表交集 1 gt 2 gt 3 gt 4 gt 5 gt 6 gt 7 gt 8 public
  • 图解RGB565、RGB555、RGB16、RGB24、RGB32、ARGB32等格式的区别

    音视频实践学习 android全平台编译ffmpeg以及x264与fdk aac实践 ubuntu下使用nginx和nginx rtmp module配置直播推流服务器 android全平台编译ffmpeg合并为单个库实践 android
  • 移植5- uboot之tftp启动kernel

    1 在主机上安装tftp server 2 在uboot中使用setenv设置serverip和ipaddr 并保存saveenv tftp mem addr kernel name 2016 7 16 ok210kernel地址是多少 o
  • 二)PyTorch入门基础串讲(二)

    10 PyTorch与线性代数 范数 在泛函分析中 它定义在赋范线性空间中 并满足一定的条件 即 非负性 齐次性 三角不等式 常被用来度量某个向量空间 或矩阵 中的每个向量的长度或大小 零范数 1范数 2范数 欧氏距离 p范数 核范数 to
  • Hive练习题

    文章目录 Hive练习题 题目一 题目二 题目三 Hive练习题 题目一 学生表 STUDENT 的字段含义 SNO 代表学号 SNAME 代表学生姓名 SAGE 代表学生年龄 SSEX 代表学生性别 课程表 COURSE 的字段含义 CN
  • 4Sum

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • 【Python爬虫开发实战①】使用urllib以及XPath爬取可爱小猫图片

    个人主页 为梦而生 关注我一起学习吧 专栏 python网络爬虫从基础到实战 欢迎订阅 后面的内容会越来越有意思 往期推荐 Python爬虫开发基础 urllib库的基本使用 Python爬虫开发基础 XPath库及其基本用法 我们在之前已
  • 策略模式-

    定义 定义一系列的算法 把它们一个个封装起来 目的就是将算法的使用与算法的实现分离开来 从而算法的变化不会影响到使用算法的用户 适用场景 1 假如系统中有很多类 而他们的区别仅仅在于他们的行为不同 2 一个系统需要动态地在几种算法中选择一种
  • python pipline_python中sklearn的pipeline模块实例详解

    最近在看 深度学习 基于Keras的Python实践 魏贞原 这本书 书中8 3创建了一个Scikit Learn的Pipeline 首先标准化数据集 然后创建和评估基线神经网络模型 代码如下 数据正态化 改进算法 steps steps
  • web前端技术笔记(十六)bootstrap、表单正则和前端优化

    bootstrap bootstrap bootstrap 容器 bootstrap 栅格系统 栅格响应式布局案例 列偏移 bootstrap 隐藏类 bootstrap 按钮 bootstrap 表单 bootstrap 导航条 导航条案
  • 如何在Redis中实现事务

    事务介绍 事务 Transaction 是指作为单个逻辑工作单元执行的一系列操作 事务必须满足ACID原则 原子性 一致性 隔离性和持久性 简单来说 事务可能包括1 N条命令 当这些命令被作为事务处理时 将会顺序执行这些命令直到完成 并返回
  • 1.1【Mask-RCNN训练自己的数据集】---- Part One:制作数据集(全部流程总结+部分释义)

    写在前面 该实现基于Tensorflow Keras框架 在Ubuntu16 04下运行 官方github MaskRCNN demo 一 制作数据集 1 1 下载安装Labelme Labelme用来制作图像分割数据集 在安装Labelm