Когнитивные сервисы Microsoft – API распознавания эмоций на изображениях

В четвертой статье про когнитивные сервисы от Microsoft поговорим о возможности работы с изображениями. Посмотрим, как работают API для распознавания лиц и эмоций.

Для начала, как обычно, необходимо получить ключи, необходимые для доступа к нужному API.

По-хорошему, показывать, как это всё работает нужно в web или настольном приложении, чтобы это всё было более наглядно. Но в данном цикле статей я стараюсь показать, как можно работать именно с API, не вдаваясь в детали использования, так что вновь покажу на примере консольного приложения. Для тех, кто хочет увидеть работу более наглядно, можно обратить внимание на тестовый проект от Microsoft на GitHub: https://github.com/Microsoft/Cognitive-Face-Windows

Код для демонстрации будет следующий:

static byte[] GetImageAsByteArray(string imageFilePath)
{
    FileStream fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
    BinaryReader binaryReader = new BinaryReader(fileStream);
    return binaryReader.ReadBytes((int)fileStream.Length);
}

private static void Main(string[] args)
{
    Console.WriteLine("Введите адрес к jpeg изображению");
    var path = Console.ReadLine();
    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "insert_key");

    string uri = "https://westus.api.cognitive.microsoft.com/emotion/v1.0/recognize?";

    HttpResponseMessage response;
    string responseContent;
    byte[] byteData = GetImageAsByteArray(path);

    using (var content = new ByteArrayContent(byteData))
    {
        content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
        response = client.PostAsync(uri, content).Result;
        responseContent = response.Content.ReadAsStringAsync().Result;
    }

    var emotionsResponse = JsonConvert.DeserializeObject<List>(responseContent);
    foreach (var emotion in emotionsResponse)
    {
        Console.WriteLine($"Top: {emotion.FaceRectangle.Top}, Left: {emotion.FaceRectangle.Left}, Width: {emotion.FaceRectangle.Width}, Height: {emotion.FaceRectangle.Height}");
        Console.WriteLine($"Гнев: {emotion.Scores.Anger}");
        Console.WriteLine($"Презрение: {emotion.Scores.Contempt}");
        Console.WriteLine($"Отвращение: {emotion.Scores.Disgust}");
        Console.WriteLine($"Страх: {emotion.Scores.Fear}");
        Console.WriteLine($"Счастье: {emotion.Scores.Happiness}");
        Console.WriteLine($"Нейтральный: {emotion.Scores.Neutral}");
        Console.WriteLine($"Печаль: {emotion.Scores.Sadness}");
        Console.WriteLine($"Удивление: {emotion.Scores.Surprise}");
        Console.WriteLine($"---");
    }
}

Ключ, как обычно, вставляется в параметр "Ocp-Apim-Subscription-Key". Остальное сложности не вызывает. Для десериализации Json использую классы:

   public class Emotions
    {
        public Facerectangle FaceRectangle { get; set; }
        public Scores Scores { get; set; }
    }

    public class Facerectangle
    {
        public int Height { get; set; }
        public int Left { get; set; }
        public int Top { get; set; }
        public int Width { get; set; }
    }

    public class Scores
    {
        public float Anger { get; set; }
        public float Contempt { get; set; }
        public float Disgust { get; set; }
        public float Fear { get; set; }
        public float Happiness { get; set; }
        public float Neutral { get; set; }
        public float Sadness { get; set; }
        public float Surprise { get; set; }
    }

Теперь посмотрим, как это отрабатывает. Для проверки, использую свою фотографию:

Можете попробовать распознать, какие эмоции у меня здесь. API для распознавания эмоций даёт следующее:

Помимо самих эмоций, как можно увидеть, распознало лицо, координаты прямоугольника, ��оторые оно занимает, можно увидеть в возвращённых данных.

Из примеров Microsoft возьму изображение, где эмоции более явные и лиц несколько.

На фотографии распознало 2 лица. Распознанные эмоции можно увидеть на скриншоте.

На фотографиях может распознавать максимум 64 лица. Максимальный размер фотографии 4MB. Поддерживаются таких форматы как JPEG, PNG, GIF (первый кадр), BMP.

Теперь в проектах с легкостью можно распознавать лица на фотографии и эмоции людей, изображённых на них.

Приятного программирования.

Комментарии (1) -

Дмитрий 07.11.2017 3:23:11

Спасибо за статью!

Добавить комментарий