提示:本人只是知识搬运工,感谢各位原创大神的支持,请多访问原创大神的网站并点赞。
labelme
labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务或执行图像标注,项目源代码已经开源。(来源于百度百科)
源代码及示例参考: https://github.com/wkentaro/labelme release 版本下载链接: https://github.com/wkentaro/labelme/releases
一、安装
哔站上有很多安装和使用视频
二、使用
2.1 单个json文件处理
在包含样本图片和json数据的文件夹中,输入
labelme_json_to_dataset xxx.json -o xxx
'xxx.json为json文件名,-o代表输出,xxx代表输出的文件夹'
例如:labelme_json_to_dataset 1.json -o 1
缺点:
- 速度慢,效率低下。
- 多张图片处理后类别容易混淆。比如第一张类别有狗、猫,标签分别为1、2;在处理第二张时,类别有飞机、坦克,标签分别也为1、2。这是不合理的。
所以,不用使用这种方式来标注多张图片。
2.2 多个json文件处理
以voc格式为例。
使用labelme2voc.pypython文件 下载链接: https://github.com/wkentaro/labelme
更详细的使用方法可去哔站上找视频观看,基本都会讲到。 有些电脑在运行这个python脚本时可能会报错,如:
usage: labelme2voc.py [-h] [--input_dir INPUT_DIR] [--output_dir OUTPUT_DIR]
需要对脚本进行修正,代码如下。
这也是网上别人的代码,借来用一下,实在找不到原作者了,如果谁知道的话请告知我,我再引用一下。
# -*- coding: utf-8 -*-
#!/usr/bin/env python
from __future__ import print_function
import argparse
import glob
import os
import os.path as osp
import sys
import json
import imgviz
import numpy as np
import PIL.Image
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', required=True)
parser.add_argument( '--noviz', help='no 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'))
os.makedirs(osp.join(args.output_dir, 'SegmentationClassPNG'))
if not args.noviz:
os.makedirs(
osp.join(args.output_dir, 'SegmentationClassVisualization')
)
print('Creating dataset:', args.output_dir)
class_names = []
class_name_to_id = {}
for i, line in enumerate(open(args.labels).readlines()):
class_id = i - 1 # starts with -1
class_name = line.strip()
class_name_to_id[class_name] = class_id
if class_id == -1:
assert class_name == '__ignore__'
continue
elif class_id == 0:
assert class_name == '_background_'
print(class_id, class_name)
class_names.append(class_name)
class_names = tuple(class_names)
print('class_names:', class_names)
out_class_names_file = osp.join(args.output_dir, 'class_names.txt')
with open(out_class_names_file, 'w') as f:
f.writelines('\n'.join(class_names))
print('Saved class_names:', out_class_names_file)
for filename in glob.glob(osp.join(args.input_dir, '*.json')):
print('Generating dataset from:', filename)
label_file = labelme.LabelFile(filename=filename)
base = osp.splitext(osp.basename(filename))[0]
out_img_file = osp.join(args.output_dir, 'JPEGImages', base + '.jpg')
out_lbl_file = osp.join(
args.output_dir, 'SegmentationClass', base + '.npy'
)
out_png_file = osp.join(
args.output_dir, 'SegmentationClassPNG', base + '.png'
)
if not args.noviz:
out_viz_file = osp.join(
args.output_dir,
'SegmentationClassVisualization',
base + '.jpg',
)
with open(out_img_file, 'wb') as f:
f.write(label_file.imageData)
img = labelme.utils.img_data_to_arr(label_file.imageData)
lbl, _ = labelme.utils.shapes_to_label(
img_shape=img.shape,
shapes=label_file.shapes,
label_name_to_value=class_name_to_id,
)
labelme.utils.lblsave(out_png_file, lbl)
np.save(out_lbl_file, lbl)
if not args.noviz:
viz = imgviz.label2rgb(
lbl,
imgviz.rgb2gray(img),
font_size=15,
label_names=class_names,
loc='rb',
)
imgviz.io.imsave(out_viz_file, viz)
if __name__ == '__main__':
main()
感恩各路大神,让我这样的小人物可以做一些想做的事。感恩地,将所学的做一做记录和整理,回馈给大家。 希望对您有所帮助。
|