Skálázás több regisztrált felhasználó kezeléséhez
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.
Ez az útmutató bemutatja, hogyan skálázhat fel a meglévő PersonGroup- és FaceList-objektumokról a LargePersonGroup és a LargeFaceList objektumokra. A PersonGroups legfeljebb 1000 személyt tarthat az ingyenes szinten, 10 000 személyt pedig a fizetős szinten, míg a LargePersonGroups akár egymillió személyt is tarthat a fizetős szinten.
Fontos
Az új fejlesztéshez a PersonDirectory újabb adatstruktúrája ajánlott. Akár 75 millió identitást is tartalmazhat, és nem igényel manuális betanítást. További információkért tekintse meg a PersonDirectory útmutatót.
Ez az útmutató bemutatja a migrálási folyamatot. Alapszintű ismeretet feltételez a PersonGroup és a FaceList objektumokról, a Betanítási műveletről és az arcfelismerési funkciókról. Ha többet szeretne megtudni ezekről a témákról, tekintse meg az arcfelismerési fogalmi útmutatót.
A LargePersonGroup és a LargeFaceList együttes elnevezése nagy léptékű műveletek. A LargePersonGroup legfeljebb 1 millió személyt tartalmazhat, egyenként legfeljebb 248 arccal. A LargeFaceList legfeljebb 1 millió arcot tartalmazhat. A nagy léptékű műveletek hasonlóak a hagyományos PersonGrouphoz és FaceListhez , de az új architektúra miatt van némi különbség.
A minták C# nyelven vannak megírva az Azure AI Face ügyfélkódtár használatával.
Feljegyzés
Az Azonosítás és a FindSimilar arckeresési teljesítményének nagy léptékű engedélyezéséhez betanítási műveletet vezet be a LargeFaceList és a LargePersonGroup előfeldolgozásához. A betanítási idő másodperctől körülbelül fél óráig változhat a tényleges kapacitástól függően. A betanítási időszak alatt lehetőség van az Azonosítás és a FindSimilar elvégzésére, ha korábban sikeres betanítást hajtottak végre. A hátránya az, hogy az új hozzáadott személyek és arcok csak akkor jelennek meg az eredményben, ha a nagy méretű képzésre való áttelepítés utáni új folyamat be nem fejeződik.
1. lépés: Az ügyfélobjektum inicializálása
A Face-ügyfélkódtár használatakor a kulcs és az előfizetés végpontja a FaceClient osztály konstruktorán keresztül lesz átadva. A Face-ügyfélobjektumok létrehozásával kapcsolatos útmutatásért tekintse meg a rövid útmutatót .
2. lépés: Kódmigrálás
Ez a szakasz arra összpontosít, hogyan migrálhatja a PersonGroup vagy a FaceList implementációt a LargePersonGroupba vagy a LargeFaceListbe. Bár a LargePersonGroup vagy a LargeFaceList a tervezés és a belső implementáció szempontjából eltér a PersonGroup-tól vagy a FaceList-től, az API-felületek hasonlóak a visszamenőleges kompatibilitáshoz.
Az adatmigrálás nem támogatott. Ehelyett újra létre kell hoznia a LargePersonGroup vagy a LargeFaceList fájlt .
PersonGroup migrálása LargePersonGroup-ba
A PersonGroup-ból a LargePersonGroupba való migrálás egyszerű. Pontosan ugyanazokkal a csoportszintű műveletekkel rendelkeznek.
PersonGroup vagy személyhez kapcsolódó implementáció esetén csak az API-útvonalakat vagy az SDK-osztályt/modult kell a LargePersonGroup és a LargePersonGroupperson verzióra módosítani.
Adja hozzá a PersonGroup összes arcát és személyét az új LargePersonGrouphoz. További információ: Arcok hozzáadása.
FaceList migrálása LargeFaceList-listára
FaceList API-k | LargeFaceList API-k |
---|---|
Létrehozás | Létrehozás |
Törlés | Törlés |
Beolvasás | Lekérés |
Lista | Lista |
Frissítés | Frissítés |
- | Betanítás |
- | Betanítási állapot lekérdezése |
Az előző táblázat a FaceList és a LargeFaceList listaszintű műveleteinek összehasonlítása. Ahogy látható, a LargeFaceList új műveleteket, betanítási és betanítási állapotot tartalmaz a FaceList-hez képest. A LargeFaceList betanítása a FindSimilar művelet előfeltétele. A FaceList használatához nincs szükség betanításra. A következő kódrészlet egy segédfüggvény, amely megvárja a LargeFaceList betanítását:
/// <summary>
/// Helper function to train LargeFaceList and wait for finish.
/// </summary>
/// <remarks>
/// The time interval can be adjusted considering the following factors:
/// - The training time which depends on the capacity of the LargeFaceList.
/// - The acceptable latency for getting the training status.
/// - The call frequency and cost.
///
/// Estimated training time for LargeFaceList in different scale:
/// - 1,000 faces cost about 1 to 2 seconds.
/// - 10,000 faces cost about 5 to 10 seconds.
/// - 100,000 faces cost about 1 to 2 minutes.
/// - 1,000,000 faces cost about 10 to 30 minutes.
/// </remarks>
/// <param name="largeFaceListId">The Id of the LargeFaceList for training.</param>
/// <param name="timeIntervalInMilliseconds">The time interval for getting training status in milliseconds.</param>
/// <returns>A task of waiting for LargeFaceList training finish.</returns>
private static async Task TrainLargeFaceList(
string largeFaceListId,
int timeIntervalInMilliseconds = 1000)
{
// Trigger a train call.
await FaceClient.LargeFaceList.TrainAsync(largeFaceListId);
// Wait for training finish.
while (true)
{
await Task.Delay(timeIntervalInMilliseconds);
var status = await faceClient.LargeFaceList.GetTrainingStatusAsyn(largeFaceListId);
if (status.Status == Status.Running)
{
continue;
}
else if (status.Status == Status.Succeeded)
{
break;
}
else
{
throw new Exception("The train operation is failed!");
}
}
}
Korábban a FaceList és a FindSimilar tipikus használata a következőhöz hasonlóan nézett ki:
// Create a FaceList.
const string FaceListId = "myfacelistid_001";
const string FaceListName = "MyFaceListDisplayName";
const string ImageDir = @"/path/to/FaceList/images";
await faceClient.FaceList.CreateAsync(FaceListId, FaceListName);
// Add Faces to the FaceList.
Parallel.ForEach(
Directory.GetFiles(ImageDir, "*.jpg"),
async imagePath =>
{
using (Stream stream = File.OpenRead(imagePath))
{
await faceClient.FaceList.AddFaceFromStreamAsync(FaceListId, stream);
}
});
// Perform FindSimilar.
const string QueryImagePath = @"/path/to/query/image";
var results = new List<SimilarPersistedFace[]>();
using (Stream stream = File.OpenRead(QueryImagePath))
{
var faces = await faceClient.Face.DetectWithStreamAsync(stream);
foreach (var face in faces)
{
results.Add(await faceClient.Face.FindSimilarAsync(face.FaceId, FaceListId, 20));
}
}
A LargeFaceListre való migráláskor a következő lesz:
// Create a LargeFaceList.
const string LargeFaceListId = "mylargefacelistid_001";
const string LargeFaceListName = "MyLargeFaceListDisplayName";
const string ImageDir = @"/path/to/FaceList/images";
await faceClient.LargeFaceList.CreateAsync(LargeFaceListId, LargeFaceListName);
// Add Faces to the LargeFaceList.
Parallel.ForEach(
Directory.GetFiles(ImageDir, "*.jpg"),
async imagePath =>
{
using (Stream stream = File.OpenRead(imagePath))
{
await faceClient.LargeFaceList.AddFaceFromStreamAsync(LargeFaceListId, stream);
}
});
// Train() is newly added operation for LargeFaceList.
// Must call it before FindSimilarAsync() to ensure the newly added faces searchable.
await TrainLargeFaceList(LargeFaceListId);
// Perform FindSimilar.
const string QueryImagePath = @"/path/to/query/image";
var results = new List<SimilarPersistedFace[]>();
using (Stream stream = File.OpenRead(QueryImagePath))
{
var faces = await faceClient.Face.DetectWithStreamAsync(stream);
foreach (var face in faces)
{
results.Add(await faceClient.Face.FindSimilarAsync(face.FaceId, largeFaceListId: LargeFaceListId));
}
}
Ahogy korábban is láthattuk, az adatkezelés és a FindSimilar rész szinte megegyezik. Az egyetlen kivétel az, hogy a FindSimilar működése előtt egy friss előfeldolgozási vonatműveletnek be kell fejeződnie a LargeFaceListben.
3. lépés: Javaslatok betanítása
Bár a Betanítási művelet felgyorsítja a FindSimilar és az Azonosítás használatát, a betanítási idő elszenvedődik, különösen nagy léptékű betanítás esetén. A különböző méretekben becsült betanítási idő az alábbi táblázatban található.
Arcok vagy személyek méretezése | Becsült betanítási idő |
---|---|
1000 | 1-2 mp |
10,000. | 5-10 másodperc |
100 000 | 1-2 perc |
1,000,000 | 10-30 perc |
A nagy léptékű funkció jobb kihasználása érdekében az alábbi stratégiákat javasoljuk.
3a. lépés: Az időintervallum testreszabása
Ahogy az látható TrainLargeFaceList()
, ezredmásodpercben van egy időintervallum, amely késlelteti a végtelen betanítási állapot-ellenőrzési folyamatot. A több arcot tartalmazó LargeFaceList esetén a nagyobb időközök csökkentik a hívásszámot és a költségeket. Szabja testre az időintervallumot a LargeFaceList várt kapacitásának megfelelően.
Ugyanez a stratégia a LargePersonGroupra is vonatkozik. Ha például egy 1 millió fős LargePersonGroupot tanít be, timeIntervalInMilliseconds
az 60 000 lehet, ami 1 perces időköz.
3b. lépés: Kis léptékű puffer
A LargePersonGroupban vagy a LargeFaceListben lévő személyek vagy arcok csak a betanítása után kereshetők. Dinamikus forgatókönyv esetén a rendszer folyamatosan új személyeket vagy arcokat ad hozzá, és azonnal kereshetőnek kell lennie, de a betanítás a kívántnál tovább tarthat.
A probléma megoldásához használjon egy extra kis méretű LargePersonGroup vagy LargeFaceList puffert csak az újonnan hozzáadott bejegyzésekhez. A puffer betanítása a kisebb méret miatt rövidebb időt vesz igénybe. Az ideiglenes puffer azonnali keresési funkciójának működnie kell. Használja ezt a puffert a Master LargePersonGroup vagy a LargeFaceList betanításával kombinálva, ha a fő betanítást ritkán futtatja. Ilyenek például az éjszaka közepén és naponta.
Példa munkafolyamat:
- Hozzon létre egy master LargePersonGroup vagy LargeFaceList nevű mestergyűjteményt. Hozzon létre egy Puffer LargePersonGroup vagy LargeFaceList nevű puffergyűjteményt. A puffergyűjtemény csak újonnan hozzáadott személyek vagy arcok számára készült.
- Adjon hozzá új személyeket vagy arcokat a főgyűjteményhez és a puffergyűjteményhez is.
- Az újonnan hozzáadott bejegyzések érvénybe léptetéséhez csak rövid időintervallummal tanítsa be a puffergyűjteményt.
- Hívásazonosítás vagy FindSimilar a főgyűjtemény és a puffergyűjtemény ellen. Egyesítse az eredményeket.
- Ha a puffergyűjtés mérete küszöbértékre vagy rendszer üresjárati időpontra nő, hozzon létre egy új puffergyűjteményt. Indítsa el a Betanítás műveletet a főgyűjteményen.
- Törölje a régi puffergyűjteményt, miután a Betanítási művelet befejeződött a főgyűjteményen.
3c. lépés: Önálló betanítás
Ha viszonylag hosszú késés elfogadható, nem szükséges közvetlenül az új adatok hozzáadása után aktiválni a betanítási műveletet. Ehelyett a betanítási művelet felosztható a fő logikából, és rendszeresen aktiválható. Ez a stratégia elfogadható késésű dinamikus forgatókönyvekhez alkalmas. Statikus forgatókönyvekre is alkalmazható a vonatok gyakoriságának további csökkentése érdekében.
Tegyük fel, hogy a TrainLargePersonGroup
függvény hasonló.TrainLargeFaceList
A LargePersonGroup önálló képzésének tipikus megvalósítása az Timer
osztály System.Timers
meghívásával:
private static void Main()
{
// Create a LargePersonGroup.
const string LargePersonGroupId = "mylargepersongroupid_001";
const string LargePersonGroupName = "MyLargePersonGroupDisplayName";
faceClient.LargePersonGroup.CreateAsync(LargePersonGroupId, LargePersonGroupName).Wait();
// Set up standalone training at regular intervals.
const int TimeIntervalForStatus = 1000 * 60; // 1-minute interval for getting training status.
const double TimeIntervalForTrain = 1000 * 60 * 60; // 1-hour interval for training.
var trainTimer = new Timer(TimeIntervalForTrain);
trainTimer.Elapsed += (sender, args) => TrainTimerOnElapsed(LargePersonGroupId, TimeIntervalForStatus);
trainTimer.AutoReset = true;
trainTimer.Enabled = true;
// Other operations like creating persons, adding faces, and identification, except for Train.
// ...
}
private static void TrainTimerOnElapsed(string largePersonGroupId, int timeIntervalInMilliseconds)
{
TrainLargePersonGroup(largePersonGroupId, timeIntervalInMilliseconds).Wait();
}
Az adatkezeléssel és az azonosítással kapcsolatos implementációkkal kapcsolatos további információkért lásd: Arcok hozzáadása.
Összegzés
Ebben az útmutatóban megtanulta, hogyan migrálhatja a meglévő PersonGroup- vagy FaceList-kódot, nem pedig az adatokat a LargePersonGroup vagy a LargeFaceList fájlba:
- A LargePersonGroup és a LargeFaceList hasonlóan működik, mint a PersonGroup vagy a FaceList, kivéve, hogy a LargeFaceList megköveteli a betanításiműveletet.
- A nagy léptékű adathalmazok dinamikus adatfrissítéséhez használja a megfelelő betanítási stratégiát.
Következő lépések
Útmutatót követve megtudhatja, hogyan adhat hozzá arcokat a PersonGrouphoz, vagy hogyan írhat szkriptet a PersonGroup azonosítási műveletéhez.