Rozpoznávání vnímané emocí pomocí rozhraní API pro rozpoznávání tváře
Rozhraní API pro rozpoznávání tváře může provádět detekci emocí, aby ve výrazu tváře detekoval strach, opomenutí, znechucení, strach, štěstí, neutrální, smutek a překvapení, a to na základě vnímacích poznámek lidských programátoři. Je ale důležité si uvědomit, že výrazy tváře nemusí nutně představovat interní stavy lidí.
Kromě vrácení výsledku emocí pro výraz tváře může rozhraní API pro rozpoznávání tváře také vrátit ohraničující rámeček pro detekované tváře.
Rozpoznávání emocí je možné provádět prostřednictvím klientské knihovny a prostřednictvím REST API. Tento článek se zaměřuje na rozpoznávání emocí prostřednictvím REST API. Další informace o této REST API v tématu Face REST API.
Rozhraní API pro rozpoznávání tváře je také možné použít k rozpoznávání výrazů tváří lidí ve videu a může vrátit souhrn emocí. Další informace najdete v tématu Analýza videí v reálném čase.
Poznámka
Pokud ještě nemáte předplatné Azure,vytvořte si bezplatný účet před tím, než začnete.
Aby bylo možné používat rozhraní API pro rozpoznávání tváře, je nutné získat klíč rozhraní API. Můžete to získat na adrese Try Cognitive Services.
Další informace o rozhraní API pro rozpoznávání tváře najdete v tématu Rozhraní API pro rozpoznávání tváře.
Authentication
Každý požadavek na rozhraní API pro rozpoznávání tváře vyžaduje klíč rozhraní API, který by se měl zadat jako hodnota Ocp-Apim-Subscription-Key hlavičky. Následující příklad kódu ukazuje, jak přidat klíč rozhraní API do Ocp-Apim-Subscription-Key hlavičky požadavku:
public FaceRecognitionService()
{
_client = new HttpClient();
_client.DefaultRequestHeaders.Add("ocp-apim-subscription-key", Constants.FaceApiKey);
}
Pokud do rozhraní API pro rozpoznávání tváře předáte platný klíč rozhraní API, dojde k chybě odpovědi 401.
Rozpoznávání emocí
Rozpoznávání emocí se provádí vytvořením požadavku POST obsahujícího obrázek do rozhraní API na adrese , kde je oblast, kterou jste použili k detecthttps://[location].api.cognitive.microsoft.com/face/v1.0 získání klíče rozhraní [location]] API. Volitelné parametry požadavku jsou:
returnFaceId– určuje, jestli se mají vrátit faceId detekovaných tváří. Výchozí hodnota jetrue.returnFaceLandmarks– určuje, jestli se mají vrátit orientační body tváří detekovaných tváří. Výchozí hodnota jefalse.returnFaceAttributes– určuje, jestli se má analyzovat a vracet jeden nebo více zadaných atributů tváře. Mezi podporované atributy tváře patříage, , , , , , , ,gender, , ,headPose,smileafacialHairglassesemotionhairmakeupocclusionaccessoriesblurexposurenoise. Všimněte si, že analýza atributů tváře má další výpočetní a časové náklady.
Obsah obrázku musí být umístěn v textu požadavku POST jako adresa URL nebo binární data.
Poznámka
Podporované formáty souborů obrázků jsou JPEG, PNG, GIF a BMP a povolená velikost souboru je od 1 kB do 4 MB.
V ukázkové aplikaci se proces rozpoznávání emocí vyvolá voláním DetectAsync metody :
Face[] faces = await _faceRecognitionService.DetectAsync(photoStream, true, false, new FaceAttributeType[] { FaceAttributeType.Emotion });
Toto volání metody určuje datový proud obsahující data obrázku, že by se měly vrátit faceId, že orientační body tváře by neměly být vráceny a že by se měly analyzovat emoce obrázku. Určuje také, že výsledky budou vráceny jako pole Face objektů. Metoda zase DetectAsync vyvolá metodu detect REST API, která provádí rozpoznávání emocí:
public async Task<Face[]> DetectAsync(Stream imageStream, bool returnFaceId, bool returnFaceLandmarks, IEnumerable<FaceAttributeType> returnFaceAttributes)
{
var requestUrl =
$"{Constants.FaceEndpoint}/detect?returnFaceId={returnFaceId}" +
"&returnFaceLandmarks={returnFaceLandmarks}" +
"&returnFaceAttributes={GetAttributeString(returnFaceAttributes)}";
return await SendRequestAsync<Stream, Face[]>(HttpMethod.Post, requestUrl, imageStream);
}
Tato metoda vygeneruje identifikátor URI požadavku a pak odešle požadavek do detect rozhraní API prostřednictvím metody SendRequestAsync .
Poznámka
Ve voláních rozhraní API pro rozpoznávání tváře musíte použít stejnou oblast, jako jste použili k získání klíčů předplatného. Pokud jste například získali klíče předplatného z oblasti, koncový bod rozpoznávání tváře westus bude https://westus.api.cognitive.microsoft.com/face/v1.0/detect .
Odeslání žádosti
Metoda SendRequestAsync provede požadavek POST do rozhraní API pro rozpoznávání tváře a vrátí výsledek jako Face pole:
async Task<TResponse> SendRequestAsync<TRequest, TResponse>(HttpMethod httpMethod, string requestUrl, TRequest requestBody)
{
var request = new HttpRequestMessage(httpMethod, Constants.FaceEndpoint);
request.RequestUri = new Uri(requestUrl);
if (requestBody != null)
{
if (requestBody is Stream)
{
request.Content = new StreamContent(requestBody as Stream);
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
}
else
{
// If the image is supplied via a URL
request.Content = new StringContent(JsonConvert.SerializeObject(requestBody, s_settings), Encoding.UTF8, "application/json");
}
}
HttpResponseMessage responseMessage = await _client.SendAsync(request);
if (responseMessage.IsSuccessStatusCode)
{
string responseContent = null;
if (responseMessage.Content != null)
{
responseContent = await responseMessage.Content.ReadAsStringAsync();
}
if (!string.IsNullOrWhiteSpace(responseContent))
{
return JsonConvert.DeserializeObject<TResponse>(responseContent, s_settings);
}
return default(TResponse);
}
else
{
...
}
return default(TResponse);
}
Pokud je image zadána prostřednictvím streamu, metoda sestaví požadavek POST zabalením streamu obrázku do instance, která poskytuje obsah HTTP na StreamContent základě streamu. Případně pokud je obrázek zadán prostřednictvím adresy URL, metoda sestaví požadavek POST zabalením adresy URL do instance, která poskytuje obsah HTTP na základě StringContent řetězce.
Požadavek POST se pak odesílá do rozhraní detect API. Odpověď je přečtena, deserializována a vrácena volající metodě.
Rozhraní API odešle v odpovědi stavový kód HTTP 200 (OK) za předpokladu, že je požadavek platný, což značí, že požadavek byl úspěšný a že v odpovědi jsou detect požadované informace. Seznam možných chybových odpovědí najdete v tématu Face REST API.
Zpracování odpovědi
Odpověď rozhraní API se vrátí ve formátu JSON. Následující data JSON zobrazují typickou zprávu úspěšné odpovědi, která poskytuje data požadovaná ukázkovou aplikací:
[
{
"faceId":"8a1a80fe-1027-48cf-a7f0-e61c0f005051",
"faceRectangle":{
"top":192,
"left":164,
"width":339,
"height":339
},
"faceAttributes":{
"emotion":{
"anger":0.0,
"contempt":0.0,
"disgust":0.0,
"fear":0.0,
"happiness":1.0,
"neutral":0.0,
"sadness":0.0,
"surprise":0.0
}
}
}
]
Zpráva úspěšné odpovědi se skládá z pole položek tváře seřazených podle velikosti obdélníku tváře v sestupném pořadí, zatímco prázdná odpověď indikuje, že nebyly rozpoznány žádné tváře. Každá rozpoznaná tvář obsahuje řadu volitelných atributů tváře, které jsou určeny returnFaceAttributes argumentem DetectAsync metody.
V ukázkové aplikaci je odpověď JSON deserializována do pole Face objektů. Při interpretaci výsledků z rozhraní API pro rozpoznávání tváře by se zjištěné emoce měly interpretovat jako emoce s nejvyšším skóre, protože skóre se normalizuje tak, aby se součet 1. Ukázková aplikace proto zobrazuje rozpoznané emoce s nejvyšším skóre největší detekované tváře na obrázku. Toho dosáhnete pomocí následujícího kódu:
emotionResultLabel.Text = faces.FirstOrDefault().FaceAttributes.Emotion.ToRankedList().FirstOrDefault().Key;
Následující snímek obrazovky ukazuje výsledek procesu rozpoznávání emocí v ukázkové aplikaci:

Stažení ukázky