سفارشی کردن رمزگشایی ویژگی

tfds.decode API به شما امکان می دهد رمزگشایی ویژگی پیش فرض را لغو کنید. مورد استفاده اصلی این است که برای عملکرد بهتر از رمزگشایی تصویر صرف نظر کنید.

نمونه های استفاده

رد شدن از رمزگشایی تصویر

برای حفظ کنترل کامل روی خط لوله رمزگشایی، یا برای اعمال فیلتر قبل از رمزگشایی تصاویر (برای عملکرد بهتر)، می توانید رمزگشایی تصویر را به طور کامل نادیده بگیرید. این با tfds.features.Image و 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

قبل از اینکه تصاویر رمزگشایی شوند، مجموعه داده را فیلتر کنید/مختلک کنید

مشابه مثال قبلی، می‌توانید از tfds.decode.SkipDecoding() برای درج سفارشی‌سازی خط لوله tf.data قبل از رمزگشایی تصویر استفاده کنید. به این ترتیب تصاویر فیلتر شده رمزگشایی نمی شوند و می توانید از یک بافر بزرگتر استفاده کنید.

# 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)

برش و رمزگشایی همزمان

برای لغو عملیات پیش‌فرض tf.io.decode_image ، می‌توانید یک شی tfds.decode.Decoder جدید با استفاده از decorator tfds.decode.make_decoder() ایجاد کنید.

@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(),
})

که معادل است با:

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']))

سفارشی کردن رمزگشایی ویدیو

ویدیوها Sequence(Image()) هستند. هنگام استفاده از رمزگشاهای سفارشی، آنها بر روی فریم های جداگانه اعمال می شوند. این یعنی رمزگشاهای تصاویر به طور خودکار با ویدیو سازگار هستند.

@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(),
})

که معادل است با:

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

فقط زیر مجموعه ای از ویژگی ها را رمزگشایی کنید.

همچنین می‌توانید با مشخص کردن ویژگی‌هایی که نیاز دارید، از برخی ویژگی‌ها به‌طور کامل صرفنظر کنید. همه ویژگی‌های دیگر نادیده گرفته می‌شوند/نادیده می‌شوند.

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

TFDS زیرمجموعه builder.info.features را انتخاب می کند که با ساختار داده شده tfds.decode.PartialDecoding مطابقت دارد.

در کد بالا، ویژگی‌ها به طور ضمنی استخراج می‌شوند تا با builder.info.features مطابقت داشته باشند. همچنین امکان تعریف صریح ویژگی ها وجود دارد. کد بالا معادل است با:

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=[]),
    }),
})

ابرداده های اصلی (نام برچسب، شکل تصویر،...) به طور خودکار مورد استفاده مجدد قرار می گیرند، بنابراین نیازی به ارائه آنها نیست.

tfds.decode.SkipDecoding می توان از طریق کوارگ PartialDecoding(..., decoders={}) به tfds.decode.PartialDecoding ارسال کرد.