예: 이미지에서 얼굴을 감지하는 방법Example: How to Detect Faces in Image

이 가이드에서는 추출된 성별, 나이 또는 포즈와 같은 얼굴 특성이 포함된 이미지에서 얼굴을 감지하는 방법을 설명합니다.This guide will demonstrate how to detect faces from an image, with face attributes like gender, age, or pose extracted. 샘플은 Face API 클라이언트 라이브러리를 사용하여 C#에서 작성되었습니다.The samples are written in C# using the Face API client library.


이 가이드에서 다음 개념에 대해 익숙치 않다면 언제든지 용어집에 나와 있는 정의를 참조하세요.If you are not familiar with any of the following concepts in this guide, please refer to the definitions in our Glossary at any time:

  • 얼굴 감지Face detection
  • 얼굴 이정표Face landmarks
  • 머리 포즈Head pose
  • 얼굴 특성Face attributes


이 샘플에서는 다음과 같은 기능을 설명합니다.In this sample, we will demonstrate the following features:

  • 이미지에서 얼굴을 감지하고 사각형 프레이밍을 사용하도록 설정Detecting faces from an image, and marking them using rectangular framing
  • 눈동자, 코나 입의 위치를 분석한 다음, 이미지에서 표시Analyzing the locations of pupils, the nose or mouth, and then marking them in the image
  • 얼굴의 머리 포즈, 성별 및 나이를 분석Analyzing the head pose, gender and age of the face

이러한 기능을 실행하려면 선명한 얼굴이 하나 이상 포함된 이미지를 준비해야 합니다.In order to execute these features, you will need to prepare an image with at least one clear face.

1단계: API 호출 권한 부여Step 1: Authorize the API call

Face API를 호출할 때마다 구독 키가 필요합니다.Every call to the Face API requires a subscription key. 이 키는 쿼리 문자열 매개 변수를 통해 전달되거나 요청 헤더에서 지정되어야 합니다.This key needs to be either passed through a query string parameter, or specified in the request header. 쿼리 문자열을 통해 구독 키를 전달하려면 얼굴 - 감지에 대한 요청 URL을 참조하세요. 다음은 예제입니다.To pass the subscription key through query string, please refer to the request URL for the Face - Detect as an example:

&subscription-key=<Subscription Key>

또는 구독 키를 HTTP 요청 헤더에서 지정할 수도 있습니다. ocp-apim-subscription-key: <Subscription Key> 클라이언트 라이브러리를 사용할 경우 구독 키가 FaceServiceClient 클래스의 생성자를 통해 전달됩니다.As an alternative, the subscription key can also be specified in the HTTP request header: ocp-apim-subscription-key: <Subscription Key> When using a client library, the subscription key is passed in through the constructor of the FaceServiceClient class. 예: For example:

faceServiceClient = new FaceServiceClient("<Subscription Key>");

2단계: 서비스에 이미지를 업로드하고 얼굴 감지를 실행Step 2: Upload an image to the service and execute face detection

얼굴 감지를 수행하는 가장 기본적인 방법은 직접 이미지를 업로드하는 것입니다.The most basic way to perform face detection is by uploading an image directly. JPEG 이미지에서 읽은 데이터와 함께 응용 프로그램/옥텟 스트림 콘텐츠 형식으로 “POST” 요청을 보내 수행합니다.This is done by sending a "POST" request with application/octet-stream content type, with the data read from a JPEG image. 이미지의 최대 크기는 4MB입니다.The maximum size of the image is 4 MB.

클라이언트 라이브러리를 사용하면 업로드를 통한 얼굴 감지는 스트리밍 개체를 전달하여 수행됩니다.Using the client library, face detection by means of uploading is done by passing in a Stream object. 아래 예제를 참조하세요.See the example below:

using (Stream s = File.OpenRead(@"D:\MyPictures\image1.jpg"))
    var faces = await faceServiceClient.DetectAsync(s, true, true);

    foreach (var face in faces)
        var rect = face.FaceRectangle;
        var landmarks = face.FaceLandmarks;

FaceServiceClient의 DetectAsync 메서드가 비동기임을 확인하세요.Note that the DetectAsync method of FaceServiceClient is async. await 절을 사용하려면 호출 메서드도 비동기로 표시되어야 합니다.The calling method should be marked as async as well, in order to use the await clause. 이미지가 이미 웹에 있고 URL이 있는 경우 URL을 제공하여 얼굴 감지를 실행할 수 있습니다.If the image is already on the web and has a URL, face detection can be executed by also providing the URL. 이 예제에서 요청 본문은 URL이 포함된 JSON 문자열입니다.In this example, the request body will be a JSON string, which contains the URL. 클라이언트 라이브러리를 사용하면 URL를 통한 얼굴 감지를 DetectAsync 메서드의 다른 오버로드를 사용하여 쉽게 실행할 수 있습니다.Using the client library, face detection by means of a URL can be executed easily using another overload of the DetectAsync method.

string imageUrl = "http://news.microsoft.com/ceo/assets/photos/06_web.jpg";
var faces = await faceServiceClient.DetectAsync(imageUrl, true, true);

foreach (var face in faces)
    var rect = face.FaceRectangle;
    var landmarks = face.FaceLandmarks;

감지된 얼굴과 함께 반환되는 FaceRectangle 속성은 기본적으로 얼굴에서의 위치(픽셀)입니다.The FaceRectangle property that is returned with detected faces is essentially locations on the face in pixels. 보통 이 사각형에는 눈, 눈썹, 코 및 입이 포함됩니다. 머리의 맨 윗부분, 귀, 턱은 포함되지 않습니다.Usually, this rectangle contains the eyes, eyebrows, the nose, and the mouth –the top of head, ears, and the chin are not included. 전체 머리 또는 중간 인물 사진을 자르는 경우(사진 ID 유형 이미지) 일부 응용 프로그램에 사용하기에 얼굴 영역이 너무 작을 수 있으므로 사각형의 얼굴 프레임 영역을 확대할 수 있습니다.If you crop a complete head or mid-shot portrait (a photo ID type image), you may want to expand the area of the rectangular face frame because the area of the face may be too small for some applications. 얼굴의 위치를 더 정확하게 찾기 위해서는 다음 섹션에 설명되어 있는 얼굴 이정표를 사용(얼굴 특징 또는 얼굴 방향 찾기 메커니즘)하는 것이 유용합니다.To locate a face more precisely, using face landmarks (locate face features or face direction mechanisms) described in the next section will prove to be useful.

3단계: 얼굴 이정표에 대한 이해 및 사용Step 3: Understanding and using face landmarks

얼굴 이정표는 얼굴에서의 일련의 세부 지점입니다(일반적으로 얼굴의 지점은 눈동자, 안각 또는 코).Face landmarks are a series of detailed points on a face; typically points of face components like the pupils, canthus, or nose. 얼굴 이정표는 얼굴을 감지하는 동안 분석할 수 있는 선택적 특성입니다.Face landmarks are optional attributes that can be analyzed during face detection. 감지 결과에 얼굴 이정표를 포함시키려면 Face - Detect를 호출할 때 ‘true’를 returnFaceLandmarks 쿼리 매개 변수에 부울 값으로 전달하거나, FaceServiceClient 클래스 DetectAsync 메서드에 대해 returnFaceLandmarks 선택적 매개 변수를 사용합니다.You can either pass 'true' as a Boolean value to the returnFaceLandmarks query parameter when calling the Face - Detect, or use the returnFaceLandmarks optional parameter for the FaceServiceClient class DetectAsync method in order to include the face landmarks in the detection results.

기본적으로 27개의 이정표 지점이 사전 정의되어 있습니다.By default, there are 27 predefined landmark points. 정의된 27개의 모든 지점이 다음 그림에 나와 있습니다.The following figure shows how all 27 points are defined:


얼굴 사각형 프레임과 마찬가지로 반환되는 지점은 픽셀 단위입니다.The points returned are in units of pixels, just like the face rectangular frame. 따라서 이미지에서 특정한 관심 지점을 더 손쉽게 표시할 수 있습니다.Therefore making it easier to mark specific points of interest in the image. 다음 코드는 코와 눈동자의 위치를 검색하는 방법을 보여 줍니다.The following code demonstrates retrieving the locations of the nose and pupils:

var faces = await faceServiceClient.DetectAsync(imageUrl, returnFaceLandmarks:true);

foreach (var face in faces)
    var rect = face.FaceRectangle;
    var landmarks = face.FaceLandmarks;

    double noseX = landmarks.NoseTip.X;
    double noseY = landmarks.NoseTip.Y;

    double leftPupilX = landmarks.PupilLeft.X;
    double leftPupilY = landmarks.PupilLeft.Y;

    double rightPupilX = landmarks.PupilRight.X;
    double rightPupilY = landmarks.PupilRight.Y;

얼굴 이정표는 이미지의 얼굴 특성을 표시할 뿐만 아니라, 얼굴의 방향을 정확히 계산하는 데도 사용할 수 있습니다.In addition to marking face features in an image, face landmarks can also be used to accurately calculate the direction of the face. 예를 들어 얼굴의 방향을 입의 가운데부터 눈동자의 가운데까지 벡터로 정의할 수 있습니다.For example, we can define the direction of the face as a vector from the center of the mouth to the center of the eyes. 아래 코드에서는 이를 자세히 설명합니다.The code below explains this in detail:

var landmarks = face.FaceLandmarks;

var upperLipBottom = landmarks.UpperLipBottom;
var underLipTop = landmarks.UnderLipTop;

var centerOfMouth = new Point(
    (upperLipBottom.X + underLipTop.X) / 2,
    (upperLipBottom.Y + underLipTop.Y) / 2);

var eyeLeftInner = landmarks.EyeLeftInner;
var eyeRightInner = landmarks.EyeRightInner;

var centerOfTwoEyes = new Point(
    (eyeLeftInner.X + eyeRightInner.X) / 2,
    (eyeLeftInner.Y + eyeRightInner.Y) / 2);

Vector faceDirection = new Vector(
    centerOfTwoEyes.X - centerOfMouth.X,
    centerOfTwoEyes.Y - centerOfMouth.Y);

얼굴이 있는 방향을 알고 있으면 얼굴에 맞춰 사각형 얼굴 프레임을 회전할 수 있습니다.By knowing the direction that the face is in, you can then rotate the rectangular face frame to align it with the face. 얼굴 이정표를 사용하면 확실히 더 많은 세부 정보 및 유용성을 제공할 수 있습니다.It is clear that using face landmarks can provide more detail and utility.

4단계: 다른 얼굴 특성 사용Step 4: Using other face attributes

얼굴 이정표 외에, Face – Detect API는 얼굴에서 다른 여러 특성을 분석할 수도 있습니다.Besides face landmarks, Face – Detect API can also analyze several other attributes on a face. 이러한 특성에는 다음이 포함됩니다.These attributes include:

  • AgeAge
  • 성별Gender
  • 웃는 정도Smile intensity
  • 얼굴의 털Facial hair
  • 3D 머리 포즈A 3D head pose

이러한 특성은 통계 알고리즘을 사용하여 예측할 수 있으나, 항상 100% 정확하지 않을 수도 있습니다.These attributes are predicted by using statistical algorithms and may not always be 100% precise. 그러나 이러한 특성으로 얼굴을 분류하려는 경우에는 여전히 유용합니다.However, they are still helpful when you want to classify faces by these attributes. 각 특성에 대한 자세한 내용은 용어집을 참조하세요.For more information about each of the attributes, please refer to the Glossary.

다음은 얼굴을 감지하는 동안 얼굴 특성을 추출하는 간단한 예제입니다.Below is a simple example of extracting face attributes during face detection:

var requiredFaceAttributes = new FaceAttributeType[] {
var faces = await faceServiceClient.DetectAsync(imageUrl,
    returnFaceLandmarks: true,
    returnFaceAttributes: requiredFaceAttributes);

foreach (var face in faces)
    var id = face.FaceId;
    var attributes = face.FaceAttributes;
    var age = attributes.Age;
    var gender = attributes.Gender;
    var smile = attributes.Smile;
    var facialHair = attributes.FacialHair;
    var headPose = attributes.HeadPose;
    var glasses = attributes.Glasses;


이 가이드에서는 Face - Detect API의 기능, 로컬 업로드된 이미지 또는 웹에 있는 이미지 URL에 대한 얼굴을 감지하는 방법, 사각형 얼굴 프레임을 반환하여 얼굴을 감지하는 방법, 얼굴 이정표, 3D 머리 포즈 및 다른 얼굴 특성을 분석하는 방법에 대해 알아보았습니다.In this guide you have learned the functionalities of Face - Detect API, how it can detect faces for local uploaded images or image URLs on the web; how it can detect faces by returning rectangular face frames; and how it can also analyze face landmarks, 3D head poses and other face attributes as well.

API 세부 사항에 대한 자세한 내용은 Face - Detect에 대한 API 참조 가이드를 참조하세요.For more information about API details, please refer to the API reference guide for Face - Detect.

이미지에서 얼굴을 식별하는 방법How to Identify Faces in Image