azure face api c#

204
23 декабря 2018, 22:50

Как максимально просто, реализовать сравнение двух лиц на сходство используя сервис azure face

Мне нужно реализовать то что у них на сайте в примере https://azure.microsoft.com/ru-ru/services/cognitive-services/face/

То есть два изображение и ответ один и тот же человек или разные люди

Подскажите каким методом реализуется данная функция

Answer 1

Для начала подготовим необходимое:

  • Библиотека Newtonsoft.Json для удобной работы с JSON объектом.
  • Ключ API (пробный получаем тут, выдает 2 ключа и сервер, который их принимает), заносим для удобства в константу:

    const string Key = "12345678901234567890";
    
  • Далее для удобства вынесем отдельно сервер (локацию) для API:

    const string Location = "westcentralus";
    
  • Теперь нам нужно 2 API адреса:

    • Detect - определяет что именно за изображение и дает на 24 часа id для него.

      static readonly string DetectApi = $"https://{Location}.api.cognitive.microsoft.com/face/v1.0/detect";
      
    • Verify - сверяет два изображения по их Id.

      static readonly string VerifyApi = $"https://{Location}.api.cognitive.microsoft.com/face/v1.0/verify";
      
  • Теперь нам нужно сделать простенький метод для отправки POST на сервер, он будет принимать объект для дальнейшей сериализации в JSON, указывать ключ в заголовке (авторизация), отправлять и выдавать ответ:

    private static async Task<string> SendRequest(string url, object data)
    {
        string result;
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", Key);
            var content = new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
            var response = await client.PostAsync(url, content);
            result = await response.Content.ReadAsStringAsync();
        }
        return result;
    }
    
  • Теперь для удобства создадим класс, который будет содержать url изображения и его Id:

    class Image
    {
        public Image(string url)
        {
            Url = url;
        }
        public string Url { get; set; }
        public string Id { get; set; }
    }
    
  • Ну и последнее, что нам понадобиться - некая коллекция наших картинок:

    var images = new List<Image>
    {
        new Image("https://st.kp.yandex.net/images/actor_iphone/iphone360_6793.jpg"),
        new Image("https://images2.cosmopolitan.ru/upload/img_cache/f15/f15b62dc9a5b8584b1bc87b50ce25e83_fitted_740x0.jpg")
    };
    

С подготовкой закончили, давайте теперь получим те самые Id изображений, для этого мы просто пройдемся по коллекции и для каждого объекта выполним запрос на DetectApi адрес:

foreach (var image in images)
{
    var data = new { url = image.Url };
    var result = await SendRequest(DetectApi, data);
    var json = JArray.Parse(result);
    image.Id = (string) json[0]["faceId"];
}
  • var data = new { url = image.Url }; - формируем объект (анонимный тип), который будет в методе SendRequest переведен в Json вида { "url": "http://example.com/1.jpg" }.
  • var result = await SendRequest(DetectApi, data); - в результате получаем ответ от API с JSON объектом (Array), который будет содержать необходимый нам faceId и др. данные.
  • var json = JArray.Parse(result); - парсим результат в JArray.
  • image.Id = (string) json[0]["faceId"]; - так, как это массив с 1 объектом, то берем из первого объекта faceId, переводим в string и заносим в наш image.

Результатом всех этих действий у нас будет в массиве images id у каждого изображения.

Отлично, имея Id, нам остается только сверить их через VerifyApi, напишем простой метод, который будет принимать 2 string (Id), отправит запрос и результат вернет нам:

private static async Task<JObject> Verify(string faceId1, string faceId2)
{
    var data = new {faceId1, faceId2};
    var result = await SendRequest(VerifyApi, data);
    return JObject.Parse(result);
}

Вызываем:

var verify = await Verify(images[0].Id, images[1].Id);

Выведем данные:

Console.WriteLine($"Результат: {verify["isIdentical"]}");
Console.WriteLine($"Уверен на {verify["confidence"]}");

В итоге получаем:

Результат: True
Уверен на 0,61441

Марафет (в виде отлова ошибок и расстановки всего по своим местам) наведете сами, делал почти на коленки, но вроде как работает.

Удачи в изучении C#!

READ ALSO
как копировать объект с массива

как копировать объект с массива

у меня копирует ссылку на объект не сам объект

202
Метод при скрытии игры

Метод при скрытии игры

Если на андроиде скрыть игру (любым способом) то она автоматически остановится, и возобновится при последующем открытии с того же места (если...

148
Вернуть таблицу с конца. ASP.NET Core

Вернуть таблицу с конца. ASP.NET Core

Все что мне нужно это в этом коде вернуть таблицу в обратном порядкеИ метод Reverse тут не помогает

173
Ошибка в скрипте Unity

Ошибка в скрипте Unity

К обьекту прикрепил данный скрипт, цель: автоматическое смещени е обьекта по оси Y, в итоге ничего не срабатываетВ чем проблема?

155