В четвертой статье про когнитивные сервисы от 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.
Теперь в проектах с легкостью можно распознавать лица на фотографии и эмоции людей, изображённых на них.
Приятного программирования.