专栏首页Mybatis学习如何通过labelme标注将json文件转为png的label

如何通过labelme标注将json文件转为png的label

1、安装labelme

1、创建一个新环境

conda create -n labelme python=3.6

2、进入该环境,安装pyqt5和labelme,labelme要求3.3.1的版本

pip install pyqt5 -i https://pypi.doubanio.com/simple
pip install labelme==3.3.1 -i https://pypi.doubanio.com/simple 

3、安装完成后,直接输入labelme,打开labelme软件即可

labelme

至于怎么使用就不说了,应该很简单,保存crtl+s保存的是json文件

下面说说如何将json文件转为png的label

2、文件转换

首先要注意的是,有些该导入的包还是要自己先导入的,比说说什么pillow等。下载的时候,加个镜像源 -i https://pypi.doubanio.com/simple 1)定位到Anaconda的安装目录D:\Software\anaconda\Lib\site-packages 在site_pakeages下找到lableme的文件夹:

进入到cli文件夹,找到json_to_dataset.py文件,将里面的代码替换成如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import argparse
import json
import os
import os.path as osp
import base64
import warnings

import PIL.Image
import yaml

from labelme import utils

import cv2
import numpy as np
from skimage import img_as_ubyte


# from sys import argv

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('json_file')
    parser.add_argument('-o', '--out', default=None)
    args = parser.parse_args()

    json_file = args.json_file

    list_path = os.listdir(json_file)

    for i in range(0, len(list_path)):
        if list_path[i].endswith('.json'):
            path = os.path.join(json_file, list_path[i])
            if os.path.isfile(path):

                data = json.load(open(path))
                img = utils.img_b64_to_arr(data['imageData'])
                lbl, lbl_names = utils.labelme_shapes_to_label(img.shape, data['shapes'])

                captions = ['%d: %s' % (l, name) for l, name in enumerate(lbl_names)]

                lbl_viz = utils.draw_label(lbl, img, captions)
                save_file_name = osp.basename(path).replace('.', '_')

                out_dir1 = osp.join(osp.dirname(path), 'labelme_results')
                if not osp.exists(out_dir1):
                    os.mkdir(out_dir1)
                out_dir1 = osp.join(out_dir1, save_file_name)
                if not osp.exists(out_dir1):
                    os.mkdir(out_dir1)

                PIL.Image.fromarray(img).save(out_dir1 + '\\' + save_file_name + '_img.png')
                PIL.Image.fromarray(lbl).save(out_dir1 + '\\' + save_file_name + '_label.png')

                PIL.Image.fromarray(lbl_viz).save(out_dir1 + '\\' + save_file_name +
                                                  '_label_viz.png')
                images_dir = osp.join(json_file, 'images_dir')
                if not osp.exists(images_dir):
                    os.mkdir(images_dir)
                labels_dir = osp.join(json_file, 'labels_dir')
                if not osp.exists(labels_dir):
                    os.mkdir(labels_dir)
                PIL.Image.fromarray(img).save(osp.join(images_dir, '{}_img.png'.format(save_file_name)))
                PIL.Image.fromarray(lbl).save(osp.join(labels_dir, '{}_label.png'.format(save_file_name)))

                with open(osp.join(out_dir1, 'label_names.txt'), 'w') as f:
                    for lbl_name in lbl_names:
                        f.write(lbl_name + '\n')

                info = dict(label_names=lbl_names)
                with open(osp.join(out_dir1, 'info.yaml'), 'w') as f:
                    yaml.safe_dump(info, f, default_flow_style=False)

                print('Saved to: %s' % out_dir1)


if __name__ == '__main__':
    # base64path = argv[1]
    main()

点击运行,出现以下错误没事。。属于正常

错误:numpy版本太高(numpy需要版本为1.15.0)

2)将utils中的文件夹中的shape.py中的文件内容改成以下:

from skimage import img_as_ubyte
import numpy as np
import PIL.Image
import PIL.ImageDraw

from labelme import logger


def polygons_to_mask(img_shape, polygons):
    mask = np.zeros(img_shape[:2], dtype=np.uint8)
    mask = PIL.Image.fromarray(mask)
    xy = list(map(tuple, polygons))
    PIL.ImageDraw.Draw(mask).polygon(xy=xy, outline=1, fill=1)
    mask = np.array(mask, dtype=bool)
    return mask


def shapes_to_label(img_shape, shapes, label_name_to_value, type='class'):
    assert type in ['class', 'instance']

    cls = np.zeros(img_shape[:2], dtype=np.int32)
    if type == 'instance':
        ins = np.zeros(img_shape[:2], dtype=np.int32)
        instance_names = ['_background_']
    for shape in shapes:
        polygons = shape['points']
        label = shape['label']
        if type == 'class':
            cls_name = label
        elif type == 'instance':
            cls_name = label.split('-')[0]
            if label not in instance_names:
                instance_names.append(label)
            ins_id = len(instance_names) - 1
        cls_id = label_name_to_value[cls_name]
        mask = polygons_to_mask(img_shape[:2], polygons)
        cls[mask] = cls_id
        if type == 'instance':
            ins[mask] = ins_id

    if type == 'instance':
        return cls, ins
    return cls


def labelme_shapes_to_label(img_shape, shapes):
    logger.warn('labelme_shapes_to_label is deprecated, so please use '
                'shapes_to_label.')

    label_name_to_value = {'_background_': 0}  # 注意:需要改成自己的类别
    for shape in shapes:
        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 = shapes_to_label(img_shape, shapes, label_name_to_value)
    lbl = img_as_ubyte(lbl)
    return lbl, label_name_to_value

运行,没出现错误即可

3)进入D:\Software\anaconda\Scripts\下找到labelme_json_to_dataset.exe 在相应的环境下输入 labelme_json_to_dataset.exe C:\Users\86152\Desktop\json\ 后面的这个路径代表的是 存放json文件的路径

已经转换完成!!! 存放的png文件在C:\Users\86152\Desktop\json\labelme_results\ID_0011_Z_0156_json下面

在这个label_names.txt文件中保存的是分的类别,这样就可以了,成功!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 高分辨率图像建筑物提取数据集制作

    # data:2020-01-04 # user:dean # desc:批量将json文件转为 label import os dir = r"I:\人工智能...

    Dean0731
  • 深度学习图像分割(二)——如何制作自己的PASCAL-VOC2012数据集

    在之前的那篇文章中:深度学习图像分割(一)——PASCAL-VOC2012数据集(vocdevkit、Vocbenchmark_release)详细介绍 我们大...

    老潘
  • 资源 | 深度学习图像标注工具汇总

    用户1737318
  • 资源 | 深度学习图像标注工具汇总

    对于监督学习算法而言,数据决定了任务的上限,而算法只是在不断逼近这个上限。世界上最遥远的距离就是我们用同一个模型,但是却有不同的任务。但是数据标注是个耗时耗力的...

    AI科技大本营
  • 资源 | 深度学习图像标注工具汇总

    对于监督学习算法而言,数据决定了任务的上限,而算法只是在不断逼近这个上限。世界上最遥远的距离就是我们用同一个模型,但是却有不同的任务。但是数据标注是个耗时耗力的...

    IT派
  • 深度学习图像标注工具

    对于监督学习算法而言,数据决定了任务的上限,而算法只是在不断逼近这个上限。世界上最遥远的距离就是我们用同一个模型,但是却有不同的任务。但是数据标注是个耗时耗力的...

    朱晓霞
  • Unet车牌分割,矫正

    我们可以通过图像分割算法对一张输入图片进行分割,分割后的图形其实是对原图中的区域进行的分类标注,例如这里我们可以将原图标注为2类,一类就是车牌区域,还有一类就是...

    机器学习AI算法工程
  • 如何用labelme标注语义分割数据集

    采用的软件为labelme,labelme是麻省理工(MIT)的计算机科学和人工智能实验室(CSAIL)研发的图像标注工具,人们可以使用该工具创建定制化标注任务...

    狼啸风云
  • 【数据相关】目标检测中的数据标注及格式转换代码

    在目标检测中有很多常用的数据标注工具,如LabelImg、Labelme等等,经过标注生成的格式各不相同,但基本符合几大数据集的标注格式。

    用户7699929
  • 4.训练模型之准备训练数据

    终于要开始训练识别熊猫的模型了, 第一步是准备好训练数据,这里有三件事情要做: 收集一定数量的熊猫图片。 将图片中的熊猫用矩形框标注出来。 将原始图片和标注文件...

    刘盼
  • keras版Mask-RCNN来训练自己的目标检测数据集

    1、下载好cuda9跟cudnn7,然后在安装好后,cuda其会自动添加到环境变量里,所以使用keras进行GPU加速的时候会自动使用这些库。

    机器学习AI算法工程
  • 再见,labelme!

    众所周知,AI 的发展有三大内核:数据、算法、算力。现如今,算法和算力在市面上的差距显然已经没有那么大,能够给 AI 提供充足弹药支持的当属数据了。深度学习算法...

    GitHubDaily
  • ​吊打labelme,这款AI开发神器的图像标注yyds!

    AI 的发展有三大内核:数据、算法、算力。现如今,算法和算力在市面上的差距显然已经没有那么大,能够给 AI 提供充足弹药支持的当属数据了。深度学习算法精度的提升...

    3D视觉工坊
  • 计算机视觉常用图像数据集标记平台

    在计算机视觉中海量图片数据的标记是个让人头疼的问题,通过学习总结列举以下几种常用的图像标记平台,从平台的价格、各种功能、工具和格式、项目管理和易用性等方面分析各...

    不脱发的程序猿
  • 资源 | MIT开放图像标注工具LabelMe源代码:助力机器视觉的发展

    机器之心
  • tensorflow

    anaconda或者pip安装tensorflow,tensorflow只支持win7 64系统,本人使用tensorflow1.5版本

    sofu456
  • mask rcnn训练自己的数据集

    最近迷上了mask rcnn,也是由于自己工作需要吧,特意研究了其源代码,并基于自己的数据进行训练~

    3D视觉工坊
  • 教程: UNet/UNet++多类别图像分割,含数据集制作

    https://pan.baidu.com/s/1PK3VoarNl3kRibbsUTuyAQ

    机器学习AI算法工程
  • 将Cityscape转换为PASACAL VOC格式的目标检测数据集

    狼啸风云

扫码关注云+社区

领取腾讯云代金券