Image Input Pipeline
There are times when the dataset is huge and we will be unable to load them into NumPy arrays in one go. Also, we want to apply some custom functions to our images randomly and uniquely such that the images with change do not take up disk space. In such cases image input pipelines build using tf.data.Dataset comes in handy.
Python3
features = df[ 'filepath' ] target = df[ 'breed' ] X_train, X_val,\ Y_train, Y_val = train_test_split(features, target, test_size = 0.15 , random_state = 10 ) X_train.shape, X_val.shape |
Output:
((8688,), (1534,))
Below are some of the augmentations which we would like to have in our training data.
Python3
import albumentations as A transforms_train = A.Compose([ A.VerticalFlip(p = 0.2 ), A.HorizontalFlip(p = 0.7 ), A.CoarseDropout(p = 0.5 ), A.RandomGamma(p = 0.5 ), A.RandomBrightnessContrast(p = 1 ) ]) |
Let’s view an example of albumentation by applying it to some sample images.
Python3
img = cv2.imread( 'train/00792e341f3c6eb33663e415d0715370.jpg' ) plt.imshow(img) plt.show() |
Output:
In the above image, we will apply VerticalFlip, HorizontalFlip, CoarseDropout, and CLAHE albumentation technique and check what changes have been done in the image.
Python3
augments = [A.VerticalFlip(p = 1 ), A.HorizontalFlip(p = 1 ), A.CoarseDropout(p = 1 ), A.CLAHE(p = 1 )] plt.subplots(figsize = ( 10 , 10 )) for i, aug in enumerate (augments): plt.subplot( 2 , 2 , i + 1 ) aug_img = aug(image = img)[ 'image' ] plt.imshow(aug_img) plt.show() |
Output:
Below we have implemented some utility functions which will be used while building the input pipeline.
- decode_image – This function will read the image from the path and resize them to be of the same size along with it will normalize as well. Finally, we will convert the labels into one_hot vectors as well.
- process_data – This is the function that will be used to introduce image augmentation to the image.
Python3
def aug_fn(img): aug_data = transforms_train(image = img) aug_img = aug_data[ 'image' ] return aug_img @tf .function def process_data(img, label): aug_img = tf.numpy_function(aug_fn, [img], Tout = tf.float32) return img, label def decode_image(filepath, label = None ): img = tf.io.read_file(filepath) img = tf.image.decode_jpeg(img) img = tf.image.resize(img, [ 128 , 128 ]) img = tf.cast(img, tf.float32) / 255.0 if label = = None : return img return img, tf.one_hot(indices = label, depth = 120 , dtype = tf.float32) |
Now by using the above function we will be implementing our training data input pipeline and the validation data pipeline.
Python3
train_ds = ( tf.data.Dataset .from_tensor_slices((X_train, Y_train)) . map (decode_image, num_parallel_calls = AUTO) . map (partial(process_data), num_parallel_calls = AUTO) .batch( 32 ) .prefetch(AUTO) ) val_ds = ( tf.data.Dataset .from_tensor_slices((X_val, Y_val)) . map (decode_image, num_parallel_calls = AUTO) .batch( 32 ) .prefetch(AUTO) ) |
We must observe here that we do not apply image data augmentation on validation or testing data.
Python3
for img, label in train_ds.take( 1 ): print (img.shape, label.shape) |
Output:
(32, 128, 128, 3) (32, 120)
From here we can confirm that the images have been converted into (128, 128) shapes and batches of 64 images have been formed.
Dog Breed Classification using Transfer Learning
In this article, we will learn how to build a classifier using the Transfer Learning technique which can classify among different breeds of dogs. This project has been developed using collab and the dataset has been taken from Kaggle whose link has been provided as well.
Contact Us