LabelMe 可用于实例分割,语义分割,目标检测,分类任务的数据集标注工作。
在线标注版本:http://labelme2.csail.mit.edu/Release3.0/index.php?message=1
python 版本:https://github.com/wkentaro/labelme
官方文档:
分类标注:Classification
目标检测标注:Object Detection
语义分割标注:Semantic Segmentation
实例分割标注:Instance Segmentation
视频标注:Video Annotation
其他形式标注:LabelMe Primitives
python版本使用
使用环境:Anaconda
python版本:2.7 / 3.6
1. 安装
# python2.7版本安装
conda create --name=labelme python=2.7
source activate labelme
# conda install -c conda-forge pyside2
conda install pyqt
pip install labelme
# if you'd like to use the latest version. run below:
# pip install git+https://github.com/wkentaro/labelme.git
# python3.6版本安装
conda create --name=labelme python=3.6
source activate labelme
# conda install -c conda-forge pyside2
# conda install pyqt
pip install pyqt5 # pyqt5 can be installed via pip on python3
pip install labelme
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
2. 使用
# 查看labelme使用方法
labelme --help
(labelme) @supermicro:~$ labelme --help
usage: labelme [-h] [--version] [--reset-config]
[--logger-level {debug,info,warning,fatal,error}]
[--output OUTPUT] [--config CONFIG_FILE] [--nodata]
[--autosave] [--nosortlabels] [--flags FLAGS]
[--labelflags LABEL_FLAGS] [--labels LABELS]
[--validatelabel {exact,instance}] [--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_FILE config file (default: /home/zyy/.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,instance}
label validation types
--keep-prev keep annotation of previous frame
--epsilon EPSILON epsilon to find nearest vertex on canvas
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- -h 或 –help 显示帮助信息
- -V 或 --version 显示 labelme 版本号
- --output:指定输出标注文件的保存路径,如果路径以 .json 结尾,则保存为一个 .json 文件,否则默认保存为文件夹形式
- --labels:用于指定标签名称,可以是用逗号分隔的 label list,也可以是包含标签的 txt 文件
- --nodata:不保存图像到 JSON 文件
3. 分割任务标注示例
终端直接输入:
# 直接打开labelme
labelme
- 1
- 2
- open:打开某一张图片
- openDir:打开某一文件夹,加载其目录下的所有图片
通过 open 读取图片,选择 create polygons
手动进行勾画,全部完成后保存为 json 文件(在当前目录下):
右键单击可以选择不同的标注方式,比如 polygons 用于分割,rectangle 用于检测。
如果是实例分割,一个图像中有多只猫,标签的命名规则为:cat1、cat2 …,如果是语义分割就不用区分了。
labelme 可以进行多类别标注,Label List
显示当前已有的类别,Polygon Labels
显示当前已标注的区域,通过勾选 Polygon Labels 前面的 “√”
,可以选择显示特定的分割区域:
要得到 label 文件,需要将 json 转换为单通道的 image,终端输入命令:
# 进入json文件保存目录
cd /path/to/your/jsonfile
# 转换
labelme_json_to_dataset <文件名>.json
# 比如
labelme_json_to_dataset cat.1.json
- 1
- 2
- 3
- 4
- 5
- 6
将在当前目录下得到一个文件夹 cat_1_json
,包括四个文件:
- img.png:原始图像
- label.png:标签,uint8
- label_viz.png:可视化的带标签图像
- label_names.txt:记录了标签的名称
img.png
label.png:
label_viz.png:
4. 其他说明
(1)启动 labelme 的方式:
# 直接打开labelme
labelme
# 打开某个文件夹,加载该文件夹下及其子文件夹下的所有图片
labelme path/to/imgfile/
# 直接打开指定的图片
labelme cat.1.jpg
# 标注保存为json文件同时自动关闭gui窗口
labelme cat.1.jpg -O cat.1.jpg.json
# 指定label list
labelme cat.1.jpg
--labels cat,eye
# 或者传入文件形式的label list
--labels labels.txt
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
(2)将 JSON 文件转换为 image 和 label
# 在当前目录下生成一个文件夹cat_1_json
labelme_json_to_dataset cat.1.json
# 指定生成文件夹的名字为cat1
labelme_json_to_dataset cat.1.json -o cat1
- 1
- 2
- 3
- 4
- 5
(3)可视化 json 文件:
# 终端输入
labelme_draw_json cat.1.json
- 1
- 2
5. 加载标签png
label.png 用 scipy.misc.imread
或者 skimage.io.imread
读取可能会出错,推荐用 PIL.Image.open
读取:
>>> import numpy as np
>>> import PIL.Image
>>> label_png = ‘imgs/cat1/label.png’ # 设置标签文件路径
>>> lbl = np.asarray(PIL.Image.open(label_png))
>>> print(lbl.dtype)
dtype(‘uint8’)
>>> np.unique(lbl)
array([0, 1, 2], dtype=uint8)
>>> lbl.shape
(280, 300)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
查看 label.png:
# 终端输入
labelme_draw_label_png imgs/cat1/label.png
- 1
- 2
6. 生成VOC格式的标签数据
在下载的 labelme 的 zip 包里,路径 labelme/examples/semantic_segmentation
下,data_annotated
是原图和对应的 JSON 文件,data_dataset_voc
是 voc 格式的输出结果,labelme2voc.py
是转换的主函数,labels.txt
是标签类别。
1)文件组织形式如下:
*_annotated
存放原图和已经生成的对应 JSON 文件- 将 labelme 工程文件下的 labelme2voc.py 复制过来
- 自己写一个
*.txt
文件,内容是分割的标签,最前面加上__ignore__
和_background_
2)转换为voc数据格式:
# 终端输入
./labelme2voc.py [图像路径] [voc文件夹名称] --labels [label list]
# 比如
./labelme2voc.py cat_annotated cat_dataset_voc --labels labels.txt
- 1
- 2
- 3
- 4
- 5
在当前目录下自动生成 cat_dataset_voc
文件夹(转换前确保不要有重名文件夹,否则会报错)
cat_dataset_voc
文件夹内容:
转换为 COCO 数据格式,同样的套路:
./labelme2coco.py data_annotated data_dataset_coco --labels labels.txt
- 1
</div>
<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
</div>