사람은 누구나 기쁨, 슬픔, 중립, 놀람, 분노 등 다양한 감정을 표현합니다. 그렇다면 이미지 속 인물의 이러한 감정을 컴퓨터가 자동으로 판별하도록 만들 수 있을까요? 답은 예입니다. 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 계열 서비스를 사용하는 것이 좋습니다. 다만 아래 코드는 원리와 요청 구조를 이해하는 데 여전히 유용한 참고 자료입니다.
동작 방식 개요
전체 흐름은 다음과 같습니다.
- API 포털에 가입하여 구독 키(subscription key)를 발급받습니다.
- 요청 헤더에 구독 키와 콘텐츠 타입(JSON)을 설정합니다.
- 분석할 이미지의 URL을 요청 본문(body)에 담아 엔드포인트로 POST 요청을 보냅니다.
- 응답으로 받은 JSON에서 각 감정의 점수(scores)를 추출합니다.
- 점수가 가장 높은 감정을 최종 결과로 출력합니다.
예제 코드
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의 동일한 감정 인식 기능을 활용하면 되며, 요청 구조 역시 위 예제와 거의 유사하게 유지되고 있습니다.