• 机器学习常见数据格式转换(xml_to_csv,csv_to_tfrecord)


    🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝
    **🥰 博客首页:knighthood2001
    😗 欢迎点赞👍评论🗨️
    ❤️ 热爱python,期待与大家一同进步成长!!❤️

    labelimg(目标检测标注工具)的安装与使用教程
    在上述文章中,笔者曾写到过,标注完后,生成的xml文件就可以方便后续的xml_to_csv以及转换为tfrecord文件了。
    不过当时并未提及到如何进行转换,这篇文章给出具体操作。

    xml_to_csv

    代码如下:

    import os
    import glob
    import pandas as pd
    import xml.etree.ElementTree as ET
    
    def xml_to_csv(path):
        xml_list = []
        for xml_file in glob.glob(path + '/*.xml'):
            tree = ET.parse(xml_file)
            root = tree.getroot()
            for member in root.findall('object'):
                value = (root.find('filename').text,
                         int(root.find('size')[0].text),
                         int(root.find('size')[1].text),
                         member[0].text,
                         int(member[4][0].text),
                         int(member[4][1].text),
                         int(member[4][2].text),
                         int(member[4][3].text)
                         )
                xml_list.append(value)
        column_name = ['filename', 'width', 'height', 'class', 'xmin', 'ymin', 'xmax', 'ymax']
        xml_df = pd.DataFrame(xml_list, columns=column_name)
        return xml_df
    
    def main():
        print(os.getcwd())
        # 结果为E:\python_code\crack\models_trainning
        # ToDo 根据自己实际目录修改
        # image_path = os.path.join(os.getcwd(), 'dataset/crack/test')  # 根据自己实际目录修改,或者使用下面的路径
        image_path = 'E:/python_code/crack/models_trainning/dataset/crack/test'
        print(image_path)
        xml_df = xml_to_csv(image_path)
        xml_df.to_csv('./dataset/crack/train/crack_test.csv', index=None)  # 根据自己实际目录修改
        print('Successfully converted xml to csv.')
    
    main()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

        这里需要注意的是,这里的话我们只需要修改路径,就不需要在终端运行(每次需要先去该目录下)了,对于不玩linux的同学比较友好。

    在这里插入图片描述

    print(os.getcwd())
    
    • 1

    结果为E:\python_code\crack\models_trainning

    image_path = os.path.join(os.getcwd(), 'dataset/crack/test')
    image_path = 'E:/python_code/crack/models_trainning/dataset/crack/test'
    
    • 1
    • 2

    以上两种图片路径方法都可以,一个采用的是os.path.join()进行路径拼接。

    xml_df.to_csv('./dataset/crack/train/crack_test.csv', index=None) 
    
    • 1

    保存为csv的路径可以随意写
    结果如下
    在这里插入图片描述

    csv_to_tfrecord

    # -*- coding: utf-8-*-
    from __future__ import division
    from __future__ import print_function
    from __future__ import absolute_import
    
    import os
    import io
    import pandas as pd
    import tensorflow as tf
    import tensorflow.compat.v1 as tf
    from PIL import Image
    from research.object_detection.utils import dataset_util
    from collections import namedtuple, OrderedDict
    
    flags = tf.app.flags
    flags.DEFINE_string('csv_input', '', 'Path to the CSV input')
    flags.DEFINE_string('output_path', '', 'Path to output TFRecord')
    FLAGS = flags.FLAGS
    
    
    # 将分类名称转成ID号
    def class_text_to_int(row_label):
        if row_label == 'crack':
            return 1
        # elif row_label == 'car':
        #     return 2
        # elif row_label == 'person':
        #     return 3
        # elif row_label == 'kite':
        #     return 4
        else:
            print('NONE: ' + row_label)
            # None
    
    
    def split(df, group):
        data = namedtuple('data', ['filename', 'object'])
        gb = df.groupby(group)
        return [data(filename, gb.get_group(x)) for filename, x in zip(gb.groups.keys(), gb.groups)]
    
    
    def create_tf_example(group, path):
        print(os.path.join(path, '{}'.format(group.filename)))
        with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid:
            encoded_jpg = fid.read()
        encoded_jpg_io = io.BytesIO(encoded_jpg)
        image = Image.open(encoded_jpg_io)
        width, height = image.size
    
        filename = (group.filename + '.jpg').encode('utf8')
        image_format = b'jpg'
        xmins = []
        xmaxs = []
        ymins = []
        ymaxs = []
        classes_text = []
        classes = []
    
        for index, row in group.object.iterrows():
            xmins.append(row['xmin'] / width)
            xmaxs.append(row['xmax'] / width)
            ymins.append(row['ymin'] / height)
            ymaxs.append(row['ymax'] / height)
            classes_text.append(row['class'].encode('utf8'))
            classes.append(class_text_to_int(row['class']))
    
        tf_example = tf.train.Example(features=tf.train.Features(feature={
            'image/height': dataset_util.int64_feature(height),
            'image/width': dataset_util.int64_feature(width),
            'image/filename': dataset_util.bytes_feature(filename),
            'image/source_id': dataset_util.bytes_feature(filename),
            'image/encoded': dataset_util.bytes_feature(encoded_jpg),
            'image/format': dataset_util.bytes_feature(image_format),
            'image/object/bbox/xmin': dataset_util.float_list_feature(xmins),
            'image/object/bbox/xmax': dataset_util.float_list_feature(xmaxs),
            'image/object/bbox/ymin': dataset_util.float_list_feature(ymins),
            'image/object/bbox/ymax': dataset_util.float_list_feature(ymaxs),
            'image/object/class/text': dataset_util.bytes_list_feature(classes_text),
            'image/object/class/label': dataset_util.int64_list_feature(classes),
        }))
        return tf_example
    
    
    def main(csv_input, output_path, imgPath):
        writer = tf.python_io.TFRecordWriter(output_path)
        path = imgPath
        examples = pd.read_csv(csv_input)
        grouped = split(examples, 'filename')
        for group in grouped:
            tf_example = create_tf_example(group, path)
            writer.write(tf_example.SerializeToString())
    
        writer.close()
        print('Successfully created the TFRecords: {}'.format(output_path))
    
    
    if __name__ == '__main__':
        # ToDo 修改相应目录
        imgPath = r'E:\python_code\crack\models_trainning\dataset\crack\test'
        output_path = 'dataset/crack/test/crack_test.record'
        csv_input = 'dataset/crack/test/crack_test.csv'
        main(csv_input, output_path, imgPath)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103

    如xml_to_csv类似,只要把路径改好即可
    imgPath是图片所在文件夹路径
    output_path是tfrecord生成的路径
    csv_iinput是使用的csv的路径
        当然,你可能会出现下面报错,起初笔者还以为是编码问题,可是始终未能解决。后来仔细检查发现,是自己路径搞错了,因此大家出现这个错误的时候,检查一下路径先。

    在这里插入图片描述

    总结

        这是笔者之前想要训练 模型的时候搞得,当时查了好久,光我上面 说的那个简单到离谱的utf-8的问题,当时都困扰我好久了。希望能帮助大家
        这篇文章是笔者第一次使用markdown编辑器写的,现在对它的感觉还行!!😀😀

  • 相关阅读:
    RabbitMQ保证消息的可靠性
    【Linux】进程间通信 | 共享内存 | 信号量
    设计模式-01简单工厂模式详解 详细代码对比
    Ubuntu 23.10:内网安装rapidocr_paddle(GPU)及其前置准备
    DispatcherServlet的功能简介说明
    最新基于R语言lavaan结构方程模型(SEM)技术
    2023研究生数学建模E题保姆级思路 出血性脑卒中临床智能诊疗
    java基础篇—基础语法
    如何保持 SSH 会话不中断?
    sklearn机器学习——day12
  • 原文地址:https://blog.csdn.net/knighthood2001/article/details/126812630