快捷搜索:

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()

感恩各路大神,让我这样的小人物可以做一些想做的事。感恩地,将所学的做一做记录和整理,回馈给大家。 希望对您有所帮助。

经验分享 程序员 微信小程序 职场和发展