Commit 8ddfb00b authored by Evgeny Belyaev's avatar Evgeny Belyaev

обновил задание и модель

parent 2bc42a7d
# Default ignored files
/shelf/
/workspace.xml
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.10" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/cnnimagequalityenhancement.iml" filepath="$PROJECT_DIR$/.idea/cnnimagequalityenhancement.iml" />
</modules>
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="69b68ebe-acf9-4b4a-b39a-652cf5e07f42" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/.gitignore" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/cnnimagequalityenhancement.iml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/modules.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/vcs.xml" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/QECNNYUV.py" beforeDir="false" afterPath="$PROJECT_DIR$/QECNNYUV.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/enhancer.weights.h5" beforeDir="false" afterPath="$PROJECT_DIR$/enhancer.weights.h5" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 3
}</component>
<component name="ProjectId" id="2nn3qSxVcbiS8hEBJ1pE6lgUbnV" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
&quot;git-widget-placeholder&quot;: &quot;master&quot;
}
}</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-python-sdk-babbdf50b680-746f403e7f0c-com.jetbrains.pycharm.community.sharedIndexes.bundled-PC-241.15989.155" />
</set>
</attachedChunks>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="69b68ebe-acf9-4b4a-b39a-652cf5e07f42" name="Changes" comment="" />
<created>1729595203374</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1729595203374</updated>
</task>
<servers />
</component>
</project>
\ No newline at end of file
...@@ -10,6 +10,7 @@ from tensorflow.keras.layers import GlobalMaxPooling2D, MaxPooling2D, AveragePoo ...@@ -10,6 +10,7 @@ from tensorflow.keras.layers import GlobalMaxPooling2D, MaxPooling2D, AveragePoo
from tensorflow.keras import models, layers from tensorflow.keras import models, layers
from tensorflow.keras.models import Model from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam, SGD, AdamW from tensorflow.keras.optimizers import Adam, SGD, AdamW
from tensorflow.keras.callbacks import ModelCheckpoint
#Frame size of training data #Frame size of training data
w=480 w=480
...@@ -194,19 +195,55 @@ def TrainImageEnhancementModel (folderRaw,folderComp,folderRawVal,folderCompVal) ...@@ -194,19 +195,55 @@ def TrainImageEnhancementModel (folderRaw,folderComp,folderRawVal,folderCompVal)
XrawVal = XrawVal / 255.0 XrawVal = XrawVal / 255.0
XcompVal = XcompVal / 255.0 XcompVal = XcompVal / 255.0
enhancer = EnhancerModel (patchsize,patchsize) enhancer = EnhancerModel (patchsize,patchsize)
learning_rate_schedule = tensorflow.keras.optimizers.schedules.ExponentialDecay( #learning_rate_schedule = tensorflow.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate=0.001, # initial_learning_rate=0.001,
decay_steps=300, # decay_steps=300,
decay_rate=0.96) # decay_rate=0.96)
optimizer=tensorflow.keras.optimizers.Adam(learning_rate=learning_rate_schedule) #optimizer=tensorflow.keras.optimizers.Adam(learning_rate=learning_rate_schedule)
enhancer.compile(loss='mean_squared_error',optimizer='Adam',metrics=[psnr]) 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]) #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') #enhancer.load_weights('enhancer.weights.h5')
#with tensorflow.device('gpu'): #with tensorflow.device('gpu'):
with tensorflow.device('cpu'): hist = enhancer.fit(Xcomp, Xraw, epochs=NumEpochs, batch_size=128, verbose=1,
hist = enhancer.fit(Xcomp, Xraw, epochs=NumEpochs, batch_size=128, verbose=1,validation_data=(XcompVal, XrawVal)) validation_data=(XcompVal, XrawVal),callbacks=[checkpoint_callback])
enhancer.save_weights('enhancer.weights.h5') enhancer.save_weights('enhancer.weights.h5')
return enhancer return enhancer
...@@ -351,11 +388,11 @@ def ShowFramePSNRPerformance (folderyuv,foldercomp,VideoIndex,framesmax,fw,fh): ...@@ -351,11 +388,11 @@ def ShowFramePSNRPerformance (folderyuv,foldercomp,VideoIndex,framesmax,fw,fh):
TrainMode = 1 TrainMode = 0
PrepareDataSetFromYUV=1 PrepareDataSetFromYUV=1
if TrainMode==1: if TrainMode==1:
if PrepareDataSetFromYUV==1: if PrepareDataSetFromYUV==0:
FromFolderYuvToFolderPNG (testfolderRawYuv,testfolderRawPng,w,h) FromFolderYuvToFolderPNG (testfolderRawYuv,testfolderRawPng,w,h)
FromFolderYuvToFolderPNG (testfolderCompYuv,testfolderCompPng,w,h) FromFolderYuvToFolderPNG (testfolderCompYuv,testfolderCompPng,w,h)
FromFolderYuvToFolderPNG (trainfolderRawYuv,trainfolderRawPng,w,h) FromFolderYuvToFolderPNG (trainfolderRawYuv,trainfolderRawPng,w,h)
......
...@@ -6,13 +6,14 @@ ...@@ -6,13 +6,14 @@
помещены в файлы BSD500train.yuv и BSD500test.yuv, соответственно. помещены в файлы BSD500train.yuv и BSD500test.yuv, соответственно.
## Модель ## Модель
Модель нейронной сети заимствована из работы [2]. Модель нейронной сети заимствована из работы [2]. Эффективность работы текущей версии модели можно представить в виде графика ниже:
![PSNR до и после улучшения для первых 20 изображений](./doc/Figure_1.png)
Код протестирован на OC Windows 10 и Ubuntu 24. Код протестирован на OC Windows 10 и Ubuntu 24.
## Описание задания к лабораторной работе ## Описание задания к лабораторной работе
Улучшить QECNN модель так, чтобы модифицированная версия: Улучшить QECNN модель так, чтобы модифицированная версия:
- выиграла на 100 изображениях из файла BSD500test.yuv в среднем 0.1 дБ и более по метрике PSNR; - выиграла на 100 изображениях из файла BSD500test.yuv в среднем 0.2 дБ и более по метрике PSNR;
Требования к реализации и результаты: Требования к реализации и результаты:
- При обучении должны использоваться только изображения из папки файла BSD500train.yuv - При обучении должны использоваться только изображения из папки файла BSD500train.yuv
......
No preview for this file type
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment