In [1]:
from __future__ import print_function
# !pip install tensorflow-gpu
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import matplotlib.pyplot as plt
%matplotlib inline
from keras.models import Sequential
from keras.layers import Dense , Dropout , Lambda, Flatten, Conv2D, MaxPool2D, BatchNormalization, Input,Concatenate
from keras.optimizers import SGD
from sklearn.model_selection import train_test_split
from keras.models import model_from_json
import cv2
import glob
import os
import pickle
#set global parameters
img_rows = 224
img_cols = 224
max_files = -1
read_from_cache = False
In [2]:
!cd ~/sharedfolder/
!git pull
In [3]:
%cd day04/
!ls
In [4]:
Path = '/root/sharedfolder/day04/'
filelist = glob.glob(Path)
filelist.sort()
filelist
Out[4]:
In [5]:
def read_image(path,img_rows,img_cols):
img = cv2.imread(path)
return cv2.resize(img, (img_cols, img_rows))
def read_train(path,img_rows,img_cols,max_files):
# img_rows & img_cols set the size of the image in the output
# max files is the maximal number of images to read from each category
# use max_files=-1 to read all images within the train subfolders
X_train = []
y_train = []
counter = 0
print('Read train images')
files = glob.glob(path+'*.JPG')
for fl in files:
flbase = os.path.basename(fl)
img = read_image(fl, img_rows, img_cols)
X_train.append(np.asarray(img))
# y_train.append(j)
counter+=1
if (counter>=max_files)&(max_files>0):
break
return np.array(X_train)#, np.array(y_train)
def cache_data(data, path):
# this is a helper function used to cache data once it was read and preprocessed
if os.path.isdir(os.path.dirname(path)):
file = open(path, 'wb')
pickle.dump(data, file)
file.close()
else:
print('Directory doesnt exists')
def restore_data(path):
# this is a helper function used to restore cached data
data = dict()
if os.path.isfile(path):
file = open(path, 'rb')
data = pickle.load(file)
return data
def save_model(model,filename):
# this is a helper function used to save a keras NN model architecture and weights
json_string = model.to_json()
if not os.path.isdir('cache'):
os.mkdir('cache')
open(os.path.join('cache', filename+'_architecture.json'), 'w').write(json_string)
model.save_weights(os.path.join('cache', filename+'_model_weights.h5'), overwrite=True)
def read_model(filename):
# this is a helper function used to restore a keras NN model architecture and weights
model = model_from_json(open(os.path.join('cache', filename+'_architecture.json')).read())
model.load_weights(os.path.join('cache', filename+'_model_weights.h5'))
return model
In [6]:
tr_data = read_train(Path,224,224,-1)
y_train = pd.read_csv(Path+'card_files_labels.csv')
from keras.utils.np_utils import to_categorical
ids = y_train.card_file
y_train.drop('card_file',inplace=True,axis=1)
OHE_y_train = (y_train)
In [7]:
tr_data.shape
Out[7]:
In [8]:
y_train
Out[8]:
In [9]:
OHE_y_train.shape
Out[9]:
In [10]:
plt.imshow(tr_data[1])
Out[10]:
In [20]:
model= Sequential()
model.add(Conv2D(16,(2,2),activation='relu',input_shape=(img_rows,img_cols,3)))
model.add(Conv2D(32,(2,2),activation='relu'))
model.add(MaxPool2D(pool_size=(2,2),padding='valid'))
model.add(Conv2D(32,(2,2),activation='relu'))
model.add(Conv2D(16,(2,2),activation='relu'))
model.add(MaxPool2D(pool_size=(2,2),padding='valid'))
model.add(Flatten())
model.add(Dense(57, activation='sigmoid'))
model.summary()
model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])
In [22]:
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ReduceLROnPlateau
rlrop = ReduceLROnPlateau(factor=0.3)
datagen = ImageDataGenerator(
horizontal_flip=True,
rescale=0.5,
shear_range=0.1,
zoom_range=0.4,
rotation_range=360,
width_shift_range=0.1,
height_shift_range=0.1
)
model.fit_generator(datagen.flow(tr_data, OHE_y_train, batch_size=8,save_to_dir='/root/sharedfolder/double/gen_imgs/'),callbacks=[rlrop],
validation_data=datagen.flow(tr_data,OHE_y_train),
steps_per_epoch=50,validation_steps = 10, epochs=4,verbose=2)
Out[22]:
In [16]:
cd /root/sharedfolder/double/single\ images/
In [17]:
ls
In [11]:
single_tr_data = read_train('/root/sharedfolder/double/single images/',80,80,-1)
In [27]:
sngl_imgs = [x.split('/')[-1].split('.')[0] for x in glob.glob('/root/sharedfolder/double/single images/'+'*.JPG')]
# sngl_imgs
In [13]:
np.setdiff1d(np.array(y_train.columns),sngl_imgs)
Out[13]:
In [14]:
plt.imshow(single_tr_data[0])
Out[14]:
In [15]:
from PIL import Image
background = Image.open('/root/sharedfolder/double/gen_imgs/blank.jpg', 'r')
img = Image.open('/root/sharedfolder/double/single images/cat.JPG', 'r')
img_w, img_h = img.size
bg_w, bg_h = background.size
offset = ((bg_w - img_w) / 2, (bg_h - img_h) / 2)
# img = img.rotate(45,resample=Image.NEAREST)
background.paste(img, offset)
background.save('/root/sharedfolder/double/gen_imgs/out.png')
In [17]:
gen = cv2.imread('/root/sharedfolder/double/gen_imgs/out.png')
plt.imshow(gen)
Out[17]:
In [47]:
ls /root/sharedfolder/double/gen_imgs/
In [46]:
rm /root/sharedfolder/double/gen_imgs/*.png
In [48]:
img_rows,img_cols = 80,80
model= Sequential()
model.add(Conv2D(16,(2,2),activation='relu',input_shape=(img_rows,img_cols,3)))
model.add(Flatten())
model.add(Dense(57, activation='sigmoid'))
model.summary()
model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])
singles_datagen = ImageDataGenerator(
horizontal_flip=True,
rotation_range=360,
width_shift_range=0.1,
height_shift_range=0.1
)
model.fit_generator(singles_datagen.flow(single_tr_data[:55], OHE_y_train, batch_size=8,save_to_dir='/root/sharedfolder/double/gen_imgs/'),callbacks=[rlrop],
validation_data=singles_datagen.flow(single_tr_data[:55],OHE_y_train),
steps_per_epoch=50,validation_steps = 10, epochs=4,verbose=2)
Out[48]:
In [49]:
ls
In [52]:
gen = cv2.imread('/root/sharedfolder/double/gen_imgs/_1_9894.png')
plt.imshow(gen)
Out[52]: