データセットのフォーマット

1、XML

コンテンツ情報を紹介する例を想像するXMLファイル形式を取得した画像に注釈を付けるためのツールをlabelmg使用します。

xmlファイルを取得するために、上記画像をタグ付けした後:

2つの部分に、そのコンテンツの分類:

  1. ブラックボックス、イメージ、名前、場所、寸法などを含む画像の第1の積分部と
  2. 第2のブラックボックスのラベル情報ブロック、各ブロックは等ターゲットカテゴリ名を含む赤いオブジェクトタグ(標識されたボックスで示される)情報、位置情報、あります

XML内の情報は、このようなラベルの先頭に注釈としてラベル、間の階層関係は、他のタグは、単語ラベルであるxmlファイルフォルダが存在しているで、1つのオブジェクトです。

2、XML - > CSV

文字(カンマ)値を分離しました。

各オブジェクトタグは、コールアウトボックスは、CSVファイルのデータを生成する日のデータを属性であろう表す:左上隅のxは、画像ファイル名、幅、高さ、およびタイプ、ボックス、ボックスの左上隅のY、右上のボックスの座標角x、フレームyの右上隅。

XMLのcsv転送コードは次のとおりです。

 - * -コーディング:UTF-8 - * - 
""」
CSVファイルへのXMLファイルのフォルダレコードのすべての情報
「」」

輸入OS  
 輸入グロブ  
 輸入PDのようパンダ  
 輸入ETとしてxml.etree.ElementTree  

  
DEF xml_to_csv(パス):           #1 パス:注釈フォルダパス 
    xml_list = []  
     のため xml_file  glob.glob、及び(パス+ ' /*.xml '):  XMLファイルディレクトリ内の各パスの 
        ツリー= ET.parse (xml_file)  に対応して得られたXMLのパースツリー 
        tree.getroot =()のルートのショートカットを   #1 のgetルートタグ注釈
        #の印刷(ルート)   
        を印刷(root.find(ファイル名)の.text)  
         のためのメンバー root.findall(オブジェクト):  各オブジェクトタグ用(ボックス) 
            値=(root.find(ファイル名)の.text、   #1 ルート・ラベルの検索ファイル名のタグ(画像ファイル名)、テキスト情報入手する 
                     INT(root.find(サイズ)[ 0]の.text)、  ルート・タグ・ラベルのサイズを見て、0番目の単語ラベル(テキスト情報の幅)はintに変換され得て 
                     、INT(root.find(' サイズ')[1]の.text)、   ルート・タグ・ラベルサイズとラベルを見て、テキスト情報のDI1単語(高さ)を取得int型変換 
                     メンバーを[0]の.text、  オブジェクトタグワード0タグ名テキスト情報取得 
                     INT(メンバ[4 ] [0]の.text)、  は、第4のサブタブbndboxオブジェクト得bndbox 0番目の単語ラベル(Xminと)テキスト情報をintに変換され得ます
                     INT(フロート(会員[4] [1]の.text))、  情報はintに変換されたテキストの最初の単語ラベル(Yminの)bndbox得られた第4のサブタブbndboxオブジェクト得る 
                     INT(メンバー〔を。4] [2]の.text)、  は、テキスト情報の第二ワードラベル(Xmaxの)bndbox得られた第4のサブタブbndboxオブジェクトはintに変換し得る 
                     INT(メンバー〔を。4] [3]の.text)  得られたオブジェクト情報はintに変換され、第三のワードbndboxタグ(Ymaxの)テキストで得bndbox第4のサブタブ

            xml_list.append(値)  
    COLUMN_NAME = [ ' ファイル名'' '' 高さ'' クラス'' XMIN '' YMIN '' XMAX '' YMAX ' ]  
    xml_df = pd.DataFrame(xml_list、列= COLUMN_NAME)  
     リターンxml_df  
  
DEF )(主:  
     のためのディレクトリ [ 列車テスト検証 ]:  訓練およびテストフォルダに対応する
        列車内/画像に対応し、ルートフォルダをテストスクリプトが配置されるべきです低いVOCフォルダ、および注釈同じレベルである、または機能を変更するためにはGETCWD 
        = os.path.join(os.getcwd()、xml_pathを' 注釈/ {} ' .format(ディレクトリ))   
        xml_df = xml_to_csv(xml_path)  
        xml_df.to_csv(' データ/ whsyxt labels.csv _ {_} ' .format(ディレクトリ)、インデックス=なし)   #1 XMLは、対応する記憶されたCSV形式に変換
        印刷' 正常XMLをCSVに変換されます。' 

メイン()

次の図に対応するXMLファイル:

最後に2つのファイルを取得します:

3、XMLコンバートtfrecord

 それぞれの絵には、バッチは、XML形式のtfrecordにファイルを変換し、xmlファイルを生成します。

 

4、CSVはtfrecord変換しました

情報の各ラインにcsvファイルへの書き込み、複数のXMLファイルはXMLファイルです、そして非常に便利な高速であることができ、直接tfrecord曲のcsvファイル形式にこれを変換します。

画像とタグの値が一緒ではありませんので、あなたは、全体の画像情報とCSVファイルをマージしたいので、トレーニングのための現地tfrecordに書かれたフォーマットに統合。

代码来自tensorflow / object_dection /モデル・マスター/研究/ object_detection / test_generate_tfrecord.py:

「」」
使用法:
  tensorflowから#/モデル/
  #列データを作成します。
  パイソンgenerate_tfrecord.py --csv_input =データ/ train_labels.csv --output_path =データ/ train.record

  #テストデータを作成します。
  python generate_tfrecord.py --csv_input=data/test_labels.csv  --output_path=data/test.record
"""
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', 'data/test_labels.csv', 'Path to the CSV input')
flags.DEFINE_string('output_path', 'data/test.record', 'Path to output TFRecord')
FLAGS = flags.FLAGS


# TO-DO replace this with label map
# 修改成你自己的标签
def class_text_to_int(row_label):
    if row_label == 'face':
        return 0
    elif row_label == 'cat':
        return 1
    #............
        

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)]

#读取每张图片,得到每张图片的信息,将每张图片信息和图片里的object标注框信息合并在一起
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'
    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']))
    #图像所有信息encoded_jpg和object信息整合一起
    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(os.getcwd(), 'images/test')    #一个csv文件最后生成一个tfrecord文件
    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()

同理还有train_generate_tfrecord.py:

"""
Usage:
  # From tensorflow/models/
  # Create train data:
  python generate_tfrecord.py --csv_input=data/train_labels.csv  --output_path=data/train.record

  # Create test data:
  python generate_tfrecord.py --csv_input=data/test_labels.csv  --output_path=data/test.record
"""
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', 'data/train_labels.csv', 'Path to the CSV input')
flags.DEFINE_string('output_path', 'data/train.record', 'Path to output TFRecord')
FLAGS = flags.FLAGS


# TO-DO replace this with label map
def class_text_to_int(row_label):
    if row_label == 'face':
        return 1
    else:
        0
        

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'
    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(os.getcwd(), 'images/train')
    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()

 

おすすめ

転載: www.cnblogs.com/pacino12134/p/11291398.html