|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| """Utility functions for creating TFRecord data sets."""
|
|
|
| from __future__ import absolute_import
|
| from __future__ import division
|
| from __future__ import print_function
|
|
|
| import tensorflow.compat.v1 as tf
|
|
|
|
|
| def int64_feature(value):
|
| return tf.train.Feature(int64_list=tf.train.Int64List(value=[value]))
|
|
|
|
|
| def int64_list_feature(value):
|
| return tf.train.Feature(int64_list=tf.train.Int64List(value=value))
|
|
|
|
|
| def bytes_feature(value):
|
| return tf.train.Feature(bytes_list=tf.train.BytesList(value=[value]))
|
|
|
|
|
| def bytes_list_feature(value):
|
| return tf.train.Feature(bytes_list=tf.train.BytesList(value=value))
|
|
|
|
|
| def float_feature(value):
|
| return tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
|
|
|
|
|
| def float_list_feature(value):
|
| return tf.train.Feature(float_list=tf.train.FloatList(value=value))
|
|
|
|
|
| def read_examples_list(path):
|
| """Read list of training or validation examples.
|
|
|
| The file is assumed to contain a single example per line where the first
|
| token in the line is an identifier that allows us to find the image and
|
| annotation xml for that example.
|
|
|
| For example, the line:
|
| xyz 3
|
| would allow us to find files xyz.jpg and xyz.xml (the 3 would be ignored).
|
|
|
| Args:
|
| path: absolute path to examples list file.
|
|
|
| Returns:
|
| list of example identifiers (strings).
|
| """
|
| with tf.gfile.GFile(path) as fid:
|
| lines = fid.readlines()
|
| return [line.strip().split(' ')[0] for line in lines]
|
|
|
|
|
| def recursive_parse_xml_to_dict(xml):
|
| """Recursively parses XML contents to python dict.
|
|
|
| We assume that `object` tags are the only ones that can appear
|
| multiple times at the same level of a tree.
|
|
|
| Args:
|
| xml: xml tree obtained by parsing XML file contents using lxml.etree
|
|
|
| Returns:
|
| Python dictionary holding XML contents.
|
| """
|
| if not xml:
|
| return {xml.tag: xml.text}
|
| result = {}
|
| for child in xml:
|
| child_result = recursive_parse_xml_to_dict(child)
|
| if child.tag != 'object':
|
| result[child.tag] = child_result[child.tag]
|
| else:
|
| if child.tag not in result:
|
| result[child.tag] = []
|
| result[child.tag].append(child_result[child.tag])
|
| return {xml.tag: result}
|
|
|