Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 Microsoft 감정 인식 API를 활용해 이미지 속 감정 분석하기

사람은 누구나 기쁨, 슬픔, 중립, 놀람, 분노 등 다양한 감정을 표현합니다. 그렇다면 이미지 속 인물의 이러한 감정을 컴퓨터가 자동으로 판별하도록 만들 수 있을까요? 답은 입니다. Python과 Microsoft의 감정(Emotion) API를 결합하면 이미지에 나타난 감정을 손쉽게 분석할 수 있습니다.

Microsoft 감정 API란?

Microsoft 감정 API는 Azure Cognitive Services(현재 Azure AI Services)에서 제공하는 클라우드 기반 서비스로, 이미지 속 얼굴을 인식하고 각 얼굴에 대해 여덟 가지 감정 — 분노(angry), 경멸(contempt), 혐오(disgust), 두려움(fear), 기쁨(happiness), 중립(neutral), 슬픔(sadness), 놀람(surprise) — 의 점수를 반환합니다. 점수가 가장 높은 감정이 해당 얼굴의 대표 감정으로 해석됩니다.

참고: 기존의 독립형 감정 API는 현재 단계적으로 지원이 종료되었으며, 해당 기능은 Azure AI Face API의 감정 인식 기능으로 통합되었습니다. 새 프로젝트에서는 Face API 또는 최신 Azure AI Vision 계열 서비스를 사용하는 것이 좋습니다. 다만 아래 코드는 원리와 요청 구조를 이해하는 데 여전히 유용한 참고 자료입니다.

동작 방식 개요

전체 흐름은 다음과 같습니다.

  1. API 포털에 가입하여 구독 키(subscription key)를 발급받습니다.
  2. 요청 헤더에 구독 키와 콘텐츠 타입(JSON)을 설정합니다.
  3. 분석할 이미지의 URL을 요청 본문(body)에 담아 엔드포인트로 POST 요청을 보냅니다.
  4. 응답으로 받은 JSON에서 각 감정의 점수(scores)를 추출합니다.
  5. 점수가 가장 높은 감정을 최종 결과로 출력합니다.

예제 코드

import http.client, urllib.request
import urllib.parse, urllib.error
import base64, sys
import simplejson as json

# 가입 후 발급받은 구독 키(subscription_key)로 교체하세요
subscription_key = '23d39244dbe55173214b56ab45d56cla'

headers = {
    # 요청 헤더 설정. 플레이스홀더 키를 실제 구독 키로 교체합니다.
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
}
params = urllib.parse.urlencode({})
url1 = 'IMAGE OF URL '
body = { 'url': url1 }
newbody = str(body)
try:
    conn = http.client.HTTPSConnection('westus.api.cognitive.microsoft.com')
    conn.request("POST", "/emotion/v1.0/recognize?%s" % params, newbody, headers)
    response = conn.getresponse()
    data = response.read()
    my_parsed = json.loads(data)
    print("Response is:")
    print(json.dumps(my_parsed, sort_keys=True, indent=2))
    val = my_parsed[0]["scores"]
    res = max(val, key=val.get)
    print("\nEmotionoutput :: ", res)
    conn.close()
except Exception as e:
    print(e.args)

코드 설명

  • 구독 키 설정: subscription_key 변수에 발급받은 실제 키를 입력합니다. 키가 없으면 요청이 거부됩니다.
  • 헤더 구성: Ocp-Apim-Subscription-Key 헤더로 인증 정보를 전달하고, 본문이 JSON임을 명시합니다.
  • 요청 본문: 분석 대상 이미지의 공개 URL을 딕셔너리 형태({'url': ...})로 준비합니다.
  • HTTPS 연결 및 POST 요청: http.client.HTTPSConnection으로 서비스 엔드포인트에 연결한 뒤, 감정 인식 경로(/emotion/v1.0/recognize)로 요청을 전송합니다.
  • 응답 파싱: 응답 본문을 JSON으로 변환해 출력하고, 첫 번째 얼굴의 scores 항목에서 감정별 점수를 꺼냅니다.
  • 최고 점수 감정 추출: max(val, key=val.get)을 사용해 점수가 가장 높은 감정 레이블을 찾아 화면에 출력합니다.

실행 시 주의 사항

  • 이미지 URL은 외부에서 접근 가능한 공개 주소여야 하며, 파일 크기와 형식 제한(API 문서 기준)을 확인하세요.
  • 무료 구독 티어에는 초당·월간 호출 한도가 있으므로 대량 처리 시 요금 정책을 검토해야 합니다.
  • 네트워크 오류나 잘못된 키 입력 시 예외가 발생하므로, 위 코드처럼 try-except 블록으로 오류를 처리하는 것이 좋습니다.

마무리

이처럼 몇십 줄의 Python 코드만으로도 이미지 속 인물의 감정을 자동으로 분석할 수 있습니다. 감정 분석 결과는 고객 만족도 조사, 광고 반응 평가, 교육용 데모 등 다양한 분야에 응용할 수 있습니다. 최신 환경에서는 Azure AI Face API의 동일한 감정 인식 기능을 활용하면 되며, 요청 구조 역시 위 예제와 거의 유사하게 유지되고 있습니다.