|
import os |
|
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3' |
|
import tensorflow as tf |
|
from matplotlib import pyplot as plt |
|
from tensorflow.keras import layers as ksl |
|
import numpy as np |
|
import pandas as pd |
|
|
|
class Model(): |
|
def __init__(self,loadWeights = False,loadModel = False,weightAddr = None,modelAddr=None): |
|
if loadModel: |
|
self.net = self.loadModel(modelAddr) |
|
elif not(loadModel and loadWeights): |
|
self.net = self.buildModel() |
|
elif loadWeights: |
|
self.net = self.loadWeights() |
|
self.loadWeights(weightAddr) |
|
else : |
|
print('[Error] incompatible inputs !') |
|
|
|
self.const = None |
|
|
|
|
|
|
|
|
|
def myLoss(y_true,y_pred): |
|
return tf.reduce_mean(tf.square(y_true - y_pred),axis = -1) |
|
def compile(self,loss,metrics,optim): |
|
self.net.compile(loss = loss,optimizer = optim ,metrics = metrics) |
|
|
|
def train(self,e,b,Data,label): |
|
hist = self.net.fit(Data,label,epochs = e,batch_size = b) |
|
return hist |
|
|
|
def buildModel(self): |
|
inpIm1 = ksl.Input((128,128,3),name = 'image1Input') |
|
inpIm2 = ksl.Input((128,128,3),name = 'image2Input') |
|
inpIm3 = ksl.Input((128,128,3),name = 'image3Input') |
|
inpIm4 = ksl.Input((128,128,3),name = 'image4Input') |
|
|
|
x = ksl.Conv2D(32,kernel_size=3,strides=1,padding='same')(inpIm1) |
|
x = ksl.Lambda(self.relu)(x) |
|
x = ksl.MaxPool2D([2,2])(x) |
|
x = ksl.Conv2D(64,kernel_size=3,padding='same')(x) |
|
x = ksl.Lambda(self.relu)(x) |
|
x = ksl.MaxPool2D([2,2])(x) |
|
x = ksl.Conv2D(128,kernel_size=3,padding='same')(x) |
|
x = ksl.Lambda(self.relu)(x) |
|
x = ksl.MaxPool2D([2,2])(x) |
|
|
|
w = ksl.Conv2D(32,kernel_size=3,strides=1,padding='same')(inpIm2) |
|
w = ksl.Lambda(self.relu)(w) |
|
w = ksl.MaxPool2D([2,2])(w) |
|
w = ksl.Conv2D(64,kernel_size=3,padding='same')(w) |
|
w = ksl.Lambda(self.relu)(w) |
|
w = ksl.MaxPool2D([2,2])(w) |
|
w = ksl.Conv2D(128,kernel_size=3,padding='same')(w) |
|
w = ksl.Lambda(self.relu)(w) |
|
w = ksl.MaxPool2D([2,2])(w) |
|
|
|
y = ksl.Conv2D(32,kernel_size=3,strides=1,padding='same')(inpIm3) |
|
y=ksl.Lambda(self.relu)(y) |
|
y = ksl.MaxPool2D([2,2])(y) |
|
y = ksl.Conv2D(64,kernel_size=3,padding='same')(y) |
|
y = ksl.Lambda(self.relu)(y) |
|
y = ksl.MaxPool2D([2,2])(y) |
|
y = ksl.Conv2D(128,kernel_size=3,padding='same')(y) |
|
y = ksl.Lambda(self.relu)(y) |
|
y = ksl.MaxPool2D([2,2])(y) |
|
|
|
z = ksl.Conv2D(32,kernel_size=3,strides=1,padding='same')(inpIm4) |
|
z = ksl.MaxPool2D([2,2])(z) |
|
z = ksl.Conv2D(64,kernel_size=3,padding='same')(z) |
|
z = ksl.MaxPool2D([2,2])(z) |
|
z = ksl.Conv2D(64,kernel_size=3,padding='same')(z) |
|
z = ksl.MaxPool2D([2,2])(z) |
|
|
|
|
|
inpTxtFeatures = ksl.Input((4,),name = 'numFeatureInput') |
|
t = ksl.Dense(1024,'relu')(inpTxtFeatures) |
|
t = ksl.Dense(512,'relu')(t) |
|
t = ksl.Dense(256,'relu')(t) |
|
t = ksl.Reshape((16,16,1))(t) |
|
|
|
|
|
|
|
concatInput = ksl.concatenate([w,x,y,z,t],axis=3) |
|
out = ksl.Conv2D(128,kernel_size=3,padding='same')(concatInput) |
|
out = ksl.MaxPool2D([2,2])(out) |
|
out = ksl.Conv2D(256,kernel_size=3,padding='same')(out) |
|
out = ksl.MaxPool2D([2,2])(out) |
|
out = ksl.Flatten()(out) |
|
out = ksl.Dense(128,'relu')(out) |
|
out = ksl.Dense(64,'relu')(out) |
|
out = ksl.Dense(1,'linear')(out) |
|
net = tf.keras.Model(inputs = [inpIm1,inpIm2,inpIm3,inpIm4,inpTxtFeatures],outputs = out) |
|
return net |
|
def predict(self,inputList,const): |
|
numericFeatur = inputList[4:] |
|
numericFeatur = pd.DataFrame(numericFeatur) |
|
max = numericFeatur.max() |
|
numericFeatur = numericFeatur/max |
|
images = inputList[:4] |
|
images = [self.preProcess(im) for im in images] |
|
pred = self.net.predict(np.concatenate((images,numericFeatur.to_numpy()))) |
|
return pred*const |
|
|
|
def saveModel(self): |
|
self.net.save('./Models/model.h5') |
|
self.net.save_weights('./Models/modelWeights.h5') |
|
def loadWeights(self,weightAddr): |
|
net = self.buildModel() |
|
net.load_weghts(weightAddr) |
|
return net |
|
@staticmethod |
|
def loadModel(modelAddr): |
|
net = tf.kerasl.models.load_model(modelAddr) |
|
return net |
|
|
|
|
|
return image |
|
@staticmethod |
|
def relu(x): |
|
return tf.maximum( 0.0,x) |
|
|
|
@staticmethod |
|
def plotHistory(Hist): |
|
|
|
plt.plot(Hist.history['loss']) |
|
plt.title('model loss') |
|
plt.show() |
|
plt.plot(Hist.history['mse']) |
|
plt.title('model mse') |
|
plt.show() |
|
|