(深度学习)简单的图片和xml数据清洗脚本

(深度学习)简单的图片和xml数据清洗脚本

分享一个自己目前在用的操作比较简单的数据清洗脚本,主要功能包括:

1.显示命名不规划的xml文件(可设置自己定义的命名规范格式)
2.缺失xml文件显示
3.缺失图像显示
4.删除没有对应xml的图片(小心误删)
5.删除没有对应图片的xml文件(小心误删)
6.找出并删除内容为空的xml文件
7.改写label出错的xml文件

脚本代码:

import os
import easygui as g
import xml.etree.ElementTree as ET
from tqdm import tqdm



def parse_obj(xml_path, filename):
    tree = ET.parse(xml_path + filename)
    objects = []
    for obj in tree.findall('object'):
        obj_struct = {}
        obj_struct['name'] = obj.find('name').text
        objects.append(obj_struct)
    return objects


image_path = g.diropenbox(title="请选择图像文件夹路径", default=r"/home/xiaopeng/dataset/")  # 将default按照自己数据的位置设置,可以减轻繁琐操作
print(image_path)
xml_path = g.diropenbox(title="请选择xml文件夹路径", default=r"/home/xiaopeng/dataset/")
print(xml_path)

image_lst = os.listdir(image_path)
xml_lst = os.listdir(xml_path)
print("image list:", len(image_lst))
print("xml list:", len(xml_lst))

print("————————功能1:显示命名不规划的xml文件———————————————————")
err_xml = []
# 显示命名不规划的xml文件
for xml in xml_lst:
    if len(xml) != 12:  # 自己定义自己的命名规范格式
        # print(xml)
        err_xml.append(xml)
if len(err_xml) == 0:
    print("无不规范命名的xml文件")

print("————————功能2:缺失xml文件显示——————————————————————————")
# 缺失xml文件显示
missing_xml = []
for image in tqdm(image_lst):
    xml = image[:-4] + '.xml'
    if xml not in xml_lst:
        missing_xml.append(xml[:-4])
print("缺失xml文件数:", len(missing_xml))
print("缺失xml文件为:", missing_xml)

print("————————功能3:缺失图像显示—————————————————————————————")
# 缺失图像显示(或者说多余的xml)
missing_image = []
for xml in tqdm(xml_lst):
    image = xml[:-4] + '.jpg'
    if image not in image_lst:
        missing_image.append(xml[:-4])
print("缺失image文件数:", len(missing_image))
print("缺失image文件为:", missing_image)

# print("————————功能4:删除没有对应xml的图片—————————————————————")
# drop_list1 = []
# while len(missing_xml):
#     for index1 in missing_xml:
#         image = index1 + '.jpg'
#         os.remove(image_path + "/" + image)
#         missing_xml.remove(index1)
#         drop_list1.append(index1)
# if len(drop_list1) > 0:
#     print("成功删除:", drop_list1)
# else:
#     print("无缺失文件")


# print("————————功能5:删除没有对应图片的xml文件——————————————————")
# drop_list2 = []
# while len(missing_image):
#     for index2 in missing_image:
#         xml = index2 + '.xml'
#         os.remove(xml_path + "/" + xml)
#         missing_image.remove(index2)
#         drop_list2.append(index2)
# if len(drop_list2) > 0:
#     print("成功删除:", drop_list2)
# else:
#     print("无缺失文件")


print("————————功能6:找出并删除空的xml文件——————————————————")
count = 0  # 保存内容为空的xml的数量
for xml in xml_lst:
    objects = parse_obj(xml_path + os.sep, xml)
    if len(objects) == 0:  # 用于判断xml是否为空
        print("{}为空".format(xml))
        count += 1
        os.remove(xml_path + os.sep + xml)  # 把空的xml删除
print("共有{}个空xml".format(count))

# print("————————功能7:改写label出错的xml文件————————————————————")
# def main(path):
#     wrong_class_lst1, wrong_class_lst2, w_lst = [], [], []
#     for xml_file in glob.glob(path + '*.xml'):
#         print(xml_file)
#         tree = ET.parse(xml_file)
#         root = tree.getroot()
#
#         for member in root.findall('object'):
#             value = member[0].text
#             if value == 'chemical_vehical' or value == 'chemcial_vehicle' or value == 'chemical_vehicel':  # 改写错误的标签
#                 wrong_class_lst1.append(root.find('filename').text)
#                 member[0].text = 'chemical_vehicle'
#             if value == 'chemical_sigh':
#                 wrong_class_lst2.append(root.find('filename').text)  # 改写错误的标签
#                 member[0].text = 'chemical_sign'
#             # if value == 'w':
#             #     w_lst.append(root.find('filename').text)
#         tree.write(xml_file)
#     print('wrong_class_list1:', wrong_class_lst1)
#     print('wrong_class_list2:', wrong_class_lst1)
# print('w_list:', w_lst)
# main(xml_path + os.sep)

print("完成!")

你可能感兴趣的:((深度学习)简单的图片和xml数据清洗脚本)