Обнаружение и отслеживание лиц с помощью 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: Идентифицируйте функции лица для отслеживания

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

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

Получите информацию о тоне кожи путем извлечения Hue из видеокадра, преобразованного в цветовое пространство 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);

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

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

Ссылка

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

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