代码之家  ›  专栏  ›  技术社区  ›  user2368505

Tensorflow。形象decode\u jpeg在解码图像TFRecord数据时移动值

  •  1
  • user2368505  · 技术社区  · 7 年前

    我使用以下方法将每个示例的可变数量的jpg帧存储到TFRecord中 SequenceExample :

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

    然后,我使用以下方法解析这些帧:

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

    但图像值在某种程度上发生了变化:

    enter image description here

    当我只是解析原始字节字符串,然后稍后使用opencv对其进行解码时,图片看起来很正常:

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

    enter image description here

    更完整的示例:

    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
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   user2368505    7 年前

    幸亏 Dan MaÅ¡ek 哦!tf。形象decode\u jpeg使用RGB cv2。imencode BGR,因此预先交换它是可行的。