Этот пример показывает, как обучить деноизирующую сверточную нейронную сеть (DnCNN), затем использовать сеть, чтобы уменьшить программные продукты сжатия JPEG в изображении.
Сжатие изображений используется, чтобы уменьшить размер памяти изображения. Один из популярных и мощных методов сжатия используется в формате изображения JPEG, который использует коэффициент качества для определения величины сжатия. Уменьшение значения качества приводит к более высокому сжатию и меньшему объему памяти за счет визуального качества изображения.
Сжатие JPEG теряется, что означает, что процесс сжатия заставляет изображение терять информацию. Для изображений JPEG эта потеря информации появляется как программные продукты блокировки на изображении. Как показано на рисунке, большее сжатие приводит к большей потере информации и более сильным программным продуктам. Текстурированные области с высокочастотным содержимым, такие как трава и облака, выглядят размытыми. Острые края, такие как крыша дома и ограждения на вершине маяка, показывают звон.
JPEG-деблокировка - это процесс уменьшения эффектов программных продуктов сжатия в изображениях JPEG. Существует несколько методов деблокировки JPEG, включая более эффективные методы, использующие глубокое обучение. Этот пример реализует один такой метод на основе глубокого обучения, который пытается минимизировать эффект программных продуктов сжатия JPEG.
Этот пример использует встроенную глубокую сверточную нейронную сеть с feedforward, называемую DnCNN
. Сеть в первую очередь была предназначена для удаления шума от изображений. Однако архитектура DnCNN также может быть обучена удалению программных продуктов сжатия JPEG или увеличению разрешения изображения.
В ссылку статье [1] используется стратегия невязки обучения, что означает, что сеть DnCNN учится оценивать остаточное изображение. Остаточное изображение является различием между первозданным изображением и искаженной копией изображения. Остаточное изображение содержит информацию о искажении изображения. В данном примере искажение появляется как программные продукты блокировки JPEG.
Сеть DnCNN обучена обнаруживать остаточное изображение от яркости цветного изображения. Канал яркости изображения Y представляет яркость каждого пикселя через линейную комбинацию значений красного, зеленого и синего пикселей. Напротив, два канала цветности изображения, Cb и Cr, являются различными линейными комбинациями красных, зеленых и синих пиксельных значений, которые представляют информацию о цветовой разности. DnCNN обучается, используя только канал яркости, потому что восприятие человека более чувствительно к изменениям яркости, чем изменения цвета.
Если яркость первозданного изображения и - яркость изображения, содержащего программные продукты сжатия JPEG, тогда вход в сеть DnCNN равен и сеть учится предсказывать из обучающих данных.
Когда сеть DnCNN узнает, как оценить остаточное изображение, она может восстановить неискаженную версию сжатого изображения JPEG путем добавления остаточного изображения к каналу сжатой яркости, затем преобразования изображения назад в цветовое пространство RGB.
Загрузите IAPR TC-12 Benchmark, который состоит из 20 000 все еще естественных изображений [2]. Набор данных включает фотографии людей, животных, городов и многое другое. Размер файла данных составляет ~ 1,8 ГБ. Если вы не хотите загружать обучающий набор обучающих данных, необходимый для обучения сети, то можно загрузить предварительно обученную сеть DnCNN, набрав load('pretrainedJPEGDnCNN.mat')
в командной строке. Затем перейдите непосредственно к разделу Perform JPEG Deblocking Using DnCNN Network в этом примере.
Используйте функцию helper, 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');
Используйте функцию helper createJPEGDeblockingTrainingSet
для предварительной обработки обучающих данных. Эта функция присоединена к примеру как вспомогательный файл.
Для каждого нетронутого обучающего изображения вспомогательная функция записывает копию изображения с фактором качества 100 для использования в качестве эталонного изображения и копий изображения с каждым фактором качества для использования в качестве входов сети. Функция вычисляет канал яркости (Y) опорного и сжатого изображений в типе данных double
для большей точности при вычислении остаточных изображений. Сжатые изображения хранятся на диске как .MAT файлов в директории compressedDirName
. Вычисленные остаточные изображения хранятся на диске как .MAT файлов в директории residualDirName
.
[compressedDirName,residualDirName] = createJPEGDeblockingTrainingSet(imdsPristine,JPEGQuality);
Используйте datastore случайного извлечения закрашенных фигур, чтобы передать обучающие данные в сеть. Этот datastore извлекает случайные соответствующие закрашенные фигуры из двух хранилищ данных изображений, которые содержат входы сети и желаемые сетевые отклики.
В этом примере сетевые входы являются сжатыми изображениями. Желаемыми сетевыми характеристиками являются остаточные изображения. Создайте изображение datastore под названием imdsCompressed
из набора файлов сжатого изображения. Создайте изображение datastore под названием imdsResidual
из набора вычисленных файлов остаточных изображений. Оба хранилища данных требуют вспомогательной функции, matRead
, для чтения данных изображения из файлов изображений. Эта функция присоединена к примеру как вспомогательный файл.
imdsCompressed = imageDatastore(compressedDirName,'FileExtensions','.mat','ReadFcn',@matRead); imdsResidual = imageDatastore(residualDirName,'FileExtensions','.mat','ReadFcn',@matRead);
Создайте imageDataAugmenter
который задает параметры увеличения данных. Используйте увеличение данных во время обучения, чтобы изменить обучающие данные, что эффективно увеличивает объем доступных обучающих данных. Здесь augmenter задает случайное вращение на 90 степени и случайные отражения в направлении x.
augmenter = imageDataAugmenter( ... 'RandRotation',@()randi([0,1],1)*90, ... 'RandXReflection',true);
Создайте randomPatchExtractionDatastore
(Image Processing Toolbox) из двух хранилищ данных изображений. Задайте размер закрашенной фигуры 50 на 50 пикселей. Каждое изображение генерирует 128 случайные закрашенные фигуры размера 50 на 50 пикселей. Задайте мини-пакет размером 128.
patchSize = 50; patchesPerImage = 128; dsTrain = randomPatchExtractionDatastore(imdsCompressed,imdsResidual,patchSize, ... 'PatchesPerImage',patchesPerImage, ... 'DataAugmentation',augmenter); dsTrain.MiniBatchSize = patchesPerImage;
Datastore случайного извлечения закрашенных фигур dsTrain
предоставляет мини-пакеты данных в сеть в итерацию эпохи. Предварительный просмотр результатов чтения из datastore.
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
(Image Processing Toolbox) функция. По умолчанию глубина сети (количество слоев свертки) составляет 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 требуется Parallel Computing Toolbox™ и графический процессор с поддержкой CUDA ® NVIDIA ®. Для получения дополнительной информации смотрите Поддержку GPU by Release (Parallel Computing Toolbox). Обучение занимает около 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 неискаженное изображение, поставленное в Image Processing 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')
Создайте три сжатых тестовых изображения с помощью Quality JPEG
значений 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
(Image Processing Toolbox) функция.
I10ycbcr = rgb2ycbcr(I10); I20ycbcr = rgb2ycbcr(I20); I50ycbcr = rgb2ycbcr(I50);
В порядок выполнения прямого прохода сети используйте denoiseImage
(Image Processing Toolbox) функция. Эта функция использует точно такие же процедуры обучения и проверки для шумоподавления изображения. Можно представить программные продукты сжатия 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
(Image Processing Toolbox) функция.
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 ширина высота]. Элементы определяют координаты x и y верхнего левого угла, ширину и высоту информация только для чтения.
roi = [30 440 100 80];
Обрезайте сжатые изображения в этот информация только для чтения и отобразите результат как montage.
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)')
Обрезайте отлаженные изображения в этом информация только для чтения и отобразите результат как montage.
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
(Image Processing Toolbox) для получения дополнительной информации об этой метрике.
Отношение пикового сигнала к шуму (PSNR). Чем больше значение PSNR, тем больше сигнал по сравнению с искажением. См. psnr
(Image Processing Toolbox) для получения дополнительной информации об этой метрике.
Оценка качества изображений Naturalness (NIQE). NIQE измеряет качество перцептивного изображения с помощью модели, обученной из естественных сцен. Меньшие счета NIQE указывают на лучшее качество восприятия. См. niqe
(Image Processing Toolbox) для получения дополнительной информации об этой метрике.
Слепой/бесфазный оценщик пространственного качества изображений (BRISQUE). BRISQUE измеряет качество воспринимаемого изображения с помощью модели, обученной из естественных сцен с искажением изображения. Меньшие счета BRISQUE указывают на лучшее качество восприятия. См. brisque
(Image Processing Toolbox) для получения дополнительной информации об этой метрике.
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] Zhang, K., W. Zuo, Y. Chen, D. Meng, and L. Zhang, «Beyond a Gaussian Denoiser: Learnual Learning of Deep CNN for Image Denoising». Транзакции IEEE ® по обработке изображений. Февраль 2017 года.
[2] Грубингер, М., П. Клаф, Х. Мюллер и Т. Дезелаерс. «IAPR TC-12 Benchmark: A New Evaluation Resource for Visual Information Systems». Сведения о языковых ресурсах OntoImage 2006 для поиска изображений на основе содержимого. Генуя, Италия. Том 5, май 2006, стр. 10.
trainingOptions
| trainNetwork
| denoiseImage
(Image Processing Toolbox) | dnCNNLayers
(Image Processing Toolbox) | randomPatchExtractionDatastore
(Набор Image Processing Toolbox) | rgb2ycbcr
(Набор Image Processing Toolbox) | ycbcr2rgb
(Набор Image Processing Toolbox)