我有一个灰度图像数据集,我想使用sdd-mobilenet检查点来训练我的对象检测。 将灰度图像转换为RGB的正确方法是什么,我可以将我的数据集转换为tfrecord? 这是我使用的代码(请注意,评论的部分对我不起作用)
with tf.gfile.GFile(os.path.join(path, '{}'.format(group.filename)), 'rb') as fid:
encoded_jpg = fid.read()
# rgb_image = tf.image.grayscale_to_rgb(
# tf.image.encode_jpeg(encoded_jpg),
# name=None
# )
encoded_jpg_io = io.BytesIO(encoded_jpg)
encoded_jpg_io = tf.stack([encoded_jpg_io, encoded_jpg_io, encoded_jpg_io], axis=-1)
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/channels': dataset_util.int64_feature(),
'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
答案 0 :(得分:1)
我尝试了不同的方法,最终得到了答案(不仅转换为tfrecords,还包括训练和对象检测本身)。
如果数据集仅包含灰度图像,则Tensorflow对象检测仅需要将通道数定义为3.因此,唯一必要的更改是将'image/channels': dataset_util.int64_feature(3)
添加到内部的列车功能代码。绝对不需要使用cv2.COLOR_GRAY2BGR或tf.image.grayscale_to_rgb将灰度转换为RGB 。
使用这些方法转换图像最终会出现以下错误:
outofrangeerror FIFOQueue '_3_prefetch_queue' is closed and has insufficient elements (requested 1, current size 0)
要么
培训期间OP_REQUIRES failed at iterator_ops.cc:891 : Invalid argument: assertion failed: [Unable to decode bytes as JPEG, PNG, GIF, or BMP]
。
为了避免任何额外的努力,确保您使用的是jpg图像。如果您有其他格式,如bmp,请将它们转换为jpg。请注意,更改文件扩展名不是转换。您必须使用您喜欢的任何工具进行转换。
答案 1 :(得分:0)
为什么'图片/频道':dataset_util.int64_feature(3)工作而不是
'图片/频道':dataset_util.int64_feature(1),因为您传递的是带有1个颜色通道的灰度图像?