Commit 2bc42a7d authored by Evgeny Belyaev's avatar Evgeny Belyaev

Первая версия модели загружена

parents
# 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
This diff is collapsed.
# Учебный проект, посвященный улучшению качества сжатых изображений при помощи нейронных сетей (модель QECNN)
## Датасет
Для обучения используется датасет изображений BSD500 [1]. Изображения из датасета сконвертированы в формат yuv и хранятся в едином файле:
при этом 400 изображений 480x320 находятся в файле BSD500train.yuv, и 100 изобажений находятся в файле BSD500test.yuv. Оба файла сжаты кодеком x265 с квантователем QP=35 и
помещены в файлы BSD500train.yuv и BSD500test.yuv, соответственно.
## Модель
Модель нейронной сети заимствована из работы [2].
Код протестирован на OC Windows 10 и Ubuntu 24.
## Описание задания к лабораторной работе
Улучшить QECNN модель так, чтобы модифицированная версия:
- выиграла на 100 изображениях из файла BSD500test.yuv в среднем 0.1 дБ и более по метрике PSNR;
Требования к реализации и результаты:
- При обучении должны использоваться только изображения из папки файла BSD500train.yuv
- Построить график функции PSNR/номер изображения для исходной и модифицированной моделей
На почту eabelyaev@itmo.ru прислать отчет в виде презентации в pdf формате, который включает в себя:
- ФИО студента, номер группы.
- Описание предложенной модификации и результаты.
- Ссылку на репозиторий с исходным кодом кодека и инструкцию по запуску.
## Литература
[1] https://github.com/BIDS/BSDS500<br />
[2] R. Yang et al., "Enhancing Quality for HEVC Compressed Videos," IEEE Transactions on Circuits and Systems for Video Technology, 2019.
[pdf](./doc/Enhancing_Quality_for_HEVC_Compressed_Videos.pdf)
\ No newline at end of file
import PIL
import numpy as np
from PIL import Image
from numpy import *
def yuv_import(filename, fw, fh, numfrm):
fp = open(filename, 'rb')
d00 = fw // 2
d01 = fh // 2
Y = np.zeros((numfrm, fw, fh), np.uint8, 'C')
U = np.zeros((numfrm, d00, d01), np.uint8, 'C')
V = np.zeros((numfrm, d00, d01), np.uint8, 'C')
for i in range(numfrm):
for m in range(fw):
for n in range(fh):
# print m,n
Y[i, m, n] = ord(fp.read(1))
for m in range(d00):
for n in range(d01):
U[i, m, n] = ord(fp.read(1))
for m in range(d00):
for n in range(d01):
V[i, m, n] = ord(fp.read(1))
fp.close()
return (Y, U, V)
def yuv_save(filename, fw, fh, numfrm,Y,U,V):
fp = open(filename, 'wb')
for i in range(numfrm):
Y[i].astype('uint8').tofile(fp)
U[i].astype('uint8').tofile(fp)
V[i].astype('uint8').tofile(fp)
fp.close()
def yuv2rgb(Y, U, V, height, width, frames):
U_new = np.empty((U.shape[0], height, width))
for i in range(U.shape[0]):
U_new[i] = np.array(Image.fromarray(U[i], mode="L").resize(size=(width, height), resample=PIL.Image.BILINEAR))
V_new = np.empty((V.shape[0], height, width))
for i in range(V.shape[0]):
V_new[i] = np.array(Image.fromarray(V[i], mode="L").resize(size=(width, height), resample=PIL.Image.BILINEAR))
U = U_new
V = V_new
Y = Y
rf = Y + 1.4075 * (V - 128.0)
gf = Y - 0.3455 * (U - 128.0) - 0.7169 * (V - 128.0)
bf = Y + 1.7790 * (U - 128.0)
for i in range(frames):
for m in range(height):
for n in range(width):
if(rf[i, m, n] > 255):
rf[i, m, n] = 255
if(gf[i, m, n] > 255):
gf[i, m, n] = 255
if(bf[i, m, n] > 255):
bf[i, m, n] = 255
if (rf[i, m, n] < 0):
rf[i, m, n] = 0
if (gf[i, m, n] < 0):
gf[i, m, n] = 0
if (bf[i, m, n] < 0):
bf[i, m, n] = 0
r = rf
g = gf
b = bf
return r, g, b
def rgb2yuv(R, G, B, height, width, frames):
Y = np.empty((R.shape[0], height, width))
U = np.empty((R.shape[0], height, width))
V = np.empty((R.shape[0], height, width))
Y = 0.299 * R + 0.587 * G + 0.114 * B
U = (B - Y) * 0.5643 + 128.0
V = (R - Y) * 0.7132 + 128.0
for i in range(frames):
for m in range(height):
for n in range(width):
if(Y[i, m, n] > 255):
Y[i, m, n] = 255
if(U[i, m, n] > 255):
U[i, m, n] = 255
if(V[i, m, n] > 255):
V[i, m, n] = 255
if (Y[i, m, n] < 0):
Y[i, m, n] = 0
if (U[i, m, n] < 0):
U[i, m, n] = 0
if (V[i, m, n] < 0):
V[i, m, n] = 0
h2 = np.around(height/2)
h2 = h2.astype(int)
w2 = np.around(width/ 2)
w2 = w2.astype(int)
Cb = np.empty((U.shape[0],h2 , w2))
Cr = np.empty((V.shape[0], h2, w2))
for i in range(frames):
for m in range(h2):
for n in range(w2):
Cb[i,m,n] = (U[i, 2 * m, 2 * n]+U[i, 2 * m+1, 2 * n]+U[i, 2 * m, 2 * n+1]+U[i, 2 * m+1, 2 * n+1])/4
Cr[i, m, n] = (V[i, 2 * m, 2 * n]+V[i, 2 * m+1, 2 * n]+V[i, 2 * m, 2 * n+1]+V[i, 2 * m+1, 2 * n+1])/4
return Y, Cb, Cr
This diff is collapsed.
python QECNNYUV.py
pause
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
x265 --input-res 480x320 --fps 30 --input BSD500train.yuv -o test.hevc --crf 35 --keyint 1 --preset medium
TAppDecoder.exe -b test.hevc -o BSD500trainc.yuv
pause
\ No newline at end of file
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