exponenta event banner

Обнаружение и отслеживание лица с помощью алгоритма 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 по компьютерному зрению и распознаванию образов, 1994 год.

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