pip install sewar
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.models import Sequential, Model, load_model
from tensorflow.keras.layers import Dense, Input, Activation
from tensorflow.keras.optimizers.legacy import Adam
from tensorflow.keras.utils import plot_model
from tensorflow.keras import metrics
from tensorflow.keras import losses
from skimage import metrics as mcs
import os
from sewar.full_ref import mse
import pandas as pd
from PIL import Image
import cv2
import numpy as np
from google.colab import drive
drive.mount('/content/drive')
df = pd.read_csv('/content/drive/My Drive/zbiór_danych/dataset_chrominance_tables.csv',index_col=[0])
!unzip "/content/drive/My Drive/zbiór_danych/tiny-imagenet-200-gray.zip"
!unzip "/content/drive/My Drive/zbiór_danych/tiny-imagenet-200-color.zip"
class Dataset:
def __init__(self, quality):
self.quality = quality
self.selected_rows = df.copy()
self.selected_rows.where(self.selected_rows["quality"] == quality, inplace = True)
self.selected_rows = self.selected_rows[~self.selected_rows['quality'].isnull()]
self.train_x = np.empty([int(self.selected_rows.shape[0]*0.9), 64*64])
self.test_x = np.empty([self.selected_rows.shape[0] - int(self.selected_rows.shape[0]*0.9), 64*64])
self.train_y = np.empty([int(self.selected_rows.shape[0]*0.9), 64])
self.test_y = np.empty([self.selected_rows.shape[0] - int(self.selected_rows.shape[0]*0.9), 64])
self.model = Sequential()
self.prepare_x()
self.prepare_y()
def prepare_x(self):
x = np.empty([self.selected_rows.shape[0],64*64])
for i in range(self.selected_rows.shape[0]):
imageA = cv2.imread("tiny-imagenet-200-gray/"+self.selected_rows["name"].iloc[i])
grayA = cv2.cvtColor(imageA, cv2.COLOR_BGR2GRAY)
x[i] = grayA.flatten()
x = x.astype('float32')
x /= 255
self.train_x = x[:int(self.selected_rows.shape[0]*0.9)]
self.test_x = x[int(self.selected_rows.shape[0]*0.9):]
def prepare_y(self):
y = self.selected_rows["quantization table"].to_numpy()
y_array = np.empty([self.selected_rows.shape[0],64])
for i in range(self.selected_rows.shape[0]):
y_array[i] = [float(s) for s in y[i].strip('[]').split(',')]
self.train_y = y_array[:int(self.selected_rows.shape[0]*0.9)]
self.test_y = y_array[int(self.selected_rows.shape[0]*0.9):]
def create_model(self):
self.model.add(Input(shape=(4096,)))
self.model.add(Dense(256))
self.model.add(Activation('relu'))
self.model.add(Dense(64))
self.model.add(Activation('relu'))
self.model.compile(
optimizer=Adam(),
loss='mse',
metrics=[tf.keras.metrics.MeanSquaredError()])
self.model.summary()
# # visualize the model
dot_img_file = '/tmp/model_1.png'
plot_model(self.model, to_file=dot_img_file, show_shapes=True)
def train_model(self):
history = self.model.fit(self.train_x, self.train_y,
batch_size=50,
epochs=100,
verbose=1,
validation_data=(self.test_x, self.test_y))
def load_weights(self, path):
self.model.load_weights(path)
def save_weights(self, path):
self.model.save_weights(path)