欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

安装labelme

程序员文章站 2024-03-15 10:39:29
...

目录

  1. 安装labelme
  2. 使用labelme

这个是语义标注的工具

安装labelme

安装labellme可以直接pip安装
pip install labelme -i https://pypi.douban.com/simple

我在安装的报了如下的错误,setuptools没有属性,

AttributeError: module 'setuptools.build_meta' has no attribute '__legacy__'

于是升级了一下setuptools,然后再安装,成功了

pip install --upgrade setuptools

使用labelme

  1. 在命令行输入
lableme

制作完会在图片的目录生成对应的json格式的文件。

  1. 把json文件转为对应的标注的图片,修改了原来的labelme里面的json_to_dataset.py文件,运行下面这个会生成如下结构的文件,1、2等等是保存每张图像的原图、标签图、标签的名字,因为每个文件都是独立的,标签也是独立,因此生成的还不能直接使用。需要经过不揍3转换。
    安装labelme
import base64
import json
import os
import os.path as osp
import imgviz
import PIL.Image
from labelme.logger import logger
from labelme import utils

def main(input_file,save_path):
    count = 1
    for json_path in os.listdir(input_file):
        if json_path.endswith('.json'): # 找以.json结尾的文件
            json_file = os.path.join(input_file,json_path)
            data = json.load(open(json_file))
            imageData = data.get('imageData')
            out_dir = os.path.join(save_path,str(count))
            if not os.path.exists(out_dir):
                os.makedirs(out_dir)

            if not imageData:
                imagePath = os.path.join(os.path.dirname(json_file), data['imagePath'])
                with open(imagePath, 'rb') as f:
                    imageData = f.read()
                    imageData = base64.b64encode(imageData).decode('utf-8')
            img = utils.img_b64_to_arr(imageData)

            label_name_to_value = {'_background_': 0}
            for shape in sorted(data['shapes'], key=lambda x: x['label']):
                label_name = shape['label']
                if label_name in label_name_to_value:
                    label_value = label_name_to_value[label_name]
                else:
                    label_value = len(label_name_to_value)
                    label_name_to_value[label_name] = label_value
            lbl, _ = utils.shapes_to_label(
                img.shape, data['shapes'], label_name_to_value
            )

            label_names = [None] * (max(label_name_to_value.values()) + 1)
            for name, value in label_name_to_value.items():
                label_names[value] = name
            lbl_viz = imgviz.label2rgb(
                label=lbl, img=imgviz.asgray(img), label_names=label_names, loc='rb'
            )
            orgin_image_path = json_path.split('.')[0] +'.jpg'
            PIL.Image.fromarray(img).save(osp.join(out_dir,orgin_image_path ))
            utils.lblsave(osp.join(out_dir, json_path.split('.')[0]+'_label.png'), lbl)
            PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, 'label_viz.png'))
            with open(osp.join(out_dir, 'label_names.txt'), 'w') as f:
                for lbl_name in label_names:
                    f.write(lbl_name + '\n')

            count +=1
            print('结束')

if __name__ == '__main__':
    input_file = './1'  # 图片的路径,和json,就是制作标签的路径
    save_path = './outputs' # 输出的文件夹
    main(input_file,save_path)

  1. 上面生成的每个图像都是从0开始,不能直接使用需要使用下面的这个转换,生成可以使用的

from PIL import Image
import os
import numpy as np
save_path = './outputs' # 上面输出的文件

# 数据集文件夹
if not os.path.exists('./dataset'):
    os.mkdir('./dataset')
original_image_dir= './dataset/images'
if not os.path.exists(original_image_dir):
    os.makedirs(original_image_dir)
label_image_dir = './dataset/labels'
if not os.path.exists(label_image_dir):
    os.makedirs(label_image_dir)

# 保存所有的标签
def make_all_label_name_txt():
    with open('./dataset/all_label_names.txt','w',encoding='utf-8') as fw:
        label_set =set()
        label_names_list = ['_background_']
        label_set.add('_background_')
        for per_img_dir in os.listdir(save_path):
            with open(os.path.join(save_path,per_img_dir,'label_names.txt'),'r',encoding='utf-8') as fr:
                label = fr.readlines()
                for i in label:
                    i = i.strip('\n')
                    if i in label_set:
                        pass
                    else:
                        label_set.add(i)
                        label_names_list.append(i)
        for label in label_names_list:
            fw.write(label+'\n')
        print('所有的标签',label_names_list)


def make_label():
    """因为每个图像的标签都是从0开始,需要自己修改"""
    with open('./dataset/all_label_names.txt','r',encoding='utf-8') as f:
        label_list = [i.strip() for i in f.readlines()]
    for per_img_dir in os.listdir(save_path):
        for img_path in os.listdir(os.path.join(save_path,per_img_dir)):
            if img_path.endswith('.jpg'):
                origin_image_path = os.path.join(save_path,per_img_dir,img_path)

                img = Image.open(origin_image_path)
                img.save(os.path.join(original_image_dir,img_path))
            elif img_path.endswith('_label.png'):

                label_image_path = os.path.join(save_path,per_img_dir,img_path)
                # 打开每个图像的label_names.txt
                with open(os.path.join(save_path,per_img_dir,'label_names.txt'), 'r', encoding='utf-8') as perf:
                    per_label_list = [i.strip() for i in perf.readlines()]   
                # 打开图像
                img = Image.open(label_image_path)
                img_arr = np.array(img)
                for i, label_val in enumerate(per_label_list):
                   
                    img_arr[img_arr==i] = label_list.index(label_val)
           
     
                img_arr =  np.asarray(img_arr, np.uint8)
                img =Image.fromarray(img_arr)
                img.save(os.path.join(label_image_dir,img_path))
make_all_label_name_txt()
make_label()

制作完了标签是黑色的不要怀疑,自己可以根据指定的色彩替换像素,看着直观

相关标签: 语义分割