【YOLO标签转换】JSON格式标签转换为YOLO格式标签详细教程(附完整代码)
关于作者
作者:小白熊
作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类,姿态识别,语义分割,路径规划,智能优化算法,数据分析,各类创新融合等等。
联系邮箱:[email protected]
在目标检测任务中,YOLO(You Only Look Once)是一种非常流行的算法。YOLO将目标检测问题转换为回归问题,从而大大提升了检测速度。YOLO格式是一种简洁的数据标注格式,通常用于训练和评估YOLO模型。本文将详细介绍如何将标注数据从JSON格式转换为YOLO格式,并附上详细的Python代码实现。
准备工作
首先,我们需要整理标注数据。每个JSON文件对应一张图片,其中包含了目标的类别和位置信息,并将其放在一个文件夹中。YOLO格式则要求每个目标的信息以“类别ID 中心点x 中心点y 宽度w 高度h”的形式表示,且所有坐标和尺寸都需要归一化到0到1之间。
完整代码
以下是一个Python脚本,用于将JSON格式的标注数据转换为YOLO格式的TXT文件。
import os
import json
from PIL import Image
import warnings
warnings.filterwarnings("ignore")
json_dir = './labels_json/' # JSON文件路径
out_dir = './labels_txt/' # 输出的TXT文件路径
# 确保输出目录存在
if not os.path.exists(out_dir):
os.makedirs(out_dir)
def get_json(json_file, filename):
# 读取JSON文件数据
with open(json_file, 'r') as load_f:
content = json.load(load_f)
image_width = 5568 # 图片的宽
image_height = 3712 # 图片的高
filename_txt = out_dir + filename + '.txt'
# 创建或清空TXT文件
with open(filename_txt, mode="w", encoding="utf-8") as fp:
pass # 创建一个空文件然后关闭
# 类别名称,对应标签序号
name = ['cola', 'pepsi', 'sprite', 'fanta', 'spring', 'ice', 'scream', 'milk', 'red', 'king']
name_class = {
name[i]: i for i in range(len(name))}
con = content['shapes']
# 逐个处理标注信息
for t in con:
num = name_class[t['label']]
point = t['points']
# 计算中心点坐标和宽高(归一化)
x = (((point[1][0] - point[0][0]) / 2) + point[0][0]) / image_width
y = (((point[1][1] - point[0][1]) / 2) + point[0][1]) / image_height
w = (point[1][0] - point[0][0]) / image_width
h = (point[1][1] - point[0][1]) / image_height
# 将计算得到的信息写入TXT文件
file_str = str(num) + ' ' + str(round(x, 6)) + ' ' + str(round(y, 6)) + ' ' + str(round(w, 6)) + \
' ' + str(round(h, 6))
with open(filename_txt, mode="a", encoding="utf-8") as fp:
fp.write(file_str + '\n')
def main():
files = os.listdir(json_dir) # 得到文件夹下的所有文件名称
for file in files: # 遍历文件夹
if file.endswith('.json'): # 只处理JSON文件
filename = file.split('.')[0]
get_json(json_dir + '/' + file, filename)
if __name__ == '__main__':
main()
代码详解
- 导入必要的库:
os
:用于文件和目录操作。json
:用于读取JSON文件。PIL.Image
:虽然在这个脚本中没有直接使用到PIL库,但通常用于图像处理。warnings
:用于忽略警告信息,使输出更加清晰。
- 设置目录路径:
json_dir
:JSON文件存储的目录。out_dir
:输出的TXT文件存储的目录。
- 确保输出目录存在:如果输出目录不存在,则创建它。
- 定义
get_json
函数:- 读取JSON文件并解析内容。
- 设置图片的宽度和高度(例子中所有图片的尺寸相同)。
- 定义类别名称和对应的标签序号。
- 遍历标注信息,计算每个目标的中心点坐标和宽高(归一化)。
- 将计算得到的信息写入TXT文件。
- 定义
main
函数:- 遍历JSON文件目录,获取所有JSON文件。
- 调用
get_json
函数处理每个JSON文件。
- 运行脚本:
- 检查是否是直接运行该脚本,如果是,则调用
main
函数。
- 检查是否是直接运行该脚本,如果是,则调用
注意事项
- JSON文件格式:
- JSON文件的格式包含
shapes
字段,每个形状包含label
和points
字段。 label
字段表示目标类别,points
字段表示目标的矩形框的两个对角点坐标。
- JSON文件的格式包含
- 归一化:
- YOLO格式要求所有坐标和尺寸都需要归一化到0到1之间。
- 归一化公式:
(实际值 - 最小值) / (最大值 - 最小值)
。在这里,图片的宽高作为最大值,坐标值作为实际值进行计算。
- 文件操作:
- 在写入TXT文件时,使用
mode="a"
模式,以确保每次都是在文件末尾追加内容,而不是覆盖原有内容。
- 在写入TXT文件时,使用
通过这段代码,你可以轻松地将JSON格式的标注数据转换为YOLO格式的TXT文件,从而用于YOLO模型的训练和评估。