exponenta event banner

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

В этом примере показано, как автоматически обнаруживать и отслеживать грань.

Введение

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

  1. Обнаружение грани для отслеживания

  2. Определение элементов лица для отслеживания

  3. Отслеживать лицо

Шаг 1: Определение грани для отслеживания

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

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

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

% Draw the returned bounding box around the detected face.
videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face');
figure, imshow(videoOut), title('Detected face');

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

Шаг 2: Определение функций лица для отслеживания

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

В этом примере для отслеживания используется тон темы оформления. Тон кожи обеспечивает большой контраст между лицом и фоном и не изменяется при вращении или движении лица.

Получение информации о тоне кожи путем извлечения тона из видеокадра, преобразованного в цветовое пространство HSV.

[hueChannel,~,~] = rgb2hsv(videoFrame);

% Display the Hue Channel data and draw the bounding box around the face.
figure, imshow(hueChannel), title('Hue channel data');
rectangle('Position',bbox(1,:),'LineWidth',2,'EdgeColor',[1 1 0])

Шаг 3: Отслеживание лица

После выбора тона темы оформления в качестве функции для отслеживания теперь можно использовать vision.HistogramBasedTracker для отслеживания. Трекер на основе гистограммы использует алгоритм CAMShift, который обеспечивает возможность отслеживания объекта с использованием гистограммы значений пикселей. В этом примере пиксели канала Hue извлекаются из области носа обнаруженной грани. Эти пиксели используются для инициализации гистограммы для трекера. Пример отслеживает объект по последовательным видеокадрам с использованием этой гистограммы.

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

noseDetector = vision.CascadeObjectDetector('Nose', 'UseROI', true);
noseBBox     = step(noseDetector, videoFrame, bbox(1,:));

% Create a tracker object.
tracker = vision.HistogramBasedTracker;

% Initialize the tracker histogram using the Hue channel pixels from the
% nose.
initializeObject(tracker, hueChannel, noseBBox(1,:));

% Create a video player object for displaying video frames.
videoPlayer  = vision.VideoPlayer;

% Track the face over successive video frames until the video is finished.
while hasFrame(videoFileReader)

    % Extract the next video frame
    videoFrame = readFrame(videoFileReader);

    % RGB -> HSV
    [hueChannel,~,~] = rgb2hsv(videoFrame);

    % Track using the Hue channel data
    bbox = step(tracker, hueChannel);

    % Insert a bounding box around the object being tracked
    videoOut = insertObjectAnnotation(videoFrame,'rectangle',bbox,'Face');

    % Display the annotated video frame using the video player object
    step(videoPlayer, videoOut);

end

% Release resources
release(videoPlayer);

Резюме

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

Ссылка

[1] Г. Р. Брадски «Отслеживание лица и объекта в реальном времени как компонент перцептивного пользовательского интерфейса», материалы 4-го семинара IEEE по применению компьютерного зрения, 1998.

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