0


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为的,也可直接点击一下链接下载安装包直接安装博主使用的版本。

  • Anaconda3-5.2.0-Windows-x86_64.exe

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.py

labels.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

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

参考链接

  • 史上最全最详细的Anaconda安装教程_anacoda安装_OSurer的博客-CSDN博客
  • (19条消息) 一种简洁且有效的方式解决anaconda一直卡在loading applications_Henry积少成多的博客-CSDN博客
  • Labelme 安装以及使用_期待686的博客-CSDN博客

本文转载自: https://blog.csdn.net/HaoXinJT/article/details/129327633
版权归原作者 HaoXinJT 所有, 如有侵权,请联系我们删除。

“labelme安装与使用制作VOC数据集”的评论:

还没有评论