简体   繁体   English

Tensorflow.image.decode_jpeg 在解码图像 TFRecord 数据时移动值

[英]Tensorflow.image.decode_jpeg shifts values while decoding image TFRecord data

I'm storing a variable numbers of jpg frames per example into TFRecord using SequenceExample :我使用SequenceExample将每个示例的可变数量的 jpg 帧存储到 TFRecord 中:

tf.compat.as_bytes(cv2.imencode(".jpg", frame)[1].tobytes()))

Then I parse these frames back by using:然后我使用以下方法解析这些帧:

images = tf.map_fn(lambda x: tf.image.decode_jpeg(x, channels=3), sequence_features['frames'], dtype=tf.uint8)

But the image values are somehow shifted:但是图像值以某种方式发生了变化:

在此处输入图片说明

When I just parse the raw byte string and then decode it with opencv later, the picture looks normal:当我只是解析原始字节字符串然后稍后用opencv解码时,图片看起来正常:

for img in images:
  img = np.frombuffer(img, dtype=np.uint8)
  img = cv2.imdecode(img, 1)

在此处输入图片说明

More complete example:更完整的例子:

def write(videos, tfr_path):
  with tf.python_io.TFRecordWriter(tfr_path) as writer:
    for video in videos:
      label = get_label()
      frames = []
        for frame in video:
          frames.append(tf.compat.as_bytes(cv2.imencode(".jpg", prec_img)[1].tobytes()))

      feature_list = {
                  'label': (_float_list_feature_list(label),),
                  'frames': _bytes_feature_list(encoded_frames)
              }
      feature_lists = tf.train.FeatureLists(feature_list=feature_list)

      example = tf.train.SequenceExample(feature_lists=feature_lists, context=None)
      writer.write(example.SerializeToString())

def _parse_tfr_data(example, size):
  sequence_features = {
      'label': tf.FixedLenSequenceFeature([size], dtype=tf.float32),
      'frames': tf.FixedLenSequenceFeature([], dtype=tf.string)
  }

  features, sequence_features = tf.parse_single_sequence_example(example, context_features=None,
                                                             sequence_features=sequence_features)

  images = tf.map_fn(lambda x: tf.image.decode_jpeg(x, channels=3), sequence_features['frames'], dtype=tf.uint8)
  label = sequence_features['label']

  return images, label

Thanks to Dan Mašek !感谢Dan Mašek tf.image.decode_jpeg uses RGB cv2.imencode BGR, so swapping it beforehand worked. tf.image.decode_jpeg 使用 RGB cv2.imencode BGR,所以事先交换它是可行的。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM