labelme是数据标注中最常用到的标注工具。可以标注矩形框、圆形、线条、不规则图形等等。所以这种多功能的标注工具,也应用广泛。
但是,有时候我们也会从别处获取一些已经标注好的数据,或只是坐标点。那如何用labelme查看呢?今天这篇文章就介绍,如何生成能labelme直接打开的json文件。
本文阅读大约需要2min,但建议收藏,动手实践之。
1.保存四边形矩形框bbox标注信息
任意四边形坐标标记格式:tl_x,tl_y,tr_x,tr_y,br_x,br_y,bl_x,bl_y。从左上点开始顺时针旋转的四个顶点的坐标,如下图所示:
将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打开,查看标注结果,进行检验:
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打开,查看标注结果:
参考链接:https://blog.csdn.net/skye_95/article/details/103635846
课程推荐:NumPy 手码一层神经网络,训练猫咪二分类
神经网络越写越深,参数容量越来越大。那只有一层的神经网络,能不能训练用于识别可爱的猫咪呢?
这篇文章不再用 TensorFlow、PyTorch 等人工智能的框架,采用最基础的数学库 NumPy,手把手带你一步步吃透深度学习最基础知识点:
数据的读取与分析
NumPy 定义一层网络的权重 w 和偏置 b,并初始化网络
定义损失函数、参数梯度优化
整体梳理数据的流向和计算
总结
学完本Chat,希望能帮助你对深层、复杂的神经网络有更加深刻的理解。对网络中的数据流向、参数优化有更加清晰的认识。
获取链接方式:
1.点击“
2.可在公众号聊天框,回复关键字“gitchat”,获取直达链接。
往期回顾
Python数据系列(一)- 列表List:Python的“苦力”
Python数据系列(二)- 字典Dictionary:Python的“大胃王”
Python数据系列(三)- 元组Tuple:Python的“不可变序列”
Python数据系列(四)- 数组array-NumPy:Python的“运算加速氮气”
深度学习常见评价指标(一)- 图像语义分割
深度学习常见评价指标(二)- 图像分类任务
【Git笔记1】本地项目与GitHub远程仓库互联