Как максимально просто, реализовать сравнение двух лиц на сходство используя сервис azure face
Мне нужно реализовать то что у них на сайте в примере https://azure.microsoft.com/ru-ru/services/cognitive-services/face/
То есть два изображение и ответ один и тот же человек или разные люди
Подскажите каким методом реализуется данная функция
Для начала подготовим необходимое:
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#!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Если на андроиде скрыть игру (любым способом) то она автоматически остановится, и возобновится при последующем открытии с того же места (если...
Все что мне нужно это в этом коде вернуть таблицу в обратном порядкеИ метод Reverse тут не помогает
К обьекту прикрепил данный скрипт, цель: автоматическое смещени е обьекта по оси Y, в итоге ничего не срабатываетВ чем проблема?