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 + + + + \ 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]. Эффективность работы текущей версии модели можно представить в виде графика ниже: +![PSNR до и после улучшения для первых 20 изображений](./doc/Figure_1.png) Код протестирован на 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