Commit 4ffb854f authored by Evgeny Belyaev's avatar Evgeny Belyaev

Обновлённая версия задания. Улучшен базовый кодек и вывод на экран, уточнено задание.

parent f008ba1a
This diff is collapsed.
from setuptools import setup, Extension
import os
import sys
import pybind11
#functions_module = Extension(
# name='EntropyCodec',
# sources=['wrapper.cpp'],
# include_dirs=[os.path.join(os.getenv('PYTHON_DIR'), 'include'),
# os.path.join(pybind11.__path__[0], 'include')]
#)
functions_module = Extension(
name='EntropyCodec',
sources=['wrapper.cpp'],
include_dirs=[os.path.join('/home/eabelyaev/miniconda3/bin/', 'include'),
os.path.join(pybind11.__path__[0], 'include')]
)
#print(pybind11.__path__[0])
#print(os.getenv('PYTHONPATH'))
#print(sys.path)
setup(ext_modules=[functions_module], options={"build_ext": {"build_lib": ".."}})
# Учебный проект, посвященный сжатию изображений при помощи нейронных сетей
# Учебный проект, посвященный сжатию изображений при автокодировщика
## Описание работы кодека
Данный простой кодек сжимает изображения размером 128x128 при помощи свёрточных нейронных сетей, квантования и адаптивного арифметического кодирования.
Данный простой кодек сжимает изображения размером 128x128 при помощи автокодировщика, квантования и адаптивного арифметического кодирования.
В папке ./train/ находятся изображения, которые были использованы для обучения сети, в папке ./test/ находятся изображения для демонстрации результатов.
Структура кодера:
1. Слой 1. Принимает x размером 128x128x3. Выполняет свёртку 7x7, ReLu, MaxPooling2D 2x2. На выходе вектор y1 размером 64x64x128.
2. Слой 2. Принимает y1. Выполняет свёртку 5x5, ReLu, MaxPooling2D 2x2. На выходе вектор y2 размером 32x32x32.
3. Слой 3. Принимает y2. Выполняет свёртку 3x3, ReLu, MaxPooling2D 2x2. На выходе вектор y3 размером 16x16x16.
4. Вычисление максимума $y_{max} = \max_i{y^i_3}$.
5. Квантование x_i = \left\lfloor clip(y^i_3/y_{max},[0,1))\cdot 2^b\right\rfloor, в результате которого x_i \in \{0,1,...,2^{b}-1\}.
6. Сжатие {x_i} при помощи адаптивного арифметического кодера (ААК) из [1].
1. Слой 1. Принимает x размером 128x128x3. Выполняет свёртку 7x7, ReLu, AveragePooling2D 2x2. На выходе вектор y1 размером 64x64x128.
2. Слой 2. Принимает y1. Выполняет свёртку 5x5, ReLu, AveragePooling2D 2x2. На выходе вектор y2 размером 32x32x32.
3. Слой 3. Принимает y2. Выполняет свёртку 3x3, ReLu, AveragePooling2D 2x2. На выходе вектор y3 размером 16x16x16.
4. Выполняется батч нормализация.
5. Вычисление максимума $y_{max} = \max_i{y^i_3}$.
6. Квантование x_i = \left\lfloor clip(y^i_3/y_{max},[0,1))\cdot 2^b\right\rfloor, в результате которого x_i \in \{0,1,...,2^{b}-1\}.
7. Сжатие {x_i} при помощи адаптивного арифметического кодера (ААК) из [1].
Структура декодера:
1. Декодирование {x_i} при помощи АAК из [1].
......@@ -19,21 +20,22 @@
4. Слой 2. Принимает \hat y_2. Свёртка 5\times 5, ReLu. На выходе \hat y_1 размером 64x64x32.
4. Слой 3. Принимает \hat y_1. Свёртка 7\times 7, ReLu. На выходе изображение \hat x размером 128x128x3.
На следующем примере показан случай, когда при обучении к вектору y_3 не прибавляется шум, соразмерный квантованию с шагом 2^3. Как можно заметить, это приводит
к появлению артефактов.
![Обучения без добавления шума. Epoch=3000](./doc/AI_Epoch3000_NoNoise.png)
На следующем примере показан случай, когда при обучении к вектору y_3 добавляется шум, соразмерный квантованию с шагом 2^3. Как можно заметить, в большей степени
артефакты устранились, что привело к тому, что данная простейшая модель выигрывает у JPEG по качеству на высоких степенях сжатия.
На следующем примере показано сравнение эффективности работы данной модели, при b=2. Здесь RAW помечена строка исходных изображений,
AE1 -- автокодировщик без добавления шума при обучении, AE2 -- автокодировщик c добавлением шума при обучении,
JPEG -- алгоритм JPEG в котором степень сжатия подобрана так, чтобы быть близкой к тому, что достигают автокодировщики.
Здесь Q -- это метрика качества изображения SSIM, а bpp -- это число бит на пиксель после сжатия (в исходном формате bpp=24).
![Обучения c добавлением шума. Epoch=3000](./doc/AI_Epoch3000_Noisebt3.png)
Как можно заметить, автокодировщик AE2 выигрывает у JPEG по качеству на высоких степенях сжатия. Также, пример показывает
важность добавления шума при обучении, вследствие чего автокодировщик адаптируется к ошибке квантования.
ААК из [1] реализован на языке Си и подключается к коду как библиотека. Для сборки модуля необходимо выполнить команды, которые находятся в файле
EntropyCompile.bat
EntropyCompile.bat или EntropyCompile.sh
## Описание задания к лабораторной работе
Улучшить учебный кодек так, чтобы он:
- либо на том же сжатии показывал лучшее субъективное визуальное качество;
- либо на том же сжатии обеспечивал выигрыш по PSNR от 0.1 дБ и выше;
- либо на том же сжатии обеспечивал выигрыш по SSIM от 0.05 и выше;
- либо при том же уровне качества обеспечивал от 3\% выигрыша по bpp.
Можно улучшать следующие модули:
......@@ -44,6 +46,8 @@ EntropyCompile.bat
Требования к реализации:
- Результаты должны быть продемонстрированы на изображениях из папки ./test/
- При обучении должны использоваться только изображения из папки ./train/
- При сравнении заменить строчку изображений автокодировщика AE1 на результаты разработанного кодека как показано на рисунке выше.
- Построить график функции средний SSIM/bpp для тестовых изображений для b=2,3,4,5 для AE2, JPEG и предложенного кодека.
На почту eabelyaev@itmo.ru прислать отчет в виде презентации в pdf формате, который включает в себя:
- ФИО студента, номер группы.
......
File added
ގœ浂* ȾG(e2
\ No newline at end of file
This diff is collapsed.
File added
doc/AI_Epoch3000_Noisebt3.png

564 KB | W: | H:

doc/AI_Epoch3000_Noisebt3.png

642 KB | W: | H:

doc/AI_Epoch3000_Noisebt3.png
doc/AI_Epoch3000_Noisebt3.png
doc/AI_Epoch3000_Noisebt3.png
doc/AI_Epoch3000_Noisebt3.png
  • 2-up
  • Swipe
  • Onion skin
File added
Ֆ֯i ǹL(Ͳ2
\ No newline at end of file
This diff is collapsed.
File added
pip install -r requirements.txt
pause
\ No newline at end of file
keras==2.15.0
matplotlib==3.8.4
numpy==1.23.5
Pillow==9.5.0
Pillow==10.3.0
pybind11==2.11.1
setuptools==58.1.0
tensorflow==2.15.0
tensorflow_intel==2.15.0
keras==3.4.1
matplotlib==3.9.1
numpy==1.24.2
Pillow==10.4.0
pybind11==2.13.1
setuptools==69.5.1
scikit-image
tensorflow==2.16.2
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