У меня есть редкий набор данных, в котором некоторые изображения не имеют каких-либо интересных объектов.Я хочу использовать этот набор данных для обнаружения объектов, поэтому мне нужно сгенерировать tfrecords.
Для этих изображений без каких-либо обнаружений в наборе данных по-прежнему есть файлы аннотаций для каждого изображения со всеми записями, заполненными нулями: instance_id= 0, class_id = 0.0, x = 0.0, y = 0.0, w= 0.0, h=0.0
и т. Д..
В моей карте ярлыков идентификаторы ярлыков курса начинаются с 1, поскольку это требование Tensorflow (идентификатор ярлыка 0 зарезервирован для фона Tensorflow)
Теперь я не понимаюкак я буду создавать tfrecords.Когда я пытаюсь использовать все файлы аннотаций, у меня появляется ключевая ошибка для class_id=0
, потому что это не карта меток.
Я не думаю, что при создании tfrecords невозможно использовать какие-либо файлы аннотаций для образца, поэтому мне нужно использовать эту абстрактную аннотацию с нулями.Любые идеи о том, как решить эту проблему?
label_map.pbtxt
item {
id: 1
name: '1.0'
display_name: 'table'
}
item {
id: 2
name: '2.0'
display_name: 'chair'
}
item {
id: 3
name: '3.0'
display_name: 'window'
}
def prepare_example(image_path, annotations, label_map_dict):
"""Converts a dictionary with annotations for an image to tf.Example proto.
Args:
image_path: The complete path to image.
annotations: A dictionary representing the annotation of a single object
that appears in the image.
label_map_dict: A map from string label names to integer ids.
Returns:
example: The converted tf.Example.
"""
with tf.gfile.GFile(image_path, 'rb') as fid:
encoded_png = fid.read()
encoded_png_io = io.BytesIO(encoded_png)
image = pil.open(encoded_png_io)
image = np.asarray(image)
key = hashlib.sha256(encoded_png).hexdigest()
width = int(image.shape[1])
height = int(image.shape[0])
xmin_norm = annotations['x1'] / float(width)
ymin_norm = annotations['y1'] / float(height)
xmax_norm = (annotations['x1'] + annotations['w']) / float(width)
ymax_norm = (annotations['y1'] + annotations['h']) / float(height)
difficult_obj = [0]*len(xmin_norm)
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(image_path.encode('utf8')),
'image/source_id': dataset_util.bytes_feature(image_path.encode('utf8')),
'image/key/sha256': dataset_util.bytes_feature(key.encode('utf8')),
'image/encoded': dataset_util.bytes_feature(encoded_png),
'image/format': dataset_util.bytes_feature('png'.encode('utf8')),
'image/object/bbox/xmin': dataset_util.float_list_feature(xmin_norm),
'image/object/bbox/xmax': dataset_util.float_list_feature(xmax_norm),
'image/object/bbox/ymin': dataset_util.float_list_feature(ymin_norm),
'image/object/bbox/ymax': dataset_util.float_list_feature(ymax_norm),
'image/object/class/label': dataset_util.bytes_list_feature(
[x.encode('utf8') for x in annotations['class_label']]),
'image/object/class/text': dataset_util.int64_list_feature(
[label_map_dict[x] for x in annotations['class_label']]),
'image/object/difficult': dataset_util.int64_list_feature(difficult_obj),
}))
return example
def read_annotation_file(filename):
"""Reads a CN annotation file.
Converts a CN annotation file into a dictionary containing all the
relevant information.
Args:
filename: the path to the annotataion text file.
Returns:
anno: A dictionary with the converted annotation information. See annotation
README file for details on the different fields.
"""
f = open(filename)
reader = csv.reader(f)
next(reader)
content = reader# skip header
content = [x for x in content][0]
anno = {}
anno['inst_id'] = np.array([float(content[0])])
anno['class_label'] = np.array([content[1]])
anno['x1'] = np.array([float(content[2])])
anno['y1'] = np.array([float(content[3])])
anno['w'] = np.array([float(content[4])])
anno['h'] = np.array([float(content[5])])
return anno