文章目录
本文主要介绍图像分割所用自定义数据集制作工具labelme及其使用方法
1、labelme简介
Labelme 是一个图形界面的图像标注软件。其的设计灵感来自于 http://labelme.csail.mit.edu/ 。它是用 Python 语言编写的,图形界面使用的是 Qt(PyQt)。
上图为VOC数据集实例分割样例
上图为其它用例:如语义分割、目标检测和分类
上图为各种各种形状的标注样例:polygon多边形、rectangle矩形、ciclel 圆、line直线,point 点
2、labelme用途
- 对图像进行多边形,矩形,圆形,多段线,线段,点形式的标注(可用于目标检测,图像分割,等任务)
- 对图像进行进行 flag 形式的标注(可用于图像分类 和 清理 任务)
- 视频标注
- 生成 VOC 格式的数据集(for semantic / instance segmentation)
- 生成 COCO 格式的数据集(for instance segmentation)
3、labelme安装
无论什么平台,只要有pip3都可以安装:
pip install labelme
4、labelme使用
终端键入labelme启动标注窗口:
labelme
通过labelme -h可以查看标注帮助文档:
labelme -h
#有如下输出:
usage: labelme [-h] [--version] [--reset-config] [--logger-level {debug,info,warning,fatal,error}] [--output OUTPUT]
[--config CONFIG] [--nodata] [--autosave] [--nosortlabels] [--flags FLAGS] [--labelflags LABEL_FLAGS]
[--labels LABELS] [--validatelabel {exact}] [--keep-prev] [--epsilon EPSILON]
[filename]
positional arguments:
filename image or label filename
optional arguments:
-h, --help show this help message and exit
--version, -V show version
--reset-config reset qt config
--logger-level {debug,info,warning,fatal,error}
logger level
--output OUTPUT, -O OUTPUT, -o OUTPUT #指定输出文件夹
output file or directory (if it ends with .json it is recognized as file, else as directory)
--config CONFIG config file or yaml-format string (default: C:\Users\T460\.labelmerc)
--nodata stop storing image data to JSON file #图片数据是否保存到标注文件事
--autosave auto save #标注后结果是否自动保存
--nosortlabels stop sorting labels
--flags FLAGS comma separated list of flags OR file containing flags#分类用标签
--labelflags LABEL_FLAGS
yaml string of label specific flags OR file containing json string of label specific flags
(ex. {person-\d+: [male, tall], dog-\d+: [black, brown, white], .*: [occluded]})
--labels LABELS comma separated list of labels OR file containing labels #分割用标签
--validatelabel {exact}
label validation types
--keep-prev keep annotation of previous frame #用于视频标注
--epsilon EPSILON epsilon to find nearest vertex on canvas
下面将用VOC数据集为例进行
4.1 分类标注
labelme --flags flags.txt
flags.txt中内容为:
然后通过"打开目录“,打开图片所在路径,或labelme imgpath --flags flags.txt
这个命令来打开效果为:
需要说明的是,因为没有指定auto save
,所以每次标完都会有弹窗出来选择是否进行保存,如是选是,会再次弹出要保存位置的窗口:
接着,看一下标注文件都是什么内容:
{
"version": "4.5.9",
"flags": {
"aeroplane": true,
"bicycle": true,
"bird": true,
"boat": false,
"bottle": false,
"bus": true,
"car": false,
"cat": false,
"chair": false,
"cow": false,
"diningtable": false,
"dog": false,
"horse": false,
"motorbike": false,
"person": false,
"pottedplant": false,
"sheep": false,
"sofa": false,
"train": false,
"tvmonitor": false
},
"shapes": [],
"imagePath": "2007_000027.jpg",
"imageData": "/9j/4AAQSkZJrRRQA42MO等等内容9P+CsCJ4tvNuf+PBv/RiUUUUMye5//9k=",
"imageHeight": 500,
"imageWidth": 486
}
imageData中存储的是加密处理后的base64格式:
解码方法为:
待写。。。
所以考虑到便捷性,启动labelme时要:
labelme --flags flags.txt --nodata --autosave --output ./
增加自动保存,标注文件中不加原始图像,并且有输出结果保存位置。当然这几个选项在软件中也可以修改。
nodata后结果为:
4.2 目标检测标注
启动:
labelme data_annotated --labels labels.txt --nodata --autosave
labels我们只标car,person为例,初次加载后结果:
接着开始标注:
鼠标右击图片,或点开编缉或使用快捷键Ctrl+R来创建矩形:
点两下,分别是框的左上角和右下角,点完右下角会有框弹出,可以手动输入类别,也可以选中列出的候选类别并确定。
如果标错了,可以鼠标右击,选择undo last point(ctrl+z)
,标完后的效果为:
看一下标注文件:
"version": "4.5.9",
"flags": {},
"shapes": [
{
"label": "person",
"points": [
[
163.0229007633588,
97.47328244274809
],
[
356.1526717557252,
333.35114503816794
]
],
"group_id": null,
"shape_type": "rectangle",
"flags": {}
},
{
"label": "car",
"points": [
[
74.08695652173913,
235.13043478260863
],
[
126.26086956521738,
324.2608695652174
]
],
"group_id": null,
"shape_type": "rectangle",
"flags": {}
}
],
"imagePath": "2007_000027.jpg",
"imageData": null,
"imageHeight": 500,
"imageWidth": 486
}
多个标注框在shapes的列表中依次存放。
标注完成后将其转换成VOC格式:
待完成
4.3 语义分割标注
同样启动:
labelme --labels labels.txt --nodata
与目标检测的相似,只有一点不同的就是把矩形把换成多边型:
看一下json,比较大:
{
"version": "4.0.0",
"flags": {},
"shapes": [
{
"label": "person",
"points": [
[
204.936170212766,
108.56382978723406
],
[
183.936170212766,
141.56382978723406
],
[
166.936170212766,
150.56382978723406
],
[
108.93617021276599,
203.56382978723406
],
[
92.93617021276599,
228.56382978723406
],
[
95.93617021276599,
244.56382978723406
],
[
105.93617021276599,
244.56382978723406
],
[
116.93617021276599,
223.56382978723406
],
[
163.936170212766,
187.56382978723406
],
[
147.936170212766,
212.56382978723406
],
[
117.93617021276599,
222.56382978723406
],
[
108.93617021276599,
243.56382978723406
],
[
100.93617021276599,
325.56382978723406
],
[
135.936170212766,
329.56382978723406
],
[
148.936170212766,
319.56382978723406
],
[
150.936170212766,
295.56382978723406
],
[
169.936170212766,
272.56382978723406
],
[
171.936170212766,
249.56382978723406
],
[
178.936170212766,
246.56382978723406
],
[
186.936170212766,
225.56382978723406
],
[
214.936170212766,
219.56382978723406
],
[
242.936170212766,
157.56382978723406
],
[
228.936170212766,
146.56382978723406
],
[
228.936170212766,
125.56382978723406
],
[
216.936170212766,
112.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "person",
"points": [
[
271.936170212766,
109.56382978723406
],
[
249.936170212766,
110.56382978723406
],
[
244.936170212766,
150.56382978723406
],
[
215.936170212766,
219.56382978723406
],
[
208.936170212766,
245.56382978723406
],
[
214.936170212766,
220.56382978723406
],
[
188.936170212766,
227.56382978723406
],
[
170.936170212766,
246.56382978723406
],
[
170.936170212766,
275.56382978723406
],
[
221.936170212766,
278.56382978723406
],
[
233.936170212766,
259.56382978723406
],
[
246.936170212766,
253.56382978723406
],
[
245.936170212766,
256.56382978723406
],
[
242.936170212766,
251.56382978723406
],
[
262.936170212766,
256.56382978723406
],
[
304.936170212766,
226.56382978723406
],
[
297.936170212766,
199.56382978723406
],
[
308.936170212766,
164.56382978723406
],
[
296.936170212766,
148.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "person",
"points": [
[
308.936170212766,
115.56382978723406
],
[
298.936170212766,
145.56382978723406
],
[
309.936170212766,
166.56382978723406
],
[
297.936170212766,
200.56382978723406
],
[
305.936170212766,
228.56382978723406
],
[
262.936170212766,
258.56382978723406
],
[
252.936170212766,
284.56382978723406
],
[
272.936170212766,
291.56382978723406
],
[
281.936170212766,
250.56382978723406
],
[
326.936170212766,
235.56382978723406
],
[
351.936170212766,
239.56382978723406
],
[
365.936170212766,
223.56382978723406
],
[
371.936170212766,
187.56382978723406
],
[
353.936170212766,
168.56382978723406
],
[
344.936170212766,
143.56382978723406
],
[
336.936170212766,
115.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "chair",
"points": [
[
308.936170212766,
243.33306055646483
],
[
281.936170212766,
252.33306055646483
],
[
270.936170212766,
288.33306055646483
],
[
174.936170212766,
276.33306055646483
],
[
148.936170212766,
297.33306055646483
],
[
150.936170212766,
320.33306055646483
],
[
159.936170212766,
329.33306055646483
],
[
164.77327127659578,
375.7692307692308
],
[
485.936170212766,
374.33306055646483
],
[
497.936170212766,
337.33306055646483
],
[
497.936170212766,
203.33306055646483
],
[
453.936170212766,
194.33306055646483
],
[
434.936170212766,
213.33306055646483
],
[
367.936170212766,
225.33306055646483
],
[
350.936170212766,
242.33306055646483
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "person",
"points": [
[
425.936170212766,
82.56382978723406
],
[
404.936170212766,
109.56382978723406
],
[
400.936170212766,
114.56382978723406
],
[
437.936170212766,
114.56382978723406
],
[
448.936170212766,
102.56382978723406
],
[
446.936170212766,
91.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "__ignore__",
"points": [
[
457.936170212766,
85.56382978723406
],
[
439.936170212766,
117.56382978723406
],
[
477.936170212766,
117.56382978723406
],
[
474.936170212766,
87.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
183.936170212766,
140.56382978723406
],
[
125.93617021276599,
140.56382978723406
],
[
110.93617021276599,
187.56382978723406
],
[
22.936170212765987,
199.56382978723406
],
[
18.936170212765987,
218.56382978723406
],
[
22.936170212765987,
234.56382978723406
],
[
93.93617021276599,
239.56382978723406
],
[
91.93617021276599,
229.56382978723406
],
[
110.93617021276599,
203.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
103.93617021276599,
290.56382978723406
],
[
58.93617021276599,
303.56382978723406
],
[
97.93617021276599,
311.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
348.936170212766,
146.56382978723406
],
[
472.936170212766,
149.56382978723406
],
[
477.936170212766,
162.56382978723406
],
[
471.936170212766,
196.56382978723406
],
[
453.936170212766,
192.56382978723406
],
[
434.936170212766,
213.56382978723406
],
[
368.936170212766,
226.56382978723406
],
[
375.936170212766,
187.56382978723406
],
[
353.936170212766,
164.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
246.936170212766,
252.56382978723406
],
[
219.936170212766,
277.56382978723406
],
[
254.936170212766,
287.56382978723406
],
[
261.936170212766,
256.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
}
],
"imagePath": "2011_000006.jpg",
"imageData": null,
"imageHeight": 375,
"imageWidth": 500
}
可以看到与目标检测的相似
接着,将数据转换成VOC格式:
待完成
4.4 实例分割标注
启动:
labelme --labels labels.txt --nodata
同样看一下json文件:
{
"version": "4.5.9",
"flags": {},
"shapes": [
{
"label": "person_1",
"points": [
[
204.936170212766,
108.56382978723406
],
[
183.936170212766,
141.56382978723406
],
[
166.936170212766,
150.56382978723406
],
[
108.93617021276599,
203.56382978723406
],
[
92.93617021276599,
228.56382978723406
],
[
95.93617021276599,
244.56382978723406
],
[
105.93617021276599,
244.56382978723406
],
[
116.93617021276599,
223.56382978723406
],
[
163.936170212766,
187.56382978723406
],
[
147.936170212766,
212.56382978723406
],
[
117.93617021276599,
222.56382978723406
],
[
108.93617021276599,
243.56382978723406
],
[
100.93617021276599,
325.56382978723406
],
[
135.936170212766,
329.56382978723406
],
[
148.936170212766,
319.56382978723406
],
[
150.936170212766,
295.56382978723406
],
[
169.936170212766,
272.56382978723406
],
[
171.936170212766,
249.56382978723406
],
[
178.936170212766,
246.56382978723406
],
[
186.936170212766,
225.56382978723406
],
[
214.936170212766,
219.56382978723406
],
[
242.936170212766,
157.56382978723406
],
[
228.936170212766,
146.56382978723406
],
[
228.936170212766,
125.56382978723406
],
[
216.936170212766,
112.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "person_2",
"points": [
[
271.936170212766,
109.56382978723406
],
[
249.936170212766,
110.56382978723406
],
[
244.936170212766,
150.56382978723406
],
[
215.936170212766,
219.56382978723406
],
[
208.936170212766,
245.56382978723406
],
[
214.936170212766,
220.56382978723406
],
[
188.936170212766,
227.56382978723406
],
[
170.936170212766,
246.56382978723406
],
[
170.936170212766,
275.56382978723406
],
[
221.936170212766,
278.56382978723406
],
[
233.936170212766,
259.56382978723406
],
[
246.936170212766,
253.56382978723406
],
[
245.936170212766,
256.56382978723406
],
[
242.936170212766,
251.56382978723406
],
[
262.936170212766,
256.56382978723406
],
[
304.936170212766,
226.56382978723406
],
[
297.936170212766,
199.56382978723406
],
[
308.936170212766,
164.56382978723406
],
[
296.936170212766,
148.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "person_3",
"points": [
[
308.936170212766,
115.56382978723406
],
[
298.936170212766,
145.56382978723406
],
[
309.936170212766,
166.56382978723406
],
[
297.936170212766,
200.56382978723406
],
[
305.936170212766,
228.56382978723406
],
[
262.936170212766,
258.56382978723406
],
[
252.936170212766,
284.56382978723406
],
[
272.936170212766,
291.56382978723406
],
[
281.936170212766,
250.56382978723406
],
[
326.936170212766,
235.56382978723406
],
[
351.936170212766,
239.56382978723406
],
[
365.936170212766,
223.56382978723406
],
[
371.936170212766,
187.56382978723406
],
[
353.936170212766,
168.56382978723406
],
[
344.936170212766,
143.56382978723406
],
[
336.936170212766,
115.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "chair",
"points": [
[
309.7054009819968,
242.94844517184941
],
[
282.7054009819968,
251.94844517184941
],
[
271.7054009819968,
287.9484451718494
],
[
175.70540098199677,
275.9484451718494
],
[
149.70540098199677,
296.9484451718494
],
[
151.70540098199677,
319.9484451718494
],
[
160.70540098199677,
328.9484451718494
],
[
165.54250204582655,
375.38461538461536
],
[
486.7054009819968,
373.9484451718494
],
[
498.7054009819968,
336.9484451718494
],
[
498.7054009819968,
202.94844517184941
],
[
454.7054009819968,
193.94844517184941
],
[
435.7054009819968,
212.94844517184941
],
[
368.7054009819968,
224.94844517184941
],
[
351.7054009819968,
241.94844517184941
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "person_4",
"points": [
[
425.936170212766,
82.56382978723406
],
[
404.936170212766,
109.56382978723406
],
[
400.936170212766,
114.56382978723406
],
[
437.936170212766,
114.56382978723406
],
[
448.936170212766,
102.56382978723406
],
[
446.936170212766,
91.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "__ignore__",
"points": [
[
457.936170212766,
85.56382978723406
],
[
439.936170212766,
117.56382978723406
],
[
477.936170212766,
117.56382978723406
],
[
474.936170212766,
87.56382978723406
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
183.936170212766,
140.56382978723406
],
[
125.93617021276599,
140.56382978723406
],
[
110.93617021276599,
187.56382978723406
],
[
22.936170212765987,
199.56382978723406
],
[
18.936170212765987,
218.56382978723406
],
[
22.936170212765987,
234.56382978723406
],
[
93.93617021276599,
239.56382978723406
],
[
91.93617021276599,
229.56382978723406
],
[
110.93617021276599,
203.56382978723406
]
],
"group_id": 0,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
103.93617021276599,
290.56382978723406
],
[
58.93617021276599,
303.56382978723406
],
[
97.93617021276599,
311.56382978723406
]
],
"group_id": 0,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
348.936170212766,
146.56382978723406
],
[
472.936170212766,
149.56382978723406
],
[
477.936170212766,
162.56382978723406
],
[
471.936170212766,
196.56382978723406
],
[
453.936170212766,
192.56382978723406
],
[
434.936170212766,
213.56382978723406
],
[
368.936170212766,
226.56382978723406
],
[
375.936170212766,
187.56382978723406
],
[
353.936170212766,
164.56382978723406
]
],
"group_id": 0,
"shape_type": "polygon",
"flags": {}
},
{
"label": "sofa",
"points": [
[
246.936170212766,
252.56382978723406
],
[
219.936170212766,
277.56382978723406
],
[
254.936170212766,
287.56382978723406
],
[
261.936170212766,
256.56382978723406
]
],
"group_id": 0,
"shape_type": "polygon",
"flags": {}
}
],
"imagePath": "2011_000006.jpg",
"imageData": null,
"imageHeight": 375,
"imageWidth": 500
}
接着进行格式转换,分别是labelme转VOC
待完成
labelme转COCO:
待完成
4.5视频标注
待完成
4.6其它形状标注
Labelme 除了能进行上面形式的标注,还能进行下面形式的标注:
- 多边形
- 矩形
- 圆形
- 多线段
- 线段
- 点
待完成
5其它
待完成