تخصيص فك التشفير

تتيح لك واجهة برمجة التطبيقات tfds.decode تجاوز ميزة فك التشفير الافتراضية. حالة الاستخدام الرئيسية هي تخطي فك تشفير الصورة للحصول على أداء أفضل.

أمثلة الاستخدام

تخطي فك تشفير الصورة

للحفاظ على التحكم الكامل في مسار فك التشفير، أو لتطبيق مرشح قبل فك تشفير الصور (للحصول على أداء أفضل)، يمكنك تخطي فك تشفير الصورة بالكامل. يعمل هذا مع كل من 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 جديد باستخدام مصمم الديكور 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 إلى tfds.decode.PartialDecoding ، من خلال PartialDecoding(..., decoders={}) kwargs.