HeadPose 특성 사용

이 가이드에서는 감지된 얼굴의 HeadPose 특성을 사용하여 몇 가지 주요 시나리오를 활성화하는 방법을 알아봅니다.

Important

얼굴 특성은 통계 알고리즘 사용을 통해 예측됩니다. 항상 정확하지는 않을 수 있습니다. 특성 데이터를 기준으로 결정을 내릴 때는 주의해야 합니다. 스푸핑 방지를 위해 이러한 특성을 사용하지 마십시오. 대신 Face Liveness 검색을 사용하는 것이 좋습니다. 자세한 내용은 자습서: 얼굴의 활동 감지를 참조하세요.

얼굴 사각형 회전

감지된 모든 얼굴과 함께 반환되는 얼굴 사각형은 이미지에 있는 얼굴의 위치와 크기를 표시합니다. 기본적으로 사각형은 항상 이미지와 맞춥니다(측면은 세로 및 가로임). 이는 기울어진 얼굴을 프레이밍하는 데 비효율적일 수 있습니다. 이미지에서 얼굴을 프로그래밍 방식으로 자르려면 사각형을 회전하여 자르는 것이 좋습니다.

Azure AI Face WPF(Windows Presentation Foundation) 샘플 앱은 HeadPose 특성을 사용하여 검색된 얼굴 직사각형을 회전합니다.

샘플 코드 탐색

HeadPose 특성을 사용하여 얼굴 사각형을 프로그래밍 방식으로 회전시킬 수 있습니다. 얼굴을 감지할 때 이 특성을 지정하면(검색 API 호출 참조) 나중에 이를 쿼리할 수 있습니다. Azure AI Face WPF 앱의 다음 메서드는 DetectedFace 개체 목록을 가져와서 Face 개체 목록을 반환합니다. 여기서 Face는 업데이트된 사각형 좌표를 포함하여 얼굴 데이터를 저장하는 사용자 지정 클래스입니다. top, left, widthheight에 대한 새 값이 계산되며, 새 FaceAngle 필드에서 회전을 지정합니다.

/// <summary>
/// Calculate the rendering face rectangle
/// </summary>
/// <param name="faces">Detected face from service</param>
/// <param name="maxSize">Image rendering size</param>
/// <param name="imageInfo">Image width and height</param>
/// <returns>Face structure for rendering</returns>
public static IEnumerable<Face> CalculateFaceRectangleForRendering(IList<DetectedFace> faces, int maxSize, Tuple<int, int> imageInfo)
{
    var imageWidth = imageInfo.Item1;
    var imageHeight = imageInfo.Item2;
    var ratio = (float)imageWidth / imageHeight;
    int uiWidth = 0;
    int uiHeight = 0;
    if (ratio > 1.0)
    {
        uiWidth = maxSize;
        uiHeight = (int)(maxSize / ratio);
    }
    else
    {
        uiHeight = maxSize;
        uiWidth = (int)(ratio * uiHeight);
    }

    var uiXOffset = (maxSize - uiWidth) / 2;
    var uiYOffset = (maxSize - uiHeight) / 2;
    var scale = (float)uiWidth / imageWidth;

    foreach (var face in faces)
    {
        var left = (int)(face.FaceRectangle.Left * scale + uiXOffset);
        var top = (int)(face.FaceRectangle.Top * scale + uiYOffset);

        // Angle of face rectangles, default value is 0 (not rotated).
        double faceAngle = 0;

        // If head pose attributes have been obtained, re-calculate the left & top (X & Y) positions.
        if (face.FaceAttributes?.HeadPose != null)
        {
            // Head pose's roll value acts directly as the face angle.
            faceAngle = face.FaceAttributes.HeadPose.Roll;
            var angleToPi = Math.Abs((faceAngle / 180) * Math.PI);

            // _____       | / \ |
            // |____|  =>  |/   /|
            //             | \ / |
            // Re-calculate the face rectangle's left & top (X & Y) positions.
            var newLeft = face.FaceRectangle.Left +
                face.FaceRectangle.Width / 2 -
                (face.FaceRectangle.Width * Math.Sin(angleToPi) + face.FaceRectangle.Height * Math.Cos(angleToPi)) / 2;

            var newTop = face.FaceRectangle.Top +
                face.FaceRectangle.Height / 2 -
                (face.FaceRectangle.Height * Math.Sin(angleToPi) + face.FaceRectangle.Width * Math.Cos(angleToPi)) / 2;

            left = (int)(newLeft * scale + uiXOffset);
            top = (int)(newTop * scale + uiYOffset);
        }

        yield return new Face()
        {
            FaceId = face.FaceId?.ToString(),
            Left = left,
            Top = top,
            OriginalLeft = (int)(face.FaceRectangle.Left * scale + uiXOffset),
            OriginalTop = (int)(face.FaceRectangle.Top * scale + uiYOffset),
            Height = (int)(face.FaceRectangle.Height * scale),
            Width = (int)(face.FaceRectangle.Width * scale),
            FaceAngle = faceAngle,
        };
    }
}

업데이트된 사각형 표시

여기서는 반환된 Face 개체를 표시에 사용할 수 있습니다. FaceDetectionPage.xaml의 다음 줄에서는 새 사각형이 이 데이터에서 렌더링되는 방법을 보여 줍니다.

 <DataTemplate>
    <Rectangle Width="{Binding Width}" Height="{Binding Height}" Stroke="#FF26B8F4" StrokeThickness="1">
        <Rectangle.LayoutTransform>
            <RotateTransform Angle="{Binding FaceAngle}"/>
        </Rectangle.LayoutTransform>
    </Rectangle>
</DataTemplate>

다음 단계

  • 회전된 얼굴 사각형에 대한 작업 예제는 GitHub의 Azure AI Face WPF 앱을 참조하세요.
  • 또는 HeadPose 특성을 실시간으로 추적하여 머리 움직임을 감지하는 Face HeadPose 샘플 앱을 참조하세요.