labelme使用方法
labelme
源代码及示例参考: release 版本下载链接:
一、安装
哔站上有很多安装和使用视频
二、使用
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文件 下载链接:
更详细的使用方法可去哔站上找视频观看,基本都会讲到。 有些电脑在运行这个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( .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()
感恩各路大神,让我这样的小人物可以做一些想做的事。感恩地,将所学的做一做记录和整理,回馈给大家。 希望对您有所帮助。