参考:

  • github地址:https://github.com/wkentaro/labelme

安装

安装方式:详情参考官网安装

# Ubuntu 14.04
sudo apt-get install python-qt4 pyqt4-dev-tools
sudo pip install labelme # python2 works# Ubuntu 16.04
sudo apt-get install python-qt5 pyqt5-dev-tools
sudo pip3 install labelme

启动命令

终端或cmd输入labelme 开始标记,标记完成后保存得到一个json文件。

注:每个对象对应一个mask(图中2个对象,对应2个mask),左边的猫标记为cat_1,右边的标记为cat_2

分析json文件

首先看看标记完成的json文件长什么样子。

{"imageData": "something too long", # 原图像数据 通过该字段可以解析出原图像数据"shapes": [ # 每个对象的形状{ # 第一个对象"points": [ # 边缘是由点构成,将这些点连在一起就是对象的边缘多边形[165.90909090909093, # 第一个点 x 坐标36.909090909090935  # 第一个点 y 坐标],……[240.90909090909093,15.909090909090935],[216.90909090909093, # 最后一个点 会闭合到第一个点完成封闭的多边形 x 坐标31.909090909090935 # y 坐标]],"fill_color": null,"label": "cat_1",  # 第一个对象的标签"line_color": null},{  # 第二个对象"points": [[280.90909090909093,31.909090909090935],……[362.90909090909093,20.909090909090935],[339.90909090909093,32.909090909090935]],"fill_color": null,"label": "cat_2", # 第二个对象的标签"line_color": null}],"fillColor": [255,0,0,128],"imagePath": "/home/wu/1.jpg", # 原始图片的路径"lineColor": [0,255,0,128]
}

通过json文件提取信息

通过解析json文件提取每个对象的边界多边形(mask)labels,以及原图像的地址路径

参考:labelme_draw_json

# -*- coding:utf-8 -*-
#!/usr/bin/env pythonimport argparse
import json
import matplotlib.pyplot as pltfrom labelme import utilsdef main():parser = argparse.ArgumentParser()parser.add_argument('json_file')args = parser.parse_args()json_file = args.json_filedata = json.load(open(json_file)) # 加载json文件img = utils.img_b64_to_array(data['imageData']) # 解析原图片数据lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes']) # 解析'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']captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]lbl_viz = utils.draw_label(lbl, img, captions)plt.subplot(121)plt.imshow(img)plt.subplot(122)plt.imshow(lbl_viz)plt.show()if __name__ == '__main__':main()''' 其他
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] # 返回第一个对象的边界点第一个点 listdata['imagePath'] # 原图路径 str
data['fillColor'] # 填充颜色(边界内部) list
data['lineColor'] # 边界线颜色  list
'''

#!/usr/bin/env pythonimport argparse
import json
import matplotlib.pyplot as plt
import numpy as npfrom labelme import utilsdef main():parser = argparse.ArgumentParser()parser.add_argument('json_file')args = parser.parse_args()json_file = args.json_filedata = json.load(open(json_file))img = utils.img_b64_to_array(data['imageData'])lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]lbl_viz = utils.draw_label(lbl, img, captions)# lbl_names[0] 默认为背景,对应的像素值为0# 解析图片中的对象 像素值不为0(0 对应背景)mask=[]class_id=[]for i in range(1,len(lbl_names)): # 跳过第一个class(默认为背景)mask.append((lbl==i).astype(np.uint8)) # 解析出像素值为1的对应,对应第一个对象 mask 为0、1组成的(0为背景,1为对象)class_id.append(i) # mask与clas 一一对应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:] # 不需要包含背景plt.subplot(221)plt.imshow(img)plt.subplot(222)plt.imshow(lbl_viz)plt.subplot(223)plt.imshow(mask[:,:,0],'gray')plt.title(class_name[0]+'\n id '+str(class_id[0]))plt.axis('off')plt.subplot(224)plt.imshow(mask[:,:,1],'gray')plt.title(class_name[1] + '\n id ' + str(class_id[1]))plt.axis('off')plt.show()if __name__ == '__main__':main()

模仿labelme的json文件

仿照lablme的json文件改写自己的数据,然后便可以调用labelme的数据接口解析自己的数据

# -*- coding:utf-8 -*-'''
仿照labelme的json文件写入自己的数据
'''
import cv2
import json# json_file = './1.json'# data = json.load(open(json_file))# 参考labelme的json格式重新生成json文件,
# 便可以使用labelme的接口解析数据def dict_json(imageData,shapes,imagePath,fillColor=None,lineColor=None):''':param imageData: str:param shapes: list:param imagePath: str:param fillColor: list:param lineColor: list:return: dict'''return {"imageData":imageData,"shapes":shapes,"fillColor":fillColor,'imagePath':imagePath,'lineColor':lineColor}def dict_shapes(points,label,fill_color=None,line_color=None):return {'points':points,'fill_color':fill_color,'label':label,'line_color':line_color}# 注以下都是虚拟数据,仅为了说明问题
imageData="image data"
shapes=[]
# 第一个对象
points=[[10,10],[120,10],[120,120],[10,120]] # 数据模拟
# fill_color=null
label='cat_1'
# line_color=null
shapes.append(dict_shapes(points,label))# 第二个对象
points=[[150,200],[200,200],[200,250],[150,250]] # 数据模拟
label='cat_2'
shapes.append(dict_shapes(points,label))fillColor=[255,0,0,128]imagePath='E:/practice/1.jpg'lineColor=[0,255,0,128]data=dict_json(imageData,shapes,imagePath,fillColor,lineColor)# 写入json文件
json_file = 'E:/practice/2.json'
json.dump(data,open(json_file,'w'))

生成的json文件便可以使用labelme提供的接口解析。

labelme标注的数据分析相关推荐

  1. 2021-07-27 对labelme标注出来的JSON文件进行灰度图转化(标签值0.1.2.3.4)

    对labelme标注出来的JSON文件进行灰度图转化(标签值0.1.2.3.4) 原图如下: 标注后生成json文件如下: import cv2 import numpy as np import j ...

  2. labelme标注文件转coco json,coco json转yolo txt格式,coco json转xml, labelme标注文件转分割,boxes转labelme json

    参考:https://github.com/wkentaro/labelme 一.labelme标注文件转coco json 1.标注时带图片ImageData信息,将一个文件夹下的照片和labelm ...

  3. LabelMe标注的.json文件批量转Dataset,通过查询到多种代码无法在我电脑上正常工作,发现他们有共同的报错,于是修改后能正常工作。

    1.写在前面 最近用到标注好的数据训练神经网络,用labelme标注好之后生成.json文件,我要实现的功能是目标分割,需要把.json文件转为VOC格式的数据.但是.json文件太多,于是在网上找一 ...

  4. labelme 标注生成24位深度图像转换为8位

    新版本的 labelme 标注完成图像后,将 json 文件转换为图像时已经转换为 8 通道图像,如下图所示: 最近在看别人程序时发现经过图像标注生成的 label 一片黑,且图像深度为 24 位,如 ...

  5. Labelme标注的json数据转化为coco格式的数据

    Labelme标注的json数据转化为coco格式的数据 1. 转化方法一 2. 转化方法二 1. 转化方法一 import os import json import numpy as np imp ...

  6. labelme标注结果可视化(持续补充)

    图像数据常用的标注工具是labelme,标注的格式是json.labelme标注结果可视化,是将标注结果绘制到原始图像上,以方便查看标注结果. 1 json文件读取与保存 由于labelme标注的保存 ...

  7. python脚本对labelme标注的数据集进行镜面旋转扩充数据集

    使用labelme做数据集标注效率不得不说非常感人,由此开始思考如何利用已经标注的数据集 参考如下脚本 编写python脚本对labelme标注的数据集进行左右/上下镜面翻转扩充数据集_Alex-Le ...

  8. 使用labelme标注语义分割数据

    当我们从各种途径获得图片数据之后,需要对其进行分割标注. 这里我们使用labelme标注工具. 环境: anaconda3 labelme项目地址:https://github.com/wkentar ...

  9. labelme标注的json标签转txt格式

    在机器学习训练中常常会有不同格式的标签之间的转换,本次是将json标签格式转化成txt格式,在此记录一下. 1.labelme标注: 2.json文件: {"version": & ...

最新文章

  1. matlab篮球队需要五名队员,MATLAB应用与数学欣赏.doc
  2. 图解C++虚函数 虚函数表
  3. 远程桌面mstsc命令参数的使用
  4. 计算机开机显示器无显示桌面,电脑开机后显示器不亮故障排除方法
  5. 剑指Offer 斐波那契数列
  6. python如何生成列表和元组数据_Python数据类型(列表和元组)
  7. 测试Flex代码覆盖率工具---FlexCover
  8. geojson 河流_GeoJSON 数据类型 | JShare
  9. 8路抢答器c语言程序,多路抢答器c程序(原创)
  10. 使用think_queue实现未支付订单半小时取消
  11. 微信小程序点击按钮弹出弹窗_微信小程序弹窗,微信小程序页面跳转、弹出框...
  12. 1. 神禹(shenyu)网关启动踩坑
  13. 关于SSL以及https的相关信息
  14. 枯燥的寒假生活(二) 武汉大学老教务系统提交表单时的密码加密方式
  15. 多线程面试题_线程魔术技巧:使用Java线程可以做的5件事
  16. 适用于计量站电子测量仪器自动检定系统设计
  17. 鬼吹灯之牧野诡事(四维数组的坐标搜索)
  18. Number 常用工具类
  19. 研发预算咨询支持活动
  20. [开源][设计]优秀的3D绘图软件——Blender

热门文章

  1. 如何利用站外推广的Facebook红人群组,提高亚马逊流量?
  2. python线程退出或应用程序请求_Python 线程和进程
  3. 存储:lun与卷(LVM)
  4. 如何在gateway网关中聚合swagger
  5. 2014年大数据预测分析市场的新兴方法
  6. 好员工的十个标准[精]
  7. matlab模仿lc串联谐振,二阶串联谐振系统Matlab/Simulink仿真
  8. kubeasz部署k8s高可用集群
  9. 【干货】汇编修改,优先考虑简短的汇编字节, B0 08 mov al,0x8
  10. spring boot项目框架的搭建