YOLO物体识别,生成数据用到的工具

YOLO物体识别,生成数据用到的工具
1 remove_spaces(去掉文件名称中的空格,将“ ”替换为“_”)
运行前:
在这里插入图片描述

import os
import string
def listdir(path, list_name):
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            listdir(file_path, list_name)
        elif os.path.splitext(file_path)[1] == '.xml' or os.path.splitext(file_path)[1] == '.jpg':
            list_name.append(file_path)
if (1):
    # 1. 读取xml文件
    file_path = "C:/31/darknet-master/build/darknet/x64/data/voc/VOC2020/JPEGImages"
    list_name = []
    listdir(file_path, list_name)
    # print(list_name)
    size = 0
    str_ = ""
    for file_name in list_name:
        # print(tree)
        # 2. 属性修改
        # A. 找到父节点
        str_ = ((file_name).replace(' ','_'))
        os.rename(file_name, str_)
        size+=1
        print( file_name + "  " + str(size) +' succeful! ')

运行后:
在这里插入图片描述
2 change_xml (修改xml文件中出现的中文和路径错误)
生成数据集时出现如下错误:
在这里插入图片描述
运行前:
在这里插入图片描述

from xml.etree.ElementTree import ElementTree, Element

def read_xml(in_path):
    '''''读取并解析xml文件
    in_path: xml路径
    return: ElementTree'''
    tree = ElementTree()
    tree.parse(in_path)
    return tree


def write_xml(tree, out_path):
    '''''将xml文件写出
    tree: xml树
    out_path: 写出路径'''
    tree.write(out_path, encoding="utf-8", xml_declaration=True)


def if_match(node, kv_map):
    '''''判断某个节点是否包含所有传入参数属性
    node: 节点
    kv_map: 属性及属性值组成的map'''
    for key in kv_map:
        if node.get(key) != kv_map.get(key):
            return False
    return True


# ---------------search -----
def find_nodes(tree, path):
    '''''查找某个路径匹配的所有节点
    tree: xml树
    path: 节点路径'''
    return tree.findall(path)


def get_node_by_keyvalue(nodelist, kv_map):
    '''''根据属性及属性值定位符合的节点,返回节点
    nodelist: 节点列表
    kv_map: 匹配属性及属性值map'''
    result_nodes = []
    for node in nodelist:
        if if_match(node, kv_map):
            result_nodes.append(node)
    return result_nodes


# ---------------change -----
def change_node_properties(nodelist, kv_map, is_delete=False):
    '''''修改/增加 /删除 节点的属性及属性值
    nodelist: 节点列表
    kv_map:属性及属性值map'''
    for node in nodelist:
        for key in kv_map:
            if is_delete:
                if key in node.attrib:
                    del node.attrib[key]
            else:
                node.set(key, kv_map.get(key))


def change_node_text(nodelist, text, is_add=False, is_delete=False):
    '''''改变/增加/删除一个节点的文本
    nodelist:节点列表
    text : 更新后的文本'''
    for node in nodelist:
        if is_add:
            node.text += text
        elif is_delete:
            node.text = ""
        else:
            node.text = text


def create_node(tag, property_map, content):
    '''''新造一个节点
    tag:节点标签
    property_map:属性及属性值map
    content: 节点闭合标签里的文本内容
    return 新节点'''
    element = Element(tag, property_map)
    element.text = content
    return element


def add_child_node(nodelist, element):
    '''''给一个节点添加子节点
    nodelist: 节点列表
    element: 子节点'''
    for node in nodelist:
        node.append(element)


def del_node_by_tagkeyvalue(nodelist, tag, kv_map):
    '''''同过属性及属性值定位一个节点,并删除之
    nodelist: 父节点列表
    tag:子节点标签
    kv_map: 属性及属性值列表'''
    for parent_node in nodelist:
        children = parent_node.getchildren()
        for child in children:
            if child.tag == tag and if_match(child, kv_map):
                parent_node.remove(child)


import os
import string

def listdir(path, list_name):
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            listdir(file_path, list_name)
        elif os.path.splitext(file_path)[1] == '.xml':
            list_name.append(file_path)
if (1):
    # 1. 读取xml文件
    file_path = "C:/Users/zhumengbo/Desktop/new/original"
    list_name = []
    listdir(file_path, list_name)
    # print(list_name)
    size = 0
    str_ = ""
    for strPath in list_name:
        tree = read_xml(strPath)
        # print(tree)
        # 2. 属性修改
        # A. 找到父节点
        nodes = find_nodes(tree, "path")
        str_ = ((strPath).replace('\\','/'))
        change_node_text(nodes, str_)
        write_xml(tree, str_)
        size+=1
        print( str_ + "  " + str(size) +' succeful! ')

修改文件名:将 新建文件夹 修改 为fruit_plates,程序自动根据当前新的文件夹名称来修改原本的路径

运行后:
在这里插入图片描述
3 去掉多余jpg和xml文件
在数据集中,jpg文件和xml需要成对出现

import os
import string


def listdir(path, list_name, format):
    for file in os.listdir(path):
        file_path = os.path.join(path, file)
        if os.path.isdir(file_path):
            listdir(file_path, list_name)
        elif os.path.splitext(file_path)[1] == format:
            list_name.append(os.path.splitext(file_path)[0].split('\\')[-1])


def aligning(path):
    list_xml_name = []
    list_jpg_name = []
    listdir(path, list_xml_name, '.xml')
    listdir(path, list_jpg_name, '.jpg')
    # 删除多余的xml文件
    for file_name_xml in list_xml_name:
        is_exit = 0
        for file_name_jpg in list_jpg_name:
            if file_name_xml == file_name_jpg:
                is_exit = 1
                break
        if is_exit == 0:
            current_file_path = path + '/' + file_name_xml + '.xml'
            if os.path.exists(current_file_path):  # 如果文件存在
                # 删除文件,可使用以下两种方法。
                os.remove(current_file_path)
    # 删除多余的jpg文件
    for file_name_jpg in list_jpg_name:
        is_exit = 0
        for file_name_xml in list_xml_name:
            if file_name_jpg == file_name_xml:
                is_exit = 1
                break
        if is_exit == 0:
            current_file_path = path + '/' + file_name_jpg + '.xml'
            if os.path.exists(current_file_path):  # 如果文件存在
                # 删除文件,可使用以下两种方法。
                os.remove(current_file_path)


if (1):
    # 1. 读取xml文件
    aligning('C:/Users//Desktop/img/label20201009/label/yellow_belt/yellow_belt2_xml')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值