Обнаружение и отслеживание лиц с помощью алгоритма KLT

В этом примере показано, как автоматически обнаружить и отследить грань с помощью точек функции. Подход в этом примере отслеживает лицо, даже когда человек наклоняет голову или движется к или от камеры.

Введение

Обнаружение объектов важны во многих приложениях компьютерного зрения, включая распознавание активности, безопасность автомобилей и наблюдение. В этом примере вы разработаете простую систему отслеживания лиц, разделив задачу отслеживания на три части:

  1. Обнаружение лица

  2. Идентифицируйте функции лица для отслеживания

  3. Отследите лицо

Обнаружение грани

Во-первых, вы должны обнаружить лицо. Используйте vision.CascadeObjectDetector объект для обнаружения местоположения лица в видеокадре. Каскадный детектор объектов использует алгоритм обнаружения Виолы-Джонса и обученную классификационную модель для обнаружения. По умолчанию детектор сконфигурирован для обнаружения граней, но может использоваться для обнаружения других типов объектов.

% Create a cascade detector object.
faceDetector = vision.CascadeObjectDetector();

% Read a video frame and run the face detector.
videoReader = VideoReader('tilted_face.avi');
videoFrame      = readFrame(videoReader);
bbox            = step(faceDetector, videoFrame);

% Draw the returned bounding box around the detected face.
videoFrame = insertShape(videoFrame, 'Rectangle', bbox);
figure; imshow(videoFrame); title('Detected face');

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

% Convert the first box into a list of 4 points
% This is needed to be able to visualize the rotation of the object.
bboxPoints = bbox2points(bbox(1, :));

Чтобы отслеживать лицо с течением времени, этот пример использует алгоритм Канаде-Лукаса-Томази (KLT). Хотя возможно использовать каскадный детектор объектов на каждой системе координат, он является вычислительно дорогим. Он также может не обнаружить лицо, когда субъект поворачивается или наклоняет голову. Это ограничение связано с типом обученной классификационной модели, используемой для обнаружения. Пример обнаруживает лицо только один раз, и затем алгоритм KLT отслеживает лицо через видеокадры.

Идентифицируйте функции лица для отслеживания

Алгоритм KLT отслеживает набор функции точек по видеокадрам. Когда обнаружение определяет местоположение грани, следующий шаг в примере идентифицирует точки функции, которые могут быть надежно отслежены. Этот пример использует стандарт, «хорошие функции для отслеживания», предложенный Ши и Томази.

Обнаружите функцию точки в области лица.

points = detectMinEigenFeatures(rgb2gray(videoFrame), 'ROI', bbox);

% Display the detected points.
figure, imshow(videoFrame), hold on, title('Detected features');
plot(points);

Figure contains an axes. The axes with title Detected features contains 2 objects of type image, line.

Инициализируйте трекер для отслеживания точек

С идентифицированными точками функции теперь можно использовать vision.PointTracker Системный объект для их отслеживания. Для каждой точки в предыдущей системе координат трекер точек пытается найти соответствующую точку в текущей системе координат. Затем estimateGeometricTransform2D функция используется для оценки перемещения, поворота и шкалы между старыми точками и новыми точками. Это преобразование применяется к ограничивающему прямоугольнику вокруг грани.

Создайте трекер точек и включите ограничение двунаправленной ошибки, чтобы сделать его более устойчивым при наличии шума и загромождения.

pointTracker = vision.PointTracker('MaxBidirectionalError', 2);

% Initialize the tracker with the initial point locations and the initial
% video frame.
points = points.Location;
initialize(pointTracker, points, videoFrame);

Инициализация видеоплеера для отображения результатов

Создайте объект видеоплеера для отображения видеокадров.

videoPlayer  = vision.VideoPlayer('Position',...
    [100 100 [size(videoFrame, 2), size(videoFrame, 1)]+30]);

Отследите лицо

Отслеживайте точки из системы координат в систему координат и используйте estimateGeometricTransform2D функция для оценки движения лица.

Создайте копию точек, которые будут использоваться для вычисления геометрического преобразования между точками в предыдущей и текущей системах координат

oldPoints = points;

while hasFrame(videoReader)
    % get the next frame
    videoFrame = readFrame(videoReader);

    % Track the points. Note that some points may be lost.
    [points, isFound] = step(pointTracker, videoFrame);
    visiblePoints = points(isFound, :);
    oldInliers = oldPoints(isFound, :);
    
    if size(visiblePoints, 1) >= 2 % need at least 2 points
        
        % Estimate the geometric transformation between the old points
        % and the new points and eliminate outliers
        [xform, inlierIdx] = estimateGeometricTransform2D(...
            oldInliers, visiblePoints, 'similarity', 'MaxDistance', 4);
        oldInliers    = oldInliers(inlierIdx, :);
        visiblePoints = visiblePoints(inlierIdx, :);
        
        % Apply the transformation to the bounding box points
        bboxPoints = transformPointsForward(xform, bboxPoints);
                
        % Insert a bounding box around the object being tracked
        bboxPolygon = reshape(bboxPoints', 1, []);
        videoFrame = insertShape(videoFrame, 'Polygon', bboxPolygon, ...
            'LineWidth', 2);
                
        % Display tracked points
        videoFrame = insertMarker(videoFrame, visiblePoints, '+', ...
            'Color', 'white');       
        
        % Reset the points
        oldPoints = visiblePoints;
        setPoints(pointTracker, oldPoints);        
    end
    
    % Display the annotated video frame using the video player object
    step(videoPlayer, videoFrame);
end

% Clean up
release(videoPlayer);

Figure Video Player contains an axes and other objects of type uiflowcontainer, uimenu, uitoolbar. The axes contains an object of type image.

release(pointTracker);

Сводные данные

В этом примере вы создали простую систему отслеживания лиц, которая автоматически обнаруживает и отслеживает одну грань. Попробуйте изменить вход видео и увидеть, сможете ли вы все еще обнаружить и отследить лицо. Убедитесь, что человек обращен к камере в начальной системе координат для шага обнаружения.

Ссылки

Виола, Пол А. и Джонс, Майкл Дж. «Быстрое обнаружение объектов с использованием усиленного каскада простых функций», IEEE CVPR, 2001.

Брюс Д. Лукас и Такео Канаде. Итерационный метод регистрации изображений с приложением к видению стерео. Международная совместная конференция по искусственному интеллекту, 1981 год.

Карло Томази и Такео Канаде. Обнаружение и отслеживание функций точки. Технический доклад Университета Карнеги-Меллона CMU-CS-91-132, 1991 год.

Цзяньбо Ши и Карло Томази. Хорошие функции для отслеживания. IEEE Conference on Компьютерное Зрение and Pattern Recognition, 1994.

Зденек Калал, Крыстиан Миколайчик и Иржи Матас. Прямая-обратная ошибка: автоматическое обнаружение отказов отслеживания. Международная конференция по распознаванию шаблонов, 2010 год