labelme安装与使用制作VOC数据集

labelme安装并用标注获得的图片制作VOC数据集

1.Anconda安装

1.1 Anconda介绍

​ Anaconda包括Conda、Python以及一大堆安装好的工具包,比如:numpy、pandas等

因此安装Anaconda的好处主要为以下几点:

  1. 包含conda:conda是一个环境管理器,其功能依靠conda包来实现,该环境管理器与pip类似,那有童鞋会问了:我能通过pip装conda包达到conda环境管理器一样的功能吗?答案是不能,conda包的实现离不开conda环境管理器。想详细知道两者异同可以去知乎遛一遛https://www.zhihu.com/question/279152320

  2. 安装大量工具包:Anaconda会自动安装一个基本的python,该python的版本Anaconda的版本有关。该python下已经装好了一大堆工具包,这对于科学分析计算是一大便利,你愿意费时耗力使用pip一个个包去装吗?

  3. 可以创建使用和管理多个不同的Python版本:比如想要新建一个新框架或者使用不同于Anoconda装的基本Python版本,Anoconda就可以实现同时多个python版本的管理。

1.2 版本选择

​ 可根据你的操作系统是32位还是64位选择对应的版本到官网下载,但是官网下载龟速,建议到清华大学镜像站下载。并且并不推荐安装最新版本的anaconda,由于不稳定可能出现这样那样的问题。

​ 如果你的操作系统是64为的,也可直接点击一下链接下载安装包直接安装博主使用的版本。

1.3 安装流程

img

img

img

img

Finish后安装完毕

1.4 运行BUG解决

​ 今天晚上打开anaconda,发现软件一直卡在loading applications。关闭重启了几次(包括重启系统)后发现依旧无法解决这个问题,于是在google中搜索解决方案,最后完美解决这个问题。具体可参考:link (用户limkin0902给出的解决方案)。

​ 这个方法就是先在anaconda3文件夹里找到conda_api.py文件,然后将conda_api.py文件中大约第1364行的data=yaml.load(f)改成。如果没有建议下载个Notepad++查找关键词。

data = yaml.safeload(f)

​ 根据原贴的描述对于windows用户应该可以根据路径:anaconda3\Lib\site-packages\anaconda_navigator\api\conda_api.py 找到conda_api.py文件。

2.labelme虚拟环境创建

2.1 测试安装

​ 终于到了最机激动人心的测试安装,这一步将直接检验你前面的步骤做的是否正确。在命令行中输入以下命令如果出Anaconda的版本号则安装成功。

conda --version

conda版本

2.2 conda换源

​ 使用conda命令安装需要的Python包非常方便,但是官方服务器在国外,下载龟速,国内清华大学提供了Anaconda的镜像仓库,我们把源改为清华大学镜像源。

方法一

在命令行中直接输入

conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --set show_channel_urls yes
conda config --set ssl_verify false

方法二

​ 打开“C:\Users\Administrator”,可以找到一个“.condarc”文件,打开该文件,更新为以下内容:

channels:
  - defaults
show_channel_urls: true
default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
ssl_verify: false

condarc

2.3 conda更新(选做)

​ 更新时间较长,建议找个空余时间更新,不更新也可以,但为避免后续安装其他东西出错最好更一下,这里我就不更了,把命令贴出来

先更新conda

conda update conda

再更新第三方所有包

conda upgrade --all

2.4 创建虚拟环境

在命令行中输如以下命令创建虚拟环境

conda create -n labelme python=3.8

在安装过程中还需要输入一个y代表同意安装

img

最后输入以下命令,查看环境是否创建成功。

conda env list

查看环境

创建好虚拟环境后,需要激活,用如下命令

conda activate labelme

labelme 正常运转需要各种依赖的包,下面的 pypt 和 pillow 就是,它们用如下命令安装

conda install pyqt
conda install pillow

​ 安装好 labelme 依赖的包之后,正式开始安装 labelme,用如下命令,先用 conda 命令,如果安装不成功,则用 pip 命令

conda install labelme=3.16.7
#conda 安装命令如果出错也可以使用 pip 命令,使用逻辑等号"=="
pip install labelme==3.16.7
#也可以直接
conda install labelme
# 或者
pip install labelme

​ 如果上面的命令实在安装不下来可以换换版本号,换了版本号也还是安装不下来可以在你的源中添加多一个渠道。

conda config --append channels conda-forge

​ 原因在于:channel可以看成是托管python包的服务器,当无法通过标准channel获得python包时,社区驱动的conda-forge通常是一个很好的地点。大部分问题都可以利用这条语句解决。

安装成功后,需查看labelme版本号是否正确

labelme --version

labelme版本查看

3.labelme图像标注

3.1 labelme使用

每次使用虚拟环境的都需要几乎环境才能使用在命令行中输入以下命令就可以激活环境

activate labelme

用labelme的第三方库的名称就可以打开图形化界面

labelme

输入如上命令后,会弹出 labelme 操作界面,如下:

img
每次标注完记得用ctrl+s保存json文件。

4.VOC数据集制作

4.1 VOC数据集简介

VOC数据集可以用于目标检测、目标分割。

该文件夹下有三个关键的子文件。分别为:ImageSets,JPEGImages,SegmentationClassPNG

JPEGImages该文件夹下一般放置原图;

SegmentationClassPNG存放标记图片;

制作好数据集就可以开始训练模型了。

4.2 单张测试

​ 仅想要查看标注的效果的话可以通过在虚拟环境中输入命令通过labelme制作语义分割图像

#查看标注图片
labelme_draw_json XXX.json
#转成标注图片
labelme_json_to_dataset XXX.json -o 想要存入的文件夹地址

4.3 批量转换

​ 但如果标注图像数量较大那用命令行的方式显然不方便,因此可以通过以下程序来简化操作。在要转换标注图片的同级目录下建立两个文件labelme2voc.pylabels.txt

  • labelme2voc.py
#!/usr/bin/env python
from __future__ import print_function

import argparse
import glob
import os
import os.path as osp
import sys

import imgviz
import numpy as np

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")
        )
    os.makedirs(osp.join(args.output_dir, "SegmentationObject"))
    os.makedirs(osp.join(args.output_dir, "SegmentationObjectPNG"))
    if not args.noviz:
        os.makedirs(
            osp.join(args.output_dir, "SegmentationObjectVisualization")
        )
    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_"
        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_cls_file = osp.join(
            args.output_dir, "SegmentationClass", base + ".npy"
        )
        out_clsp_file = osp.join(
            args.output_dir, "SegmentationClassPNG", base + ".png"
        )
        if not args.noviz:
            out_clsv_file = osp.join(
                args.output_dir,
                "SegmentationClassVisualization",
                base + ".jpg",
            )
        out_ins_file = osp.join(
            args.output_dir, "SegmentationObject", base + ".npy"
        )
        out_insp_file = osp.join(
            args.output_dir, "SegmentationObjectPNG", base + ".png"
        )
        if not args.noviz:
            out_insv_file = osp.join(
                args.output_dir,
                "SegmentationObjectVisualization",
                base + ".jpg",
            )

        img = labelme.utils.img_data_to_arr(label_file.imageData)
        imgviz.io.imsave(out_img_file, img)

        cls, ins = labelme.utils.shapes_to_label(
            img_shape=img.shape,
            shapes=label_file.shapes,
            label_name_to_value=class_name_to_id,
        )
        ins[cls == -1] = 0  # ignore it.

        # class label
        labelme.utils.lblsave(out_clsp_file, cls)
        np.save(out_cls_file, cls)
        if not args.noviz:
            clsv = imgviz.label2rgb(
                cls,
                imgviz.rgb2gray(img),
                label_names=class_names,
                font_size=15,
                loc="rb",
            )
            imgviz.io.imsave(out_clsv_file, clsv)

        # instance label
        labelme.utils.lblsave(out_insp_file, ins)
        np.save(out_ins_file, ins)
        if not args.noviz:
            instance_ids = np.unique(ins)
            instance_names = [str(i) for i in range(max(instance_ids) + 1)]
            insv = imgviz.label2rgb(
                ins,
                imgviz.rgb2gray(img),
                label_names=instance_names,
                font_size=15,
                loc="rb",
            )
            imgviz.io.imsave(out_insv_file, insv)


if __name__ == "__main__":
    main()
  • labels.txt
__ignore__
_background_
crop

批量转换

接下来在地址栏中输入cmd就能打开命令行然后输入activate labelme命令打开虚拟环境运行以下命令。

python labelme2voc.py Image CrdldVOC --label labels.txt

如果你不运行成功,有可能遇到到了以下的这几种情况。

  • 情况1:labels.txt配置文档配置错误

image-20230303203546249

原因:

​ 由于我一开始labels.txt文档中没有加入__ignore__参数到时识别不了。

解决:

​ 按照我以上文档配置labels.txt文档即可。

  • 情况2:AttributeError: module ‘labelme’ has no attribute ‘LabelFile’

原因:

​ 这是由于 labelme 版本的问题。高版本在 labelme 的utils文件夹里缺少 LabelFile 文件。

解决:

​ 在虚拟环境中输入以下命令更新一下labelme即可

pip install -U labelme

​ 如果还有别的错误可以在评论区留言,看到了我回及时回复的.

​ 在虚拟环境中输入以下命令更新一下labelme即可

pip install -U labelme

​ 如果还有别的错误可以在评论区留言,看到了我回及时回复的.

参考链接

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
### 回答1: labelme2voc是一个用于将LabelMe格式标注数据转换为VOC格式标注数据的工具。LabelMe是一个非常流行的对图像进行标注的工具,它可以在图像上绘制边界框、标记物体等等。而VOC(Visual Object Classes)格式是一种常用的用于目标检测和图像分割任务的数据标注格式。 使用labelme2voc工具,可以方便地将LabelMe标注数据转换为VOC格式的标注数据,以便于后续使用其他目标检测或图像分割算法进行处理。该工具主要包括以下几个步骤: 1. 解析LabelMe标注数据:读取LabelMe标注文件,获取图像路径、大小以及标注的物体信息。 2. 创建VOC格式标注文件:将解析得到的标注信息按照VOC格式要求,生成相应的xml文件。 3. 复制图像文件:将解析得到的图像文件复制到VOC格式标注文件所在的目录下。 通过以上步骤,labelme2voc工具完成了从LabelMe标注数据到VOC格式标注数据的转换。转换后的VOC格式标注数据可以直接用于训练和评估目标检测或图像分割模型。这样,使用LabelMe标注数据的用户可以更方便地与使用VOC格式标注数据的用户共享、使用相关工具和算法。 ### 回答2: labelme2voc是一个方便的工具,可用于将Labelme标注的图像数据集转换为VOC格式的数据集VOC格式是一种常用的目标检测数据集格式,可被许多流行的深度学习框架和工具支持。 使用labelme2voc的主要步骤如下: 1. 首先确保安装Labelme和相关依赖库。 2. 使用Labelme标注图像,生成对应的json文件。这些json文件包含了图像的标注信息。 3. 将图像和对应的json文件放置在同一目录下,并运行labelme2voc命令。 4. labelme2voc将会读取json文件,解析图像的标注信息,并将其转换为VOC格式的标注文件,包括XML文件和相应的标注图片。 5. 转换后的VOC格式数据集可以用于训练目标检测模型,如Faster R-CNN、YOLO等。 labelme2voc的好处是它简化了将Labelme标注数据转换为常用的VOC格式数据的过程。VOC格式广泛用于目标检测任务,因此转换后的数据可以在许多深度学习框架中直接使用。此外,VOC格式也支持目标的多类别标注,方便进行多类别目标检测。 总之,labelme2voc是一个方便实用的工具,可以将Labelme标注的图像数据集转换为VOC格式的数据集,为目标检测任务提供便利。 ### 回答3: Labelme2voc 是一个用于将 Labelme 标注数据转换为 VOC 数据格式的工具。Labelme 是一个广泛使用的图像标注工具,而 VOC 是一种常用的数据集格式,特别适用于目标检测任务。 Labelme2voc 的工作原理是将 Labelme 标注数据中的标注信息解析,提取出目标的位置和类别等信息,然后根据 VOC 格式的要求,生成 VOC 数据集的相关文件。具体来说,Labelme2voc 包括以下步骤: 1. 解析 Labelme 的 JSON 文件,获取图像的宽度、高度和文件名等基本信息。 2. 检查每个标注的类型,根据 VOC 数据集的类别定义,将其转换为相应的 VOC 类别。 3. 根据标注的坐标信息,生成对应的 VOC 数据集中的 XML 文件。XML 文件包含了图像的路径、大小、目标的位置和类别信息等。 4. 将生成的 XML 文件保存到 VOC 数据集的指定目录下,并根据 VOC 的要求,将图像复制到 VOC 数据集的指定目录下。 5. 最后,用户可以使用生成的 VOC 数据集进行目标检测任务或进行后续的数据处理。 通过使用 Labelme2voc,用户可以轻松将 Labelme 标注数据转换为 VOC 格式,方便地与其他基于 VOC 格式的模型及工具进行兼容。这样可以简化数据准备的过程,提高工作效率,并方便用户进行目标检测等相关任务的开展。
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HaoXinJT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值