В этом примере показано, как обучить денонсирующую сверточную нейронную сеть (DnCNN), а затем использовать сеть для уменьшения артефактов сжатия JPEG в изображении.
Сжатие изображения используется для уменьшения занимаемой памяти изображения. Один популярный и мощный метод сжатия используется в формате изображения JPEG, который использует коэффициент качества для указания величины сжатия. Уменьшение значения качества приводит к более высокому сжатию и меньшему объему памяти за счет визуального качества изображения.
Сжатие JPEG потеряно, что означает, что процесс сжатия приводит к потере информации изображения. Для изображений JPEG эта потеря информации отображается как блокирующие артефакты в изображении. Как показано на рисунке, большее сжатие приводит к большей потере информации и более сильным артефактам. Текстурированные области с высокочастотным содержанием, такие как трава и облака, выглядят размытыми. Острые края, такие как крыша дома и ограждения над маяком, демонстрируют звон.

Дедупликация JPEG - это процесс уменьшения эффектов артефактов сжатия в изображениях JPEG. Существует несколько методов дедупликации JPEG, включая более эффективные методы, использующие глубокое обучение. В этом примере реализован один такой основанный на глубоком обучении метод, который пытается минимизировать эффект артефактов сжатия JPEG.
В этом примере используется встроенная сверточная нейронная сеть с глубокой передачей, называемая DnCNN. Сеть была в первую очередь предназначена для удаления шума с изображений. Однако архитектура DnCNN также может быть обучена удалению артефактов сжатия JPEG или увеличению разрешения изображения.
В справочном документе [1] используется стратегия остаточного обучения, означающая, что сеть DnCNN учится оценивать остаточное изображение. Остаточное изображение - это разница между первозданным изображением и искаженной копией изображения. Остаточное изображение содержит информацию о искажении изображения. В этом примере искажение отображается как артефакты блокировки JPEG.
Сеть DnCNN обучена обнаруживать остаточное изображение по яркости цветного изображения. Канал яркости изображения, Y, представляет яркость каждого пикселя посредством линейной комбинации значений красного, зеленого и синего пикселей. Напротив, два канала цветности изображения, Cb и Cr, представляют собой различные линейные комбинации значений красного, зеленого и синего пикселей, которые представляют информацию о цветоразнице. DnCNN обучается, используя только канал яркости, потому что человеческое восприятие более чувствительно к изменениям яркости, чем к изменениям цвета.

Если - яркость первозданного изображения, а - яркость изображения, содержащего артефакты сжатия JPEG, то вход в сеть DnCNN - , и сеть учится предсказывать YCompressed-YOriginal из обучающих данных.
Как только сеть DnCNN узнает, как оценить остаточное изображение, она может восстановить неискаженную версию сжатого изображения JPEG путем добавления остаточного изображения в сжатый канал яркости, затем преобразовать изображение обратно в цветовое пространство RGB.
Загрузите IAPR TC-12 Benchmark, который состоит из 20 000 натурных изображений [2]. Набор данных включает фотографии людей, животных, городов и многое другое. Размер файла данных составляет ~ 1,8 ГБ. Если вы не хотите загружать набор обучающих данных, необходимых для обучения сети, вы можете загрузить предварительно обученную сеть DnCNN, набравload('pretrainedJPEGDnCNN.mat') в командной строке. Затем в этом примере перейдите непосредственно к разделу Выполнение дедупликации JPEG с использованием сети DnCNN.
Используйте функцию помощника, downloadIAPRTC12Data, для загрузки данных. Эта функция присоединена к примеру как вспомогательный файл.
imagesDir = tempdir;
url = "http://www-i6.informatik.rwth-aachen.de/imageclef/resources/iaprtc12.tgz";
downloadIAPRTC12Data(url,imagesDir);В этом примере сеть будет обучаться с помощью небольшого подмножества данных IAPR TC-12 Benchmark. Загрузите учебные данные imageCLEF. Все изображения являются 32-битными цветными изображениями JPEG.
trainImagesDir = fullfile(imagesDir,'iaprtc12','images','00'); exts = {'.jpg','.bmp','.png'}; imdsPristine = imageDatastore(trainImagesDir,'FileExtensions',exts);
Перечислите количество обучающих изображений.
numel(imdsPristine.Files)
ans = 251
Чтобы создать обучающий набор данных, считывайте в нетронутых изображениях и записывайте изображения в формате JPEG с различными уровнями сжатия.
Укажите значения качества изображения JPEG, используемые для визуализации артефактов сжатия изображения. Значения качества должны находиться в диапазоне [0, 100]. Небольшие значения качества приводят к большему сжатию и более сильным артефактам сжатия. Используйте более плотную выборку малых значений качества, чтобы учебные данные имели широкий диапазон артефактов сжатия.
JPEGQuality = [5:5:40 50 60 70 80];
Сжатые изображения хранятся на диске как файлы MAT в каталоге compressedImagesDir. Вычисленные остаточные изображения хранятся на диске как файлы MAT в каталоге residualImagesDir. Файлы MAT хранятся в виде данных double для большей точности при обучении сети.
compressedImagesDir = fullfile(imagesDir,'iaprtc12','JPEGDeblockingData','compressedImages'); residualImagesDir = fullfile(imagesDir,'iaprtc12','JPEGDeblockingData','residualImages');
Использовать функцию помощника createJPEGDeblockingTrainingSet для предварительной обработки данных обучения. Эта функция присоединена к примеру как вспомогательный файл.
Для каждого нетронутого обучающего изображения вспомогательная функция записывает копию изображения с коэффициентом 100 качества для использования в качестве опорного изображения и копии изображения с каждым коэффициентом качества для использования в качестве сетевых входов. Функция вычисляет канал яркости (Y) опорного и сжатого изображений в типе данных. double для большей точности при расчете остаточных изображений. Сжатые образы хранятся на диске как файлы .MAT в каталоге compressedDirName. Вычисленные остаточные изображения хранятся на диске как файлы .MAT в каталоге residualDirName.
[compressedDirName,residualDirName] = createJPEGDeblockingTrainingSet(imdsPristine,JPEGQuality);
Используйте хранилище данных случайного извлечения исправлений для передачи обучающих данных в сеть. Это хранилище данных извлекает случайные соответствующие исправления из двух хранилищ данных образов, которые содержат сетевые входы и требуемые сетевые ответы.
В этом примере сетевые входы представляют собой сжатые изображения. Требуемыми сетевыми ответами являются остаточные изображения. Создание хранилища данных образа с именем imdsCompressed из коллекции сжатых файлов изображений. Создание хранилища данных образа с именем imdsResidual из коллекции вычисленных файлов остаточных изображений. Для обоих хранилищ данных требуется вспомогательная функция, matRead, для считывания данных изображения из файлов изображений. Эта функция присоединена к примеру как вспомогательный файл.
imdsCompressed = imageDatastore(compressedDirName,'FileExtensions','.mat','ReadFcn',@matRead); imdsResidual = imageDatastore(residualDirName,'FileExtensions','.mat','ReadFcn',@matRead);
Создание imageDataAugmenter определяет параметры увеличения данных. Используйте увеличение данных во время обучения для изменения данных обучения, что эффективно увеличивает объем доступных данных обучения. Здесь augmenter задает случайное вращение на 90 градусов и случайные отражения в направлении х.
augmenter = imageDataAugmenter( ... 'RandRotation',@()randi([0,1],1)*90, ... 'RandXReflection',true);
Создать randomPatchExtractionDatastore(Панель инструментов обработки изображений) из двух хранилищ данных изображений. Укажите размер фрагмента 50 на 50 пикселей. Каждое изображение генерирует 128 случайных фрагментов размером 50 на 50 пикселей. Укажите размер мини-пакета 128.
patchSize = 50; patchesPerImage = 128; dsTrain = randomPatchExtractionDatastore(imdsCompressed,imdsResidual,patchSize, ... 'PatchesPerImage',patchesPerImage, ... 'DataAugmentation',augmenter); dsTrain.MiniBatchSize = patchesPerImage;
Хранилище данных для случайного извлечения исправлений dsTrain предоставляет мини-пакеты данных в сеть при итерации эпохи. Предварительный просмотр результата чтения из хранилища данных.
inputBatch = preview(dsTrain); disp(inputBatch)
InputImage ResponseImage
______________ ______________
{50×50 double} {50×50 double}
{50×50 double} {50×50 double}
{50×50 double} {50×50 double}
{50×50 double} {50×50 double}
{50×50 double} {50×50 double}
{50×50 double} {50×50 double}
{50×50 double} {50×50 double}
{50×50 double} {50×50 double}
Создайте уровни встроенной сети DnCNN с помощью dnCNNLayers(Панель инструментов обработки изображений). По умолчанию глубина сети (количество слоев свертки) равна 20.
layers = dnCNNLayers
layers =
1x59 Layer array with layers:
1 'InputLayer' Image Input 50x50x1 images
2 'Conv1' Convolution 64 3x3x1 convolutions with stride [1 1] and padding [1 1 1 1]
3 'ReLU1' ReLU ReLU
4 'Conv2' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
5 'BNorm2' Batch Normalization Batch normalization with 64 channels
6 'ReLU2' ReLU ReLU
7 'Conv3' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
8 'BNorm3' Batch Normalization Batch normalization with 64 channels
9 'ReLU3' ReLU ReLU
10 'Conv4' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
11 'BNorm4' Batch Normalization Batch normalization with 64 channels
12 'ReLU4' ReLU ReLU
13 'Conv5' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
14 'BNorm5' Batch Normalization Batch normalization with 64 channels
15 'ReLU5' ReLU ReLU
16 'Conv6' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
17 'BNorm6' Batch Normalization Batch normalization with 64 channels
18 'ReLU6' ReLU ReLU
19 'Conv7' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
20 'BNorm7' Batch Normalization Batch normalization with 64 channels
21 'ReLU7' ReLU ReLU
22 'Conv8' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
23 'BNorm8' Batch Normalization Batch normalization with 64 channels
24 'ReLU8' ReLU ReLU
25 'Conv9' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
26 'BNorm9' Batch Normalization Batch normalization with 64 channels
27 'ReLU9' ReLU ReLU
28 'Conv10' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
29 'BNorm10' Batch Normalization Batch normalization with 64 channels
30 'ReLU10' ReLU ReLU
31 'Conv11' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
32 'BNorm11' Batch Normalization Batch normalization with 64 channels
33 'ReLU11' ReLU ReLU
34 'Conv12' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
35 'BNorm12' Batch Normalization Batch normalization with 64 channels
36 'ReLU12' ReLU ReLU
37 'Conv13' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
38 'BNorm13' Batch Normalization Batch normalization with 64 channels
39 'ReLU13' ReLU ReLU
40 'Conv14' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
41 'BNorm14' Batch Normalization Batch normalization with 64 channels
42 'ReLU14' ReLU ReLU
43 'Conv15' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
44 'BNorm15' Batch Normalization Batch normalization with 64 channels
45 'ReLU15' ReLU ReLU
46 'Conv16' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
47 'BNorm16' Batch Normalization Batch normalization with 64 channels
48 'ReLU16' ReLU ReLU
49 'Conv17' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
50 'BNorm17' Batch Normalization Batch normalization with 64 channels
51 'ReLU17' ReLU ReLU
52 'Conv18' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
53 'BNorm18' Batch Normalization Batch normalization with 64 channels
54 'ReLU18' ReLU ReLU
55 'Conv19' Convolution 64 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
56 'BNorm19' Batch Normalization Batch normalization with 64 channels
57 'ReLU19' ReLU ReLU
58 'Conv20' Convolution 1 3x3x64 convolutions with stride [1 1] and padding [1 1 1 1]
59 'FinalRegressionLayer' Regression Output mean-squared-error
Обучение сети с помощью стохастического градиентного спуска с оптимизацией импульса (SGDM). Укажите параметры гиперпараметра для SGDM с помощью trainingOptions функция.
Обучение глубокой сети занимает много времени. Ускорьте обучение, указав высокий уровень обучения. Однако это может привести к взрыву или неконтролируемому росту градиентов сети, препятствуя успешному обучению сети. Чтобы сохранить градиенты в значимом диапазоне, включите отсечение градиента с помощью параметра 'GradientThreshold' кому 0.005, и указать 'GradientThresholdMethod' для использования абсолютного значения градиентов.
maxEpochs = 30; initLearningRate = 0.1; l2reg = 0.0001; batchSize = 64; options = trainingOptions('sgdm', ... 'Momentum',0.9, ... 'InitialLearnRate',initLearningRate, ... 'LearnRateSchedule','piecewise', ... 'GradientThresholdMethod','absolute-value', ... 'GradientThreshold',0.005, ... 'L2Regularization',l2reg, ... 'MiniBatchSize',batchSize, ... 'MaxEpochs',maxEpochs, ... 'Plots','training-progress', ... 'Verbose',false);
По умолчанию в примере загружается предварительно обученная сеть DnCNN. Предварительно обученная сеть позволяет выполнять отмену блокировки JPEG, не дожидаясь завершения обучения.
Для обучения сети установите doTraining переменная в следующем коде true. Обучение сети DnCNN с помощью trainNetwork функция.
Обучение на GPU, если он доступен. Для использования графического процессора требуются параллельные вычислительные Toolbox™ и графический процессор NVIDIA ® с поддержкой CUDA ®. Дополнительные сведения см. в разделе Поддержка графического процессора по выпуску (Панель инструментов параллельных вычислений). Обучение занимает около 40 часов на NVIDIA™ Titan X.
doTraining = false; if doTraining modelDateTime = string(datetime('now','Format',"yyyy-MM-dd-HH-mm-ss")); [net,info] = trainNetwork(dsTrain,layers,options); save(strcat("trainedJPEGDnCNN-",modelDateTime,"-Epoch-",num2str(maxEpochs),".mat"),'net'); else load('pretrainedJPEGDnCNN.mat'); end
Теперь можно использовать сеть DnCNN для удаления артефактов сжатия JPEG из изображений.
Чтобы отменить блокировку JPEG с помощью DnCNN, выполните остальные шаги этого примера. В остальном примере показано, как:
Создание образцов тестовых изображений с артефактами сжатия JPEG на трех различных уровнях качества.
Удалите артефакты сжатия с помощью сети DnCNN.
Визуальное сравнение изображений до и после снятия блокировки.
Оцените качество сжатых и разблокированных изображений путем количественной оценки их сходства с неискаженным опорным изображением.
Создание образцов изображений для оценки результата отмены блокировки изображений JPEG с помощью сети DnCNN. Набор тестовых данных, testImagesсодержит 21 неискаженное изображение, переданное в Toolbox™ обработки изображений. Загрузка изображений в imageDatastore.
exts = {'.jpg','.png'};
fileNames = {'sherlock.jpg','car2.jpg','fabric.png','greens.jpg','hands1.jpg','kobi.png',...
'lighthouse.png','micromarket.jpg','office_4.jpg','onion.png','pears.png','yellowlily.jpg',...
'indiancorn.jpg','flamingos.jpg','sevilla.jpg','llama.jpg','parkavenue.jpg',...
'peacock.jpg','car1.jpg','strawberries.jpg','wagon.jpg'};
filePath = [fullfile(matlabroot,'toolbox','images','imdata') filesep];
filePathNames = strcat(filePath,fileNames);
testImages = imageDatastore(filePathNames,'FileExtensions',exts);Отображение тестовых изображений в качестве монтажа.
montage(testImages)

Выберите одно из изображений, которое будет использоваться в качестве опорного изображения для снятия блокировки JPEG. В качестве опорного изображения можно использовать собственное несжатое изображение.
indx = 7; % Index of image to read from the test image datastore Ireference = readimage(testImages,indx); imshow(Ireference) title('Uncompressed Reference Image')

Создание трех сжатых тестовых изображений с помощью JPEG Quality значения 10, 20 и 50.
imwrite(Ireference,fullfile(tempdir,'testQuality10.jpg'),'Quality',10); imwrite(Ireference,fullfile(tempdir,'testQuality20.jpg'),'Quality',20); imwrite(Ireference,fullfile(tempdir,'testQuality50.jpg'),'Quality',50);
Считывание сжатых версий изображения в рабочую область.
I10 = imread(fullfile(tempdir,'testQuality10.jpg')); I20 = imread(fullfile(tempdir,'testQuality20.jpg')); I50 = imread(fullfile(tempdir,'testQuality50.jpg'));
Отображение сжатых изображений в виде монтажа.
montage({I50,I20,I10},'Size',[1 3])
title('JPEG-Compressed Images with Quality Factor: 50, 20 and 10 (left to right)')
Напомним, что DnCNN обучается, используя только канал яркости изображения, потому что человеческое восприятие более чувствительно к изменениям яркости, чем к изменениям цвета. Преобразуйте изображения, сжатые в формате JPEG, из цветового пространства RGB в цветовое пространство YCbCr с помощью команды rgb2ycbcr(Панель инструментов обработки изображений).
I10ycbcr = rgb2ycbcr(I10); I20ycbcr = rgb2ycbcr(I20); I50ycbcr = rgb2ycbcr(I50);
Для выполнения прямого прохода сети используйте denoiseImage(Панель инструментов обработки изображений). Эта функция использует точно такие же процедуры обучения и тестирования, чтобы засорить изображение. Артефакты сжатия JPEG можно рассматривать как тип шума изображения.
I10y_predicted = denoiseImage(I10ycbcr(:,:,1),net); I20y_predicted = denoiseImage(I20ycbcr(:,:,1),net); I50y_predicted = denoiseImage(I50ycbcr(:,:,1),net);
Каналы цветности не нуждаются в обработке. Соедините канал яркости с отменой блочности с исходными каналами цветности для получения изображения с отменой блочности в цветовом пространстве YCbCr.
I10ycbcr_predicted = cat(3,I10y_predicted,I10ycbcr(:,:,2:3)); I20ycbcr_predicted = cat(3,I20y_predicted,I20ycbcr(:,:,2:3)); I50ycbcr_predicted = cat(3,I50y_predicted,I50ycbcr(:,:,2:3));
Преобразование разблокированного изображения YCbCr в цветовое пространство RGB с помощью ycbcr2rgb(Панель инструментов обработки изображений).
I10_predicted = ycbcr2rgb(I10ycbcr_predicted); I20_predicted = ycbcr2rgb(I20ycbcr_predicted); I50_predicted = ycbcr2rgb(I50ycbcr_predicted);
Отображение разблокированных изображений в качестве монтажа.
montage({I50_predicted,I20_predicted,I10_predicted},'Size',[1 3])
title('Deblocked Images with Quality Factor 50, 20 and 10 (Left to Right)')
Чтобы получить лучшее визуальное понимание улучшений, изучите меньшую область внутри каждого изображения. Укажите интересующую область (ROI) с помощью вектора roi в формате [x y width height]. Элементы определяют координаты x и y верхнего левого угла, а также ширину и высоту окупаемости инвестиций.
roi = [30 440 100 80];
Обрезайте сжатые изображения до этой окупаемости инвестиций и отобразите результат как монтаж.
i10 = imcrop(I10,roi);
i20 = imcrop(I20,roi);
i50 = imcrop(I50,roi);
montage({i50 i20 i10},'Size',[1 3])
title('Patches from JPEG-Compressed Images with Quality Factor 50, 20 and 10 (Left to Right)')
Обрезайте разблокированные изображения до этого ROI и отобразите результат как монтаж.
i10predicted = imcrop(I10_predicted,roi);
i20predicted = imcrop(I20_predicted,roi);
i50predicted = imcrop(I50_predicted,roi);
montage({i50predicted,i20predicted,i10predicted},'Size',[1 3])
title('Patches from Deblocked Images with Quality Factor 50, 20 and 10 (Left to Right)')
Количественная оценка качества разблокированных изображений с помощью четырех метрик. Вы можете использовать displayJPEGResults вспомогательная функция для вычисления этих метрик для сжатых и разблокированных изображений при коэффициентах качества 10, 20 и 50. Эта функция присоединена к примеру как вспомогательный файл.
Индекс структурного подобия (SSIM). SSIM оценивает визуальное воздействие трех характеристик изображения: яркости, контраста и структуры, на эталонное изображение. Чем ближе значение SSIM к 1, тем лучше тестовое изображение согласуется с эталонным изображением. Здесь опорное изображение является неискаженным исходным изображением, Ireferenceперед сжатием JPEG. Посмотрите ssim(Панель инструментов обработки изображений) для получения дополнительной информации об этой метрике.
Пиковое отношение сигнал/шум (PSNR). Чем больше значение PSNR, тем сильнее сигнал по сравнению с искажением. Посмотрите psnr(Панель инструментов обработки изображений) для получения дополнительной информации об этой метрике.
Оценщик качества изображения естественности (NIQE). NIQE измеряет качество воспринимаемого изображения с помощью модели, обученной на естественных сценах. Меньшие оценки NIQE указывают на лучшее качество восприятия. Посмотрите niqe(Панель инструментов обработки изображений) для получения дополнительной информации об этой метрике.
Анализатор пространственного качества слепого/безрецензионного изображения (BRISQUE). BRISQUE измеряет качество воспринимаемого изображения, используя модель, обученную из естественных сцен с искажением изображения. Меньшие оценки BRISQUE указывают на лучшее качество восприятия. Посмотрите brisque(Панель инструментов обработки изображений) для получения дополнительной информации об этой метрике.
displayJPEGResults(Ireference,I10,I20,I50,I10_predicted,I20_predicted,I50_predicted)
------------------------------------------ SSIM Comparison =============== I10: 0.90624 I10_predicted: 0.91286 I20: 0.94904 I20_predicted: 0.95444 I50: 0.97238 I50_predicted: 0.97482 ------------------------------------------ PSNR Comparison =============== I10: 26.6046 I10_predicted: 27.0793 I20: 28.8015 I20_predicted: 29.3378 I50: 31.4512 I50_predicted: 31.8584 ------------------------------------------ NIQE Comparison =============== I10: 7.2194 I10_predicted: 3.9478 I20: 4.5158 I20_predicted: 3.0685 I50: 2.8874 I50_predicted: 2.4106 NOTE: Smaller NIQE score signifies better perceptual quality ------------------------------------------ BRISQUE Comparison ================== I10: 52.372 I10_predicted: 38.9271 I20: 45.3772 I20_predicted: 30.8991 I50: 27.7093 I50_predicted: 24.3845 NOTE: Smaller BRISQUE score signifies better perceptual quality
[1] Чжан, К., У. Цзо, Я. Чен, Д. Мэн и Л. Чжан, «За гауссовым денуазером: остаточное обучение глубокому CNN для обличения». Транзакции IEEE ® при обработке изображений. Февраль 2017 года.
[2] Грубингер, М., П. Клаф, Х. Мюллер и Т. Деселер. «Эталонный тест IAPR TC-12: новый ресурс оценки для визуальных информационных систем». Труды языковых ресурсов TrainingImage 2006 для извлечения изображений на основе контента. Генуя, Италия. Том 5, май 2006, стр. 10.
trainingOptions | trainNetwork | denoiseImage (Панель инструментов обработки изображений) | dnCNNLayers(Панель инструментов обработки изображений) | randomPatchExtractionDatastore(Панель инструментов обработки изображений) | rgb2ycbcr(Панель инструментов обработки изображений) | ycbcr2rgb(Панель инструментов обработки изображений)