1、XML
コンテンツ情報を紹介する例を想像するXMLファイル形式を取得した画像に注釈を付けるためのツールをlabelmg使用します。
xmlファイルを取得するために、上記画像をタグ付けした後:
2つの部分に、そのコンテンツの分類:
- ブラックボックス、イメージ、名前、場所、寸法などを含む画像の第1の積分部と
- 第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()