본문 바로가기
C#

[C#] - Microsoft Emotion API

by CHML 2016. 10. 5.
1. API 소개

최근 마이크로소프트는 컴퓨터 비전, 음성 인식, 언어 분석 등의 기능을 Cognitive Services라는 이름으로 제공하고 있다. 마이크로소프트의 Cognitive Services는 일정 제약 조건 하에서 무료로 이용해볼 수 있으며, C# 및 Java, JavaScript, PHP, Python 등의 다양한 언어로 API를 이용할 수 있다.

이 글에서 소개하는 것은 Cognitive Services에서 제공하는 Emotion API이다. Emotion API는 사진을 입력받아서 사진에 나타나는 인물들의 감정을 분석하는 기능을 제공한다. Emotion API는 사진에 나타나는 모든 인물들의 감정을 아래와 같은 8가지의 감정으로 분석하여 JSON 형태의 결과값으로 반환한다.


  • anger (화남)
  • contempt (경멸)
  • disgust (혐오)
  • fear (두려움)
  • happiness (행복)
  • neutral (무감정)
  • sadness (슬픔)
  • surprise (놀라움)


각각의 값은 0 ~ 1의 실수값을 갖고 있으며, 모든 감정의 합은 1이다. 가장 높은 값을 갖는 감정을 해당 인물이 갖고 있는 감정이라고 해석할 수 있다.


2. API 키 발급

Emotion API를 이용하기 위해서는 먼저 API 키를 발급받아야 한다. 먼저, https://www.microsoft.com/cognitive-services에 접속하여 마이크로소프트 계정으로 로그인한다. 그 다음, [그림 1]과 같이 "Get started for free"를 클릭한다.


[그림 1] Cognitive Service의 메인 페이지


이동된 페이지에서 아래의 [그림 2]와 같이 "Let's go" 버튼을 클릭한다.


[그림 2] API 키 발급 화면 1


그 다음, [그림 3]과 같은 화면에서 "Emotion - Preview" 항목을 선택한다.


[그림 3] API 키 발급 화면 2


[그림 3]과 같은 페이지의 하단에 위치한 [그림 4]에서 "I agree to the Microsoft Cognitive Services Terms and Microsoft Privacy Statement."를 체크하고, "Subscribe" 버튼을 클릭하면 API 키 발급이 완료된다.


[그림 4] API 키 발급 화면 3


API 키의 발급이 완료되면 [그림 5]와 같은 화면으로 이동하며, 실제로 API 인증에 이용되는 키는 두 번째에 위치한 "Key 2"이다. 키 값은 "Show" 버튼을 클릭하면 볼 수 있다.


[그림 5] API 키 발급 완료


3. C#에서 Emotion API 이용하기

아래의 [코드 1]은 Emotion API에 요청을 보내는 MakeRequest() 함수로써, Cognitive Services에서 제공하는 Emotion API의 샘플 코드를 변형한 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private async void MakeRequest(Bitmap selectedImage)
{
    var client = new HttpClient();
    var queryString = HttpUtility.ParseQueryString(string.Empty);
    var uri = "https://api.projectoxford.ai/emotion/v1.0/recognize?" + queryString;
    HttpResponseMessage response = null;
    MemoryStream stream = new MemoryStream();
    ByteArrayContent content = null;
 
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key""API key");
    selectedImage.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
    content = new ByteArrayContent(stream.ToArray());
    content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    response = await client.PostAsync(uri, content);
 
    content.Dispose();
 
    MessageBox.Show(response.Content.ReadAsStringAsync().Result);
}
cs

[코드 1] Emotion API 요청 함수


[코드 1]의 10번째 줄에 있는 "API key"를 자신이 발급 받은 API 키로 변경해주기만 하면 문제 없이 동작한다. 12번째 줄은 인자로 전달 받은 Bitmap 형식의 이미지를 byte 배열로 변형하는 코드이다. 마지막으로, 18번째 줄에서는 Emotion API로부터 반환된 결과값을 MessageBox를 통해 출력하도록 했다. 단순하게 Emotion API의 동작을 보여주도록 구현된 C# 프로그램은 아래의 [그림 6]과 같다.


[그림 6] 구현된 프로그램


프로그램은 하나의 PictureBox와 Button으로 구성되어 있으며, Browse 버튼을 클릭하면 파일 탐색기가 호출되어 사진을 선택하도록 한다. 파일 탐색기를 통해 선택된 사진은 [그림 7]과 같이 PictureBox에 표시되면서 [코드 1]의 MakeRequest() 함수의 인자로 전달되어 Emotion API가 호출되도록 한다.


[그릠 7] 사진 선택 및 선택된 사진 보기


[그림 7]에서 선택된 사진에 대한 Emotion API의 결과는 아래의 [그림 8] 같으며, 행복 (happiness)라는 감정이 가장 높게 측정된 것을 볼 수 있다.


[그림 8] 선택된 사진에 대한 Emotion API의 결과


프로그램에 대한 전체 소스 코드는 아래의 [코드 2]와 같다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
using System;
using System.Net.Http.Headers;
using System.Net.Http;
using System.Web;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
 
namespace EmotionAPI
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }
 
        private void ButtonBrowse_Click(object sender, EventArgs e)
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                Bitmap selectedImage = new Bitmap(openFileDialog.FileName);
                pictureSelected.Image = selectedImage;
                MakeRequest(selectedImage);
            }
        }
 
        private async void MakeRequest(Bitmap selectedImage)
        {
            var client = new HttpClient();
            var queryString = HttpUtility.ParseQueryString(string.Empty);
            var uri = "https://api.projectoxford.ai/emotion/v1.0/recognize?" + queryString;
            HttpResponseMessage response = null;
            MemoryStream stream = new MemoryStream();
            ByteArrayContent content = null;
 
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key""API key");
            selectedImage.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp);
            content = new ByteArrayContent(stream.ToArray());
            content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
            response = await client.PostAsync(uri, content);
 
            content.Dispose();
 
            MessageBox.Show(response.Content.ReadAsStringAsync().Result);
        }
    }
}
cs

[코드 2] 프로그램의 전체 소스 코드


Emotion API에 대한 API 문서와 레퍼런스는 아래의 링크에서 볼 수 있다.

- Emotion API의 API 문서

- Emotion API의 API 레퍼런스




'C#' 카테고리의 다른 글

[C#] - Microsoft Text Analytics API  (0) 2016.10.09
[C#] - Visual Studio에서 Metro UI Framework 추가하기  (4) 2016.10.03
[C#] - 클래스 정의와 상속  (0) 2016.09.15
[C#] - 메소드 (Method)  (0) 2016.09.15