Main Content

SURF를 사용하여 특징 추출하기

SURF(Speeded-Up Robust Features)를 사용한 객체 인식은 특징 추출, 특징 설명, 특징 매칭이라는 세 단계로 구성됩니다. 이 예제에서는 SURF 알고리즘의 첫 번째 단계인 특징 추출을 수행합니다. 여기서 사용된 알고리즘은 OpenSURF 라이브러리 구현을 기반으로 합니다. 이 예제에서는 GPU Coder™를 사용하여 CUDA® 코드 생성을 통해 이 연산 집약적인 문제를 푸는 방법을 보여줍니다.

타사 선행 조건

필수

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

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

선택 사항

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

GPU 환경 확인하기

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

envCfg = coder.gpuEnvConfig('host');
envCfg.BasicCodegen = 1;
envCfg.Quiet = 1;
coder.checkGpuInstall(envCfg);

특징 추출

특징 추출은 모든 객체 인식 알고리즘의 기본 단계입니다. 입력 영상에서 특징이라고 하는 유용한 정보를 추출하는 과정을 말합니다. 추출된 특징은 본질적으로 대표적이어야 하며, 영상의 중요하고 고유한 특성을 담고 있어야 합니다.

SurfDetect.m 함수는 특징 추출을 수행하는 메인 진입점 함수입니다. 이 함수는 8비트 RGB 또는 8비트 회색조 영상을 입력값으로 받습니다. 반환되는 출력값은 추출된 관심점으로 구성된 배열입니다. 이 함수는 GPU 병렬화에 적합한 계산을 포함하는, 다음과 같은 함수 호출로 구성됩니다.

  • Convert32bitFPGray.m 함수는 8비트 RGB 영상을 8비트 회색조 영상으로 변환합니다. 제공된 입력값이 이미 8비트 회색조 형식인 경우 이 단계를 건너뜁니다. 이 단계가 완료되면 GPU에서 빠른 계산이 가능하도록 8비트 회색조 영상이 32비트 부동소수점 표현으로 변환됩니다.

  • MyIntegralImage.m 함수는 이전 단계에서 얻은 32비트 부동소수점 회색조 영상의 적분 영상을 계산합니다. 적분 영상은 영상의 직사각형 영역 내에 포함된 픽셀의 합을 구하는 과정을 단순화하는 데 유용합니다. 픽셀의 합을 구하면 다음 단계에서 수행되는 컨벌루션의 속도를 개선하는 데 도움이 됩니다.

  • FastHessian.m 함수는 다양한 크기의 상자 필터로 영상에 대한 컨벌루션을 수행하고 계산된 응답을 저장합니다. 이 예제에서는 다음 파라미터를 사용합니다.

    Number of Octaves: 5
    Number of Intervals: 4
    Threshold: 0.0004
    
    Filter Sizes: Octave 1 -  9,  15,  21,  27
                  Octave 2 - 15,  27,  39,  51
                  Octave 3 - 27,  51,  75,  99
                  Octave 4 - 51,  99, 147, 195
                  Octave 5 - 99, 195, 291, 387
  • NonMaxSuppression.m 함수는 NMS(Non-Maximal Suppression, 비최댓값 억제)를 수행하여 앞서 얻은 응답에서 유용한 관심점만 필터링합니다.

  • OrientationCalc.m 함수는 방향을 계산한 후 이전 단계에서 얻은 관심점에 할당합니다.

최종 결과는 관심점으로 구성된 배열이며, 관심점은 다음 필드로 구성된 구조체입니다.

x, y (coordinates), scale, orientation, Laplacian

입력 영상 읽어 들이기

imread 함수를 사용하여 입력 영상을 MATLAB으로 읽어 들입니다.

imageFile = 'peppers.png';
inputImage = imread(imageFile);
imshow(inputImage);

함수에 대한 CUDA MEX 생성하기

SurfDetect 함수에 대한 CUDA MEX를 생성하기 위해 GPU Coder 구성 객체를 생성한 다음 codegen 함수를 실행합니다.

cfg = coder.gpuConfig('mex');
codegen -config cfg SurfDetect -args {inputImage}
Code generation successful: View report

MATLAB 및 GPU에서 SURF 검출 실행하기

MATLAB에서 SurfDetect를 실행합니다.

disp('Running SURF Detection on MATLAB...');
Running SURF Detection on MATLAB...
tic;
interestPoints = SurfDetect(inputImage);
execTime = toc;
fprintf('Found %d SURF interest points in %f seconds.\n',length(interestPoints),execTime);
Found 249 SURF interest points in 7.777913 seconds.

생성된 MEX 함수 SurfDetect_mex를 호출하여 GPU에서 실행합니다.

disp('Running GPU Coder SURF');
Running GPU Coder SURF
tic;
interestPointsGPU = SurfDetect_mex(inputImage);
execTime = toc;
fprintf('GPU Coder SURF found %d interest points in %f seconds.\n',length(interestPointsGPU),execTime);
GPU Coder SURF found 249 interest points in 0.436629 seconds.

추출된 관심점 표시하기

출력값 interestPointsGPU는 추출된 관심점으로 구성된 배열입니다. 이러한 관심점은 Figure 창에서 입력 영상 위에 표시됩니다.

DrawIpoints(imageFile, interestPointsGPU);

참고 문헌

[1] Notes on the OpenSURF Library by Christopher Evans.

[2] Bay, H., A. Ess, T. Tuytelaars, and L. Van Gool. "SURF:Speeded Up Robust Features." Computer Vision and Image Understanding (CVIU).Vol. 110, No. 3, pp. 346-359, 2008.

참고 항목

함수

객체

관련 항목