Main Content

잡음 제거 심층 신경망의 코드 생성

이 예제에서는 MATLAB® 코드에서 CUDA® MEX를 생성하고 잡음 제거 컨벌루션 신경망(DnCNN [1])을 사용하여 회색조 영상의 잡음을 제거하는 방법을 보여줍니다. 잡음 제거 신경망을 사용하면 잡음이 있는 영상에서 잡음을 추정, 제거하여 잡음이 없어진 영상을 구할 수 있습니다.

타사 선행 조건

필수

이 예제는 CUDA MEX를 생성하며, 다음과 같은 타사 요구 사항이 있습니다.

  • CUDA® 지원 NVIDIA® GPU 및 호환되는 드라이버.

선택 사항

정적, 동적 라이브러리 또는 실행 파일과 같은 비 MEX 빌드의 경우, 이 예제에는 다음과 같은 추가 요구 사항이 있습니다.

GPU 환경 확인하기

coder.checkGpuInstall (GPU Coder) 함수를 사용하여 이 예제를 실행하는 데 필요한 컴파일러와 라이브러리가 올바르게 설치되었는지 확인합니다.

envCfg = coder.gpuEnvConfig('host');
envCfg.DeepLibTarget = 'cudnn';
envCfg.DeepCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

잡음이 있는 영상 불러오기

잡음이 있는 회색조 영상을 작업 공간으로 불러오고 표시합니다.

noisyI = imread('noisy_cameraman.png');
figure
imshow(noisyI);
title('Noisy Image');

사전 훈련된 잡음 제거 신경망 가져오기

getDenoisingNetwork 헬퍼 함수를 호출하여 사전 훈련된 영상 잡음 제거 심층 신경망을 가져옵니다.

net = getDenoisingNetwork;

getDenoisingNetwork 함수는 알 수 없는 수준의 가산성 백색 가우스 잡음(AWGN) 검출에 사용할 수 있는 사전 훈련된 DnCNN [1]을 반환합니다. 이 신경망은 잔차 학습 기법을 구현하여 잔차 영상을 예측하는 피드포워드 잡음 제거 컨벌루션 신경망입니다. 즉, DnCNN [1]은 잡음이 있는 영상과 그 기저의 정리된 영상 사이의 차이를 계산합니다.

이 신경망은 컨벌루션 계층, 배치 정규화 계층, 회귀 출력 계층을 비롯한 59개의 계층으로 이루어져 있습니다. 딥러닝 신경망 아키텍처의 대화형 시각화를 표시하려면 analyzeNetwork 함수를 사용하십시오.

analyzeNetwork(net);

denoisenet_predict 함수

denoisenet_predict 진입점 함수는 잡음이 있는 영상을 입력값으로 받아 사전 훈련된 잡음 제거 신경망을 사용하여 잡음이 제거된 영상을 반환합니다.

이 함수는 getDenoisingNetwork가 반환하는 network 객체를 영속 변수 mynet으로 불러온 다음 후속 예측 호출에서 영속 객체를 재사용합니다.

type denoisenet_predict
function I = denoisenet_predict(in)
%#codegen
% Copyright 2018-2021 The MathWorks, Inc.

persistent mynet;


if isempty(mynet)   
    mynet = coder.loadDeepLearningNetwork('getDenoisingNetwork', 'DnCNN');
end

% The activations methods extracts the output from the last layer. The
% 'OutputAs' 'channels' name-value pair argument is used inorder to call
% activations on an image whose input dimensions are greater than or equal
% to the network's imageInputLayer.InputSize.

res = mynet.activations(in, 59,'OutputAs','channels');


% Once the noise is estimated, we subtract the noise from the original
% image to obtain a denoised image.

I = in - res;
  

여기서 계층 숫자형 인덱스로 59를 사용하여 activations 메서드가 호출되어 신경망의 마지막 계층에서 활성화 결과를 추출합니다. 'OutputAs' 'channels' 이름-값 쌍 인수는 신경망의 imageInputLayer.InputSize보다 큰 영상에 대한 활성화 값을 계산합니다.

activations 메서드는 사전 훈련된 잡음 제거 영상을 사용하여 입력 영상의 잡음에 대한 추정을 반환합니다.

잡음이 추정되면 원본 영상에서 잡음을 빼서 잡음이 제거된 영상을 얻습니다.

MEX 코드 생성 실행하기

denoisenet_predict.m 진입점 함수에 대한 CUDA 코드를 생성하려면 MEX 타깃에 대한 GPU 코드 구성 객체를 만들고 타깃 언어를 C++로 설정하십시오. coder.DeepLearningConfig (GPU Coder) 함수를 사용하여 CuDNN 딥러닝 구성 객체를 만들고 이 객체를 GPU 코드 구성 객체의 DeepLearningConfig 속성에 할당합니다. 입력 크기를 [256,256]으로 지정하여 codegen 명령을 실행합니다. 이 값은 잡음을 제거하려는 영상의 크기입니다.

cfg = coder.gpuConfig('mex');
cfg.TargetLang = 'C++';
cfg.DeepLearningConfig = coder.DeepLearningConfig('cudnn');
codegen -config cfg denoisenet_predict -args {ones(256,256,'single')} -report
Code generation successful: View report

생성된 MEX 실행하기

DnCNN [1]은 입력 범위가 [0,1]인 입력 영상에 대해 훈련되었습니다. noisyI에 대해 im2single (Image Processing Toolbox) 함수를 호출하여 값을 [0,255]에서 [0,1]로 다시 스케일링합니다.

다시 스케일링된 입력 영상에 대해 denoisenet_predict_predict를 호출합니다.

denoisedI = denoisenet_predict_mex(im2single(noisyI));

잡음이 제거된 영상 보기

figure
imshowpair(noisyI,denoisedI,'montage');
title('Noisy Image (left) and Denoised Image (right)');

참고 문헌

[1] Zhang, K., W. Zuo, Y. Chen, D. Meng, and L. Zhang. "Beyond a Gaussian Denoiser: Residual Learning of Deep CNN for Image Denoising." IEEE Transactions on Image Processing. Vol. 26, Number 7, Feb. 2017, pp. 3142-3155.

관련 항목