diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 26d33521af10bcc7fd8cea344038eaaeb78d0ef5..0000000000000000000000000000000000000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/.idea/cnnimagequalityenhancement.iml b/.idea/cnnimagequalityenhancement.iml
deleted file mode 100644
index d0876a78d06ac03b5d78c8dcdb95570281c6f1d6..0000000000000000000000000000000000000000
--- a/.idea/cnnimagequalityenhancement.iml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
deleted file mode 100644
index 105ce2da2d6447d11dfe32bfb846c3d5b199fc99..0000000000000000000000000000000000000000
--- a/.idea/inspectionProfiles/profiles_settings.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index 9de286525ff35cf3ec9f171ef56fd1557939f2a0..0000000000000000000000000000000000000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
deleted file mode 100644
index e04712cb7e3155aa7fedcdd4b7b8643910a55e7d..0000000000000000000000000000000000000000
--- a/.idea/modules.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 35eb1ddfbbc029bcab630581847471d7f238ec53..0000000000000000000000000000000000000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
new file mode 100644
index 0000000000000000000000000000000000000000..db9aea405c3f2c9cb404df2f8f63f0daff0ccea6
--- /dev/null
+++ b/.idea/workspace.xml
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ "associatedIndex": 3
+}
+
+
+
+
+
+ {
+ "keyToString": {
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "git-widget-placeholder": "master"
+ }
+}
+
+
+
+
+
+
+
+
+
+
+
+ 1729595203374
+
+
+ 1729595203374
+
+
+
+
\ No newline at end of file
diff --git a/QECNNYUV.py b/QECNNYUV.py
index 734ebbb50991c2b3d87fec51d54d5667fb0e755f..0e09de123ddaea505ba43499689ca98df8e37933 100644
--- a/QECNNYUV.py
+++ b/QECNNYUV.py
@@ -10,6 +10,7 @@ from tensorflow.keras.layers import GlobalMaxPooling2D, MaxPooling2D, AveragePoo
from tensorflow.keras import models, layers
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam, SGD, AdamW
+from tensorflow.keras.callbacks import ModelCheckpoint
#Frame size of training data
w=480
@@ -194,19 +195,55 @@ def TrainImageEnhancementModel (folderRaw,folderComp,folderRawVal,folderCompVal)
XrawVal = XrawVal / 255.0
XcompVal = XcompVal / 255.0
enhancer = EnhancerModel (patchsize,patchsize)
- learning_rate_schedule = tensorflow.keras.optimizers.schedules.ExponentialDecay(
- initial_learning_rate=0.001,
- decay_steps=300,
- decay_rate=0.96)
- optimizer=tensorflow.keras.optimizers.Adam(learning_rate=learning_rate_schedule)
- enhancer.compile(loss='mean_squared_error',optimizer='Adam',metrics=[psnr])
+ #learning_rate_schedule = tensorflow.keras.optimizers.schedules.ExponentialDecay(
+ # initial_learning_rate=0.001,
+ # decay_steps=300,
+ # decay_rate=0.96)
+ #optimizer=tensorflow.keras.optimizers.Adam(learning_rate=learning_rate_schedule)
+ optimizer = tensorflow.keras.optimizers.Adam()
+ print(optimizer.get_config())
+ #{'name': 'adam', 'learning_rate': 0.0010000000474974513, 'weight_decay': None, 'clipnorm': None,
+ # 'global_clipnorm': None, 'clipvalue': None, 'use_ema': False, 'ema_momentum': 0.99,
+ # 'ema_overwrite_frequency': None, 'loss_scale_factor': None, 'gradient_accumulation_steps': None, 'beta_1': 0.9,
+ # 'beta_2': 0.999, 'epsilon': 1e-07, 'amsgrad': False}
+
+ optimizer = tensorflow.keras.optimizers.Adam(
+ learning_rate=0.0001,
+ beta_1=0.9,
+ beta_2=0.999,
+ epsilon=1e-07,
+ weight_decay=None,
+ clipnorm=None,
+ global_clipnorm=None,
+ clipvalue=None,
+ use_ema=False,
+ ema_momentum=0.99,
+ ema_overwrite_frequency=None,
+ loss_scale_factor=None,
+ gradient_accumulation_steps=None,
+ amsgrad=False)
+ print(optimizer.get_config())
+ enhancer.compile(loss='mean_squared_error',optimizer=optimizer,metrics=[psnr])
#enhancer.compile(loss='mean_squared_error', optimizer=optimizer, metrics=[psnr])
- NumEpochs=50
+ # Путь для сохранения модели
+ checkpoint_filepath = 'best_model.weights.h5'
+
+ # Определяем колбэк для сохранения наилучшей модели
+ checkpoint_callback = ModelCheckpoint(
+ filepath=checkpoint_filepath, # куда сохраняем веса
+ monitor='val_loss', # метрика для отслеживания
+ save_best_only=True, # сохраняем только наилучшие веса
+ save_weights_only=True, # сохраняем только веса (не архитектуру)
+ mode='min', # минимизируем значение метрики
+ verbose=1 # вывод информации в процессе обучения
+ )
+
+ NumEpochs=200
#enhancer.load_weights('enhancer.weights.h5')
#with tensorflow.device('gpu'):
- with tensorflow.device('cpu'):
- hist = enhancer.fit(Xcomp, Xraw, epochs=NumEpochs, batch_size=128, verbose=1,validation_data=(XcompVal, XrawVal))
+ hist = enhancer.fit(Xcomp, Xraw, epochs=NumEpochs, batch_size=128, verbose=1,
+ validation_data=(XcompVal, XrawVal),callbacks=[checkpoint_callback])
enhancer.save_weights('enhancer.weights.h5')
return enhancer
@@ -351,11 +388,11 @@ def ShowFramePSNRPerformance (folderyuv,foldercomp,VideoIndex,framesmax,fw,fh):
-TrainMode = 1
+TrainMode = 0
PrepareDataSetFromYUV=1
if TrainMode==1:
- if PrepareDataSetFromYUV==1:
+ if PrepareDataSetFromYUV==0:
FromFolderYuvToFolderPNG (testfolderRawYuv,testfolderRawPng,w,h)
FromFolderYuvToFolderPNG (testfolderCompYuv,testfolderCompPng,w,h)
FromFolderYuvToFolderPNG (trainfolderRawYuv,trainfolderRawPng,w,h)
diff --git a/README.md b/README.md
index f0f22763536f81381ff2c35f65411df1390480f4..b09bac83eef04fd09c165a97f857409c1fb3538c 100644
--- a/README.md
+++ b/README.md
@@ -6,13 +6,14 @@
помещены в файлы BSD500train.yuv и BSD500test.yuv, соответственно.
## Модель
-Модель нейронной сети заимствована из работы [2].
+Модель нейронной сети заимствована из работы [2]. Эффективность работы текущей версии модели можно представить в виде графика ниже:
+
Код протестирован на OC Windows 10 и Ubuntu 24.
## Описание задания к лабораторной работе
Улучшить QECNN модель так, чтобы модифицированная версия:
-- выиграла на 100 изображениях из файла BSD500test.yuv в среднем 0.1 дБ и более по метрике PSNR;
+- выиграла на 100 изображениях из файла BSD500test.yuv в среднем 0.2 дБ и более по метрике PSNR;
Требования к реализации и результаты:
- При обучении должны использоваться только изображения из папки файла BSD500train.yuv
diff --git a/__pycache__/YUV_RGB.cpython-310.pyc b/__pycache__/YUV_RGB.cpython-310.pyc
deleted file mode 100644
index 3c96ecbb73aae47aafce3badf4275b9aca930386..0000000000000000000000000000000000000000
Binary files a/__pycache__/YUV_RGB.cpython-310.pyc and /dev/null differ
diff --git a/__pycache__/YUV_RGB.cpython-312.pyc b/__pycache__/YUV_RGB.cpython-312.pyc
deleted file mode 100644
index 4b9fbe60d83b1f921d04185e2c576ab0dfb433b6..0000000000000000000000000000000000000000
Binary files a/__pycache__/YUV_RGB.cpython-312.pyc and /dev/null differ
diff --git a/doc/Figure_1.png b/doc/Figure_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ee5c7de1c89bd7c4d5e68bd4af1c81c7d54a414
Binary files /dev/null and b/doc/Figure_1.png differ
diff --git a/enhancer.weights.h5 b/enhancer.weights.h5
index fe573a7974116b0e22c2a18d9e735cc3a3a37e6d..58dd991d00a985b284e8f4e6fd9cb706d7bc8248 100644
Binary files a/enhancer.weights.h5 and b/enhancer.weights.h5 differ