Image Augmentation

Image Augmentation augments datasets (especially small datasets) to train model. The way to do image augmentation is to transform images by different ways. In this notebook we demonstrate how to do image augmentation using Analytics ZOO APIs.


In [1]:
from zoo.common.nncontext import init_nncontext
from zoo.feature.image import *
import cv2
import numpy as np
from IPython.display import Image, display
sc = init_nncontext("Image Augmentation Example")

Create LocalImageSet


In [2]:
# create LocalImageSet from an image
local_image_set = ImageSet.read(os.getenv("ANALYTICS_ZOO_HOME")+"/apps/image-augmentation/image/test.jpg")

# create LocalImageSet from an image folder
local_image_set = ImageSet.read(os.getenv("ANALYTICS_ZOO_HOME")+"/apps/image-augmentation/image/")

# create LocalImageSet from list of images
image = cv2.imread(os.getenv("ANALYTICS_ZOO_HOME")+"/apps/image-augmentation/image/test.jpg")
local_image_set = LocalImageSet([image])

print(local_image_set.get_image())
print('isDistributed: ', local_image_set.is_distributed(), ', isLocal: ', local_image_set.is_local())


creating: createLocalImageSet
[array([[[ 33.,  32.,  34., ...,  79.,  79.,  80.],
        [ 33.,  32.,  34., ...,  78.,  79.,  82.],
        [ 34.,  33.,  34., ...,  78.,  78.,  81.],
        ...,
        [ 82.,  47.,  43., ...,  42.,  42.,  42.],
        [102.,  58.,  46., ...,  43.,  43.,  43.],
        [112.,  66.,  48., ...,  41.,  41.,  42.]],

       [[ 56.,  55.,  57., ..., 102.,  99., 100.],
        [ 56.,  55.,  57., ..., 100.,  99., 102.],
        [ 57.,  56.,  57., ..., 100.,  98., 101.],
        ...,
        [115.,  79.,  74., ...,  75.,  75.,  75.],
        [133.,  91.,  77., ...,  76.,  76.,  76.],
        [144.,  97.,  79., ...,  74.,  74.,  75.]],

       [[ 94.,  93.,  95., ..., 118., 117., 118.],
        [ 94.,  93.,  95., ..., 118., 117., 120.],
        [ 95.,  94.,  95., ..., 118., 116., 119.],
        ...,
        [131.,  98.,  97., ..., 108., 108., 108.],
        [148., 107.,  98., ..., 109., 109., 109.],
        [157., 112., 100., ..., 107., 107., 108.]]], dtype=float32)]
('isDistributed: ', False, ', isLocal: ', True)

Create DistributedImageSet


In [3]:
# create DistributedImageSet from an image
distributed_image_set = ImageSet.read(os.getenv("ANALYTICS_ZOO_HOME")+"/apps/image-augmentation/image/test.jpg", sc, 2)

# create DistributedImageSet from an image folder
distributed_image_set = ImageSet.read(os.getenv("ANALYTICS_ZOO_HOME")+"/apps/image-augmentation/image/", sc, 2)

# create LocalImageSet from image rdd
image = cv2.imread(os.getenv("ANALYTICS_ZOO_HOME")+"/apps/image-augmentation/image/test.jpg")
image_rdd = sc.parallelize([image], 2)
label_rdd = sc.parallelize([np.array([1.0])], 2)
distributed_image_set = DistributedImageSet(image_rdd, label_rdd)

images_rdd = distributed_image_set.get_image()
label_rdd = distributed_image_set.get_label()
print(images_rdd)
print(label_rdd)
print('isDistributed: ', distributed_image_set.is_distributed(), ', isLocal: ', distributed_image_set.is_local())
print('total images:', images_rdd.count())


creating: createDistributedImageSet
PythonRDD[24] at RDD at PythonRDD.scala:48
PythonRDD[25] at RDD at PythonRDD.scala:48
('isDistributed: ', True, ', isLocal: ', False)
('total images:', 1)

Transform images


In [4]:
path = os.getenv("ANALYTICS_ZOO_HOME")+"/apps/image-augmentation/image/test.jpg"
    
def transform_display(transformer, image_set):
    out = transformer(image_set)
    cv2.imwrite('/tmp/tmp.jpg', out.get_image(to_chw=False)[0])
    display(Image(filename='/tmp/tmp.jpg'))

Brightness

Adjust the image brightness


In [5]:
brightness = ImageBrightness(0.0, 32.0)
image_set = ImageSet.read(path)
transform_display(brightness, image_set)


creating: createImageBrightness

Hue

Adjust image hue


In [6]:
transformer = ImageHue(-18.0, 18.0)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageHue

Saturation

Adjust image saturation


In [7]:
transformer = ImageSaturation(10.0, 20.0)
image_set= ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageSaturation

ChannelOrder

Random change the channel of an image


In [8]:
transformer = ImageChannelOrder()
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageChannelOrder

ColorJitter

Random adjust brightness, contrast, hue, saturation


In [9]:
transformer = ImageColorJitter()
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageColorJitter

Resize

Resize the roi(region of interest) according to scale


In [10]:
transformer = ImageResize(300, 300)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageResize

AspectScale

Resize the image, keep the aspect ratio. scale according to the short edge


In [11]:
transformer = ImageAspectScale(200, max_size = 3000)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageAspectScale

RandomAspectScale

Resize the image by randomly choosing a scale


In [12]:
transformer = ImageRandomAspectScale([100, 300], max_size = 3000)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageRandomAspectScale

ChannelNormalize

Image channel normalize


In [13]:
transformer = ImageChannelNormalize(20.0, 30.0, 40.0, 2.0, 3.0, 4.0)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageChannelNormalize

PixelNormalize

Pixel level normalizer, data(Pixel) = data(Pixel) - mean(Pixels)


In [14]:
%%time
print("PixelNormalize takes nearly one and a half minutes. Please wait a moment.")
means = [2.0] * 3 * 500 * 375
transformer = ImagePixelNormalize(means)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


PixelNormalize takes nearly one and a half minutes. Please wait a moment.
creating: createImagePixelNormalize
CPU times: user 51.8 s, sys: 10.6 s, total: 1min 2s
Wall time: 1min 13s

CenterCrop

Crop a cropWidth x cropHeight patch from center of image.


In [15]:
transformer = ImageCenterCrop(200, 200)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageCenterCrop

RandomCrop

Random crop a cropWidth x cropHeight patch from an image.


In [16]:
transformer = ImageRandomCrop(200, 200)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageRandomCrop

FixedCrop

Crop a fixed area of image


In [17]:
transformer = ImageFixedCrop(0.0, 0.0, 200.0, 200.0, False)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageFixedCrop

Filler

Fill part of image with certain pixel value


In [18]:
transformer = ImageFiller(0.0, 0.0, 0.5, 0.5, 255)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageFiller

Expand

Expand image, fill the blank part with the meanR, meanG, meanB


In [19]:
transformer = ImageExpand(means_r=123, means_g=117, means_b=104,
                        max_expand_ratio=2.0)
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageExpand

HFlip

Flip the image horizontally


In [20]:
transformer = ImageHFlip()
image_set = ImageSet.read(path)
transform_display(transformer, image_set)


creating: createImageHFlip

In [ ]: