labelme制作数据集_labelme的open和opendir-程序员宅基地

技术标签: 深度学习  

使用labelme制作自己的数据集

环境准备

安装anaconda啥的,新建一个虚拟环境后

pip install labelme

labelme操作

使用命令打开labelme

activate 环境
labelme

点击open或者opendir打开文件或文件夹,点击create ploygons对图片进行标记,同一类的用同样的字母或者数字表示。
标记完成后会在图片文件夹下生成 ,json 文件,包含了图片和标记信息,选择所有的 .json 文件移动到一个新的文件夹保存。

使用.json文件生成数据集(单个文件)

json文件里面已经有图片的所有信息了,所以只需要json文夹就能制作所需的东西

  1. 找到labelme安装路径下的script,找到labelme_json_to_dataset.exe所在目录
    (启动labelme时会有路径输出,我的在E:\ProgramData\Anaconda3\envs\others\Scripts里面)
  2. 把labelme_json_to_dataset.exe复制到刚才存放json文件的文件夹里面
  3. 并且在此目录下运行cmd,激活labelme环境,输入指令
python labelme_json_to_dataset.exe 名字.json
  1. 可以看到当前目录里面出现了一个新文件夹,里面包括原图、mask图

使用.json文件生成数据集(批量)

但是上面这样只能一个一个手动打进去生成,所以考虑一下批量生成

  1. 首先使用sh脚本把所有json重新从1开始命名,如1.json、2.json…
  2. 因为labelme_json_to_dataset.exe这个程序一次只能搞一个,所以想办法循环执行,我用的是python,新建一个process.py文件。
import os
import time

# 注意:使用前先把所有json文件重新按顺序命名

# 命令行里cd到当前文件夹
# 然后python process.py开始转换

# 文件数量
picture_num = 251
t = time.time()
for i in range(251):
    # 在命令行中执行引号里面的语句:循环转换数据集
    os.popen("python labelme_json_to_dataset.exe %d.json" % (i+1))
    # 暂停11s,不然内存会炸,视cpu减小
    time.sleep(11)
print("time-consuming is %f" % (time.time()-t))
    

运行时间有点长,因为每个都有点慢…这个方法很蠢,用的是本来的自带的程序,肯定还有其他更好的办法,不过我是个菜鸡,贪方便就先这样弄吧,以后随缘找到其他方法再弄下。

刚找到一个比较高端的代码:
https://blog.csdn.net/weixin_41319671/article/details/82684334

2019-7-1:又尝试照着大佬的代码改了下

import json
import matplotlib.pyplot as plt
import numpy as np
import os
import cv2

from labelme import utils

json_path = "./json_file/"
file_list = os.listdir(json_path)
for loop_count in range(0, len(file_list)):
    # 读取文件名
    json_file = os.path.join(json_path, file_list[loop_count])
    # 判断是否为 文件 (不对文件夹进行处理)
    if os.path.isfile(json_file):
        # 打开,order:RGB
        data = json.load(open(json_file))
        ''' 其他
        data['imageData'] # 原图数据 str
        data['shapes'] # 每个对像mask及label  list
        len(data['shapes']) # 返回对象个数 int
        data['shapes'][0]['label'] # 返回第一个对象的标签 str
        data['shapes'][0]['points'] # 返回第一个对象的边界点 list
        data['shapes'][0]['points'][0] # 返回第一个对象的边界点第一个点 list

        data['imagePath'] # 原图路径 str
        data['fillColor'] # 填充颜色(边界内部) list
        data['lineColor'] # 边界线颜色  list
        '''

        # write_to_json(save_dict=data, save_path="save_json_test.json")

        # 把json文件中的二进制图片格式转化为array数组形式
        img = utils.img_b64_to_arr(data['imageData'])

        # 转换label(重要)
        #  lbl 为与输入图片大小一致的,按标记赋值的二维数组(也就是训练要用到的mask):
        # 如一共有5类,则背景为0,第一类范围:1,第二类范围:2, 第三类范围:3,... 由此类推
        #  lbl_names 是不同标签的名称,如第一类(json中的标记名):1
        #
        # 解析'shapes'中的字段信息,解析出每个对象的mask与对应的label
        # lbl存储 mask,lbl_names 存储对应的label
        # lal 像素取值 0、1、2 其中0对应背景,1对应第一个对象,2对应第二个对象
        # 使用该方法取出每个对象的mask mask=[] mask.append((lbl==1).astype(np.uint8))
        # 解析出像素值为1的对象,对应第一个对象 mask 为0、1组成的(0为背景,1为对象)
        # lbl_names  ['background','cat_1','cat_2']
        lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])

        # 取出标签的key和value
        captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]

        # 画出原图上面覆盖有lbl的多层的图(用处不大)
        lbl_viz = utils.draw_label(lbl, img, captions)

        # lbl_names[0] 默认为背景,对应的像素值为0
        # 解析图片中的对象 像素值不为0(0 对应背景)
        mask = []
        class_id = []
        # 跳过第一个class(默认为背景)
        for i in range(1, len(lbl_names)):
            # 解析出每种标记对应的图,如:第一种对象标记为1,那么就单独取出第一种对象组成一张mask
            # (lbl == i)会把对应位置变成True,用astype转为int8
            # 此时对应位置置1,其余为0
            mask.append((lbl == i).astype(np.uint8))
            # mask与clas 一一对应
            class_id.append(i)

        mask = np.transpose(np.asarray(mask, np.uint8), [1, 2, 0])  # 转成[h,w,instance count]
        class_id = np.asarray(class_id, np.uint8)  # [instance count,]
        # class_name = lbl_names[1:]  # 不需要包含背景
        # 获取标记值(原json文件中的)
        class_name = [key for key in lbl_names.keys()]
        # 删掉背景标记
        del class_name[0]

        # 保存文件
        # os.path.basename:返回path最后的文件名,如path='D:\CSDN'-> os.path.basename(path)=CSDN
        out_dir = os.path.basename(file_list[loop_count]).replace('.', '_')
        # os.path.dirname:去掉文件名,返回目录
        out_dir = os.path.join(os.path.dirname(file_list[loop_count]), out_dir)
        if not os.path.exists(out_dir):
            os.mkdir(out_dir)

        cv2.imwrite(os.path.join(out_dir, 'img.png'), cv2.cvtColor(img, cv2.COLOR_RGB2BGR))
        for i in range(len(lbl_names)-1):
            # 转化为二值图
            _, mask[:,:,i] = cv2.threshold(mask[:,:,i], 0.5, 255, type=cv2.THRESH_BINARY)
            cv2.imwrite(os.path.join(out_dir, 'label%d.png' % i), mask[:,:,i])
        cv2.imwrite(os.path.join(out_dir, 'label_viz.png'), lbl_viz)
        with open(os.path.join(out_dir, 'label_names.txt'), 'w') as f:
            for lbl_name in lbl_names:
                f.write(lbl_name + '\n')
        print('Saved to: %s' % out_dir)

参考:
https://www.cnblogs.com/roscangjie/p/10737053.html
https://blog.csdn.net/wc781708249/article/details/79486819

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gdxnyy123/article/details/90605916

智能推荐

2024最新计算机毕业设计选题大全-程序员宅基地

文章浏览阅读1.6k次,点赞12次,收藏7次。大家好!大四的同学们毕业设计即将开始了,你们做好准备了吗?学长给大家精心整理了最新的计算机毕业设计选题,希望能为你们提供帮助。如果在选题过程中有任何疑问,都可以随时问我,我会尽力帮助大家。在选择毕业设计选题时,有几个要点需要考虑。首先,选题应与计算机专业密切相关,并且符合当前行业的发展趋势。选择与专业紧密结合的选题,可以使你们更好地运用所学知识,并为未来的职业发展奠定基础。要考虑选题的实际可行性和创新性。选题应具备一定的实践意义和应用前景,能够解决实际问题或改善现有技术。

dcn网络与公网_电信运营商DCN网络的演变与规划方法(The evolution and plan method of DCN)...-程序员宅基地

文章浏览阅读3.4k次。摘要:随着电信业务的发展和电信企业经营方式的转变,DCN网络的定位发生了重大的演变。本文基于这种变化,重点讨论DCN网络的规划方法和运维管理方法。Digest: With the development oftelecommunication bussiness and the change of management of telecomcarrier , DCN’s role will cha..._电信dcn

动手深度学习矩阵求导_向量变元是什么-程序员宅基地

文章浏览阅读442次。深度学习一部分矩阵求导知识的搬运总结_向量变元是什么

月薪已炒到15w?真心建议大家冲一冲数据新兴领域,人才缺口极大!-程序员宅基地

文章浏览阅读8次。近期,裁员的公司越来越多今天想和大家聊聊职场人的新出路。作为席卷全球的新概念ESG已然成为当前各个行业关注的最热风口目前,国内官方发布了一项ESG新证书含金量五颗星、中文ESG证书、完整ESG考试体系、名师主讲...而ESG又是与人力资源直接相关甚至在行业圈内成为大佬们的热门话题...当前行业下行,裁员的公司也越来越多大家还是冲一冲这个新兴领域01 ESG为什么重要?在双碳的大背景下,ESG已然成...

对比传统运营模式,为什么越拉越多的企业选择上云?_系统上云的前后对比-程序员宅基地

文章浏览阅读356次。云计算快速渗透到众多的行业,使中小企业受益于技术变革。最近微软SMB的一项研究发现,到今年年底,78%的中小企业将以某种方式使用云。企业希望投入少、收益高,来取得更大的发展机会。云计算将中小企业信息化的成本大幅降低,它们不必再建本地互联网基础设施,节省时间和资金,降低了企业经营风险。科技创新已成时代的潮流,中小企业上云是创新前提。云平台稳定、安全、便捷的IT环境,提升企业经营效率的同时,也为企业..._系统上云的前后对比

esxi网卡直通后虚拟机无网_esxi虚拟机无法联网-程序员宅基地

文章浏览阅读899次。出现选网卡的时候无法选中,这里应该是一个bug。3.保存退出,重启虚拟机即可。1.先随便选择一个网卡。2.勾先取消再重新勾选。_esxi虚拟机无法联网

随便推点

在LaTeX中使用.bib文件统一管理参考文献_egbib-程序员宅基地

文章浏览阅读913次。在LaTeX中,可在.tex文件的同一级目录下创建egbib.bib文件,所有的参考文件信息可以统一写在egbib.bib文件中,然后在.tex文件的\end{document}前加入如下几行代码:{\small\bibliographystyle{IEEEtran}\bibliography{egbib}}即可在文章中用~\cite{}宏命令便捷的插入文内引用,且文章的Reference部分会自动排序、编号。..._egbib

Unity Shader - Predefined Shader preprocessor macros 着色器预处理宏-程序员宅基地

文章浏览阅读950次。目录:Unity Shader - 知识点目录(先占位,后续持续更新)原文:Predefined Shader preprocessor macros版本:2019.1Predefined Shader preprocessor macros着色器预处理宏Unity 编译 shader programs 期间的一些预处理宏。(本篇的宏介绍随便看看就好,要想深入了解,还是直接看Unity...

大数据平台,从“治理”数据谈起-程序员宅基地

文章浏览阅读195次。本文目录:一、大数据时代还需要数据治理吗?二、如何面向用户开展大数据治理?三、面向用户的自服务大数据治理架构四、总结一、大数据时代还需要数据治理吗?数据平台发展过程中随处可见的数据问题大数据不是凭空而来,1981年第一个数据仓库诞生,到现在已经有了近40年的历史,相对数据仓库来说我还是个年轻人。而国内企业数据平台的建设大概从90年代末就开始了,从第一代架构出现到..._数据治理从0搭建

大学抢课python脚本_用彪悍的Python写了一个自动选课的脚本 | 学步园-程序员宅基地

文章浏览阅读2.2k次,点赞4次,收藏12次。高手请一笑而过。物理实验课别人已经做过3、4个了,自己一个还没做呢。不是咱不想做,而是咱不想起那么早,并且仅有的一次起得早,但是哈工大的服务器竟然超负荷,不停刷新还是不行,不禁感慨这才是真正的“万马争过独木桥“啊!服务器不给力啊……好了,废话少说。其实,我的想法很简单。写一个三重循环,不停地提交,直到所有的数据都accepted。其中最关键的是提交最后一个页面,因为提交用户名和密码后不需要再访问其..._哈尔滨工业大学抢课脚本

english_html_study english html-程序员宅基地

文章浏览阅读4.9k次。一些别人收集的英文站点 http://www.lifeinchina.cn (nice) http://www.huaren.us/ (nice) http://www.hindu.com (okay) http://www.italki.com www.talkdatalk.com (transfer)http://www.en8848.com.cn/yingyu/index._study english html

Cortex-M3双堆栈MSP和PSP_stm32 msp psp-程序员宅基地

文章浏览阅读5.5k次,点赞19次,收藏78次。什么是栈?在谈M3堆栈之前我们先回忆一下数据结构中的栈。栈是一种先进后出的数据结构(类似于枪支的弹夹,先放入的子弹最后打出,后放入的子弹先打出)。M3内核的堆栈也不例外,也是先进后出的。栈的作用?局部变量内存的开销,函数的调用都离不开栈。了解了栈的概念和基本作用后我们来看M3的双堆栈栈cortex-M3内核使用了双堆栈,即MSP和PSP,这极大的方便了OS的设计。MSP的含义是Main..._stm32 msp psp

推荐文章

热门文章

相关标签