当前位置:   article > 正文

LabelImg软件制作tfrecord格式数据集_tfrecord labelimg

tfrecord labelimg

下载资源

1、labelImg标注工具的下载及安装:
下载软件: tzutalin /labelImg
安装:参看作者的项目文档,找到Installation,选择window+anaconda的安装方式:
在这里插入图片描述

进行标记

1、打开labelimg软件
打开解压缩后的labelimg文件存放地址:
在这里插入图片描述运行labelImg.py程序
在这里插入图片描述
则打开labelImg软件界面:
在这里插入图片描述2、设置导入、导出操作地址
在这里插入图片描述
将待标记图像集存放在data-picture文件夹中,选择opendir命令,打开data-picture中的数据集并完成标记。
打开change save dir,将导出地址选择为data-xml文件夹。如果未做修改保持默认,则会将.xml文件输出在data-picture文件夹中
在这里插入图片描述
3、标记图像
在这里插入图片描述在这里插入图片描述至此,完成了图片集的标记,软件其他的详细命令请参考手把手教你图片打标
查看生成的.xml文件:因为选择了Change Save Dir命令,所以输出.xml在data-xml的train文件夹中:

在这里插入图片描述
4、YOLO数据集的标注格式的annotation

在labelImg的项目文档中如下说明:
在这里插入图片描述标注的生成格式:1、ImageNet数据集使用PASCAL VOC格式
2、YOLO使用的格式
在这里插入图片描述
生成的yolo标注格式:
在这里插入图片描述

VOC格式的.xml文件——>tfrecord

.xml 转csv

在这里插入图片描述生成的.csv文件内容如下:
在这里插入图片描述
其中,xml_to_csv.py程序内容,里面有2项内容需要根据自己的实际情况更改:

import os
import glob
import pandas as pd
import xml.etree.ElementTree as ET

def xml_to_csv(path):
    xml_list = []
    print(path+'1')
    a = glob.glob(path + '/*.xml')
    print(a)
    for xml_file in glob.glob(path + '/*.xml'):
        print(path + '2')
        print(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():
        image_path = r'D:\labelimg\labelImg-master\data-xml\train'  # 第1处修改:标注图像集后生成的.xml文件地址
        xml_df = xml_to_csv(image_path)
        xml_df.to_csv('raccoon_labels.csv', index=None)      # 第2处修改:生成的.csv文件的存放名称。
        print('Successfully converted xml to csv.')      # 生成的.csv文件存放地址为image_path

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

csv转tfrecord

配置所需环境

1、安装tensorflow1.5版本
2、下载slim

pip install --upgrade tf_slim  
  • 1

3、安装依赖库
在这里插入图片描述
slim的许多功能已经移入tf-slim中,所以tf-slim也需要安装。cocoapi是训练coco数据集使用,此处不需要安装。
4、下载models,下载文档文件名字为:models-master.zip,更改为models。此处将models放入D盘中。
在这里插入图片描述

5、Protobuf编译
Tensorflow Object Detection API 使用Protobuf配置模型和训练参数。

可以用protoc --version查看自己安装的protoc版本,如果没有,则需要根据以下步骤进行安装:
在这里插入图片描述

  • protoc的安装

检查protoc,models的安装文档文档建议使用protoc3.0的版本。
在这里插入图片描述打开protoc的下载地址: protocolbuffers /protobuf
在这里插入图片描述在这里插入图片描述找到3.0的版本:
在这里插入图片描述
这里只有win32的release版本:
在这里插入图片描述
下载后复制到与models同名的文件夹下,解压,生成:bin、include。将bin文件夹下的protoc.exe复制到C:\Windows\System32文件夹下。
在这里插入图片描述
cmd打开命令行界面,输入命令protoc,出现如下界面说明安装成功:
在这里插入图片描述

  • 使用protoc对proto文件进行编译

在models/researc/object_detection/protos/目录下有很多以“.proto”结尾的文件,这些文件需要使用protoc程序编译成python文件。

在models/research下运行Windows PowerShell(注意,这里必须是PowerShell,运行cmd会报错),输入如下命令:

Get-ChildItem object_detection/protos/*.proto | Resolve-Path -Relative | %{ protoc $_ --python_out=. }
  • 1

可以检查moels/research/object_detection/protos/文件夹,如果每个proto文件都成了对应的以py为后缀的python源码,就说明编译成功了。
在这里插入图片描述或者
切换目录到 tensorflow/models/research/下,激活tensorflow的运行环境,执行命令:

# From tensorflow/models/research/
protoc object_detection/protos/*.proto --python_out=.
  • 1
  • 2

可以在protos/文件夹下看到每个.proto文件生成了对应的.py文件,说明编译成功。
6、配置环境路径
将 tensorflow/models/research/和slim路径添加到 PYTHONPATH ,切换至tensorflow/models/research/路径下,运行命令:

# From tensorflow/models/research/
export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim
  • 1
  • 2

或者
添加一个名为PYTHONPATH的系统环境变量: 右击【我的电脑】-【属性】-【高级系统设置】-【环境变量】-【新建】,变量名写PYTHONPATH,变量值就是要导入模块的路径。
在这里插入图片描述
7、运行models/research下的setup.py

    python setup.py build
    python setup.py install
  • 1
  • 2

8、测试安装
如果上述步骤没有出现问题,激活tensorflow的运行环境,执行以下命令:

# If using Tensorflow 1.X:
python object_detection/builders/model_builder_tf1_test.py
  • 1
  • 2

输出ok,表面安装成功了。
8、用API调用现成的模型直接测试图片和视频
在research文件夹下运行命令:jupyter notebook,接着在jupyter中打开object_detection文件夹,并单击object_detection_tutorial.ipynb运行试例文件。
在这里插入图片描述运行中报错:matplotlib.use() must be called before pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.
在这里插入图片描述查询解决办法关于python中用matplotlib画图遇到的一些问题

将.csv文件转化为tfrecord格式

将.csv文件和图片集拷贝到generate_tfrecord文件夹中。

其中有3处根据实际情况进行修改的地方:

"""
Usage:
  # From tensorflow/models/
  # Create train data:
  python generate_tfrecord.py --csv_input=data/train_labels.csv  --output_path=train.record
  # Create test data:
  python generate_tfrecord.py --csv_input=data/test_labels.csv  --output_path=test.record
"""
# 第1处修改,此处都使用相对地址:
# --csv_input=raccoon_labels.csv
# --output_path=train.record
# --image_dir=data-picture 

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

from PIL import Image
from 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.DEFINE_string('image_dir', '', 'Path to images')
FLAGS = flags.FLAGS


# TO-DO replace this with label map
def class_text_to_int(row_label):
    if row_label == 'dog':      # 第2处修改:需要更换为自己label标签中的名称:dog!!!!
        return 1
    else:
        None


'''如果有多个标签类别则参照如下修改:   # 第2‘处修改:如果有多个标签类别,则仿照修改
def class_text_to_int(row_label):
    if row_label == 'nine':
        return 1
    elif row_label == 'ten':
        return 2
    elif row_label == 'jack':
        return 3
    elif row_label == 'queen':
        return 4
    elif row_label == 'king':
        return 5
    elif row_label == 'ace':
        return 6
    else:
        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):
    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.encode('utf8')
    image_format = b'jpg'                             # 第3处修改:图片类型为.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(_):
    writer = tf.python_io.TFRecordWriter(FLAGS.output_path)
    path = os.path.join(FLAGS.image_dir)
    examples = pd.read_csv(FLAGS.csv_input)
    grouped = split(examples, 'filename')
    for group in grouped:
        tf_example = create_tf_example(group, path)
        writer.write(tf_example.SerializeToString())

    writer.close()
    output_path = os.path.join(os.getcwd(), FLAGS.output_path)
    print('Successfully created the TFRecords: {}'.format(output_path))


if __name__ == '__main__':
    tf.app.run()
  • 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
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122

改为相对路径:
将.csv 和图片集拷贝到generate_tfrecord文件夹中:

cpppython generate_tfrecord.py --csv_input=raccoon_labels.csv --output_path=train.record --image_dir=data-picture
  • 1

在这里插入图片描述在这里插入图片描述
第2中方法:
os.chdir() 方法用于改变当前工作目录到指定的路径。

os.chdir('D:\labelimg\labelImg-master')
  • 1

在这里插入图片描述

python generate_tfrecord.py --csv_input=data-xml\train\raccoon_labels.csv --output_path=data-xml\train\train.record --image_dir=data-picture
  • 1

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/123787
推荐阅读
相关标签
  

闽ICP备14008679号