目录
引言
YOLO(You Only Look Once)作为一个目标检测算法,主要是针对矩形边界框的标注设计的,通常情况下使用的是矩形边界框,常用的LabelImg可以只支持矩形标注,该软件标注的标签可以直接用于应用,本文教程主要介绍如何训练自己的YOLO模型,LabelMe多边形标注的标签如何训练。
前期准备
在开始前建议先下载YOLOv10训练源码,安装Anaconda,VSCode,LabelMe并配置好Python环境,OpenCV环境,PyTorch即可开始训练自己的数据集。
Step1 打标训练
使用LabelMe软件进行打标签,会在原图路径下生成.json标签文件。
Step2 格式转换
LabelMe生成的.json标签文件格式不适用于YOLO训练,需要转换格式为.txt标签文件,利用以下代码将.json标签文件归一化为YOLO可直接训练的.txt标签文件。
import json
import os
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon
import numpy as np
#定义分类
name2id = {
'background':0,'dot':1}
#通过相对路径索引到标签文件
label_floder_path = './source'
def convert(img_size, corners):
# 输入的image_size[0]为宽,[1]为高
# 输入的corners[0]和[1]左上角的xy坐标,[2][3]为右下角的xy坐标
dw = 1./(img_size[0])
dh = 1./(img_size[1])
x = (corners[0] + corners[2]) / 2.0 - 1
y = (corners[1] + corners[3]) / 2.0 - 1
w = abs(corners[2] - corners[0])
h = abs(corners[3] - corners[1])
x = x * dw
w = w * dw
y = y * dh
h = h * dh
print("归一化后矩形中心坐标为(", x, ",", y, ")")
print("归一化后矩形中心宽高为(", w, ",", h, ")")
return (x, y, w, h)
def decode_json(label_floder_path, label_name):
# txt文件名为:文件名.json转换为文件名.txt
txt_name = label_floder_path + "/" + label_name[0:-5] + '.txt'
# 打开txt后续可以进行写入,若不存在改文件会自动创建
print("新建的txt文件名称为", txt_name)
txt_file = open(txt_name, 'w')
# 文件路径+文件名称组成完整路径
label_path = os.path.join(label_floder_path, label_name)
print("文件路径为", label_floder_path, "文件名称为", label_name)
# 打开json后续可进行读取,编码方式为GBK
data = json.load(open(label_path, 'r', encoding='GBK'))
# 用索引的方式可以得到数据
img_w = data['imageWidth']
img_h = data['imageHeight']
for i in data['shapes']:
label_name = i['label']
# 标签形状为矩形时的转换方式
if (i['shape_type'] == 'rectangle'):
print("标签形状为矩形进行转换")
x1 = int(i['points'][0][0])
y1 = int(i['points'][0][1])
x2 = int(i