Git Product home page Git Product logo

imageaugmentation's Introduction

Generating additional data for unbalanced classes by jittering the original image.

In many deep learning applications, we often come across data sets where one type of data may be seen more than other types. For example, in a traffic sign identification task, there may be more stop signs than speed limit signs. Therefore, in these cases, we need to make sure that the trained model is not biased towards the class that has more data. As an example, consider a data set where there are 5 speed limit signs and 20 stop signs. If the model predicts all signs to be stop signs, its accuracy is 80%. Further, f1-score of such a model is 0.88. Therefore, the model has high tendency to be biased toward the 'stop' sign class. In such cases, additional data can be generated to make the size of data sets similar.

One way to collect more data is to take the picture of the same sign from different angles. This can be done easily in openCV by applying affine transformations, such as rotations, translations and shearing. Affine transformations are transformations where the parallel lines before transformation remain parallel after transformation.

Below I present a function that can be used to generate jittered images. The function takes in the original image, range of angle rotation, range of translation and range of shearing and returns a jittered image. As the function chooses true transformation values from a uniform distribution that is specified by these ranges. I also added brighness augmentation which can be chosen to be on or off by setting the brighness flag in transform_image() function.

Note, the same techniques can be applied using image generator in Keras. However, the transform_image() function provided here will help you play with the parameters and see whats happening under the hood.

#importing some useful packages
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import cv2

import numpy as np
%matplotlib inline
import matplotlib.image as mpimg
def augment_brightness_camera_images(image):
    image1 = cv2.cvtColor(image,cv2.COLOR_RGB2HSV)
    random_bright = .25+np.random.uniform()
    #print(random_bright)
    image1[:,:,2] = image1[:,:,2]*random_bright
    image1 = cv2.cvtColor(image1,cv2.COLOR_HSV2RGB)
    return image1

def transform_image(img,ang_range,shear_range,trans_range,brightness=0):
    '''
    This function transforms images to generate new images.
    The function takes in following arguments,
    1- Image
    2- ang_range: Range of angles for rotation
    3- shear_range: Range of values to apply affine transform to
    4- trans_range: Range of values to apply translations over.

    A Random uniform distribution is used to generate different parameters for transformation

    '''
    # Rotation

    ang_rot = np.random.uniform(ang_range)-ang_range/2
    rows,cols,ch = img.shape    
    Rot_M = cv2.getRotationMatrix2D((cols/2,rows/2),ang_rot,1)

    # Translation
    tr_x = trans_range*np.random.uniform()-trans_range/2
    tr_y = trans_range*np.random.uniform()-trans_range/2
    Trans_M = np.float32([[1,0,tr_x],[0,1,tr_y]])

    # Shear
    pts1 = np.float32([[5,5],[20,5],[5,20]])

    pt1 = 5+shear_range*np.random.uniform()-shear_range/2
    pt2 = 20+shear_range*np.random.uniform()-shear_range/2

    # Brightness


    pts2 = np.float32([[pt1,5],[pt2,pt1],[5,pt2]])

    shear_M = cv2.getAffineTransform(pts1,pts2)

    img = cv2.warpAffine(img,Rot_M,(cols,rows))
    img = cv2.warpAffine(img,Trans_M,(cols,rows))
    img = cv2.warpAffine(img,shear_M,(cols,rows))

    if brightness == 1:
      img = augment_brightness_camera_images(img)

    return img
image = mpimg.imread('stopsign.jpg')
plt.imshow(image);
plt.axis('off');

png

gs1 = gridspec.GridSpec(10, 10)
gs1.update(wspace=0.01, hspace=0.02) # set the spacing between axes.
plt.figure(figsize=(12,12))
for i in range(100):
    ax1 = plt.subplot(gs1[i])
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')
    img = transform_image(image,20,10,5,brightness=1)

    plt.subplot(10,10,i+1)
    plt.imshow(img)
    plt.axis('off')

plt.show()

png

imageaugmentation's People

Contributors

vxy10 avatar

Stargazers

zzz avatar Sothy Chanty avatar  avatar Reza Tanakizadeh avatar fcqfcq avatar bigtomissyue avatar  avatar Darius Roman avatar Yuzhe Zhang avatar Angel avatar  avatar  avatar Qiang Wen avatar Canelo_ avatar  avatar Cecilia Lee avatar Sukonya Phukan avatar zhaozz avatar  avatar  avatar  avatar Randy Ibarra avatar  avatar Susie avatar  avatar Konrad avatar Yuqian Zhou avatar  avatar PesarAmmehZA avatar  avatar Prajwal Singh avatar Brue avatar Ashish_Neo007 avatar  avatar 无 avatar Qing Wang avatar 岑朝君 avatar rowrowyourboat avatar  avatar wangliujun avatar Reachsak Ly avatar Xiaoyu Zhang avatar  avatar  avatar Laygond avatar  avatar Shihao Zhao avatar crz avatar Cevdet CIVIR avatar mingmingdiii avatar Nihhaar_RC avatar  avatar  avatar Xuejian Rong avatar Abhinav Garg avatar  avatar WangBo avatar  avatar Mohammad H. Sattarian avatar Alireza AkhavanPour avatar Auejin Ham avatar Adam Gyarmati avatar Andy Wu avatar  avatar Mariam Mohamed Fawzy avatar Paul Anton avatar SamT avatar XavierFlow avatar JH avatar  avatar Shardul Parab avatar zhuyichen avatar Mohammad Azam Khan avatar  avatar  avatar Unmesh Shukla avatar songit avatar  avatar Yoav Alon avatar Kamil Gurgul avatar  avatar Kuang-Yu Jeng avatar Gurumurthi V Ramanan avatar Jieneng Chen avatar Michał Wilczyński avatar Andrey Gasparyan avatar Ale Solano avatar  avatar Eray Yıldız avatar Akash avatar GuiYang avatar Tian Cao avatar Deepanshu Malhotra avatar  avatar  avatar Ajinkya avatar Vo Tiet Huy avatar  avatar  avatar Nile Frater avatar

Watchers

James Cloos avatar Paul Anton avatar  avatar  avatar  avatar Komuraiah Poodari avatar Argin avatar

imageaugmentation's Issues

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.