주요 콘텐츠

KLT 알고리즘을 사용한 얼굴 검출 및 추적

이 예제에서는 특징점을 사용하여 얼굴을 자동으로 검출하고 추적하는 방법을 보여줍니다. 이 예제의 방식은 사람이 머리를 기울이거나 카메라를 향해 오거나 멀어지는 경우에도 얼굴을 계속 추적합니다.

소개

객체 검출과 추적은 행동 인식, 자동차 안전, 감시 등을 비롯하여 많은 컴퓨터 비전 응용 분야에서 중요한 작업입니다. 이 예제에서는 추적 문제를 3개의 부분으로 나누어 간단한 얼굴 추적 시스템을 개발합니다.

  1. 얼굴 검출

  2. 추적할 얼굴 특징 식별

  3. 얼굴 추적

이 예제에서는 실시간 응용 사례에 적합한 기본적인 특징 기반 추적 알고리즘을 수행하지만, 객체 가림(occlusion)이 요인이 되는 더 복잡한 시나리오에서는 성능이 빠르게 저하될 수 있습니다. 더 높은 정확도와 강인성을 갖추어 복잡한 시나리오에서도 이 문제를 극복할 수 있는 추적 알고리즘을 구현하는 방법을 알아보려면 Multi-Object Tracking with DeepSORT (Sensor Fusion and Tracking Toolbox) 예제를 참조하십시오.

얼굴 검출하기

먼저 얼굴을 검출해야 합니다. VideoReader를 사용하여 영상을 불러온 다음, 비디오 프레임 크기를 사용하여 faceDetector 신경망 객체를 만듭니다.

WIDER FACE 데이터 세트에 대해 사전 훈련된 faceDetector 검출 신경망을 사용하려면, 애드온 탐색기에서 Computer Vision Toolbox Model for RetinaFace Face Detection 지원 패키지를 다운로드하여 설치해야 합니다. 애드온 설치에 대한 자세한 내용은 애드온을 받고 관리하기를 참조하십시오. 이 함수를 실행하려면 Deep Learning Toolbox™가 필요합니다.

v = VideoReader("tilted_face.avi");
frameSize = [v.Height v.Width];
detector = faceDetector("small-network", InputSize=frameSize);

faceDetector를 사용하여 첫 번째 비디오 프레임에서 얼굴의 위치를 검출하고 showShape를 사용하여 검출된 얼굴을 표시합니다.

frame = readFrame(v);
bbox = detect(detector, frame);

figure;
imshow(frame);
title("Detected face");
showShape("rectangle",bbox);

Figure contains an axes object. The hidden axes object with title Detected face contains an object of type image.

이 예제에서는 시간 경과에 따라 얼굴을 추적하기 위해 KLT(Kanade-Lucas-Tomasi) 알고리즘을 사용합니다. faceDetector 객체 검출기를 모든 프레임에서 사용하는 것도 가능하지만 많은 계산량을 필요로 합니다. 피사체가 머리를 돌리거나 기울이면 얼굴을 검출하지 못할 수도 있습니다. 이 예제에서는 얼굴을 한 번만 검출하며, 그런 다음 KLT 알고리즘이 비디오 프레임 전체에서 얼굴을 추적합니다.

추적할 얼굴 특징 식별하기

faceDetector가 얼굴을 찾으면, detectSIFTFeatures 함수를 사용하여 얼굴 영역 내에서 안정적으로 추적할 수 있는 특징점을 식별합니다. 그런 다음, KLT 알고리즘을 사용하여 연속적인 비디오 프레임 전체에서 해당 특징점을 추적합니다.

얼굴 영역에서 특징점을 검출하고 plot을 사용하여 표시합니다.

points = detectSIFTFeatures(im2gray(frame), ROI=bbox);

figure;
imshow(frame);
hold on;
title("Detected features");
plot(points,ShowScale=false);
hold off;

Figure contains an axes object. The hidden axes object with title Detected features contains 2 objects of type image, line. One or more of the lines displays its values using only markers

추적기를 초기화하여 점 추적하기

특징점이 식별되면 이제 vision.PointTracker System object를 사용하여 이를 추적할 수 있습니다. 점 추적기는 이전 프레임의 각 점에 대해 현재 프레임에서 대응점을 찾으려고 시도합니다. 그런 다음 estgeotform2d 함수를 사용하여 이전 점과 새 점 간의 평행 이동, 회전, 스케일을 추정합니다. 이 변환은 얼굴을 둘러싸는 경계 상자에 적용됩니다.

점 추적기를 만들고 양방향 오차 제약 조건을 활성화하여 잡음이 있고 지저분할 때 더욱 견고해 지도록 합니다. 초기점 위치와 초기 비디오 프레임을 사용하여 추적기를 초기화합니다.

pointTracker = vision.PointTracker(MaxBidirectionalError=2);
points = points.Location;
initialize(pointTracker, points, frame);

얼굴 추적하기

검출된 얼굴을 둘러싸는 경계 상자에 해당하는 네 개의 코너 점을 가져옵니다. 이를 사용하여 KLT 알고리즘이 연속적인 비디오 프레임에서 새로운 대응점을 찾는 과정에서 경계 상자의 회전을 시각화합니다.

bboxPoints = bbox2points(bbox(1,:));

프레임 간에 점을 추적하고 estgeotform2d 함수를 사용하여 얼굴의 움직임을 추정합니다.

이전 프레임의 점과 현재 프레임의 점 사이의 기하 변환을 계산하는 데 사용할 점의 복사본을 만듭니다.

oldPoints = points;

while hasFrame(v)
    % Get the next frame.
    frame = readFrame(v);

    % Track the points. Note that some points may be lost.
    [points, isFound] = step(pointTracker, frame);
    visiblePoints = points(isFound, :);
    oldInliers = oldPoints(isFound, :);
    
    if size(visiblePoints, 1) >= 2 % At least 2 points are needed.
        
        % Estimate the geometric transformation between the old points
        % and the new points and eliminate outliers.
        [xform, inlierIdx] = estgeotform2d(oldInliers, visiblePoints, "similarity", MaxDistance=4);
        oldInliers    = oldInliers(inlierIdx, :);
        visiblePoints = visiblePoints(inlierIdx, :);
        
        % Apply the transformation to the bounding box points
        bboxPoints = transformPointsForward(xform, bboxPoints);

        % Reset the points
        oldPoints = visiblePoints;
        setPoints(pointTracker, oldPoints);
    end
    
    % Display the annotated video frame using the video player object
    imshow(frame);
    hold on;
    plot(visiblePoints(:,1), visiblePoints(:,2), "+", Color="white");
    bboxPolygon = reshape(bboxPoints', 1, []);
    showShape("polygon",bboxPolygon);
    hold off;
end

Figure contains an axes object. The hidden axes object contains 2 objects of type image, line. One or more of the lines displays its values using only markers

% Clean up the point tracker system object.
release(pointTracker);

요약

이 예제에서는 하나의 얼굴을 자동으로 검출하고 추적하는 간단한 얼굴 추적 시스템을 구축했습니다. 다른 입력 비디오를 사용하여 알고리즘이 여전히 얼굴을 추적할 수 있는지 확인해 보십시오. 최상의 결과를 얻으려면, 효과적인 검출을 위해 초기 프레임에서 사람이 카메라를 바라보도록 하십시오.

단일 객체 추적과 같은 간단한 추적 작업에서는 KLT(Kanade-Lucas-Tomasi) 알고리즘이 효과적인 경우가 많습니다. 그러나 여러 객체가 나타났다가 사라지거나 서로 교차하는 등 시나리오가 복잡해질수록 KLT는 정확한 추적을 유지하는 데 어려움을 겪을 수 있습니다. 이러한 경우 여러 객체의 추적을 관리하고, 추적 할당을 처리하며, 시간 경과에 따라 추적 대상의 식별을 유지해야 합니다.

이러한 어려움을 해결하기 위해 MATLAB은 다중 객체 추적기 (Sensor Fusion and Tracking Toolbox)를 제공하며, 이는 다중 객체 추적 및 추적 관리를 위한 고급 툴을 제공합니다. 딥러닝을 사용하여 여러 객체를 추적하고 복잡한 시나리오를 처리할 수 있는 방법을 보려면 Multi-Object Tracking with DeepSORT 예제를 살펴보십시오.

참고 문헌

Bruce D. Lucas and Takeo Kanade. An Iterative Image Registration Technique with an Application to Stereo Vision. International Joint Conference on Artificial Intelligence, 1981.

Carlo Tomasi and Takeo Kanade. Detection and Tracking of Point Features. Carnegie Mellon University Technical Report CMU-CS-91-132, 1991.

Lowe, David G.. "Distinctive Image Features from Scale-Invariant Keypoints." Int. J. Comput. Vision 60, no. 2 (2004): 91--110.

Zdenek Kalal, Krystian Mikolajczyk and Jiri Matas. Forward-Backward Error: Automatic Detection of Tracking Failures. International Conference on Pattern Recognition, 2010