Labelme分割标注软件
相关重要博文链接:
MS COCO数据集介绍以及pycocotools使用
Labelme项目源代码
Labelme是一款经典的标注工具,支持目标检测、语义分割、实例分割等任务。今天针对分割任务的数据标注进行简单的介绍。开源项目地址
0、VOC数据集目录
1、环境配置与安装
1.1 创建conda虚拟环境(建议)
为了不影响其他python环境,建议新建一个环境。(不想新建可以跳过)
这里以创建一个名为labelme_env,python版本为3.8的环境为例:
conda create -n labelme_env python=3.8
创建完成后,进入新环境:
conda activate labelme_env
1.2 安装Labelme
安装非常简单,直接使用pip安装即可:
pip install labelme
安装pycocotools
# ubutnu
pip install pycocotools
# Windows
pip install pycocotools-windows
安装完成后在终端输入labelme即可启动:
labelme
2、简单使用
├── img_data: 存放你要标注的所有图片
├── data_annotated: 存放后续标注好的所有json文件
└── labels.txt: 所有类别信息
2.1 创建label标签文件
__ignore__
_background_
dog
cat
2.2 启动labelme
labelme --labels labels.txt
2.3 打开文件/文件夹
2.4 设置保存结果路径
2.5 标注目标
2.6 保存json文件格式
{
"version": "4.5.9",
"flags": {
},
"shapes": [
{
"label": "dog",
"points": [
[
108.09090909090907,
687.1818181818181
],
....
[
538.090909090909,
668.090909090909
],
[
534.4545454545454,
689.0
]
],
"group_id": null,
"shape_type": "polygon",
"flags": {
}
}
],
"imagePath": "../img_data/1.jpg",
"imageData": null,
"imageHeight": 690,
"imageWidth": 690
}
3 格式转换
3.1 转换语义分割标签
原作者为了方便,也提供了一个脚本,帮我们方便的将json文件转换成PASCAL VOC的语义分割标签格式。示例项目链接:
https://github.com/wkentaro/labelme/tree/master/examples/semantic_segmentation
python labelme2voc.py data_annotated data_dataset_voc --labels labels.txt
执行后会生成如下目录:
- data_dataset_voc/JPEGImages
- data_dataset_voc/SegmentationClass
- data_dataset_voc/SegmentationClassPNG
- data_dataset_voc/SegmentationClassVisualization
- data_dataset_voc/class_names.txt
class_names.txt存储的是所有的类别信息,包括背景。
_background_
dog
cat
#!/usr/bin/env python
from __future__ import print_function
import argparse
import glob
import os
import os.path as osp
import sys
import imgviz
import numpy as np
import labelme
def main():
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter
)
parser.add_argument("input_dir", help="Input annotated directory")
parser.add_argument("output_dir", help="Output dataset directory")
parser.add_argument(
"--labels", help="Labels file or comma separated text", required=True
)
parser.add_argument(
"--noobject", help="Flag not to generate object label", action="store_true"
)
parser.add_argument(
"--nonpy", help="Flag not to generate .npy files", action="store_true"
)
parser.add_argument(
"--noviz", help="Flag to disable visualization", action="store_true"
)
args = parser.parse_args()
if osp.exists(args.output_dir):
print("Output directory already exists:", args.output_dir)
sys.exit(1)
os.makedirs(args.output_dir)
os.makedirs(osp.join(args.output_dir, "JPEGImages"))
os.makedirs(osp.join(args.output_dir, "SegmentationClass"))
if not args.nonpy:
os.makedirs(osp.join(args.output_dir, "SegmentationClassNpy"))
if not args.noviz:
os.makedirs(osp.join(args.output_dir, "SegmentationClassVisualization"))
if not args.noobject:
os.makedirs(osp.join(args.output_dir, "SegmentationObject"))
if not args.nonpy:
os.makedirs(osp.join(args.output_dir, "SegmentationObjectNpy"))
if not args.noviz:
os.makedirs(osp.join(args.output_dir, "SegmentationObjectVisualization"))
print("Creating dataset:", args.output_dir)
if osp.exists(args.labels):
with open(args.labels) as f:
labels = [label.strip() for label in f if label]
else:
labels = [label.strip() for label in args.labels.split(",")]
class_names = []
class_name_to_id = {
}
for i, label in enumerate(labels)