55、记录标注的关键点和目标检测数据集,进行目标检测标注文件和关键点文件分离以及yolov5.txt标注格式转xml数据集

2023-05-16

基本思想:手中存在一份关键点检测模型,因为客户把检测框和目标关键点框都标注在一起了,所以进行一下剥离

代码一:从关标注数据集剥离目标检测

# -*- coding: utf-8 -*-
import cv2
import json
import io
import os
import glob
from xml.dom.minidom import Document

path = r'F:\trash\test'
destPath = r"F:\trash\test"




m_folder = ""
print('m_folder=', m_folder)
m_database = 'Unknown'
print('m_database=', m_database)
m_depth = 3
print('m_depth=', m_depth)
m_segmented = 0
print('m_segmented=', m_segmented)

m_pose = 'Unspecified'
print('m_pose=', m_pose)
m_truncated = 0
print('m_truncated=', m_truncated)
m_difficult = 0
print('m_difficult=', m_difficult)
m_segmented = 0
print('m_segmented=', m_segmented)

path_list = glob.glob(path+"\*.json")
for name in enumerate(path_list):
    m_path = name[1]
    print("m_path=",m_path)
    dir = os.path.dirname(m_path)
    name__,__=os.path.split(name[1])
    ff,ext=os.path.splitext(__)
    print('dir=', dir)

    file_json = io.open(m_path, 'r', encoding='utf-8')
    json_data = file_json.read()
    data = json.loads(json_data)
    m_filename = ff+".jpg"
    print('m_filename=', m_filename)
    m_path = os.path.join(dir, m_filename)
    #print('m_path=', m_path)
    m_width = data['imageWidth']
    #print('m_width=', m_width)
    m_height = data['imageHeight']
    #print('m_height=', m_height)
    object_name = os.path.splitext(m_filename)[0]
    new_object_name = object_name + '.xml'
    img_name = object_name + ".jpg"

    #print(new_object_name)
    doc = Document()  # 创建DOM文档对象
    DOCUMENT = doc.createElement('annotation')  # 创建根元素

    folder = doc.createElement('folder')
    folder_text = doc.createTextNode(m_folder)
    folder.appendChild(folder_text)
    DOCUMENT.appendChild(folder)
    doc.appendChild(DOCUMENT)

    filename = doc.createElement('filename')
    filename_text = doc.createTextNode(m_filename)
    filename.appendChild(filename_text)
    DOCUMENT.appendChild(filename)
    doc.appendChild(DOCUMENT)

    path = doc.createElement('path')
    path_text = doc.createTextNode(m_filename)
    path.appendChild(path_text)
    DOCUMENT.appendChild(path)
    doc.appendChild(DOCUMENT)

    source = doc.createElement('source')
    database = doc.createElement('database')
    database_text = doc.createTextNode(m_database)  # 元素内容写入
    database.appendChild(database_text)
    source.appendChild(database)
    DOCUMENT.appendChild(source)
    doc.appendChild(DOCUMENT)

    size = doc.createElement('size')
    width = doc.createElement('width')
    width_text = doc.createTextNode(str(m_width))  # 元素内容写入
    width.appendChild(width_text)
    size.appendChild(width)

    height = doc.createElement('height')
    height_text = doc.createTextNode(str(m_height))
    height.appendChild(height_text)
    size.appendChild(height)

    depth = doc.createElement('depth')
    depth_text = doc.createTextNode(str(m_depth))
    depth.appendChild(depth_text)
    size.appendChild(depth)

    DOCUMENT.appendChild(size)

    segmented = doc.createElement('segmented')
    segmented_text = doc.createTextNode(str(m_segmented))
    segmented.appendChild(segmented_text)
    DOCUMENT.appendChild(segmented)
    doc.appendChild(DOCUMENT)
    for i in range(len(data['shapes'])):
        if data['shapes'][i]['shape_type'] !="rectangle":
            continue
        m_xmin_0 = data['shapes'][i]['points'][0][0]
        #print('m_xmin_0=', m_xmin_0)
        m_ymin_0 = data['shapes'][i]['points'][0][1]
        #print('m_ymin_0=', m_ymin_0)
        m_xmax_0 = data['shapes'][i]['points'][1][0]
        #print('m_xmax_0=', m_xmax_0)
        m_ymax_0 = data['shapes'][i]['points'][1][1]
        #print('m_ymax_0=', m_ymax_0)
        m_name_0 ="tilapia"# data['shapes'][i]['label']
        #print('m_name_0=', m_name_0)
        object = doc.createElement('object')
        name = doc.createElement('name')
        name_text = doc.createTextNode(m_name_0)
        name.appendChild(name_text)
        object.appendChild(name)

        pose = doc.createElement('pose')
        pose_text = doc.createTextNode(m_pose)
        pose.appendChild(pose_text)
        object.appendChild(pose)

        truncated = doc.createElement('truncated')
        truncated_text = doc.createTextNode(str(m_truncated))
        truncated.appendChild(truncated_text)
        object.appendChild(truncated)

        difficult = doc.createElement('difficult')
        difficult_text = doc.createTextNode(str(m_difficult))
        difficult.appendChild(difficult_text)
        object.appendChild(difficult)

        bndbox = doc.createElement('bndbox')
        xmin = doc.createElement('xmin')
        xmin_text = doc.createTextNode(str(int(m_xmin_0)))
        xmin.appendChild(xmin_text)
        bndbox.appendChild(xmin)

        ymin = doc.createElement('ymin')
        ymin_text = doc.createTextNode(str(int(m_ymin_0)))
        ymin.appendChild(ymin_text)
        bndbox.appendChild(ymin)

        xmax = doc.createElement('xmax')
        xmax_text = doc.createTextNode(str(int(m_xmax_0)))
        xmax.appendChild(xmax_text)
        bndbox.appendChild(xmax)

        ymax = doc.createElement('ymax')
        ymax_text = doc.createTextNode(str(int(m_ymax_0)))
        ymax.appendChild(ymax_text)
        bndbox.appendChild(ymax)
        object.appendChild(bndbox)

        DOCUMENT.appendChild(object)
    new_path_filename = os.path.join(destPath, new_object_name)
    print('new_path_filename=', new_path_filename)
    f = open(new_path_filename, 'w')

    doc.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
    f.close()



txt数据集格式转xml

# -*- coding: utf-8 -*-
import glob
import json
import io
import os
import cv2
from xml.dom.minidom import Document

path = '/home/ubuntu/Downloads/RetinaFace/images'
destPath = "/home/ubuntu/Downloads/RetinaFace/images"


m_folder = os.path.basename(path)
print('m_folder=', m_folder)
m_database = 'Unknown'
print('m_database=', m_database)
m_depth = 3
print('m_depth=', m_depth)
m_segmented = 0
print('m_segmented=', m_segmented)

m_pose = 'Unspecified'
print('m_pose=', m_pose)
m_truncated = 0
print('m_truncated=', m_truncated)
m_difficult = 0
print('m_difficult=', m_difficult)
m_segmented = 0
print('m_segmented=', m_segmented)

path_list = glob.glob(path+"/*.txt")
for name in path_list:
    m_path,name_ = os.path.split(name)
    name_p, ext_ = os.path.splitext(name_)
    img_jpg=".".join([name_p,"jpg"])
    image_src=cv2.imread(os.path.join(m_path,img_jpg))
    m_width,m_height,_=image_src.shape[0],image_src.shape[1],image_src.shape[2]
    m_filename = img_jpg
    print('m_path=', m_path)
    print('m_height=', m_height)
    object_name = os.path.splitext(m_filename)[0]
    new_object_name = object_name + '.xml'
    img_name = object_name + ".jpg"

    print(new_object_name)
    doc = Document()  # 创建DOM文档对象
    DOCUMENT = doc.createElement('annotation')  # 创建根元素

    folder = doc.createElement('folder')
    folder_text = doc.createTextNode(m_folder)
    folder.appendChild(folder_text)
    DOCUMENT.appendChild(folder)
    doc.appendChild(DOCUMENT)

    filename = doc.createElement('filename')
    filename_text = doc.createTextNode(m_filename)
    filename.appendChild(filename_text)
    DOCUMENT.appendChild(filename)
    doc.appendChild(DOCUMENT)

    path = doc.createElement('path')
    path_text = doc.createTextNode(m_filename)
    path.appendChild(path_text)
    DOCUMENT.appendChild(path)
    doc.appendChild(DOCUMENT)

    source = doc.createElement('source')
    database = doc.createElement('database')
    database_text = doc.createTextNode(m_database)  # 元素内容写入
    database.appendChild(database_text)
    source.appendChild(database)
    DOCUMENT.appendChild(source)
    doc.appendChild(DOCUMENT)

    size = doc.createElement('size')
    width = doc.createElement('width')
    width_text = doc.createTextNode(str(m_width))  # 元素内容写入
    width.appendChild(width_text)
    size.appendChild(width)

    height = doc.createElement('height')
    height_text = doc.createTextNode(str(m_height))
    height.appendChild(height_text)
    size.appendChild(height)

    depth = doc.createElement('depth')
    depth_text = doc.createTextNode(str(m_depth))
    depth.appendChild(depth_text)
    size.appendChild(depth)

    DOCUMENT.appendChild(size)

    segmented = doc.createElement('segmented')
    segmented_text = doc.createTextNode(str(m_segmented))
    segmented.appendChild(segmented_text)
    DOCUMENT.appendChild(segmented)
    doc.appendChild(DOCUMENT)
    with open(name ,encoding='utf-8') as f:
        lines = f.readlines()
        for j, line in enumerate(lines):
            class_id, x, y, w, h = line.strip().split(' ')
            class_id, x, y, w, h = int(class_id), float(x), float(y), float(w), float(h)  # 将字符串类型转为可计算的int和float类型

            m_xmin_0 = (x - w / 2) * m_width  # 坐标转换
            m_ymin_0 = (y - h / 2) * m_height
            m_xmax_0 = (x + w / 2) * m_width
            m_ymax_0 = (y + h / 2) * m_height

            print('m_ymax_0=', m_ymax_0)
            m_name_0 = str(class_id)
            print('m_name_0=', m_name_0)
            object = doc.createElement('object')
            name = doc.createElement('name')
            name_text = doc.createTextNode(m_name_0)
            name.appendChild(name_text)
            object.appendChild(name)

            pose = doc.createElement('pose')
            pose_text = doc.createTextNode(m_pose)
            pose.appendChild(pose_text)
            object.appendChild(pose)

            truncated = doc.createElement('truncated')
            truncated_text = doc.createTextNode(str(m_truncated))
            truncated.appendChild(truncated_text)
            object.appendChild(truncated)

            difficult = doc.createElement('difficult')
            difficult_text = doc.createTextNode(str(m_difficult))
            difficult.appendChild(difficult_text)
            object.appendChild(difficult)

            bndbox = doc.createElement('bndbox')
            xmin = doc.createElement('xmin')
            xmin_text = doc.createTextNode(str(int(m_xmin_0)))
            xmin.appendChild(xmin_text)
            bndbox.appendChild(xmin)

            ymin = doc.createElement('ymin')
            ymin_text = doc.createTextNode(str(int(m_ymin_0)))
            ymin.appendChild(ymin_text)
            bndbox.appendChild(ymin)

            xmax = doc.createElement('xmax')
            xmax_text = doc.createTextNode(str(int(m_xmax_0)))
            xmax.appendChild(xmax_text)
            bndbox.appendChild(xmax)

            ymax = doc.createElement('ymax')
            ymax_text = doc.createTextNode(str(int(m_ymax_0)))
            ymax.appendChild(ymax_text)
            bndbox.appendChild(ymax)
            object.appendChild(bndbox)

            DOCUMENT.appendChild(object)
    new_path_filename = os.path.join(destPath, new_object_name)
    print('new_path_filename=', new_path_filename)
    f = open(new_path_filename, 'w')

    doc.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8')
    f.close()

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

55、记录标注的关键点和目标检测数据集,进行目标检测标注文件和关键点文件分离以及yolov5.txt标注格式转xml数据集 的相关文章

随机推荐