주요 콘텐츠

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

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

타사 선행 조건

이 예제는 CUDA MEX를 생성하며, CUDA® 지원 NVIDIA® GPU 및 호환되는 드라이버가 필요합니다.

GPU 환경 확인하기

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

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

잡음이 있는 영상 불러오기

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

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

Figure contains an axes object. The hidden axes object with title Noisy Image contains an object of type image.

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

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

net = getDenoisingNetwork;

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

신경망에는 58개 계층이 포함되어 있습니다. 딥러닝 신경망 아키텍처의 대화형 시각화를 표시하려면 analyzeNetwork (Deep Learning Toolbox) 함수를 사용하십시오.

analyzeNetwork(net);

denoisenet_predict 함수

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

이 함수는 getDenoisingNetwork가 반환하는 dlnetwork 객체를 영속 변수 dlnet으로 불러온 다음 후속 예측 호출에서 영속 객체를 재사용합니다. predict 메서드는 사전 훈련된 잡음 제거 영상을 사용하여 입력 영상의 잡음 추정값을 반환합니다. 그런 다음 원본 영상에서 잡음을 빼서 잡음이 제거된 영상을 얻을 수 있습니다.

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

persistent dlnet;


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

% Use the network to predict the noise in the input image
dlIn = dlarray(in, 'SSC');
res = extractdata(predict(dlnet, dlIn));


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

I = in - res;
  

MEX 코드 생성 실행하기

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

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

생성된 MEX 실행하기

잡음 제거 신경망은 입력 범위가 [0,1]인 입력 영상에 대해 훈련되었습니다. noisyI에 대해 im2single (Image Processing Toolbox) 함수를 사용하여 값을 [0,255]에서 [0,1]로 다시 스케일링합니다. 다시 스케일링한 후 denoisenet_predict_predict를 사용하여 잡음이 제거된 영상 denoisedI를 얻습니다.

denoisedI = denoisenet_predict_mex(im2single(noisyI));

잡음이 제거된 영상 보기

잡음이 있는 원래 영상과 잡음이 제거된 영상을 나란히 표시합니다.

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

Figure contains an axes object. The hidden axes object with title Noisy Image (left) and Denoised Image (right) contains an object of type image.

참고 문헌

[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.

참고 항목

함수

객체

도움말 항목