Share via


A PersonDirectory adatstruktúra használata (előzetes verzió)

Figyelemfelhívás

A Face Service hozzáférése a jogosultsági és használati feltételek alapján korlátozott a felelős AI-alapelvek támogatása érdekében. A Face service csak a Microsoft által felügyelt ügyfelek és partnerek számára érhető el. A Hozzáférés igényléséhez használja a Face Recognition beviteli űrlapot . További információt a Face korlátozott hozzáférésű oldalán talál.

Az olyan arcfelismerési műveletek végrehajtásához, mint az Azonosság és a Hasonló keresése, a Face API-ügyfeleknek létre kell hozniuk a Személy objektumok válogatott listáját. A PersonDirectory egy olyan adatstruktúra a nyilvános előzetes verzióban, amely egyedi azonosítókat, választható névsztringeket és opcionális felhasználói metaadat-sztringeket tartalmaz a címtárhoz hozzáadott egyes személyidentitásokhoz . Ebből az útmutatóból megtudhatja, hogyan végezhet alapvető feladatokat a PersonDirectory használatával.

A PersonDirectory előnyei

A Face API jelenleg a LargePersonGroup struktúrát kínálja, amely hasonló funkcionalitással rendelkezik, de legfeljebb 1 millió identitással rendelkezik. A PersonDirectory struktúra akár 75 millió identitást is felskálázhat.

A PersonDirectory és a korábbi adatstruktúrák közötti másik jelentős különbség az, hogy többé nem kell betanítási API-hívásokat indítania, miután arcokat ad hozzá egy Személy objektumhoz – a frissítési folyamat automatikusan megtörténik.

Előfeltételek

  • Azure-előfizetés – Hozzon létre egyet ingyenesen.
  • Miután megkapta az Azure-előfizetését, hozzon létre egy Face-erőforrást az Azure Portalon a kulcs és a végpont lekéréséhez. Az üzembe helyezés után válassza az Ugrás az erőforrásra lehetőséget.
    • Az alkalmazás Face API-hoz való csatlakoztatásához szüksége lesz a létrehozott erőforrás kulcsára és végpontjára. Illessze be a kulcsot és a végpontot az alábbi kódba.
    • Az ingyenes tarifacsomag (F0) használatával kipróbálhatja a szolgáltatást, és később frissíthet egy fizetős szintre az éles környezetben.

Személyek hozzáadása a PersonDirectoryhoz

A PersonDirectory alapregisztrációs egységei a személyek. Miután felvett egy személyt a címtárba, felismerési modellenként legfeljebb 248 arcképet adhat hozzá az adott személyhez. Ezután különböző hatókörökkel azonosíthatja az arcokat.

A személy létrehozása

Személy létrehozásához meg kell hívnia a CreatePerson API-t, és meg kell adnia egy nevet vagy egy userData tulajdonságértéket.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

var addPersonUri = "https:// {endpoint}/face/v1.0-preview/persons";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("name", "Example Person");
body.Add("userData", "User defined data");
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PostAsync(addPersonUri, content); 
}

A CreatePerson hívás egy generált azonosítót ad vissza a személyhez és egy műveleti helyhez. A Person-adatok aszinkron módon lesznek feldolgozva, így a műveleti hely használatával lekérheti az eredményeket.

Várakozás az aszinkron művelet befejezésére

A folyamat ellenőrzéséhez le kell kérdeznie az aszinkron művelet állapotát a visszaadott műveleti hely sztringjének használatával.

Először az állapotválasz kezeléséhez az alábbihoz hasonló adatmodellt kell meghatároznia.

[Serializable]
public class AsyncStatus
{
    [DataMember(Name = "status")]
    public string Status { get; set; }

    [DataMember(Name = "createdTime")]
    public DateTime CreatedTime { get; set; }

    [DataMember(Name = "lastActionTime")]
    public DateTime? LastActionTime { get; set; }

    [DataMember(Name = "finishedTime", EmitDefaultValue = false)]
    public DateTime? FinishedTime { get; set; }

    [DataMember(Name = "resourceLocation", EmitDefaultValue = false)]
    public string ResourceLocation { get; set; }

    [DataMember(Name = "message", EmitDefaultValue = false)]
    public string Message { get; set; }
}

A httpResponseMessage felülről történő használatával lekérdezheti az URL-címet, és megvárhatja az eredményeket.

string operationLocation = response.Headers.GetValues("Operation-Location").FirstOrDefault();

Stopwatch s = Stopwatch.StartNew();
string status = "notstarted";
do
{
    if (status == "succeeded")
    {
        await Task.Delay(500);
    }

    var operationResponseMessage = await client.GetAsync(operationLocation);

    var asyncOperationObj = JsonConvert.DeserializeObject<AsyncStatus>(await operationResponseMessage.Content.ReadAsStringAsync());
    status = asyncOperationObj.Status;

} while ((status == "running" || status == "notstarted") && s.Elapsed < TimeSpan.FromSeconds(30));

Miután az állapot "sikeres" állapotú lett, a Person objektumot hozzáadja a címtárhoz.

Feljegyzés

A Személy létrehozása hívás aszinkron műveletének nem kell "sikeres" állapotot mutatnia ahhoz, hogy arcokat lehessen hozzáadni hozzá, de ahhoz, hogy a személy hozzáadható legyen a DynamicPersonGrouphoz (lásd alább a DynamicPersonGroup létrehozását és frissítését), vagy össze kell hasonlítani egy azonosítási hívás során. Győződjön meg arról, hogy a hívások azonnal működni fognak, miután az arcok sikeresen hozzáadva lettek a személyhez.

Arcok hozzáadása személyekhez

Miután megkapta a Személy létrehozása hívás személyazonosítóját, legfeljebb 248 arcképet adhat hozzá egy személyhez felismerési modellenként. Adja meg a hívásban használni kívánt felismerési modellt (és opcionálisan az észlelési modellt), mivel az egyes felismerési modellek adatai külön lesznek feldolgozva a PersonDirectoryban.

A jelenleg támogatott felismerési modellek a következők:

  • Recognition_02
  • Recognition_03
  • Recognition_04

Továbbá, ha a kép több arcot is tartalmaz, meg kell adnia a kívánt célként megadott arc téglalaphatároló mezőjét. Az alábbi kód arcokat ad hozzá egy Személy objektumhoz.

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

// Optional query strings for more fine grained face control
var queryString = "userData={userDefinedData}&targetFace={left,top,width,height}&detectionModel={detectionModel}";
var uri = "https://{endpoint}/face/v1.0-preview/persons/{personId}/recognitionModels/{recognitionModel}/persistedFaces?" + queryString;

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("url", "{image url}");
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PostAsync(uri, content);
}

Az Arcok hozzáadása hívás után az arcadatok aszinkron módon lesznek feldolgozva, és a művelet sikerére ugyanúgy kell várnia, mint korábban.

Amikor az arcfeladási művelet befejeződik, az adatok készen állnak a hívások azonosítására.

DynamicPersonGroup létrehozása és frissítése

A DynamicPersonGroups személyobjektumokra mutató hivatkozások gyűjteményei a PersonDirectoryban; a címtár részhalmazainak létrehozására szolgálnak. Gyakori felhasználási terület, ha kevesebb hamis pozitív értéket és nagyobb pontosságot szeretne kapni egy azonosítási műveletben úgy, hogy a hatókört csak a kívánt személyobjektumokra korlátozza. A gyakorlati használati esetek magukban foglalják a nagyobb campusok vagy szervezetek adott épülethozzáféréséhez szükséges könyvtárakat. A szervezeti címtár 5 millió személyt tartalmazhat, de csak egy adott épület 800 személyében kell keresnie, ezért létre kell hoznia egy DynamicPersonGroup csoportot, amely az adott személyeket tartalmazza.

Ha korábban personGroup-t használt, jegyezze fel két fő különbséget:

  • A DynamicPersonGroup minden egyes személye a PersonDirectory tényleges személyére mutató hivatkozás, ami azt jelenti, hogy nem szükséges létrehozni egy személyt az egyes csoportokban.
  • Ahogy az előző szakaszokban is említettük, nem kell betanítási hívásokat kezdeményezni, mivel a rendszer automatikusan feldolgozza az arcadatokat a címtár szintjén.

A csoport létrehozása

DynamicPersonGroup létrehozásához meg kell adnia egy csoportazonosítót alfanumerikus vagy szaggatott karakterekkel. Ez az azonosító a csoport összes használati céljának egyedi azonosítójaként fog működni.

A csoportgyűjtemények inicializálásának két módja van. Kezdetben létrehozhat egy üres csoportot, majd később feltöltheti:

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

var uri = "https://{endpoint}/face/v1.0-preview/dynamicpersongroups/{dynamicPersonGroupId}";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("name", "Example DynamicPersonGroup");
body.Add("userData", "User defined data");
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PutAsync(uri, content);
}

Ez a folyamat azonnali, és nem kell megvárni, amíg az aszinkron műveletek sikeresek lesznek.

Azt is megteheti, hogy az AddPersonIds argumentumban adja meg a halmazt egy személyazonosító-készlettel, amely az elejétől kezdve tartalmazza ezeket a hivatkozásokat:

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

var uri = "https://{endpoint}/face/v1.0-preview/dynamicpersongroups/{dynamicPersonGroupId}";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("name", "Example DynamicPersonGroup");
body.Add("userData", "User defined data");
body.Add("addPersonIds", new List<string>{"{guid1}", "{guid2}", …});
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PutAsync(uri, content);

    // Async operation location to query the completion status from
    var operationLocation = response.Headers.Get("Operation-Location");
}

Feljegyzés

Amint a hívás visszatér, a létrehozott DynamicPersonGroup készen áll az azonosítási hívásban való használatra, a folyamat során megadott személyhivatkozásokkal. A visszaadott műveletazonosító befejezési állapota viszont a személy–csoport kapcsolat frissítési állapotát jelzi.

A DynamicPersonGroup frissítése

A kezdeti létrehozás után hozzáadhat és eltávolíthat személyhivatkozásokat a DynamicPersonGroupból a Dinamikus személycsoport frissítése API-val. Ha személyobjektumokat szeretne hozzáadni a csoporthoz, sorolja fel a személyazonosítókat az addPersonsIds argumentumban. A Person objektumok eltávolításához listázhatja őket a removePersonIds argumentumban. A hozzáadás és az eltávolítás is elvégezhető egyetlen hívásban:

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

var uri = "https://{endpoint}/face/v1.0-preview/dynamicpersongroups/{dynamicPersonGroupId}";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("name", "Example Dynamic Person Group updated");
body.Add("userData", "User defined data updated");
body.Add("addPersonIds", new List<string>{"{guid1}", "{guid2}", …});
body.Add("removePersonIds", new List<string>{"{guid1}", "{guid2}", …});
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PatchAsync(uri, content);

    // Async operation location to query the completion status from
    var operationLocation = response.Headers.Get("Operation-Location");
}

A hívás visszatérése után a gyűjtemény frissítései megjelennek a csoport lekérdezésekor. A létrehozási API-hoz hasonlóan a visszaadott művelet a személy–csoport kapcsolat frissítési állapotát jelzi a frissítésben részt vevő bármely személy esetében. Nem kell megvárnia a művelet befejezését, mielőtt további frissítési hívásokat indít a csoportnak.

Arcok azonosítása a PersonDirectoryban

A PersonDirectoryban az arcadatok használatának leggyakoribb módja, ha összehasonlítja a regisztrált személy objektumait egy adott arccal, és azonosítja a legvalószínűbb jelöltet. A kérelemben több arc is megadható, és mindegyik saját összehasonlítási eredményeket kap a válaszban.

A PersonDirectoryban az egyes arcok három típusú hatókörrel azonosíthatók:

1. forgatókönyv: Azonosítás dynamicPersonGroup-csoporttal

A dinamikusPersonGroupId tulajdonság megadása a kérelemben összehasonlítja az arcot a csoport minden hivatkozott személyével. Egy hívásban csak egyetlen DynamicPersonGroup azonosítható.

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

// Optional query strings for more fine grained face control
var uri = "https://{endpoint}/face/v1.0-preview/identify";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("faceIds", new List<string>{"{guid1}", "{guid2}", …});
body.Add("dynamicPersonGroupId", "{dynamicPersonGroupIdToIdentifyIn}");
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PostAsync(uri, content);
}

2. forgatókönyv: Azonosítás adott személyek listájával

A personIds tulajdonságban megadhatja a személyazonosítók listáját is, hogy összehasonlítsa az arcot mindegyikével.

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");
            
var uri = "https://{endpoint}/face/v1.0-preview/identify";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("faceIds", new List<string>{"{guid1}", "{guid2}", …});
body.Add("personIds", new List<string>{"{guid1}", "{guid2}", …});
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PostAsync(uri, content);
}

3. forgatókönyv: Azonosítsa a teljes PersonDirectory-t

Ha egyetlen csillagot ad meg a kérelem personIds tulajdonságában, az összehasonlítja az arcot a PersonDirectoryban regisztrált minden egyes személlyel.

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");
            
var uri = "https://{endpoint}/face/v1.0-preview/identify";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("faceIds", new List<string>{"{guid1}", "{guid2}", …});
body.Add("personIds", new List<string>{"*"});
byte[] byteData = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PostAsync(uri, content);
}

Mindhárom forgatókönyv esetében az azonosítás csak azokkal az arcokkal hasonlítja össze a bejövő arcokat, akiknek az AddPersonFace hívása "sikeres" válaszsal lett visszaadva.

Arcok ellenőrzése személyek ellen a PersonDirectoryban

Az észlelési hívásból visszaadott arcazonosítóval ellenőrizheti, hogy az arc egy adott, a PersonDirectoryban regisztrált személyhez tartozik-e. Adja meg a personId tulajdonságot használó személyt.

var client = new HttpClient();

// Request headers
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{subscription key}");

var uri = "https://{endpoint}/face/v1.0-preview/verify";

HttpResponseMessage response;

// Request body
var body = new Dictionary<string, object>();
body.Add("faceId", "{guid1}");
body.Add("personId", "{guid1}");
var jsSerializer = new JavaScriptSerializer();
byte[] byteData = Encoding.UTF8.GetBytes(jsSerializer.Serialize(body));

using (var content = new ByteArrayContent(byteData))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    response = await client.PostAsync(uri, content);
}

A válasz tartalmaz egy logikai értéket, amely jelzi, hogy a szolgáltatás az új arcot ugyanahhoz a személyhez tartozónak tekinti-e, és egy megbízhatósági pontszámot az előrejelzéshez.

Következő lépések

Ebben az útmutatóban megtanulta, hogyan használhatja a PersonDirectory struktúrát a Face-alkalmazás arc- és személyadatainak tárolására. A következő lépésben megismerheti a felhasználói arcadatok hozzáadásának ajánlott eljárásait.