Image Decoder examples (CPU)¶
In this notebook we will show usage examples of different flavors of decoders.image for CPU backend.
Common code¶
[1]:
from nvidia.dali import pipeline_def
import nvidia.dali.fn as fn
import nvidia.dali.types as types
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
%matplotlib inline
seed = 1549361629
def show_images(image_batch):
    columns = 4
    rows = (batch_size + 1) // (columns)
    fig = plt.figure(figsize = (32,(32 // columns) * rows))
    gs = gridspec.GridSpec(rows, columns)
    for j in range(rows*columns):
        plt.subplot(gs[j])
        plt.axis("off")
        plt.imshow(image_batch.at(j))
image_dir = "../data/images"
batch_size = 4
Image Decoder (CPU)¶
decoders.image decodes images stored in common formats (including JPEG, JPEG2000, TIFF, PNG)
[2]:
@pipeline_def(seed=seed)
def image_decoder_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir)
    return fn.decoders.image(jpegs)
pipe = image_decoder_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images)
Image Decoder (CPU) with Random Cropping Window Size and Anchor¶
decoders.image_random_crop produces a randomly cropped image. The random cropping window is produced based on a given aspect ratio and area distributions.
[3]:
@pipeline_def(seed=seed)
def image_decoder_random_crop_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir)
    images = fn.decoders.image_random_crop(jpegs,
                                           random_aspect_ratio=[0.8, 1.25],
                                           random_area=[0.1, 1.0],
                                           num_attempts=100)
    return images
pipe = image_decoder_random_crop_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images)
Image Decoder with Fixed Cropping Window Size and External Anchor¶
decoders.image_crop produces a cropped image with a fixed cropping window size and a variable position
[4]:
@pipeline_def(seed=seed)
def image_decoder_crop_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir)
    pos_x = fn.random.uniform(range=(0., 1.))
    pos_y = fn.random.uniform(range=(0., 1.))
    return fn.decoders.image_crop(jpegs, crop=(244, 244), crop_pos_x=pos_x, crop_pos_y=pos_y)
pipe = image_decoder_crop_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images)
Image Decoder (CPU) with External Window Size and Anchor¶
decoders.image_slice produces a cropped image based on additional tensor inputs describing the cropping window size and position
[5]:
import numpy as np
from itertools import product
pos_source = [[0.4, 0.2], [0.3, 0.3]]
size_source = [[0.3, 0.5], [0.3, 0.2]]
def ext_source_generator():
    for pos, size in product(pos_source, size_source):
        yield np.array(pos, dtype=np.float32), np.array(size, dtype=np.float32)
@pipeline_def(seed=seed)
def image_decoder_slice_pipeline():
    crop_pos, crop_size = fn.external_source(source=ext_source_generator, cycle=True,
                                             num_outputs=2, batch=False)
    jpegs, labels = fn.readers.file(file_root=image_dir)
    return fn.decoders.image_slice(jpegs, crop_pos, crop_size)
pipe = image_decoder_slice_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images)
Image Decoder (Hybrid)¶
decoders.image with mixed backend offloads JPEG decoding to the GPU or a dedicated hardware unit, if present.
[6]:
@pipeline_def(seed=seed)
def image_decoder_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir)
    return fn.decoders.image(jpegs, device='mixed')
pipe = image_decoder_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images.as_cpu())
Image Decoder (Hybrid) with Random Cropping Window Size and Anchor¶
decoders.image_random_crop produces a randomly cropped image. The random cropping window is produced based on a given aspect ratio and area distributions.
[7]:
@pipeline_def(seed=seed)
def image_decoder_random_crop_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir)
    images = fn.decoders.image_random_crop(jpegs,
                                           random_aspect_ratio=[0.8, 1.25],
                                           random_area=[0.1, 1.0],
                                           num_attempts=100,
                                           device='mixed')
    return images
pipe = image_decoder_random_crop_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images.as_cpu())
Image Decoder (Hybrid) with Fixed Cropping Window Size and External Anchor¶
decoders.image_crop produces a cropped image with a fixed cropping window size and a variable position
[8]:
@pipeline_def(seed=seed)
def image_decoder_crop_pipeline():
    jpegs, labels = fn.readers.file(file_root=image_dir)
    pos_x = fn.random.uniform(range=(0., 1.))
    pos_y = fn.random.uniform(range=(0., 1.))
    return fn.decoders.image_crop(jpegs, crop=(244, 244), crop_pos_x=pos_x, crop_pos_y=pos_y, device='mixed')
pipe = image_decoder_crop_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images.as_cpu())
Image Decoder (Hybrid) with External Window Size and Anchor¶
decoders.image_slice produces a cropped image based on additional tensor inputs describing the cropping window size and position
[9]:
pos_source = [[0.4, 0.2], [0.3, 0.3]]
size_source = [[0.3, 0.5], [0.3, 0.2]]
def ext_source_generator():
    for pos, size in product(pos_source, size_source):
        yield np.array(pos, dtype=np.float32), np.array(size, dtype=np.float32)
@pipeline_def(seed=seed)
def image_decoder_slice_pipeline():
    crop_pos, crop_size = fn.external_source(source=ext_source_generator, cycle=True,
                                             num_outputs=2, batch=False)
    jpegs, labels = fn.readers.file(file_root=image_dir)
    return fn.decoders.image_slice(jpegs, crop_pos, crop_size, device='mixed')
pipe = image_decoder_slice_pipeline(batch_size=batch_size, num_threads=1, device_id=0)
pipe.build()
images, = pipe.run()
show_images(images.as_cpu())