来源:极客Merry

前言

在深度学习中若是没有带标注的数据,这可能会阻碍研究的进展,所以深度学习第一步就是制作数据集,手动去标注一些数据。LabelMe就是这样一个在线的图像数据标注工具:

LabelMe工具地址

http://labelme.csail.mit.edu/Release3.0/

今天要介绍的图像标注工具是受到LabelMe启发的,使用Python和PyQT进行重写的一个离线工具labelme:

labelme的GitHub地址

https://github.com/wkentaro/labelme

labelme可以通过多边形,矩形,圆形,直线和点的方式对图像进行标注,能够满足语义分割和目标检测等任务的标注要求。同时,labelme通过json文件存储标注的信息。

01

labelme安装

各个平台的安装方法在GitHub上已有说明,我使用的是Win10,在Win10,Python3环境下的安装也很简单:

pip install pyqt5
pip install labelme

如果安装速度过慢,可以考虑换源:

pip install labelme  -i https://pypi.tuna.tsinghua.edu.cn/simple

安装完成后,在命令行执行以下命令,就会出现labelme的界面

labelme

然后就可以对图像进行标注了。Open选项是打开一张图像,对单张图像进行标注,OpenDir选项是选中要标记的图像文件夹,对文件夹内的所有图像进行标注。

02

语义分割标注

点击"open",打开需要标注的图像,选择"CreatePolygons",然后对目标区域进行标注。

"CreatePolygons"是采用多边形方式标注,同样有矩形(Rectangle),圆形(Circle),线段(Line)和点(Point)的方式进行标注,可根据需要自由选择。

标注完成后,点击"save"会生成一个json文件,这个文件就保存了图像标注的信息。打开json文件看看里面都是什么东东。限于篇幅原因,只展示关键的数据信息。

下面的json文件只展示了桌子的标注信息(上图中两个人的标注信息由于太长,故删去)。可以看到,"shapes"字段包含了整幅图像所有区域的标注点信息,具体的各个区域标注的点的信息都存在"points"里,它表示的是图像上构成多边形标注的各点坐标,"label"指明该目标区域的类别,"imageData"参数保存了原始图像的信息。

{"version": "4.5.7","flags": {},"shapes": [{"label": "tabel","points": [[304.34715025906735,274.3523316062176],[330.7720207253886,268.13471502590676],[367.0414507772021,268.9119170984456],[393.98445595854923,279.01554404145077],[422.74093264248705,295.0777202072539],[432.0673575129534,316.0621761658031],[426.6269430051814,331.0880829015544],[422,337],[292,337],[277.4041450777202,336.7875647668394],[273.25906735751295,303.8860103626943],[283.10362694300517,290.1554404145078]],"group_id": null,"shape_type": "polygon","flags": {}}],"imagePath": "2011_000003.jpg","imageData": "巨长巨长的图像数据","imageHeight": 338,"imageWidth": 500
}

然后将json文件转换为对应的标签图像。进入json文件所在目录下,在命令行执行以下命令

labelme_json_to_dataset 2011_000003.json

在同一级目录下会生成一个与json同名的文件夹,里面有四个文件:

"label.png"就是语义分割需要的标签数据了。这张图像标注了两类区域(加上背景总共三类),一类是"person",另一类是"tabel",同一类别的区域用同一种颜色填充。

读取"label.png"看看里面底层数据都是什么妖魔鬼怪:写一个脚本将图像数据转换为ASCII码,并且保存到txt文件中,这个过程有点像是图像转字符画。

import numpy as np
from PIL import Imagepng_file = "label.png路径"
img = Image.open(png_file)
img = img.resize((int(img.size[0]*0.25),int(img.size[1]*0.25)))
print(img.size)img_arr = np.asarray(img)
# 统计图像中的像素点数值
label = np.unique(img_arr)
print(label)height, width = img_arr.shape
print(height, width)img2code = ''
for i in range(height):for j in range(width):#pixel = img.getpixel((j, i))#img2code += ascii(pixel)img2code += ascii(img_arr[i][j])img2code += '\n'fo = open('txt存储路径', 'w')
fo.write(img2code)
fo.close()

打开刚刚保存的txt文件,因为太大全屏显示不了,将字体大小设置为七号,可以看到效果如下。字符画的宽高比例和原图不一样,这是因为竖直方向上显示字符占用的空间大小和水平方向上不一样。

从上图可以看出,最终得到的标签图像,底层存储的数值按不同类别区域设置为不同数值,背景的每个像素数值设置为0,person的每个像素数值设为1,tabel的每个像素数值设为2。

03

批量转换json为标签图像

"labelme_json_to_dataset"这个命令能将json文件转为标签数据,但是它一次只能转换一个,若是有成千上万张图像简直难以想象,本来标注完图像已经头昏脑胀,难道还要我一个一个转换?不可能的!这时需要自己写个脚本来帮我们完成这个任务。

第一种方式借助于labelme提供的"labelme_json_to_dataset"这个命令。利用os.system()函数批量转换json文件,每个json生成的同名文件夹与json在同一级目录下。

import osjson_path = "json文件保存路径"for filename in os.listdir(json_path):os.system("labelme_json_to_dataset "+os.path.join(json_path,filename))

第二种方式使用labelme提供的API。使用img_b64_to_arr()函数,将json文件中"iamgeData"字段的字符转换为原始图像;然后根据json文件中"shapes"字段的标注信息,使用labelme_shapes_to_label()函数获取到标签图像lbl。

有童鞋可能会发现,此时的lbl标签图像一片漆黑,什么也没有。这是因为图像中各点的像素值是标签对应的数字(如同上面画的字符画),而这些数字都很小:0,1,2,3....,而黑色对应的像素值为0,所以lbl图像的颜色和黑色非常接近,看起来就是一片漆黑。

这时我们只需要给图像上色就可以了:使用putpalette()函数,而且我们可以自定义各个类别区域的颜色。

import json
import os
import numpy as np
from PIL import Image
from labelme import utilsdef json2mask_multi(json_path, save_path):if not os.path.exists(save_path):os.makedirs(save_path)for json_name in os.listdir(json_path):data = json.load(open(os.path.join(json_path, json_name)))json_name = json_name.split('.')[0]# 根据imageData字段的字符可以得到原图像img = utils.img_b64_to_arr(data['imageData'])# lbl为label图像(用类别名对应的数字来标,背景为0)# lbl_names为label名和数字的对应关系字典lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])mask = Image.fromarray(lbl).convert('L')# putpalette给对象加上调色板,相当于上色:R,G,B# 三个数一组,对应于RGB通道,可以自己定义标签颜色mask.putpalette([0, 0, 0,  255, 0, 255,255, 255, 0,128, 128, 128])mask.save(os.path.join(save_path, json_name + ".png"))json_path = "json文件存储路径"
save_path = "标签图像的保存路径"
json2mask_multi(json_path,save_path)

本文只是对labelme简单介绍了一番,因为自己在做语义分割时需要做一些标注,所以只介绍了语义分割上的应用,而labelme还可以满足目标检测和图像分类任务的标注要求,这些功能就留给各位童鞋去探索研究,这里就不一一展开来说明。

------- End -------

点右下角「在看」与转发

是对我们最大的支持

特别推荐下公众号「价值前瞻」,分享读书、成长和投资思考,欢迎来串门。

回复「书单」 可获取精选书单一份,包括《如何阅读 一本书》、《巴菲特之道》、《金字塔原理》、高瓴张磊的《价值》、《投资最重要的事》、《戴维斯王朝》等书籍的笔记内容或思维导图

价 值 前 瞻

做一个有远见的人

扫码关注,查看更多内容

深度学习图像标注工具labelme相关推荐

  1. 深度学习图像标注工具汇总

    深度学习图像标注工具汇总 原文地址: https://blog.csdn.net/chaipp0607/article/details/79036312 对于监督学习算法而言,数据决定了任务的上限,而 ...

  2. 资源 | 深度学习图像标注工具汇总

    作者 | chaibubble 来源 | CSDN 网站 对于监督学习算法而言,数据决定了任务的上限,而算法只是在不断逼近这个上限.世界上最遥远的距离就是我们用同一个模型,但是却有不同的任务.但是数据 ...

  3. 深度学习图像标注工具-LabelImage (一款在线的深度学习图像分割标注工具)

    导语 这个工具是在一个关于AI的项目中二次开发优化积累下来的,基本上可以满足常见的图像标注工作,有矩形,多边形等标注方式,后面还将会继续添加如圆形.关键点.OCR等标注方式, 其实现在就多边形标注而言 ...

  4. 深度学习图像标注软件labelme使用教程

    labelme使用方法 配置环境 win10 anaconda3(2022.05) label(5.0.1) 官方代码不能使用可能是版本问题 官方教程 图像分类 目标检测 语义分割 实例分割 视频标注 ...

  5. 深度学习图像标注软件LabelMe使用方法

    一.安装 安装Python并配置环境变量 使用pip安装labelme,cmd中使用如下命令: pip install labelme 等待安装完成即可 二.标注 1.打开labelme,cmd中输入 ...

  6. 深度学习数据集标注工具、图像语料数据库等资源

    NLP+VS︱深度学习数据集标注工具.图像语料数据库.实验室搜索ing... 2017年02月07日 12:12:01 阅读数:27032 ~~因为不太会使用opencv.matlab工具,所以在找一 ...

  7. 深度学习半自动标注_时下流行的深度学习数据标注工具

    时下流行的深度学习数据标注工具 迷若烟雨 2018-09-04 16:36:00 15820 收藏 33 分类专栏: 深度学习 版权 本文将标注工具适用的最佳运行环境分成了三类. 跨平台 https: ...

  8. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing..

    一.NLP标注工具 来源:<构想:中文文本标注工具(附开源文本标注工具列表)> Chinese-Annotator   来源:https://github.com/crownpku/Chi ...

  9. NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing....

    from: https://blog.csdn.net/sinat_26917383/article/details/54908389 一.NLP标注工具 来源:<构想:中文文本标注工具(附开源 ...

最新文章

  1. 菜鸟学Linux 第044篇笔记 算法和私有CA
  2. ios10申请权限以及弹出允许使用数据框
  3. SpringBoot+AntV实现一次前后端交互渲染多个饼状图
  4. UOJ #588. 图图的旅行
  5. VS Code 黑宝书背后的故事
  6. 【OJ】洛谷循环结构题单题解锦集
  7. 布线管理的设计(一)
  8. C#字节数组转换成字符串
  9. SQL Server中删除重复数据
  10. 关于mysql性能优化_关键的十个MySQL性能优化技巧
  11. Pycharm汉化后设置无法打开解决办法
  12. 计算机毕业设计JAVA垂钓分享交流网的设计与实现mybatis+源码+调试部署+系统+数据库+lw
  13. piaget读法_读音教学 | 这些手表品牌原来是这么念的!
  14. 配置Snappy压缩
  15. 只有一重循环的排序——侏儒排序(Gnome Sort)
  16. 【深信服】Python 开发工程师(云计算、网络安全) 【已offer】
  17. USA gov data from Bitly
  18. PPPoE获取到32位掩码的研究
  19. GSM-GPRS-WCDMA-LTE-5g 的总结
  20. php中上传图片,原生代码

热门文章

  1. vue自定义指令(详解)
  2. 简述结构化范型和面向对象范型的要点,并分析他们的优缺点
  3. 女硕士患绝症谱写生命绝唱 参加答辩1月后辞世
  4. 图论总结(一)二分图最大匹配
  5. Tensorflow实现cnn模型的训练与使用
  6. 两种主流桌面虚拟化的对决
  7. 使用技术简章 | 具体讲解AEE 4G执法记录仪的无线功能
  8. katalon 测试app_Katalon Studio一款免费的自动化测试工具
  9. 数字信号处理-基于matlab的语音信号的加密解密
  10. 经典的机器学习二分类算法——Logistic回归