Özellik kod çözmeyi özelleştirme

tfds.decode API'si varsayılan özellik çözme geçersiz verir. Ana kullanım durumu, daha iyi performans için görüntü kod çözme işlemini atlamaktır.

kullanım örnekleri

Görüntü kod çözmeyi atlama

Kod çözme ardışık düzeni üzerinde tam kontrol sağlamak veya görüntülerin kodu çözülmeden önce bir filtre uygulamak için (daha iyi performans için), görüntü kod çözme işlemini tamamen atlayabilirsiniz. Bu, her iki ile çalışır tfds.features.Image ve tfds.features.Video .

ds = tfds.load('imagenet2012', split='train', decoders={
    'image': tfds.decode.SkipDecoding(),
})

for example in ds.take(1):
  assert example['image'].dtype == tf.string  # Images are not decoded

Görüntülerin kodu çözülmeden önce veri kümesini filtreleyin/karıştırın

Benzer şekilde önceki örneğe kullanabileceğiniz tfds.decode.SkipDecoding() ek eklemek için tf.data görüntüyü deşifre önce boru hattı özelleştirme. Bu şekilde filtrelenmiş görüntülerin kodu çözülmez ve daha büyük bir karıştırma arabelleği kullanabilirsiniz.

# Load the base dataset without decoding
ds, ds_info = tfds.load(
    'imagenet2012',
    split='train',
    decoders={
        'image': tfds.decode.SkipDecoding(),  # Image won't be decoded here
    },
    as_supervised=True,
    with_info=True,
)
# Apply filter and shuffle
ds = ds.filter(lambda image, label: label != 10)
ds = ds.shuffle(10000)
# Then decode with ds_info.features['image']
ds = ds.map(
    lambda image, label: ds_info.features['image'].decode_example(image), label)

Aynı anda kırpma ve kod çözme

Varsayılan geçersiz kılmak için tf.io.decode_image operasyonu, yeni oluşturabilirsiniz tfds.decode.Decoder kullanarak nesneyi tfds.decode.make_decoder() dekoratör.

@tfds.decode.make_decoder()
def decode_example(serialized_image, feature):
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,
      [crop_y, crop_x, crop_height, crop_width],
      channels=feature.feature.shape[-1],
  )

ds = tfds.load('imagenet2012', split='train', decoders={
    # With video, decoders are applied to individual frames
    'image': decode_example(),
})

Hangisine eşdeğerdir:

def decode_example(serialized_image, feature):
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,
      [crop_y, crop_x, crop_height, crop_width],
      channels=feature.shape[-1],
  )

ds, ds_info = tfds.load(
    'imagenet2012',
    split='train',
    with_info=True,
    decoders={
        'image': tfds.decode.SkipDecoding(),  # Skip frame decoding
    },
)
ds = ds.map(functools.partial(decode_example, feature=ds_info.features['image']))

Video kod çözmeyi özelleştirme

Video vardır Sequence(Image()) . Özel kod çözücüler uygulanırken bunlar tek tek çerçevelere uygulanacaktır. Bu, görüntüler için kod çözücülerin otomatik olarak videoyla uyumlu olduğu anlamına gelir.

@tfds.decode.make_decoder()
def decode_example(serialized_image, feature):
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,
      [crop_y, crop_x, crop_height, crop_width],
      channels=feature.feature.shape[-1],
  )

ds = tfds.load('ucf101', split='train', decoders={
    # With video, decoders are applied to individual frames
    'video': decode_example(),
})

Hangisine eşdeğerdir:

def decode_frame(serialized_image):
  """Decodes a single frame."""
  crop_y, crop_x, crop_height, crop_width = 10, 10, 64, 64
  return tf.image.decode_and_crop_jpeg(
      serialized_image,
      [crop_y, crop_x, crop_height, crop_width],
      channels=ds_info.features['video'].shape[-1],
  )


def decode_video(example):
  """Decodes all individual frames of the video."""
  video = example['video']
  video = tf.map_fn(
      decode_frame,
      video,
      dtype=ds_info.features['video'].dtype,
      parallel_iterations=10,
  )
  example['video'] = video
  return example


ds, ds_info = tfds.load('ucf101', split='train', with_info=True, decoders={
    'video': tfds.decode.SkipDecoding(),  # Skip frame decoding
})
ds = ds.map(decode_video)  # Decode the video

Yalnızca özelliklerin bir alt kümesinin kodunu çözün.

Yalnızca ihtiyacınız olan özellikleri belirterek bazı özellikleri tamamen atlamak da mümkündür. Diğer tüm özellikler yoksayılacak/atlanacak.

builder = tfds.builder('my_dataset')
builder.as_dataset(split='train', decoders=tfds.decode.PartialDecoding({
    'image': True,
    'metadata': {'num_objects', 'scene_name'},
    'objects': {'label'},
})

TFDS alt kümesini seçecek builder.info.features verilen eşleşen tfds.decode.PartialDecoding yapısı.

Yukarıdaki kodda, özellikli örtük maç için ayıklanır builder.info.features . Özellikleri açıkça tanımlamak da mümkündür. Yukarıdaki kod şuna eşdeğerdir:

builder = tfds.builder('my_dataset')
builder.as_dataset(split='train', decoders=tfds.decode.PartialDecoding({
    'image': tfds.features.Image(),
    'metadata': {
        'num_objects': tf.int64,
        'scene_name': tfds.features.Text(),
    },
    'objects': tfds.features.Sequence({
        'label': tfds.features.ClassLabel(names=[]),
    }),
})

Orijinal meta veriler (etiket adları, görüntü şekli,...) otomatik olarak yeniden kullanılır, dolayısıyla bunları sağlamanız gerekmez.

tfds.decode.SkipDecoding geçirilebilir tfds.decode.PartialDecoding aracılığıyla, PartialDecoding(..., decoders={}) kwargs.