HoloLens (första generationen) och Azure 304: Ansiktsigenkänning


Anteckning

Självstudierna Mixed Reality Academy har utformats med HoloLens (första generationen) och Mixed Reality integrerande headset i åtanke. Därför anser vi att det är viktigt att låta de här självstudierna vara kvar för utvecklare som fortfarande letar efter vägledning för att utveckla för dessa enheter. De här självstudierna uppdateras inte med de senaste verktygsuppsättningarna eller interaktionerna som används för HoloLens 2. De underhålls för att fortsätta arbeta på de enheter som stöds. Det kommer att finnas en ny serie självstudier som kommer att publiceras i framtiden som visar hur du utvecklar för HoloLens 2. Det här meddelandet uppdateras med en länk till självstudierna när de publiceras.


resultatet av att slutföra den här kursen

I den här kursen får du lära dig hur du lägger till funktioner för ansiktsigenkänning i ett program för mixad verklighet med hjälp av Azure Cognitive Services med Microsofts ansikts-API.

Azure Face API är en Microsoft-tjänst som ger utvecklare de mest avancerade ansiktsalgoritmerna, allt i molnet. Ansikts-API:et har två huvudfunktioner: ansiktsidentifiering med attribut och ansiktsigenkänning. Detta gör det möjligt för utvecklare att helt enkelt ange en uppsättning grupper för ansikten och sedan skicka frågebilder till tjänsten senare för att avgöra vem ett ansikte tillhör. Mer information finns på sidan Ansiktsigenkänning i Azure.

När du har slutfört den här kursen har du ett HoloLens-program för mixad verklighet som kan göra följande:

  1. Använd en tryckgest för att initiera avbildningen av en bild med hjälp av den inbyggda HoloLens-kameran.
  2. Skicka den avbildade avbildningen till Azure Face API-tjänsten .
  3. Ta emot resultatet av ansikts-API-algoritmen .
  4. Använd ett enkelt användargränssnitt för att visa namnet på matchade personer.

På så sätt får du lära dig hur du hämtar resultaten från Ansikts-API-tjänsten till ditt Unity-baserade mixed reality-program.

I ditt program är det upp till dig hur du ska integrera resultaten med din design. Den här kursen är utformad för att lära dig hur du integrerar en Azure-tjänst med ditt Unity-projekt. Det är ditt jobb att använda den kunskap du får från den här kursen för att förbättra ditt mixed reality-program.

Stöd för enheter

Kurs HoloLens Integrerande headset
MR och Azure 304: Ansiktsigenkänning ✔️ ✔️

Anteckning

Den här kursen fokuserar främst på HoloLens, men du kan också använda det du lär dig i den här kursen för att Windows Mixed Reality integrerande (VR) headset. Eftersom integrerande (VR) headset inte har tillgängliga kameror behöver du en extern kamera ansluten till datorn. När du följer kursen visas anteckningar om eventuella ändringar som du kan behöva använda för att stödja uppslukande (VR)-headset.

Förutsättningar

Anteckning

Den här självstudien är utformad för utvecklare som har grundläggande erfarenhet av Unity och C#. Tänk också på att kraven och de skriftliga instruktionerna i det här dokumentet representerar vad som har testats och verifierats i skrivande stund (maj 2018). Du är fri att använda den senaste programvaran, som anges i artikeln installera verktyg , även om det inte bör antas att informationen i den här kursen perfekt matchar vad du hittar i nyare programvara än vad som anges nedan.

Vi rekommenderar följande maskinvara och programvara för den här kursen:

Innan du börjar

  1. För att undvika problem med att skapa det här projektet rekommenderar vi starkt att du skapar projektet som nämns i den här självstudien i en rotmapp eller nära rotmapp (långa mappsökvägar kan orsaka problem vid byggtiden).
  2. Konfigurera och testa HoloLens. Om du behöver support för att konfigurera HoloLens bör du gå till installationsartikeln holoLens.
  3. Det är en bra idé att utföra kalibrering och sensorjustering när du börjar utveckla en ny HoloLens-app (ibland kan det hjälpa till att utföra dessa uppgifter för varje användare).

För hjälp med kalibrering, följ denna länk till HoloLens Kalibrering artikeln.

Om du vill ha hjälp med sensorjustering följer du den här länken till artikeln HoloLens Sensor Tuning.

Kapitel 1 – Azure-portalen

Om du vill använda tjänsten Ansikts-API i Azure måste du konfigurera en instans av tjänsten som ska göras tillgänglig för ditt program.

  1. Logga först in på Azure-portalen.

    Anteckning

    Om du inte redan har ett Azure-konto måste du skapa ett. Om du följer den här självstudien i ett klassrum eller en labbsituation ber du instruktören eller någon av rektorerna om hjälp med att konfigurera ditt nya konto.

  2. När du är inloggad klickar du på Nytt i det övre vänstra hörnet och söker efter Ansikts-API, trycker på Retur.

    sök efter ansikts-API

    Anteckning

    Ordet Nytt kan ha ersatts med Skapa en resurs i nyare portaler.

  3. Den nya sidan innehåller en beskrivning av ansikts-API-tjänsten . Längst ned till vänster i den här prompten väljer du knappen Skapa för att skapa en association med den här tjänsten.

    ansikts-API-information

  4. När du har klickat på Skapa:

    1. Infoga önskat namn för den här tjänstinstansen.

    2. Välj en prenumeration.

    3. Välj den prisnivå som är lämplig för dig, om det är första gången du skapar en Ansikts-API-tjänst bör en kostnadsfri nivå (med namnet F0) vara tillgänglig för dig.

    4. Välj en resursgrupp eller skapa en ny. En resursgrupp är ett sätt att övervaka, kontrollera åtkomst, etablera och hantera fakturering för en samling Azure-tillgångar. Vi rekommenderar att du behåller alla Azure-tjänster som är associerade med ett enskilt projekt (t.ex. dessa labb) under en gemensam resursgrupp).

      Om du vill läsa mer om Azure-resursgrupper kan du gå till resursgruppsartikeln.

    5. UWP-appen Person Maker, som du använder senare, kräver att "USA, västra" används för plats.

    6. Du måste också bekräfta att du har förstått de villkor som tillämpas på den här tjänsten.

    7. Välj Skapa.*

      skapa tjänsten ansikts-API

  5. När du har klickat på Skapa* måste du vänta tills tjänsten har skapats, det kan ta en minut.

  6. Ett meddelande visas i portalen när tjänstinstansen har skapats.

    meddelande om att tjänsten har skapats

  7. Klicka på meddelandena för att utforska din nya tjänstinstans.

    gå till resursmeddelande

  8. När du är klar klickar du på knappen Gå till resurs i meddelandet för att utforska din nya tjänstinstans.

    åtkomst till ansikts-API-nycklar

  9. I den här självstudien måste ditt program göra anrop till tjänsten, vilket görs med hjälp av tjänstens prenumerationsnyckel. Från sidan Snabbstart för din ansikts-API-tjänst är den första punkten nummer 1, till Hämta dina nycklar.

  10. På sidan Tjänst väljer du antingen den blå hyperlänken Nycklar (om det finns på sidan Snabbstart) eller länken Nycklar i navigeringsmenyn för tjänster (till vänster, som anges av ikonen "nyckel" ) för att visa dina nycklar.

    Anteckning

    Anteckna någon av nycklarna och skydda den, eftersom du behöver den senare.

Kapitel 2 – Använda UWP-programmet "Person Maker"

Se till att ladda ned det fördefinierade UWP-programmet med namnet Person Maker. Den här appen är inte slutprodukten för den här kursen, bara ett verktyg som hjälper dig att skapa dina Azure-poster, som det senare projektet kommer att förlita sig på.

Med Person Maker kan du skapa Azure-poster som är associerade med personer och grupper av personer. Programmet placerar all nödvändig information i ett format som sedan kan användas av FaceAPI för att identifiera ansikten för personer som du har lagt till.

[VIKTIGT] Person Maker använder viss grundläggande begränsning för att säkerställa att du inte överskrider antalet tjänstanrop per minut för den kostnadsfria prenumerationsnivån. Den gröna texten längst upp ändras till röd och uppdateras som "AKTIV" när begränsningen sker. Om så är fallet väntar du bara på programmet (det väntar tills det kan fortsätta att komma åt ansiktstjänsten och uppdateras som "IN-ACTIVE" när du kan använda det igen).

Det här programmet använder Microsoft.ProjectOxford.Face-biblioteken , vilket gör att du kan använda Ansikts-API:et fullt ut. Det här biblioteket är tillgängligt kostnadsfritt som ett NuGet-paket. Mer information om detta och liknande api:er finns i API-referensartikeln.

Anteckning

Det här är bara de steg som krävs, instruktioner för hur du gör dessa saker ligger längre ned i dokumentet. Med appen Person Maker kan du:

  • Skapa en persongrupp, som är en grupp som består av flera personer som du vill associera med den. Med ditt Azure-konto kan du vara värd för flera persongrupper.

  • Skapa en person, som är medlem i en persongrupp. Varje person har ett antal ansiktsbilder kopplade till sig.

  • Tilldela ansiktsbilder till en person så att din Azure Face API-tjänst kan identifiera en person med motsvarande ansikte.

  • Träna din Azure Face API-tjänst.

Tänk på att för att träna den här appen att känna igen personer behöver du tio (10) närbilder av varje person som du vill lägga till i din persongrupp. Den Windows 10 Cam App kan hjälpa dig att ta dessa. Du måste se till att varje foto är klart (undvik att sudda ut, dölja eller vara för långt från motivet), ha fotot i jpg- eller png-filformat, där bildfilstorleken inte är större än 4 MB och inte mindre än 1 kB.

Anteckning

Om du följer den här självstudien ska du inte använda ditt eget ansikte för träning, som när du sätter på HoloLens kan du inte titta på dig själv. Använd ansiktet på en kollega eller medstudent.

Personskapare som körs:

  1. Öppna mappen PersonMaker och dubbelklicka på PersonMaker-lösningen för att öppna den med Visual Studio.

  2. När PersonMaker-lösningen är öppen kontrollerar du att:

    1. Lösningskonfigurationen är inställd på Felsök.

    2. Lösningsplattformen är inställd på x86

    3. Målplattformen är lokal dator.

    4. Du kan också behöva återställa NuGet-paket (högerklicka på lösningen och välj Återställ NuGet-paket).

  3. Klicka på Lokal dator så startas programmet. Tänk på att på mindre skärmar kanske allt innehåll inte visas, även om du kan rulla längre ned för att visa det.

    användargränssnitt för personskapare

  4. Infoga din Azure-autentiseringsnyckel, som du bör ha, från ansikts-API-tjänsten i Azure.

  5. Infoga:

    1. Det ID som du vill tilldela till persongruppen. ID:t måste vara gemener utan blanksteg. Anteckna det här ID:t eftersom det krävs senare i Ditt Unity-projekt.
    2. Namnet som du vill tilldela till persongruppen (kan ha blanksteg).
  6. Tryck på knappen Skapa persongrupp . Ett bekräftelsemeddelande bör visas under knappen.

Anteckning

Om du har ett felmeddelande om nekad åtkomst kontrollerar du den plats som du har angett för din Azure-tjänst. Som nämnts ovan är den här appen utformad för "USA, västra".

Viktigt

Du kan också klicka på knappen Hämta en känd grupp : detta gäller om du redan har skapat en persongrupp och vill använda den i stället för att skapa en ny. Tänk på att om du klickar på Skapa en persongrupp med en känd grupp hämtas även en grupp.

  1. Infoga namnet på den person som du vill skapa.

    1. Klicka på knappen Skapa person .

    2. Ett bekräftelsemeddelande bör visas under knappen.

    3. Om du vill ta bort en person som du har skapat tidigare kan du skriva namnet i textrutan och trycka på Ta bort person

  2. Kontrollera att du vet var tio (10) foton av personen du vill lägga till i gruppen finns.

  3. Tryck på Skapa och öppna mapp för att öppna Utforskaren till mappen som är associerad med personen. Lägg till de tio (10) bilderna i mappen. Dessa måste ha JPG - eller PNG-filformat .

  4. Klicka på Skicka till Azure. En räknare visar tillståndet för sändningen, följt av ett meddelande när det har slutförts.

  5. När räknaren är klar och ett bekräftelsemeddelande har visats klickar du på Träna för att träna din tjänst.

När processen har slutförts är du redo att gå vidare till Unity.

Kapitel 3 – Konfigurera Unity-projektet

Följande är en typisk konfiguration för utveckling med mixad verklighet och är därför en bra mall för andra projekt.

  1. Öppna Unity och klicka på Nytt.

    Starta ett nytt Unity-projekt.

  2. Nu måste du ange ett Unity-projektnamn. Infoga MR_FaceRecognition. Kontrollera att projekttypen är inställd på 3D. Ange plats till någonstans som passar dig (kom ihåg att närmare rotkataloger är bättre). Klicka sedan på Skapa projekt.

    Ange information för det nya Unity-projektet.

  3. När Unity är öppet är det värt att kontrollera att standardskriptredigeraren är inställd på Visual Studio. Gå till Redigera > inställningar och gå sedan till Externa verktyg från det nya fönstret. Ändra extern skriptredigerare till Visual Studio 2017. Stäng fönstret Inställningar .

    Uppdatera skriptredigerarens inställningar.

  4. Gå sedan till Inställningar för filbygge > och växla plattformen till Universell Windows-plattform genom att klicka på knappen Växla plattform.

    Fönstret Skapa inställningar, växla plattform till UWP.

  5. Gå till Inställningar för filbygge > och kontrollera att:

    1. Målenheten är inställd på HoloLens

      För de uppslukande headseten anger du Målenhet till Valfri enhet.

    2. Byggtyp är inställt på D3D

    3. SDK är inställt på Senaste installerat

    4. Visual Studio-versionen är inställd på Senaste installerad

    5. Build and Run är inställt på Lokal dator

    6. Spara scenen och lägg till den i bygget.

      1. Gör detta genom att välja Lägg till öppna scener. Ett spara-fönster visas.

        Klicka på knappen Lägg till öppna scener

      2. Välj knappen Ny mapp om du vill skapa en ny mapp och ge den namnet Scener.

        Skapa ny skriptmapp

      3. Öppna mappen Scener och skriv FaceRecScene i textfältet Filnamn: och tryck sedan på Spara.

        Ge den nya scenen ett namn.

    7. De återstående inställningarna i Bygginställningar bör vara kvar som standard för tillfället.

  6. I fönstret Build Settings (Skapa inställningar ) klickar du på knappen Spelarinställningar . Då öppnas den relaterade panelen i det utrymme där kontrollanten finns.

    Öppna spelarinställningar.

  7. I den här panelen måste några inställningar verifieras:

    1. På fliken Andra inställningar :

      1. Körningsversionen för skript ska vara experimentell (.NET 4.6 Motsvarande). Om du ändrar detta utlöses ett behov av att starta om redigeraren.

      2. Skriptserverdelen ska vara .NET

      3. API-kompatibilitetsnivån ska vara .NET 4.6

        Uppdatera andra inställningar.

    2. På fliken Publiceringsinställningar går du till Funktioner och kontrollerar:

      • InternetClient

      • Webbkamera

        Uppdaterar publiceringsinställningarna.

    3. Längre ned på panelen, i XR-inställningar (finns nedan Publicera inställningar), markerar du Virtual Reality Supported (Virtual Reality Supported) och kontrollerar att Windows Mixed Reality SDK har lagts till.

      Uppdatera X R-inställningarna.

  8. I Bygginställningar är Unity C# Projects inte längre nedtonat. markera kryssrutan bredvid detta.

  9. Stäng fönstret Build Settings (Bygginställningar).

  10. Spara din scen och ditt projekt (FILE > SAVE SCENE/FILE > SAVE PROJECT).

Kapitel 4 – Installation av huvudkamera

Viktigt

Om du vill hoppa över Unity Set up-komponenten i den här kursen och fortsätta direkt till koden kan du ladda ned .unitypackage och importera den till projektet som ett anpassat paket. Tänk på att det här paketet även omfattar import av Newtonsoft DLL, som beskrivs i kapitel 5. Med den här importen kan du fortsätta från kapitel 6.

  1. I hierarkipanelen väljer du huvudkameran.

  2. När du har valt kan du se alla komponenter i huvudkameran i kontrollpanelen.

    1. Kameraobjektet måste ha namnet Main Camera (observera stavningen!)

    2. Huvudkamerataggen måste vara inställd på MainCamera (observera stavningen!)

    3. Kontrollera att transformeringspositionen är inställd på 0, 0, 0

    4. Ange Ta bort flaggor till Enfärgad

    5. Ange bakgrundsfärgen för kamerakomponenten till Svart, Alpha 0 (Hexkod: #000000000)

      konfigurera kamerakomponenter

Kapitel 5 – Importera Newtonsoft.Json-biblioteket

Viktigt

Om du importerade ".unitypackage" i det sista kapitlet kan du hoppa över det här kapitlet.

För att hjälpa dig att deserialisera och serialisera objekt som tagits emot och skickats till Bot Service måste du ladda ned Newtonsoft.Json-biblioteket. Du hittar en kompatibel version som redan är ordnad med rätt Unity-mappstruktur i den här Unity-paketfilen.

Så här importerar du biblioteket:

  1. Ladda ned Unity-paketet.

  2. Klicka på Tillgångar, Importera paket, Anpassat paket.

    Importera Newtonsoft.Json

  3. Leta efter Unity-paketet som du har laddat ned och klicka på Öppna.

  4. Kontrollera att alla komponenter i paketet är markerade och klicka på Importera.

    Importera Newtonsoft.Json-tillgångarna

Kapitel 6 – Skapa klassen FaceAnalysis

Syftet med klassen FaceAnalysis är att vara värd för de metoder som krävs för att kommunicera med din Azure Face Recognition Service.

  • När tjänsten har skickat en avbildningsbild analyserar den den och identifierar ansiktena i och avgör om någon tillhör en känd person.
  • Om en känd person hittas visar den här klassen sitt namn som användargränssnittstext i scenen.

Så här skapar du klassen FaceAnalysis :

  1. Högerklicka i mappen Tillgångar i projektpanelen och klicka sedan på Skapa>mapp. Anropa mappen Skript.

    Skapa klassen FaceAnalysis.

  2. Dubbelklicka på mappen som nyss skapades för att öppna den.

  3. Högerklicka i mappen och klicka sedan på Skapa>C#-skript. Anropa skriptet FaceAnalysis.

  4. Dubbelklicka på det nya FaceAnalysis-skriptet för att öppna det med Visual Studio 2017.

  5. Ange följande namnområden ovanför klassen FaceAnalysis :

        using Newtonsoft.Json;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using System.Text;
        using UnityEngine;
        using UnityEngine.Networking;
    
  6. Nu måste du lägga till alla objekt som används för deserialisering. Dessa objekt måste läggas till utanförFaceAnalysis-skriptet (under den nedre klammerparentesen).

        /// <summary>
        /// The Person Group object
        /// </summary>
        public class Group_RootObject
        {
            public string personGroupId { get; set; }
            public string name { get; set; }
            public object userData { get; set; }
        }
    
        /// <summary>
        /// The Person Face object
        /// </summary>
        public class Face_RootObject
        {
            public string faceId { get; set; }
        }
    
        /// <summary>
        /// Collection of faces that needs to be identified
        /// </summary>
        public class FacesToIdentify_RootObject
        {
            public string personGroupId { get; set; }
            public List<string> faceIds { get; set; }
            public int maxNumOfCandidatesReturned { get; set; }
            public double confidenceThreshold { get; set; }
        }
    
        /// <summary>
        /// Collection of Candidates for the face
        /// </summary>
        public class Candidate_RootObject
        {
            public string faceId { get; set; }
            public List<Candidate> candidates { get; set; }
        }
    
        public class Candidate
        {
            public string personId { get; set; }
            public double confidence { get; set; }
        }
    
        /// <summary>
        /// Name and Id of the identified Person
        /// </summary>
        public class IdentifiedPerson_RootObject
        {
            public string personId { get; set; }
            public string name { get; set; }
        }
    
  7. Metoderna Start() och Update() används inte, så ta bort dem nu.

  8. Lägg till följande variabler i klassen FaceAnalysis :

        /// <summary>
        /// Allows this class to behave like a singleton
        /// </summary>
        public static FaceAnalysis Instance;
    
        /// <summary>
        /// The analysis result text
        /// </summary>
        private TextMesh labelText;
    
        /// <summary>
        /// Bytes of the image captured with camera
        /// </summary>
        internal byte[] imageBytes;
    
        /// <summary>
        /// Path of the image captured with camera
        /// </summary>
        internal string imagePath;
    
        /// <summary>
        /// Base endpoint of Face Recognition Service
        /// </summary>
        const string baseEndpoint = "https://westus.api.cognitive.microsoft.com/face/v1.0/";
    
        /// <summary>
        /// Auth key of Face Recognition Service
        /// </summary>
        private const string key = "- Insert your key here -";
    
        /// <summary>
        /// Id (name) of the created person group 
        /// </summary>
        private const string personGroupId = "- Insert your group Id here -";
    

    Anteckning

    Ersätt nyckeln och personGroupId med din tjänstnyckel och ID:t för den grupp som du skapade tidigare.

  9. Lägg till metoden Awake(), som initierar klassen, lägger till klassen ImageCapture i Main Camera och anropar metoden Skapa etikett:

        /// <summary>
        /// Initialises this class
        /// </summary>
        private void Awake()
        {
            // Allows this instance to behave like a singleton
            Instance = this;
    
            // Add the ImageCapture Class to this Game Object
            gameObject.AddComponent<ImageCapture>();
    
            // Create the text label in the scene
            CreateLabel();
        }
    
  10. Lägg till metoden CreateLabel() som skapar etikettobjektet för att visa analysresultatet:

        /// <summary>
        /// Spawns cursor for the Main Camera
        /// </summary>
        private void CreateLabel()
        {
            // Create a sphere as new cursor
            GameObject newLabel = new GameObject();
    
            // Attach the label to the Main Camera
            newLabel.transform.parent = gameObject.transform;
    
            // Resize and position the new cursor
            newLabel.transform.localScale = new Vector3(0.4f, 0.4f, 0.4f);
            newLabel.transform.position = new Vector3(0f, 3f, 60f);
    
            // Creating the text of the Label
            labelText = newLabel.AddComponent<TextMesh>();
            labelText.anchor = TextAnchor.MiddleCenter;
            labelText.alignment = TextAlignment.Center;
            labelText.tabSize = 4;
            labelText.fontSize = 50;
            labelText.text = ".";       
        }
    
  11. Lägg till metoden DetectFacesFromImage() och GetImageAsByteArray(). Den förstnämnda begär att ansiktsigenkänningstjänsten identifierar alla möjliga ansikten i den skickade bilden, medan den senare är nödvändig för att konvertera den avbildade bilden till en bytematris:

        /// <summary>
        /// Detect faces from a submitted image
        /// </summary>
        internal IEnumerator DetectFacesFromImage()
        {
            WWWForm webForm = new WWWForm();
            string detectFacesEndpoint = $"{baseEndpoint}detect";
    
            // Change the image into a bytes array
            imageBytes = GetImageAsByteArray(imagePath);
    
            using (UnityWebRequest www = 
                UnityWebRequest.Post(detectFacesEndpoint, webForm))
            {
                www.SetRequestHeader("Ocp-Apim-Subscription-Key", key);
                www.SetRequestHeader("Content-Type", "application/octet-stream");
                www.uploadHandler.contentType = "application/octet-stream";
                www.uploadHandler = new UploadHandlerRaw(imageBytes);
                www.downloadHandler = new DownloadHandlerBuffer();
    
                yield return www.SendWebRequest();
                string jsonResponse = www.downloadHandler.text;
                Face_RootObject[] face_RootObject = 
                    JsonConvert.DeserializeObject<Face_RootObject[]>(jsonResponse);
    
                List<string> facesIdList = new List<string>();
                // Create a list with the face Ids of faces detected in image
                foreach (Face_RootObject faceRO in face_RootObject)
                {
                    facesIdList.Add(faceRO.faceId);
                    Debug.Log($"Detected face - Id: {faceRO.faceId}");
                }
    
                StartCoroutine(IdentifyFaces(facesIdList));
            }
        }
    
        /// <summary>
        /// Returns the contents of the specified file as a byte array.
        /// </summary>
        static byte[] GetImageAsByteArray(string imageFilePath)
        {
            FileStream fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
            BinaryReader binaryReader = new BinaryReader(fileStream);
            return binaryReader.ReadBytes((int)fileStream.Length);
        }
    
  12. Lägg till metoden IdentifyFaces() som begär ansiktsigenkänningstjänsten för att identifiera alla kända ansikten som tidigare identifierats i den skickade bilden. Begäran returnerar ett ID för den identifierade personen men inte namnet:

        /// <summary>
        /// Identify the faces found in the image within the person group
        /// </summary>
        internal IEnumerator IdentifyFaces(List<string> listOfFacesIdToIdentify)
        {
            // Create the object hosting the faces to identify
            FacesToIdentify_RootObject facesToIdentify = new FacesToIdentify_RootObject();
            facesToIdentify.faceIds = new List<string>();
            facesToIdentify.personGroupId = personGroupId;
            foreach (string facesId in listOfFacesIdToIdentify)
            {
                facesToIdentify.faceIds.Add(facesId);
            }
            facesToIdentify.maxNumOfCandidatesReturned = 1;
            facesToIdentify.confidenceThreshold = 0.5;
    
            // Serialize to Json format
            string facesToIdentifyJson = JsonConvert.SerializeObject(facesToIdentify);
            // Change the object into a bytes array
            byte[] facesData = Encoding.UTF8.GetBytes(facesToIdentifyJson);
    
            WWWForm webForm = new WWWForm();
            string detectFacesEndpoint = $"{baseEndpoint}identify";
    
            using (UnityWebRequest www = UnityWebRequest.Post(detectFacesEndpoint, webForm))
            {
                www.SetRequestHeader("Ocp-Apim-Subscription-Key", key);
                www.SetRequestHeader("Content-Type", "application/json");
                www.uploadHandler.contentType = "application/json";
                www.uploadHandler = new UploadHandlerRaw(facesData);
                www.downloadHandler = new DownloadHandlerBuffer();
    
                yield return www.SendWebRequest();
                string jsonResponse = www.downloadHandler.text;
                Debug.Log($"Get Person - jsonResponse: {jsonResponse}");
                Candidate_RootObject [] candidate_RootObject = JsonConvert.DeserializeObject<Candidate_RootObject[]>(jsonResponse);
    
                // For each face to identify that ahs been submitted, display its candidate
                foreach (Candidate_RootObject candidateRO in candidate_RootObject)
                {
                    StartCoroutine(GetPerson(candidateRO.candidates[0].personId));
    
                    // Delay the next "GetPerson" call, so all faces candidate are displayed properly
                    yield return new WaitForSeconds(3);
                }           
            }
        }
    
  13. Lägg till metoden GetPerson(). Genom att ange person-ID:t begär den här metoden sedan att ansiktsigenkänningstjänsten ska returnera namnet på den identifierade personen:

        /// <summary>
        /// Provided a personId, retrieve the person name associated with it
        /// </summary>
        internal IEnumerator GetPerson(string personId)
        {
            string getGroupEndpoint = $"{baseEndpoint}persongroups/{personGroupId}/persons/{personId}?";
            WWWForm webForm = new WWWForm();
    
            using (UnityWebRequest www = UnityWebRequest.Get(getGroupEndpoint))
            {
                www.SetRequestHeader("Ocp-Apim-Subscription-Key", key);
                www.downloadHandler = new DownloadHandlerBuffer();
                yield return www.SendWebRequest();
                string jsonResponse = www.downloadHandler.text;
    
                Debug.Log($"Get Person - jsonResponse: {jsonResponse}");
                IdentifiedPerson_RootObject identifiedPerson_RootObject = JsonConvert.DeserializeObject<IdentifiedPerson_RootObject>(jsonResponse);
    
                // Display the name of the person in the UI
                labelText.text = identifiedPerson_RootObject.name;
            }
        }
    
  14. Kom ihåg att spara ändringarna innan du går tillbaka till Unity-redigeraren.

  15. Dra FaceAnalysis-skriptet från mappen Skript i projektpanelen till huvudkameraobjektet på hierarkipanelen i Unity-redigeraren. Den nya skriptkomponenten läggs till i huvudkameran.

Placera FaceAnalysis på huvudkameran

Kapitel 7 – Skapa klassen ImageCapture

Syftet med klassen ImageCapture är att vara värd för de metoder som krävs för att kommunicera med din Azure-tjänst för ansiktsigenkänning för att analysera den bild som du kommer att avbilda, identifiera ansikten i den och avgöra om den tillhör en känd person. Om en känd person hittas visar den här klassen sitt namn som användargränssnittstext i scenen.

Så här skapar du klassen ImageCapture :

  1. Högerklicka i mappen Skript som du skapade tidigare och klicka sedan på SkapaC#-skript. Anropa skriptet ImageCapture.

  2. Dubbelklicka på det nya ImageCapture-skriptet för att öppna det med Visual Studio 2017.

  3. Ange följande namnområden ovanför klassen ImageCapture:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  4. Lägg till följande variabler i klassen ImageCapture :

        /// <summary>
        /// Allows this class to behave like a singleton
        /// </summary>
        public static ImageCapture instance;
    
        /// <summary>
        /// Keeps track of tapCounts to name the captured images 
        /// </summary>
        private int tapsCount;
    
        /// <summary>
        /// PhotoCapture object used to capture images on HoloLens 
        /// </summary>
        private PhotoCapture photoCaptureObject = null;
    
        /// <summary>
        /// HoloLens class to capture user gestures
        /// </summary>
        private GestureRecognizer recognizer;
    
  5. Lägg till metoderna Awake() och Start() som krävs för att initiera klassen och låta HoloLens avbilda användarens gester:

        /// <summary>
        /// Initialises this class
        /// </summary>
        private void Awake()
        {
            instance = this;
        }
    
        /// <summary>
        /// Called right after Awake
        /// </summary>
        void Start()
        {
            // Initialises user gestures capture 
            recognizer = new GestureRecognizer();
            recognizer.SetRecognizableGestures(GestureSettings.Tap);
            recognizer.Tapped += TapHandler;
            recognizer.StartCapturingGestures();
        }
    
  6. Lägg till TapHandler() som anropas när användaren utför en Tryckgest :

        /// <summary>
        /// Respond to Tap Input.
        /// </summary>
        private void TapHandler(TappedEventArgs obj)
        {
            tapsCount++;
            ExecuteImageCaptureAndAnalysis();
        }
    
  7. Lägg till metoden ExecuteImageCaptureAndAnalysis(), som påbörjar processen för bildfångst:

        /// <summary>
        /// Begin process of Image Capturing and send To Azure Computer Vision service.
        /// </summary>
        private void ExecuteImageCaptureAndAnalysis()
        {
            Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending
                ((res) => res.width * res.height).First();
            Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height);
    
            PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject)
            {
                photoCaptureObject = captureObject;
    
                CameraParameters c = new CameraParameters();
                c.hologramOpacity = 0.0f;
                c.cameraResolutionWidth = targetTexture.width;
                c.cameraResolutionHeight = targetTexture.height;
                c.pixelFormat = CapturePixelFormat.BGRA32;
    
                captureObject.StartPhotoModeAsync(c, delegate (PhotoCapture.PhotoCaptureResult result)
                {
                    string filename = string.Format(@"CapturedImage{0}.jpg", tapsCount);
                    string filePath = Path.Combine(Application.persistentDataPath, filename);
    
                    // Set the image path on the FaceAnalysis class
                    FaceAnalysis.Instance.imagePath = filePath;
    
                    photoCaptureObject.TakePhotoAsync
                    (filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk);
                });
            });
        }
    
  8. Lägg till de hanterare som anropas när fotoinspelningsprocessen har slutförts:

        /// <summary>
        /// Called right after the photo capture process has concluded
        /// </summary>
        void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result)
        {
            photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode);
        }
    
        /// <summary>
        /// Register the full execution of the Photo Capture. If successful, it will begin the Image Analysis process.
        /// </summary>
        void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result)
        {
            photoCaptureObject.Dispose();
            photoCaptureObject = null;
    
            // Request image caputer analysis
            StartCoroutine(FaceAnalysis.Instance.DetectFacesFromImage());
        }
    
  9. Kom ihåg att spara ändringarna innan du går tillbaka till Unity-redigeraren.

Kapitel 8 – Skapa lösningen

Om du vill utföra ett grundligt test av ditt program måste du läsa in det separat på HoloLens.

Innan du gör det kontrollerar du att:

  • Alla inställningar som anges i kapitel 3 är korrekt inställda.
  • Skriptet FaceAnalysis är kopplat till huvudkameraobjektet.
  • Både autentiseringsnyckeln och grupp-ID:t har angetts i FaceAnalysis-skriptet .

Nu är du redo att skapa lösningen. När lösningen har skapats är du redo att distribuera ditt program.

Så här påbörjar du byggprocessen:

  1. Spara den aktuella scenen genom att klicka på Arkiv, Spara.

  2. Gå till Arkiv, Skapa inställningar, klicka på Lägg till öppna scener.

  3. Se till att kryssa i Unity C#-projekt.

    Distribuera Visual Studio-lösningen

  4. Tryck på Skapa. När du gör det startar Unity ett Utforskaren fönster där du behöver skapa och väljer sedan en mapp som appen ska byggas in i. Skapa mappen nu i Unity-projektet och kalla den App. Tryck sedan på Välj mapp när appmappen är markerad.

  5. Unity börjar skapa projektet, ut till mappen App.

  6. När Unity har skapats (det kan ta lite tid) öppnas ett Utforskaren fönster på platsen för bygget.

    Distribuera lösningen från Visual Studio

  7. Öppna mappen App och öppna sedan den nya projektlösningen (se ovan MR_FaceRecognition.sln).

Kapitel 9 – Distribuera ditt program

Så här distribuerar du på HoloLens:

  1. Du behöver IP-adressen för din HoloLens (för fjärrdistribution) och för att säkerställa att HoloLens är i utvecklarläge. Gör så här:

    1. När du har på dig HoloLens öppnar du Inställningar.
    2. Gå till Avancerade alternativ för Nätverk & Internet > Wi-Fi >
    3. Anteckna IPv4-adressen .
    4. Gå sedan tillbaka till Inställningar och sedan till Uppdatera & Säkerhet > för utvecklare
    5. Ställ in Utvecklarläge på.
  2. Gå till din nya Unity-version (mappen App ) och öppna lösningsfilen med Visual Studio.

  3. I Lösningskonfiguration väljer du Felsök.

  4. I Lösningsplattform väljer du x86, Fjärrdator.

    Ändra lösningskonfigurationen

  5. Gå till menyn Skapa och klicka på Distribuera lösning för att läsa in programmet separat till HoloLens.

  6. Din app bör nu visas i listan över installerade appar på HoloLens, redo att startas!

Anteckning

Om du vill distribuera till integrerande headset ställer du in LösningsplattformLokal dator och ställer in KonfigurationFelsök med x86 som Plattform. Distribuera sedan till den lokala datorn med hjälp av menyn Skapa och välj Distribuera lösning.

Kapitel 10 – Använda programmet

  1. Starta appen med HoloLens.

  2. Titta på den person som du har registrerat med ansikts-API:et. Se till att:

    • Personens ansikte är inte alltför avlägset och tydligt synligt
    • Miljöbelysningen är inte för mörk
  3. Använd tryckgesten för att fånga personens bild.

  4. Vänta tills appen skickar analysbegäran och får ett svar.

  5. Om personen har identifierats visas personens namn som användargränssnittstext.

  6. Du kan upprepa avbildningsprocessen med tryckgesten med några sekunders mellanrum.

Ditt färdiga Ansikts-API-program i Azure

Grattis, du har skapat en mixed reality-app som använder Tjänsten Ansiktsigenkänning i Azure för att identifiera ansikten i en bild och identifiera kända ansikten.

resultatet av att ha slutfört den här kursen

Bonusövningar

Övning 1

Ansikts-API:et i Azure är tillräckligt kraftfullt för att identifiera upp till 64 ansikten i en enda bild. Utöka programmet så att det kan känna igen två eller tre ansikten, bland många andra personer.

Övning 2

Ansikts-API:et i Azure kan också ge tillbaka alla typer av attributinformation. Integrera detta i programmet. Detta kan vara ännu mer intressant i kombination med Känslo-API:et.