Get emotions of images using Microsoft emotion API in Python?

Every human being has emotions like happy, sad, neutral, surprise, sorrow, and more. We can analyze these emotions in images using Python with Microsoft's Cognitive Services Emotion API. This API can detect and classify facial expressions in photographs.

The Microsoft Emotion API analyzes facial expressions and returns confidence scores for different emotions including happiness, sadness, surprise, anger, fear, contempt, disgust, and neutral.

Prerequisites

Before using the Emotion API, you need to:

  • Register for a Microsoft Azure account
  • Subscribe to the Cognitive Services Emotion API
  • Obtain your subscription key
  • Install required Python packages: requests and json

Basic Implementation

Here's how to detect emotions in an image using the Microsoft Emotion API ?

import http.client
import urllib.request
import urllib.parse
import json

# Replace with your actual subscription key
subscription_key = 'your_subscription_key_here'

# Set up headers for the API request
headers = {
    'Content-Type': 'application/json',
    'Ocp-Apim-Subscription-Key': subscription_key,
}

# Parameters for the request (empty in this case)
params = urllib.parse.urlencode({})

# URL of the image to analyze
image_url = 'https://example.com/path/to/your/image.jpg'
body = {'url': image_url}
request_body = json.dumps(body)

try:
    # Create HTTPS connection to the API endpoint
    conn = http.client.HTTPSConnection('westus.api.cognitive.microsoft.com')
    
    # Send POST request to the emotion recognition endpoint
    conn.request("POST", "/emotion/v1.0/recognize?%s" % params, request_body, headers)
    
    # Get the response
    response = conn.getresponse()
    data = response.read()
    
    # Parse the JSON response
    emotion_data = json.loads(data)
    
    print("Response:")
    print(json.dumps(emotion_data, sort_keys=True, indent=2))
    
    # Extract the emotion scores from the first face detected
    if emotion_data:
        emotion_scores = emotion_data[0]["scores"]
        dominant_emotion = max(emotion_scores, key=emotion_scores.get)
        print(f"\nDominant emotion: {dominant_emotion}")
    
    conn.close()
    
except Exception as e:
    print(f"Error occurred: {e}")

Understanding the Response

The API returns a JSON response containing emotion scores for each detected face. The scores range from 0 to 1, where higher values indicate stronger confidence in that emotion ?

[
  {
    "faceRectangle": {
      "height": 162,
      "left": 130,
      "top": 141,
      "width": 162
    },
    "scores": {
      "anger": 0.00300731952,
      "contempt": 0.0249196119,
      "disgust": 0.0205775667,
      "fear": 0.00001912825,
      "happiness": 0.9273863,
      "neutral": 0.0009861537,
      "sadness": 0.00269649853,
      "surprise": 0.0194079429
    }
  }
]

Dominant emotion: happiness

Improved Version with Error Handling

Here's a more robust version with better error handling and code organization ?

import http.client
import json
import urllib.parse

def detect_emotions(subscription_key, image_url):
    """
    Detect emotions in an image using Microsoft Emotion API
    
    Args:
        subscription_key (str): Your API subscription key
        image_url (str): URL of the image to analyze
        
    Returns:
        dict: Emotion analysis results
    """
    
    headers = {
        'Content-Type': 'application/json',
        'Ocp-Apim-Subscription-Key': subscription_key,
    }
    
    params = urllib.parse.urlencode({})
    body = {'url': image_url}
    request_body = json.dumps(body)
    
    try:
        conn = http.client.HTTPSConnection('westus.api.cognitive.microsoft.com')
        conn.request("POST", "/emotion/v1.0/recognize?%s" % params, request_body, headers)
        
        response = conn.getresponse()
        
        if response.status == 200:
            data = response.read()
            return json.loads(data)
        else:
            print(f"API request failed with status: {response.status}")
            return None
            
    except Exception as e:
        print(f"Error: {e}")
        return None
    finally:
        if 'conn' in locals():
            conn.close()

# Example usage
subscription_key = 'your_subscription_key_here'
image_url = 'https://example.com/path/to/image.jpg'

results = detect_emotions(subscription_key, image_url)

if results:
    for face_data in results:
        emotions = face_data["scores"]
        dominant_emotion = max(emotions, key=emotions.get)
        confidence = emotions[dominant_emotion]
        
        print(f"Dominant emotion: {dominant_emotion}")
        print(f"Confidence: {confidence:.2%}")

Key Points

  • Authentication: Requires a valid subscription key from Microsoft Azure
  • Input format: Supports image URLs or binary image data
  • Output: Returns emotion scores for anger, contempt, disgust, fear, happiness, neutral, sadness, and surprise
  • Face detection: Can analyze multiple faces in a single image
  • Rate limits: Free tier has usage limitations

Conclusion

The Microsoft Emotion API provides a powerful way to analyze facial expressions in images using Python. Remember to handle API errors gracefully and respect rate limits when building applications that process multiple images.

Updated on: 2026-03-24T20:53:08+05:30

248 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements