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
ใหม่ได้โดยใช้เครื่องมือตกแต่ง 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