list排序时报json异常_生成labelme能查看的json格式文件

labelme是数据标注中最常用到的标注工具。可以标注矩形框、圆形、线条、不规则图形等等。所以这种多功能的标注工具,也应用广泛。

但是,有时候我们也会从别处获取一些已经标注好的数据,或只是坐标点。那如何用labelme查看呢?今天这篇文章就介绍,如何生成能labelme直接打开的json文件。

本文阅读大约需要2min,但建议收藏,动手实践之。

1.保存四边形矩形框bbox标注信息

任意四边形坐标标记格式:tl_x,tl_y,tr_x,tr_y,br_x,br_y,bl_x,bl_y。从左上点开始顺时针旋转的四个顶点的坐标,如下图所示:

bfae7d5fc716babc429df67f2074005e.png

将TXT文档中标注信息,存储到labelme标注的json文件内,代码如下:

import json
import base64
from PIL import Image
import io
import os
import cv2
import numpy as np


def generate_json(file_dir, file_name):
    str_json = {}
    shapes = []
    # 读取坐标
    fr = open(os.path.join(file_dir, file_name))
    for line in fr.readlines():  # 逐行读取,滤除空格等
        print(line.strip())
        print(type(line.strip()))
        lineArr = line.strip().split(',')
        print("lineArr:", lineArr)
        points = []
        points.append([float(lineArr[0]), float(lineArr[1])])
        points.append([float(lineArr[2]), float(lineArr[3])])
        points.append([float(lineArr[4]), float(lineArr[5])])
        points.append([float(lineArr[6]), float(lineArr[7])])
        print(points)  # 从左上点开始顺时针旋转的四个顶点的坐标
        shape = {}
        shape["label"] = "plate_1"
        shape["points"] = points
        shape["line_color"] = []
        shape["fill_color"] = []
        shape["flags"] = {}
        shapes.append(shape)
    str_json["version"] = "3.14.1"
    str_json["flags"] = {}
    str_json["shapes"] = shapes
    str_json["lineColor"] = [0, 255, 0, 128]
    str_json["fillColor"] = [255, 0, 0, 128]
    picture_basename = file_name.replace('.txt', '.png')
    str_json["imagePath"] = picture_basename
    img = cv2.imread(os.path.join(file_dir, picture_basename))
    str_json["imageHeight"] = img.shape[0]
    str_json["imageWidth"] = img.shape[1]
    str_json["imageData"] = base64encode_img(os.path.join(file_dir, picture_basename))
    return str_json


def base64encode_img(image_path):
    src_image = Image.open(image_path)
    output_buffer = io.BytesIO()
    src_image.save(output_buffer, format='JPEG')
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str

if __name__=="__main__":
    """
    txt文件和图像(png)文件,均存储在下面这个文件夹下
    生成的json文件,也保存到这个文件夹下
    """
    file_dir = r"E:\temp"
    file_name_list = [file_name for file_name in os.listdir(file_dir) \
                      if file_name.lower().endswith('txt')]

    for file_name in file_name_list:
        str_json = generate_json(file_dir, file_name)
        json_data = json.dumps(str_json, indent=2, ensure_ascii=False)
        jsonfile_name = file_name.replace(".txt", ".json")
        f = open(os.path.join(file_dir, jsonfile_name), 'w')
        f.write(json_data)
        f.close()

检验下生成的json,是否成功。用labelme打开,查看标注结果,进行检验:

85cdabe7fc23768e174ed26cc7397042.png

2.保存不规则边框polygon标注信息

这里与bbox的区别就在于:

  • bbox只有四个坐标点,按顺时针一次排布;

  • polygon是大于2个点都可以的,坐标的排序也是按照顺时针进行排布的。

所以,在poly中坐标点的数量是不固定的。在读取时候,依次将坐标点存储进来就行

import json
import base64
from PIL import Image
import io
import os
import cv2
import numpy as np


def generate_json(file_dir, file_name):
    str_json = {}
    shapes = []
    # 读取坐标
    fr = open(os.path.join(file_dir, file_name))
    for line in fr.readlines():  # 逐行读取,滤除空格等
        print(line.strip())
        print(type(line.strip()))
        lineArr = line.strip().split(',')
        print("lineArr:", lineArr)
        points = []
        for i in range(0, len(lineArr), 2):
            points.append([float(lineArr[i]), float(lineArr[i+1])])
        print(points)  # 从左上点开始顺时针旋转的四个顶点的坐标
        shape = {}
        shape["label"] = "plate_1"
        shape["points"] = points
        shape["line_color"] = []
        shape["fill_color"] = []
        shape["flags"] = {}
        shapes.append(shape)
    str_json["version"] = "3.14.1"
    str_json["flags"] = {}
    str_json["shapes"] = shapes
    str_json["lineColor"] = [0, 255, 0, 128]
    str_json["fillColor"] = [255, 0, 0, 128]
    picture_basename = file_name.replace('.txt', '.png')
    str_json["imagePath"] = picture_basename
    img = cv2.imread(os.path.join(file_dir, picture_basename))
    str_json["imageHeight"] = img.shape[0]
    str_json["imageWidth"] = img.shape[1]
    str_json["imageData"] = base64encode_img(os.path.join(file_dir, picture_basename))
    return str_json


def base64encode_img(image_path):
    src_image = Image.open(image_path)
    output_buffer = io.BytesIO()
    src_image.save(output_buffer, format='JPEG')
    byte_data = output_buffer.getvalue()
    base64_str = base64.b64encode(byte_data).decode('utf-8')
    return base64_str

if __name__=="__main__":
    """
    txt文件和图像(png)文件,均存储在下面这个文件夹下
    生成的json文件,也保存到这个文件夹下
    """
    file_dir = r"E:\temp\polygon"
    file_name_list = [file_name for file_name in os.listdir(file_dir) \
                      if file_name.lower().endswith('txt')]

    for file_name in file_name_list:
        str_json = generate_json(file_dir, file_name)
        json_data = json.dumps(str_json, indent=2, ensure_ascii=False)
        jsonfile_name = file_name.replace(".txt", ".json")
        with open(os.path.join(file_dir, jsonfile_name), 'w') as f:
            f.write(json_data)

同样,labelme打开,查看标注结果:

6cd44780059cbf0124c3d34db8c12047.png

参考链接:https://blog.csdn.net/skye_95/article/details/103635846

课程推荐:NumPy 手码一层神经网络,训练猫咪二分类

神经网络越写越深,参数容量越来越大。那只有一层的神经网络,能不能训练用于识别可爱的猫咪呢? 

这篇文章不再用 TensorFlow、PyTorch 等人工智能的框架,采用最基础的数学库 NumPy,手把手带你一步步吃透深度学习最基础知识点: 

  1. 数据的读取与分析

  2. NumPy 定义一层网络的权重 w 和偏置 b,并初始化网络

  3. 定义损失函数、参数梯度优化

  4. 整体梳理数据的流向和计算

  5. 总结

学完本Chat,希望能帮助你对深层、复杂的神经网络有更加深刻的理解。对网络中的数据流向、参数优化有更加清晰的认识。

获取链接方式:

1.点击“

2.可在公众号聊天框,回复关键字“gitchat”,获取直达链接。

往期回顾

  1. Python数据系列(一)- 列表List:Python的“苦力”

  2. Python数据系列(二)- 字典Dictionary:Python的“大胃王”

  3. Python数据系列(三)- 元组Tuple:Python的“不可变序列”

  4. Python数据系列(四)- 数组array-NumPy:Python的“运算加速氮气”

  5. 深度学习常见评价指标(一)- 图像语义分割

  6. 深度学习常见评价指标(二)- 图像分类任务

  7. 【Git笔记1】本地项目与GitHub远程仓库互联

621ad443db5523c2d54989220bd69edc.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值