В этом примере показано, как автоматически обнаружить и отследить лицо.
Обнаружение объектов важны во многих приложениях компьютерного зрения, включая распознавание активности, безопасность автомобилей и наблюдение. В этом примере вы разработаете простую систему отслеживания лиц, разделив задачу отслеживания на три отдельные задачи:
Обнаружение лица для отслеживания
Идентифицируйте функции лица для отслеживания
Отследите лицо
Прежде чем вы начнете отслеживать лицо, необходимо сначала обнаружить его. Используйте 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');
Можно использовать каскадный детектор объектов для отслеживания лица через последующие видеокадры. Однако, когда лицо наклоняется или человек поворачивается головой, вы можете потерять отслеживание. Это ограничение связано с типом обученной классификационной модели, используемой для обнаружения. Чтобы избежать этой проблемы и потому, что выполнение обнаружения лиц для каждого видеокадра является вычислительно интенсивным, этот пример использует простую функцию лица для отслеживания.
Когда лицо находится в видео, следующий шаг - идентифицировать функцию, которая поможет вам отследить лицо. Например, можно использовать форму, текстуру или цвет. Выберите функцию, который является уникальным для объекта и остается инвариантным, даже когда объект перемещается.
В этом примере вы используете тон кожи в качестве функции для отслеживания. Тон кожи обеспечивает хороший контраст между лицом и фоном и не меняется, когда лицо вращается или перемещается.
Получите информацию о тоне кожи путем извлечения 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])
С тоном кожи, выбранным в качестве функции для отслеживания, вы теперь можете использовать 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.