diff --git a/README.md b/README.md index 61719715a4fcbb7c34c194f8119a0af64744add2..ea6abfaf81f009d3c0dfd382788e1cf02a3b6e18 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,33 @@ # CNNImageCodec -Учебный проект, посвященный сжатию изображений при помощи нейронных сетей \ No newline at end of file +Учебный проект, посвященный сжатию изображений при помощи нейронных сетей + +Данный простой кодек сжимает изображения размером 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. Декодирование {x_i} при помощи АAК из [1]. +2. \hat y^i_3 = y_{max}\cdot\left(\frac{x_i}{2^{b}}+\frac{1}{2^{b+1}}\right) +3. Слой 1. Принимает \hat y_3. Свёртка 3\times 3, ReLu. На выходе \hat y_2 размером 32x32x16. +4. Слой 2. Принимает \hat y_2. Свёртка 5\times 5, ReLu. На выходе \hat y_3 размером 64x64x32. +4. Слой 3. Принимает \hat y_3. Свёртка 5\times 5, ReLu. На выходе изображение \hat x размером 128x128x3. + +На следующем примере показан случай, когда при обучении к вектору y_3 не прибавляется шум, соразмерный квантованию с шагом 2^3. Как можно заметить, это приводит +к появлению артефактов. +![Обучения без добавления шума. Epoch=3000](./doc/AI_Epoch3000_NoNoise.png) + +На следующем примере показан случай, когда при обучении к вектору y_3 добавляется шум, соразмерный квантованию с шагом 2^3. Как можно заметить, в большей степени +артефакты устранились, что привело к тому, что данная простейшая модель выигрывает у JPEG по качеству на высоких степенях сжатия. +![Обучения c добавлением шума. Epoch=3000](./doc/AI_Epoch3000_Noisebt3.png) + + +[1] Ian H. Witten, Radford M. Neal, and John G. Cleary, “Arithmetic coding for data compression,” Commun. ACM, vol. 30, no. 6, pp. 520–540, jun +1987. \ No newline at end of file diff --git a/doc/AI_Epoch3000_NoNoise.png b/doc/AI_Epoch3000_NoNoise.png new file mode 100644 index 0000000000000000000000000000000000000000..dafa725f38d8a7732f3d7e23ab44fcb0ad219eb2 Binary files /dev/null and b/doc/AI_Epoch3000_NoNoise.png differ diff --git a/doc/AI_Epoch3000_Noisebt3.png b/doc/AI_Epoch3000_Noisebt3.png new file mode 100644 index 0000000000000000000000000000000000000000..ba972f693bf5ed85026701025eec0f445141f6a2 Binary files /dev/null and b/doc/AI_Epoch3000_Noisebt3.png differ