前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >labelme标注的数据分析[通俗易懂]

labelme标注的数据分析[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-10-01 06:34:04
发布于 2022-10-01 06:34:04
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

参考:

安装

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 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文件长什么样子。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
"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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-
#!/usr/bin/env python
import argparse
import json
import matplotlib.pyplot as plt
from labelme import utils
def main():
parser = argparse.ArgumentParser()
parser.add_argument('json_file')
args = parser.parse_args()
json_file = args.json_file
data = 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 像素取值 012 其中0对应背景,1对应第一个对象,2对应第二个对象
# 使用该方法取出每个对象的mask mask=[] mask.append((lbl==1).astype(np.uint8)) # 解析出像素值为1的对象,对应第一个对象 mask 为01组成的(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] # 返回第一个对象的边界点第一个点 list data['imagePath'] # 原图路径 str data['fillColor'] # 填充颜色(边界内部) list data['lineColor'] # 边界线颜色 list '''
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/env python
import argparse
import json
import matplotlib.pyplot as plt
import numpy as np
from labelme import utils
def main():
parser = argparse.ArgumentParser()
parser.add_argument('json_file')
args = parser.parse_args()
json_file = args.json_file
data = 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
# 解析图片中的对象 像素值不为00 对应背景)
mask=[]
class_id=[]
for i in range(1,len(lbl_names)): # 跳过第一个class(默认为背景)
mask.append((lbl==i).astype(np.uint8)) # 解析出像素值为1的对应,对应第一个对象 mask 为01组成的(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的数据接口解析自己的数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- 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提供的接口解析。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/194808.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月12日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
PQ实战:不确定项数的数据堆在一起,只有汉字是分组标志,怎么办?
小勤:前面关于《PQ-综合实战:数据都堆在一列里,怎么办?》的文章里,每组里的项数是一样的,但像这个,如果每组的项数不一样怎么办?
大海Power
2021/08/30
3430
理解PQ里的数据结构(一、总体结构)
大海:嗯,要深入学习M及函数部分,的确需要更加深入了解PQ里的数据是怎么构成的。我们还是先拿个简单的例子来看一下吧。
大海Power
2021/08/31
8190
这些步骤公式,我经常顺手改一下!|PQ实战技巧
导语:随手改公式,不仅能减少操作步骤,还能提升对Power Query函数的熟悉和理解。
大海Power
2024/06/07
2640
这些步骤公式,我经常顺手改一下!|PQ实战技巧
PQ/PP结合:领导就要这种格式的数据汇总之续篇
小勤:我知道了,其实跟传统数据透视表的布局设置都是一样的了,就是取消分类汇总、取消行列总计、设置表格形式、合并居中……你关于数据透视布局的文章《随心所欲的分类汇总》和《行列表头,想合就合,想套就套》里说得很清楚了哦。
大海Power
2021/08/30
1.2K0
PQ-综合实战:数据都堆在一列里,怎么办?
小勤:大海,最近公司系统导出来的订单数据害屎人了,所有信息都堆在了一列里面,你看,怎么转成规范的明细表啊?
大海Power
2021/08/30
5720
PQ-综合实战:根据关键词匹配查找对应内容
今天的文章有点儿长,步骤有点儿多,但这个综合操作很值得练好,以后扩展应用的空间很大。
大海Power
2021/08/30
1.9K0
Power Query 真经 - 第 7 章 - 常用数据转换
分析师面临的普遍问题是,无论从哪里获得数据,大部分情况都是一种不能立即使用的状态。因此,不仅需要时间把数据加载到文件中,还得花更多的时间来清洗它,改变它的结构,以便后续做分析的时候能更好的使用这个数据。
BI佐罗
2022/05/17
8.2K0
Power Query 真经 - 第 7 章 - 常用数据转换
PP-数据建模:明明删除了重复项,为什么还是说有重复值?
最近,有朋友在用Power Pivot构建表间关系的时候,出现了一个问题:明明我已经删除了重复项,但构建表间关系的时候,还是说我两个表都有重复的数据!结果表间关系建立不起来!
大海Power
2021/08/30
3.9K0
each和(x),90%的人都感困惑的知识难点! | PQ重点突破
前段时间,有朋友在群里问,Power Query最难的函数是什么?有的说是List.Accumulate,有的说是List.Generate……
大海Power
2022/11/07
1K0
each和(x),90%的人都感困惑的知识难点! | PQ重点突破
不支持连续分隔符当作一个处理?这个方法很多人没想到!|PQ实战
导语:一般来说,Excel里能实现的对数据的处理,在Power Query里都可以实现,有的Excel里方便一点儿,有的PQ里更快一些儿,但关键不在于多几个步骤还是少几个步骤,而是你是否需要重复地做。
大海Power
2024/03/13
3030
不支持连续分隔符当作一个处理?这个方法很多人没想到!|PQ实战
PQ-批量汇总多Excel表格之特殊处理:标题行前行数不确定的处理
标准Excel表格批量汇总过程及基础方法请参考文章:《PQ批量汇总Excel文件就是这么简单》,所有特殊情况处理都是在该基础方法之上加以适当的处理而已。
大海Power
2021/08/30
1K0
把表头日期整到一列?很多人会碰到这个小问题,其实很简单!|PQ实战
导语:把表头内容转成一列,是数据规范处理中经常遇到的一个问题,这个问题本身并不复杂,如果没有处理好,却有可能把问题复杂化。
大海Power
2023/12/26
5561
把表头日期整到一列?很多人会碰到这个小问题,其实很简单!|PQ实战
又一种数据堆在一列还被切断的情况,怎么办?|PQ实战
导语:日常工作中很难避免碰到一些奇奇怪怪的数据,但没办法,谁叫我们都是苦命的表哥表姐表叔表婶呢。
大海Power
2024/06/18
2000
又一种数据堆在一列还被切断的情况,怎么办?|PQ实战
列名是会变的日期,数据更新就出错,怎么办?
在用Power Query处理数据表的过程中,经常碰到一个问题——标题行是变化的,比如下面这个例子,日期随着数据的变化而更新:
大海Power
2023/01/11
1.2K0
Power Query 真经 - 第 9 章 - 批量合并文件
合并来自多个文件数据的传统方法是极其繁琐和容易出错的。每个文件都需要经历导入、转换、复制和粘贴的过程。根据转换数据量的大小和复杂程度、文件的数量以及解决方案运行的时长,这些问题可能形成可怕的积累效应。
BI佐罗
2022/07/07
5.7K0
Power Query 真经 - 第 9 章 - 批量合并文件
PQ-案例实战:格式化表单转数据明细之1:单表转换
大海:这种填报格式的申请表、登记表等等的要转为规范的数据明细还真是经常有的事。以前我写过一个可配置的VBA,就是自己定义好哪个单元格的内容转到明细表里的哪一列,比如配置表:
大海Power
2021/08/30
5810
10万行30列数据乘上系数,能快一些吗?含“函数作为参数”的触类旁通方法
小勤:前面讲到一个多列数据乘上一个系数的问题,《将多列的数据都乘上一个系数,Power Query里怎么操作比较简单?》,里面采用了逆透视成一列数据然后再透视回去的方法,操作比较简单,但是……
大海Power
2021/08/31
7530
PQ小问题小技巧8个,第一个就很多人都遇到了!
在Power Query及Power Pivot系列课程中,对大家日常学习和使用过程中的较多问题和可能遇到的坑有诸多讲解,比如,PQ系列课一开始就有新手经常遇到问题提示,让大家有一定的印象(也可能很多朋友直接跳过去了):
大海Power
2021/08/31
2.6K0
一维表、二维表那些事
像下面左图这种仅需通过单行就能确定数值的,被称为一维表。为了方便浏览打印美观,很多人会把重复姓名合并单元格,如下面右图(合并单元格只是格式美观,对数据清洗反而是一大障碍,会耗费额外时间精力)
公众号PowerBI大师
2020/05/27
4.4K0
PQ-综合实战:工资条制作一键刷新之M解
大海:嗯。用函数解的话步骤上省一些,开始之前咱们先确定一下做的思路:工资表原来的数据已经有了,咱们实际只需要构造一个同样多行的重复标题表和一个同样多行的空白表,然后排序就可以了。
大海Power
2021/08/30
4810
推荐阅读
相关推荐
PQ实战:不确定项数的数据堆在一起,只有汉字是分组标志,怎么办?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档