Mask-RCNN应用 - 数据增强基础准备 - labelme 标注24位深RGB标注图转换为8位深RGB标注图

2023-11-13

MaskRCNN入门路径–> Mask-RCNN应用研究方法 - 持续更新中

如有问题或需要源码、指导,请私聊留下联系方式或用手机打开https://m.tb.cn/h.fINaraE?tk=PCzA2jPp4V0进行咨询

本文介绍如何将24位深图片根据调色表转换位8位深图片
能够提供为何training时出现"IndexError: boolean index did not match indexed array along dimension 0; dimension is 12 but corresponding boolean dimension is 192"错误
Complete:2020/08/27 - 文章内容完成

前言

1、关于Mask-RCNN使用的标注结果文件
  • Mask-RCNN学习 - 批量生成训练所需文件并训练自己的数据集(技巧与防坑)文章中已经介绍过labelme生成的标定文件。但是实际上Mask-RCNN使用的文件仅为info.yaml和label.png文件,其中info.yaml文件存储的是label-names,label.png文件则为8位深RGB图,存储了label-names对应的label-indexes。
  • 因此label.png非常重要,无论之后通过何种方式处理,仍然需要保证其为8位深RGB图,并且调色板也需与labelme中的保持一致。
  • 如果使用错误在training时会出现类似"IndexError: boolean index did not match indexed array along dimension 0; dimension is 12 but corresponding boolean dimension is 192"的错误
    label.png
2、关于labelme标注生成的label.png
  • 新编的labelme软件生成的label.png已经转换为了8位深RGB图,因此无需考虑24位转8位的问题。
  • 然而老版的labelme或者通过其余方式处理过后保存的label.png依然有可能是24位深图片
    例如:
import cv2
img = cv2.imread("label.png")  #默认以24位读取方式读入,shape=[rows,cols,channel]
cv2.imwrite("label.png",img)   #此时保存下来的label.png已经转为24位图

因此希望找到一个方法能够将这种24位深的图转换为8位深图,为将来的数据处理做准备。

json_to_dataset.py源代码分析

json_to_dataset.py中存储了如何将json中的label-mask以及label-index信息转换成label.png的过程,因此本文中的代码借用了json_to_dataset.py的部分代码

1、json_to_dataset.py中的8位调色码生成
  • label_colormap(n_label=256, value=None)生成了256个RGB调色码,colormap.shape = [256,3]
def label_colormap(n_label=256, value=None):
    """Label colormap.

    Parameters
    ----------
    n_labels: int
        Number of labels (default: 256).
    value: float or int
        Value scale or value of label color in HSV space.

    Returns
    -------
    cmap: numpy.ndarray, (N, 3), numpy.uint8
        Label id to colormap.

    """

    def bitget(byteval, idx):
        return (byteval & (1 << idx)) != 0

    cmap = np.zeros((n_label, 3), dtype=np.uint8)
    for i in range(0, n_label):
        id = i
        r, g, b = 0, 0, 0
        for j in range(0, 8):
            r = np.bitwise_or(r, (bitget(id, 0) << 7 - j))
            g = np.bitwise_or(g, (bitget(id, 1) << 7 - j))
            b = np.bitwise_or(b, (bitget(id, 2) << 7 - j))
            id = id >> 3
        cmap[i, 0] = r
        cmap[i, 1] = g
        cmap[i, 2] = b

    if value is not None:
        hsv = rgb2hsv(cmap.reshape(1, -1, 3))
        if isinstance(value, float):
            hsv[:, 1:, 2] = hsv[:, 1:, 2].astype(float) * value
        else:
            assert isinstance(value, int)
            hsv[:, 1:, 2] = value
        cmap = hsv2rgb(hsv).reshape(-1, 3)
    return cmap
2、json_to_dataset.py中将label转换为RGB图片
  • label.shape=[rows, cols],label[r,c] = label_index
  • json_to_dataset.py中将label对应到colormap中对应index中的值,即能将label映射到图片中的像素,label_rgb[r,c] = colormap[label[r,c]]
 def lblsave(filename, lbl):
    if osp.splitext(filename)[1] != '.png':
        filename += '.png'
    # Assume label ranses [-1, 254] for int32,
    # and [0, 255] for uint8 as VOC.
    if lbl.min() >= -1 and lbl.max() < 255:
        lbl_pil = PIL.Image.fromarray(lbl.astype(np.uint8), mode='P')
        colormap = label_colormap()
        lbl_pil.putpalette(colormap.flatten())
        lbl_pil.save(filename)
    else:
        raise ValueError(
            '[%s] Cannot save the pixel-wise class label as PNG. '
            'Please consider using the .npy format.' % filename
        )

24位深图转换为8位深图的整体过程

#======================================================================
#
#        Copyright (C) 2020
#        All rights reserved
#
#        description :
#
#        created by 天木青(https://blog.csdn.net/qq_15615505) at  08/27/2020 18:41:28
#
#======================================================================

# 读取调色板
colormap = label_colormap()

# 读入图片并将opencv的BGR转换为RGB格式
img = cv2.imread("label-24.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 将24位深图片中的[r,g,b]对应到colormap反求出label
lbls = np.zeros(shape=[img.shape[0], img.shape[1]], dtype=np.int32)
len_colormap = len(colormap)
indexes = np.nonzero(img)

for i, j in zip(indexes[0], indexes[1]):
    for k in range(len_colormap):
        if all(img[i, j, :3] == colormap[k]):
            lbls[i, j] = k
            break
            
#####
##### 此处添加对lal图的变换处理过程,注意数据类型为int32
#####

# 将label再转换成8位label.png
lblsave(os.path.join(os.getcwd(), 'label.png'), lbls)

完整代码

如需完整代码,请私信博主留言!
近期好多同学私信我需要源码,在此声明一下:本文中的代码labelme部分源代码未放在代码中,需要各位自己补充,其余的功能已经完整。如果还有什么问题,请私信或用手机打开https://m.tb.cn/h.fINaraE?tk=PCzA2jPp4V0进行咨询,谢谢!

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

Mask-RCNN应用 - 数据增强基础准备 - labelme 标注24位深RGB标注图转换为8位深RGB标注图 的相关文章

随机推荐

  • 关于Selenium WebDriver的geckodriver

    Selenium作为网站UI测试利器 为黑盒功能测试人员所喜爱 下载Selenium的最新版本地址 http selenium release storage googleapis com index html 友情提示 如果一直下载不了
  • 【IDEA】windows、mac下IDEA下载的驱动包在哪

    1 概述 因为我们是内外网分离的 内网不连接网络 因此在内网的IDEA下载驱动包的的时候 遇到问题 然后因为不知道需要什么样的驱动包 然后就先在外网找了一下 然后在拷贝到内网 打算这么做 mac 下 System Volumes Data
  • flutter混编ios打包生成ipa文件

    项目场景 flutter集成到原有ios项目上 将项目打包生成ipa文件 在通过爱思助手或者分发服务器分发安装 解决方案 1 在flutter module项目路径下 通过以下命令打包 其中 no codesign表示不使用证书签名 后续会
  • AvalonJs入门二 复选框全选反选+layui分页

    前言 今天给大家带来初识Avalon的第二篇文章 复选框的全选操作和Avalon layUI的分页 Demo1 神奇的全选反选 Avalon的双工绑定duplex和监听事件 watch 第一篇文章的第一个例子大家是否还记得 文本框输入什么内
  • Vue.js之事件的绑定(v-on: 或者 @ )

    1 Vue js事件绑定的一般格式 v on click function v on click mouseout mouseover click 2 Vue js事件绑定的实现 2 1 JavaScript代码
  • STM32 使用HAL库实现微秒级长延时

    STM32 使用HAL库实现微秒级长延时 背景 定时器初始化 主程序中的设计 背景 STM32 HAL库中有一个延时函数HAL Delay 可以实现毫秒级的延时 能够满足一般延时需求 在有些场合下 我们需要更精准的延时 同时可能会有较长时间
  • 智慧校园小程序-微信小程序毕业设计(附下载链接)

    2023年微信小程序毕业设计 智慧校园 点我下载项目资源 智慧校园小程序 校园是一个充满创造力和活力的地方 教育和互联网发展向纵深发展 智慧校园小程序开发是当前校园建设中不可或缺的互联网工具 通过智慧校园小程序 可以整合更多的校园服务基础设
  • 2022年油价的暴涨让你意识到了什么?

    2022年才刚刚开始 油价便以迅雷不及掩耳之势快速上涨几次 从本月3月3日24时起 油价上升之窗开启 从全国来看 92号汽油每升上涨0 2元 95号汽油每升上涨0 22元 0号柴油也不甘落后也每升上涨0 22元 而近几天国际原油价格上升幅度
  • 【目标检测】33、AutoAssign:Differentiable Label Assignment for Dense Object Detection

    文章目录 一 背景 二 方法 2 1 Prior level Center Weighting 2 2 Instance level Confidence Weighting 2 3 Loss 三 效果 论文 AutoAssign Diff
  • Oracle 10g RAC Dataguard Faileover

    环境 1 Oracle 10g RAC Oracle 10g RAC Dataguard最大性能模式配置 2 rac1 rac2 Primary Database 3 vmrac1 vmrac2 Physical Standby Datab
  • C语言课设学生籍贯信息记录簿(大作业)

    一 任务概述 文章仅供参考 进一步掌握和利用C语言进行课程设计的能力 进一步理解和运用结构化程序设计的思想和方法 初步掌握开发一个小型实用系统的基本方法 二 设计功能 1 创建信息链表并以磁盘文件保存 2 读取磁盘文件并显示输出所有学生的籍
  • alibaba druid数据库连接池详解

    1 介绍 Druid连接池是阿里巴巴开源的数据库连接池项目 Druid连接池为监控而生 内置强大的监控功能 监控特性不影响性能 功能强大 能防SQL注入 内置Loging能诊断Hack应用行为 2 下载 git地址 https github
  • 漏洞信息收集之——指纹识别

    指纹识别 目录 指纹识别 目的 常见指纹检测的对象 常见指纹识别方式 1 特定文件的MD5 2 正常页面或错误网页中包含的关键字 3 请求头信息的关键字匹配 4 部分URL中包含的关键字 比如wp includes dede等URL关键特征
  • luci 开发中一些小总结

    一 只保存不应用 当修改或者增加一项配置后 如果不是点击 保存 应用 按钮 而是点击 保存 按钮 这些配置不会保存各个到配置文件中 而是暂时保存到如下临时目录下 tmp uci 例如 当修改了网络配置 没有应用时 会生成一个 tmp uci
  • vue-quill-editor富文本编辑器多个音频上传显示覆盖问题

    新建的时候没有问题 正常提交 修改时候后台传过来的数据正确 但是渲染会导致前一个audio被后面一个覆盖掉 刷新audio标签就没有了 1 覆盖问题 将代码 that refs editRef content data content 改成
  • vue拖拽实现app或小程序装修界面

    vue拖拽实现app或小程序装修 一 最终效果图 参考引用作者 作者 李白不吃茶v 原作者源代码git地址 大神的源代码 这里是引用 二 需要安装的依赖 安装 vuedraggable 语法 npm install vuedraggable
  • 对于poll的总结

    参考书籍 linux高性能服务器编程 是个人对看书的总结 上文一致 poll系统调用和select类似 个人认为poll和select掌握一个就好了 也是在指定时间内轮询一定数量的文件描述符 以测试其中是否有就绪者 关于poll的原型 in
  • 数字滤波算法(一)——滑动平均滤波算法

    一 数字滤波器简介 数字滤波器是指通过一定的数据逻辑构成的可以滤除输入信号中的特定的噪声的算法 这里所指的数字滤波器主要包括平均值滤波 FIR滤波 CIC滤波等 在之后的实验中 我们将介绍不同数字滤波器的原理 通过MATLAB和FPGA分别
  • 目标检测标签格式转换 Json -> txt

    目标检测标签格式转换 Json gt txt 将Json格式的标签转换为YOLO格式标签 适用于用labelimg标注后 每个图片 对应一个Json标签的场合 import os import shutil import json 需要根据
  • Mask-RCNN应用 - 数据增强基础准备 - labelme 标注24位深RGB标注图转换为8位深RGB标注图

    MaskRCNN入门路径 gt Mask RCNN应用研究方法 持续更新中 如有问题或需要源码 指导 请私聊留下联系方式或用手机打开https m tb cn h fINaraE tk PCzA2jPp4V0进行咨询 本文介绍如何将24位深