使 用 l a b e l m e 进 行 检 测 、 分 割 数 据 集 制 作 使用labelme进行检测、分割数据集制作 使labelme

教学视频:https://www.bilibili.com/video/BV1na4y1W7i3?from=search&seid=6829801342228999041

使用labelme进行检测、分割数据集的制作

实例-水稻分割数据集制作


  • 一 安装
pip install labelme

  • 二 打开

在cmd命令行窗口输入命令

labelme

使用labelme进行检测、分割数据集制作_desktop

  • 三 安装成功

使用labelme进行检测、分割数据集制作_desktop_02


  • 四 原数据集制作

原数据集是我网上自己随便收集的
有6个类别:香蕉(banana)、猫(cat)、狗(dog)、海豚(dolphin)、人(person)、猪(pig)
每个类别8张图片,且大小不一致
图片格式:png

1.已收集数据集(10个类别的图片)

使用labelme进行检测、分割数据集制作_绝对路径_03

2.dog
使用labelme进行检测、分割数据集制作_绝对路径_04

3.重新统一图片的size为512*512

读取dataset下所有png图片路径,并返回list

import cv2
import os
def get_file_path_by_name(file_dir):
    '''
    获取指定路径下所有文件的绝对路径
    :param file_dir:
    :return:
    '''
    L = []
    for root, dirs, files in os.walk(file_dir):  # 获取所有文件
        for file in files:  # 遍历所有文件名
            if os.path.splitext(file)[1] == '.png':   # 指定尾缀  ***重要***
                L.append(os.path.join(root, file))  # 拼接处绝对路径并放入列表
    print('总文件数目:', len(L))
    return L

list_dir = get_file_path_by_name(r'C:\Users\29939\Desktop\dataset')

使用labelme进行检测、分割数据集制作_绝对路径_05

list_dir

使用labelme进行检测、分割数据集制作_绝对路径_06

主函数:读取–>Resize—>保存

# 1. 遍历所有png文件路径
for item in list_dir:
    # 2. 读取图片
    img_raw = cv2.imread(item)
    # 3. reszize (512,512)
    img_resize  = cv2.resize(img_raw,(512,512),interpolation=cv2.INTER_AREA)
    print(img_resize.shape) # 打印resize大小
    # 4. 获取图片名字,用于另存
    photo_name = os.path.split(item)[1]
    # 5. 获取图片的类别名词,下面代码用的 “\\”是windows系统下的路径分割符,在linux下不同
    class_name = item.split('\\')[-2]
    saved_file_dir = os.path.join('..','dataset_samesize',class_name)
    saved_file_path = os.path.join('..','dataset_samesize',class_name,photo_name)
    # 6.创建文件夹,否则cv2.imwrite找不到文件路径,无法保存
    if not os.path.exists(saved_file_dir):
       os.makedirs(saved_file_dir)
       print("目录:"+saved_file_dir+"创建成功!")
    print(saved_file_path)
    # 7.保存
    cv2.imwrite(saved_file_path, img_resize)

结果

使用labelme进行检测、分割数据集制作_数据集_07


  • 五 检测数据集制作

在图像上右击,选择create rectangle

使用labelme进行检测、分割数据集制作_文件路径_08

补充:

点击Edit Polygans,可以再次修改已经成形的label框


  • 六 分割数据集制作

在图像上右击,选择create Polygans

使用labelme进行检测、分割数据集制作_json_09

补充:

点击Edit Polygans,可以再次修改已经成形的label框


  • 七 生成
python json_to_dataset.py D:/dataset/img1.json -o D:/dataset/output
labelme_json_to_dataset.exe D:/dataset/img1.json -o D:/dataset/output

  • 八 批量生成

一 改py文件

文件路径:E:\Software\Anaconda3\Lib\site-packages\labelme\cli  下面 的json_to_dataset.py文件

使用labelme进行检测、分割数据集制作_数据集_10

import argparse
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():
    logger.warning(
        "This script is aimed to demonstrate how to convert the "
        "JSON file to a single image dataset."
    )
    logger.warning(
        "It won't handle multiple JSON files to generate a "
        "real-use dataset."
    )

    parser = argparse.ArgumentParser()
    parser.add_argument("json_file")
    parser.add_argument("-o", "--out", default=None)
    args = parser.parse_args()

    json_file = args.json_file
    
    file_name = json_file.split('.')[0]

    if args.out is None:
        out_dir = osp.basename(json_file).replace(".", "_")
        out_dir = osp.join(osp.dirname(json_file), out_dir)
    else:
        out_dir = args.out
    if not osp.exists(out_dir):
        os.mkdir(out_dir)

    data = json.load(open(json_file))
    imageData = data.get("imageData")

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

    PIL.Image.fromarray(img).save(osp.join(out_dir, file_name+".png"))
    utils.lblsave(osp.join(out_dir, file_name+"_label.png"), lbl)
    PIL.Image.fromarray(lbl_viz).save(osp.join(out_dir, file_name+"_label_viz.png"))

    with open(osp.join(out_dir, file_name+"_label_names.txt"), "w") as f:
        for lbl_name in label_names:
            f.write(lbl_name + "\n")

    logger.info("Saved to: {}".format(out_dir))


if __name__ == "__main__":
    main()

二 调用命令

批量生成label

  • 1.确定批量生成json文件的文件夹路径

  • 2.找出所有的json文件

  • 3.调用命令将json文件转为分割数据集

  • 1.确定批量生成json文件的文件夹路径

import os
path = r'C:/Users/Administrator/Desktop/dataset_samesize/dog'  # path为json文件存放的路径
  • 2.找出所有的json文件
def get_file_path_by_name(file_dir):
    '''
    获取指定路径下所有文件的绝对路径
    :param file_dir:
    :return:
    '''
    L = []
    for root, dirs, files in os.walk(file_dir):  # 获取所有文件
        for file in files:  # 遍历所有文件名
            if os.path.splitext(file)[1] == '.json':   # 指定尾缀  ***重要***
                L.append(os.path.join(root, file))  # 拼接处绝对路径并放入列表
    print('总文件数目:', len(L))
    return L

list_dir = get_file_path_by_name(path)

使用labelme进行检测、分割数据集制作_desktop_11

list_dir

使用labelme进行检测、分割数据集制作_数据集_12

list_dir[0]

使用labelme进行检测、分割数据集制作_文件路径_13

  • 3.调用命令将json文件转为分割数据集
saving_dataset_dir = r'C://Users//Administrator//Desktop//dataset_samesize//dog//dataset//'
for target_json_path in list_dir:
    os.system("labelme_json_to_dataset.exe %s" %target_json_path + ' -o %s' %saving_dataset_dir)

补充:安装可能所遇问题


一 AttributeError: module ‘enum’ has no attribute ‘IntFlag’

使用labelme进行检测、分割数据集制作_desktop_14

解决:卸载enum34,因为这个已经过期了,但是还没删

pip uninstall enum34

使用labelme进行检测、分割数据集制作_json_15


TypeError: rectangle() got an unexpected keyword argument 'width’问题

  • 是Pillow的版本问题
    解决:
pip install Pillow==5.3.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

视频:

https://www.bilibili.com/video/BV1na4y1W7i3?from=search&seid=6829801342228999041

https://www.bilibili.com/video/BV1eD4y1X7rV