TensorFlow Object Detection API的FasterCNN能否用归一化浮点数组输入?
问题原因与解决方案
核心问题
TensorFlow Object Detection API的默认输入管线是为图像数据设计的,它会尝试将输入的bytes数据解码为JPEG/PNG等格式的图像,而你直接存入的归一化浮点数组并非标准图像编码格式,因此触发"Unknown image file format"错误。直接用这种方式作为输入不可行,需要调整数据存储和输入管线的逻辑。
可行的解决方案
1. 自定义TFRecord存储与输入解析逻辑
跳过图像编码步骤,直接将浮点数组以数值形式存入TFRecord,在读取时还原为张量:
- 写入TFRecord示例:
def create_tf_example(sensor_data, annotations): # 将2D数组展平为一维列表 flattened_data = sensor_data.flatten().tolist() feature = { # 存储浮点数据 'sensor_data': tf.train.Feature(float_list=tf.train.FloatList(value=flattened_data)), # 记录原始尺寸,用于还原形状 'height': tf.train.Feature(int64_list=tf.train.Int64List(value=[sensor_data.shape[0]])), 'width': tf.train.Feature(int64_list=tf.train.Int64List(value=[sensor_data.shape[1]])), # 添加你的标注字段,比如bbox、类别等 'bboxes': tf.train.Feature(float_list=tf.train.FloatList(value=annotations['bboxes'].flatten())), 'classes': tf.train.Feature(int64_list=tf.train.Int64List(value=annotations['classes'])) } return tf.train.Example(features=tf.train.Features(feature=feature)) - 读取解析示例:
def parse_tf_example(example_proto): feature_desc = { 'sensor_data': tf.io.FixedLenFeature([None], tf.float32), 'height': tf.io.FixedLenFeature([], tf.int64), 'width': tf.io.FixedLenFeature([], tf.int64), 'bboxes': tf.io.FixedLenFeature([None], tf.float32), 'classes': tf.io.FixedLenFeature([None], tf.int64) } parsed = tf.io.parse_single_example(example_proto, feature_desc) # 还原为2D单通道张量(FasterCNN需要通道维度) input_tensor = tf.reshape(parsed['sensor_data'], [parsed['height'], parsed['width'], 1]) # 处理标注数据 bboxes = tf.reshape(parsed['bboxes'], [-1, 4]) classes = tf.cast(parsed['classes'], tf.int32) return input_tensor, {'groundtruth_boxes': bboxes, 'groundtruth_classes': classes}
2. 适配FasterCNN的输入要求
FasterCNN默认期望输入为3通道图像,需要调整输入张量的维度:
- 如果你的传感器数据是单通道2D数组,可通过复制通道扩展为3通道:
input_tensor = tf.image.grayscale_to_rgb(input_tensor) - 修改模型的
pipeline.config文件:- 确保
fixed_shape_resizer的height和width与你的输入尺寸一致; - 检查
feature_extractor的配置,比如使用faster_rcnn_resnet50_feature_extractor时,确认输入通道数适配(扩展为3通道后无需修改,单通道则需自定义特征提取器)。
- 确保
3. 保留精度的图像编码方式(备选)
如果希望沿用API默认的图像解码管线,可将浮点数据编码为支持浮点格式的PNG:
- 写入时编码:
# 将0-1的float32转换为float16(PNG支持float16编码) sensor_data_float16 = tf.cast(sensor_data, tf.float16) # 添加通道维度 data_with_channel = tf.expand_dims(sensor_data_float16, axis=-1) # 编码为PNG字节 encoded_data = tf.image.encode_png(data_with_channel, dtype=tf.float16) # 存入TFRecord的bytes feature feature = { 'encoded_image': tf.train.Feature(bytes_list=tf.train.BytesList(value=[encoded_data.numpy()])), # 其他标注字段 } - 读取时解码:
parsed = tf.io.parse_single_example(example_proto, feature_desc) # 解码为float16张量,再转回float32使用 input_tensor = tf.image.decode_png(parsed['encoded_image'], dtype=tf.float16) input_tensor = tf.cast(input_tensor, tf.float32)
内容的提问来源于stack exchange,提问作者Jinfone Tang
相关产品推荐
相关产品推荐

