Urządzenia HoloLens (1. generacji) i Azure 304: rozpoznawanie twarzy


Uwaga

Samouczki Mixed Reality Academy zostały zaprojektowane z myślą o urządzeniach HoloLens (1. generacji) i Mixed Reality immersywnych zestawów słuchawkowych. W związku z tym uważamy, że ważne jest pozostawienie tych samouczków w miejscu dla deweloperów, którzy nadal szukają wskazówek dotyczących opracowywania dla tych urządzeń. Te samouczki nie zostaną zaktualizowane o najnowsze zestawy narzędzi ani interakcje używane na potrzeby HoloLens 2. Będą one utrzymywane w celu kontynuowania pracy na obsługiwanych urządzeniach. W przyszłości zostanie opublikowana nowa seria samouczków, które pokażą, jak opracowywać na potrzeby HoloLens 2. To powiadomienie zostanie zaktualizowane za pomocą linku do tych samouczków po ich opublikowaniu.


wynik ukończenia tego kursu

W tym kursie dowiesz się, jak dodać funkcje rozpoznawania twarzy do aplikacji rzeczywistości mieszanej przy użyciu usług Azure Cognitive Services za pomocą interfejsu API rozpoznawania twarzy firmy Microsoft.

Interfejs API rozpoznawania twarzy platformy Azure to usługa firmy Microsoft, która udostępnia deweloperom najbardziej zaawansowane algorytmy rozpoznawania twarzy— wszystkie w chmurze. Interfejs API rozpoznawania twarzy ma dwie główne funkcje: wykrywanie twarzy z atrybutami i rozpoznawanie twarzy. Dzięki temu deweloperzy mogą po prostu ustawić zestaw grup dla twarzy, a następnie wysłać obrazy zapytań do usługi później, aby określić, do kogo należy twarz. Aby uzyskać więcej informacji, odwiedź stronę rozpoznawania twarzy platformy Azure.

Po ukończeniu tego kursu będziesz mieć aplikację holoLens rzeczywistości mieszanej, która będzie mogła wykonać następujące czynności:

  1. Użyj gestu naciśnięcia , aby zainicjować przechwytywanie obrazu przy użyciu wbudowanej kamery HoloLens.
  2. Wyślij przechwycony obraz do usługi interfejsu API rozpoznawania twarzy platformy Azure .
  3. Odbieranie wyników algorytmu interfejsu API rozpoznawania twarzy .
  4. Użyj prostego interfejsu użytkownika, aby wyświetlić nazwę dopasowanych osób.

Dzięki temu dowiesz się, jak uzyskać wyniki z usługi interfejsu API rozpoznawania twarzy w aplikacji rzeczywistości mieszanej opartej na akodzie aparatu Unity.

W aplikacji należy do Ciebie, jak zintegrować wyniki z projektem. Ten kurs jest przeznaczony do nauki integrowania usługi platformy Azure z projektem aparatu Unity. Twoim zadaniem jest wykorzystanie wiedzy zdobytą z tego kursu w celu ulepszenia aplikacji rzeczywistości mieszanej.

Obsługa urządzeń

Kurs HoloLens Immersyjne zestawy nagłowne
MR i Azure 304: rozpoznawanie twarzy ✔️ ✔️

Uwaga

Chociaż ten kurs koncentruje się głównie na urządzeniu HoloLens, możesz również zastosować to, czego nauczysz się w tym kursie, aby Windows Mixed Reality immersywny zestaw słuchawkowy (VR). Ponieważ immersyjne zestawy nagłowne (VR) nie mają dostępnych kamer, potrzebny będzie zewnętrzny aparat podłączony do komputera. Wraz z kursem zobaczysz notatki dotyczące wszelkich zmian, które mogą być potrzebne do obsługi immersywnych zestawów słuchawkowych (VR).

Wymagania wstępne

Uwaga

Ten samouczek jest przeznaczony dla deweloperów, którzy mają podstawowe doświadczenie w językach Unity i C#. Należy również pamiętać, że wymagania wstępne i pisemne instrukcje zawarte w tym dokumencie reprezentują to, co zostało przetestowane i zweryfikowane w momencie pisania (maj 2018 r.). Możesz korzystać z najnowszego oprogramowania, jak wymieniono w artykule dotyczącym instalacji narzędzi , choć nie należy zakładać, że informacje w tym kursie doskonale pasują do tego, co znajdziesz w nowszym oprogramowaniu niż wymienione poniżej.

Na potrzeby tego kursu zalecamy następujący sprzęt i oprogramowanie:

Przed rozpoczęciem

  1. Aby uniknąć problemów podczas tworzenia tego projektu, zdecydowanie zaleca się utworzenie projektu wymienionego w tym samouczku w folderze głównym lub niemal głównym (długie ścieżki folderów mogą powodować problemy w czasie kompilacji).
  2. Konfigurowanie i testowanie urządzenia HoloLens. Jeśli potrzebujesz pomocy technicznej dotyczącej konfigurowania urządzenia HoloLens, zapoznaj się z artykułem dotyczącym konfigurowania urządzenia HoloLens.
  3. Dobrym pomysłem jest przeprowadzenie kalibracji i dostrajania czujników podczas tworzenia nowej aplikacji holoLens (czasami może to pomóc w wykonaniu tych zadań dla każdego użytkownika).

Aby uzyskać pomoc dotyczącą kalibracji, skorzystaj z tego linku do artykułu Kalibracja urządzenia HoloLens.

Aby uzyskać pomoc dotyczącą dostrajania czujników, skorzystaj z tego linku do artykułu dotyczącego dostrajania czujników holoLens.

Rozdział 1 — Witryna Azure Portal

Aby korzystać z usługi interfejsu API rozpoznawania twarzy na platformie Azure, należy skonfigurować wystąpienie usługi, które ma zostać udostępnione aplikacji.

  1. Najpierw zaloguj się do witryny Azure Portal.

    Uwaga

    Jeśli nie masz jeszcze konta platformy Azure, musisz je utworzyć. Jeśli korzystasz z tego samouczka w sytuacji na potrzeby zajęć lub laboratorium, poproś instruktora lub jednego z opiekunów o pomoc przy konfigurowaniu nowego konta.

  2. Po zalogowaniu kliknij pozycję Nowy w lewym górnym rogu i wyszukaj pozycję Interfejs API rozpoznawania twarzy, naciśnij klawisz Enter.

    wyszukiwanie interfejsu API rozpoznawania twarzy

    Uwaga

    Wyraz Nowy mógł zostać zastąpiony ciągiem Create a resource (Utwórz zasób) w nowszych portalach.

  3. Nowa strona zawiera opis usługi interfejsu API rozpoznawania twarzy . W lewym dolnym rogu tego monitu wybierz przycisk Utwórz , aby utworzyć skojarzenie z tą usługą.

    Informacje o interfejsie API rozpoznawania twarzy

  4. Po kliknięciu pozycji Utwórz:

    1. Wstaw żądaną nazwę dla tego wystąpienia usługi.

    2. Wybierz subskrypcję.

    3. Wybierz warstwę cenową odpowiednią dla Ciebie, jeśli jest to pierwszy raz podczas tworzenia usługi interfejsu API rozpoznawania twarzy, powinna być dostępna warstwa bezpłatna (o nazwie F0).

    4. Wybierz grupę zasobów lub utwórz nową. Grupa zasobów umożliwia monitorowanie, kontrolowanie dostępu, aprowizowania i zarządzania rozliczeniami dla kolekcji zasobów platformy Azure. Zaleca się zachowanie wszystkich usług platformy Azure skojarzonych z jednym projektem (np. takich jak te laboratoria) w ramach wspólnej grupy zasobów.

      Jeśli chcesz dowiedzieć się więcej na temat grup zasobów platformy Azure, odwiedź artykuł grupy zasobów.

    5. Aplikacja platformy UWP, Person Maker, której używasz później, wymaga użycia elementu "Zachodnie stany USA" do lokalizacji.

    6. Musisz również potwierdzić, że rozumiesz warunki i postanowienia zastosowane do tej usługi.

    7. Wybierz pozycję Utwórz.*

      tworzenie usługi interfejsu API rozpoznawania twarzy

  5. Po kliknięciu pozycji Utwórz* trzeba będzie poczekać, aż usługa zostanie utworzona, może to potrwać minutę.

  6. Po utworzeniu wystąpienia usługi w portalu zostanie wyświetlone powiadomienie.

    powiadomienie o utworzeniu usługi

  7. Kliknij powiadomienia, aby zapoznać się z nowym wystąpieniem usługi.

    Przejdź do powiadomienia o zasobie

  8. Gdy wszystko będzie gotowe, kliknij przycisk Przejdź do zasobu w powiadomieniu, aby zapoznać się z nowym wystąpieniem usługi.

    uzyskiwanie dostępu do kluczy interfejsu API rozpoznawania twarzy

  9. W ramach tego samouczka aplikacja będzie musiała wykonywać wywołania usługi, co odbywa się za pomocą subskrypcji "klucz" usługi. Na stronie Szybki start usługi interfejsu API rozpoznawania twarzy pierwszy punkt to numer 1, aby pobrać klucze.

  10. Na stronie Usługa wybierz niebieski hiperlink Klucze (jeśli znajduje się na stronie Szybki start) lub link Klucze w menu nawigacji usług (po lewej stronie, oznaczony ikoną klucza), aby wyświetlić klucze.

    Uwaga

    Zanotuj jeden z kluczy i zabezpieczeń go, ponieważ będzie on potrzebny później.

Rozdział 2 — Korzystanie z aplikacji platformy UWP "Person Maker"

Pamiętaj, aby pobrać wstępnie utworzoną aplikację platformy UWP o nazwie Person Maker. Ta aplikacja nie jest produktem końcowym tego kursu, tylko narzędziem, które ułatwia tworzenie wpisów platformy Azure, na których będzie polegać późniejszy projekt.

Usługa Person Maker umożliwia tworzenie wpisów platformy Azure, które są skojarzone z osobami i grupami osób. Aplikacja umieści wszystkie potrzebne informacje w formacie, który może być później używany przez interfejs FaceAPI w celu rozpoznawania twarzy osób, które zostały dodane.

[WAŻNE] Usługa Person Maker używa niektórych podstawowych ograniczeń, aby zapewnić, że nie przekraczasz liczby wywołań usług na minutę dla warstwy subskrypcji bezpłatnej. Zielony tekst u góry zmieni się na czerwony i zostanie zaktualizowany jako "AKTYWNY", gdy występuje ograniczanie przepustowości; jeśli tak jest, po prostu zaczekaj na aplikację (będzie czekać, aż będzie mogła kontynuować dostęp do usługi rozpoznawania twarzy, aktualizując ją jako "IN-ACTIVE", gdy będzie można jej ponownie użyć).

Ta aplikacja korzysta z bibliotek Microsoft.ProjectOxford.Face , które umożliwiają pełne korzystanie z interfejsu API rozpoznawania twarzy. Ta biblioteka jest dostępna bezpłatnie jako pakiet NuGet. Aby uzyskać więcej informacji na temat tego i podobnych interfejsów API, zobacz artykuł Dokumentacja interfejsu API.

Uwaga

Są to tylko wymagane kroki, instrukcje dotyczące dalszego wykonywania tych czynności w dokumencie. Aplikacja Person Maker umożliwia wykonywanie następujących czynności:

  • Utwórz grupę osób, która jest grupą składającą się z kilku osób, które chcesz z nią skojarzyć. Za pomocą konta platformy Azure możesz hostować wiele grup osób.

  • Utwórz osobę, która jest członkiem grupy osób. Każda osoba ma skojarzonych z nim kilka obrazów twarzy .

  • Przypisz obrazy twarzy do osoby, aby umożliwić usłudze interfejsu API rozpoznawania twarzy platformy Azure rozpoznawanie osoby przy użyciu odpowiedniej twarzy.

  • Trenowanieusługi interfejsu API rozpoznawania twarzy platformy Azure.

Pamiętaj, aby wytrenować tę aplikację do rozpoznawania osób, będziesz potrzebować dziesięciu (10) zdjęć zbliżeniowych każdej osoby, którą chcesz dodać do grupy osób. Aplikacja Windows 10 Cam może pomóc w ich podjęciu. Należy upewnić się, że każde zdjęcie jest jasne (unikaj rozmycia, zaciemniania lub zbyt daleko od tematu), mieć zdjęcie w formacie jpg lub png, z rozmiarem pliku obrazu nie większym niż 4 MB, a nie mniej niż 1 KB.

Uwaga

Jeśli korzystasz z tego samouczka, nie używaj własnej twarzy do trenowania, ponieważ podczas umieszczania urządzenia HoloLens nie możesz spojrzeć na siebie. Użyj twarzy współpracownika lub innego ucznia.

Uruchamianie usługi Person Maker:

  1. Otwórz folder PersonMaker i kliknij dwukrotnie rozwiązanie PersonMaker , aby otworzyć je za pomocą programu Visual Studio.

  2. Po otwarciu rozwiązania PersonMaker upewnij się, że:

    1. Konfiguracja rozwiązania jest ustawiona na Debugowanie.

    2. Platforma rozwiązania jest ustawiona na x86

    3. Platforma docelowa to maszyna lokalna.

    4. Może być również konieczne przywrócenie pakietów NuGet (kliknij prawym przyciskiem myszy rozwiązanie i wybierz polecenie Przywróć pakiety NuGet).

  3. Kliknij pozycję Maszyna lokalna , a aplikacja zostanie uruchomiona. Należy pamiętać, że na mniejszych ekranach cała zawartość może nie być widoczna, ale możesz przewijać ją dalej, aby ją wyświetlić.

    interfejs użytkownika twórcy osób

  4. Wstaw klucz uwierzytelniania platformy Azure, który należy mieć z poziomu usługi interfejsu API rozpoznawania twarzy na platformie Azure.

  5. Wstawić:

    1. Identyfikator, który chcesz przypisać do grupy osób. Identyfikator musi być małymi literami bez spacji. Zanotuj ten identyfikator, ponieważ będzie on wymagany w dalszej części projektu aparatu Unity.
    2. Nazwa, którą chcesz przypisać do grupy osób (może mieć spacje).
  6. Naciśnij przycisk Utwórz grupę osób . Pod przyciskiem powinien pojawić się komunikat z potwierdzeniem.

Uwaga

Jeśli masz błąd "Odmowa dostępu", sprawdź lokalizację ustawioną dla usługi platformy Azure. Jak wspomniano powyżej, ta aplikacja jest przeznaczona dla "Zachodnie stany USA".

Ważne

Zauważysz, że możesz również kliknąć przycisk Pobierz znaną grupę : dotyczy to, jeśli grupa osób została już utworzona i chcesz jej użyć, a nie utworzyć nowego. Pamiętaj, że jeśli klikniesz pozycję Utwórz grupę osób ze znaną grupą, spowoduje to również pobranie grupy.

  1. Wstaw nazwęosoby , którą chcesz utworzyć.

    1. Kliknij przycisk Utwórz osobę .

    2. Pod przyciskiem powinien pojawić się komunikat z potwierdzeniem.

    3. Jeśli chcesz usunąć wcześniej utworzoną osobę, możesz napisać nazwę w polu tekstowym i nacisnąć klawisz Delete Person

  2. Upewnij się, że znasz lokalizację dziesięciu (10) zdjęć osoby, którą chcesz dodać do grupy.

  3. Naciśnij pozycję Utwórz i Otwórz folder , aby otworzyć Eksploratora Windows w folderze skojarzonym z osobą. Dodaj dziesięć (10) obrazów w folderze. Musi to być format pliku JPG lub PNG .

  4. Kliknij pozycję Prześlij na platformę Azure. Licznik wyświetli stan przesłania, po którym następuje komunikat po zakończeniu.

  5. Po zakończeniu licznika i wyświetleniu komunikatu z potwierdzeniem kliknij pozycję Trenuj , aby wytrenować usługę.

Po zakończeniu procesu możesz przejść do środowiska Unity.

Rozdział 3 . Konfigurowanie projektu aparatu Unity

Poniżej przedstawiono typową konfigurację do opracowywania za pomocą rzeczywistości mieszanej, a w związku z tym jest to dobry szablon dla innych projektów.

  1. Otwórz aparat Unity i kliknij pozycję Nowy.

    Uruchom nowy projekt aparatu Unity.

  2. Teraz musisz podać nazwę projektu aparatu Unity. Wstaw MR_FaceRecognition. Upewnij się, że typ projektu ma ustawioną wartość 3D. Ustaw lokalizację na odpowiednią dla Ciebie (pamiętaj, że bliżej katalogów głównych jest lepiej). Następnie kliknij pozycję Utwórz projekt.

    Podaj szczegóły nowego projektu aparatu Unity.

  3. Po otwarciu aparatu Unity warto sprawdzić domyślny edytor skryptów ustawiony na program Visual Studio. Przejdź do pozycji Edytuj > preferencje , a następnie w nowym oknie przejdź do pozycji Narzędzia zewnętrzne. Zmień edytor skryptów zewnętrznych na Visual Studio 2017. Zamknij okno Preferencje .

    Aktualizowanie preferencji edytora skryptów.

  4. Następnie przejdź do pozycji Ustawienia kompilacji plików > i przełącz platformę na platforma uniwersalna systemu Windows, klikając przycisk Przełącz platformę.

    Okno Ustawienia kompilacji, przełącz platformę na platformę UWP.

  5. Przejdź do pozycji Ustawienia kompilacji pliku > i upewnij się, że:

    1. Urządzenie docelowe ma ustawioną wartość HoloLens

      W przypadku immersyjnych zestawów słuchawkowych ustaw wartość Urządzenie docelowe na Dowolne urządzenie.

    2. Typ kompilacji jest ustawiony na D3D

    3. Zestaw SDK jest ustawiony na najnowszą zainstalowaną

    4. Wersja programu Visual Studio jest ustawiona na najnowszą zainstalowaną

    5. Kompilowanie i uruchamianie jest ustawione na komputer lokalny

    6. Zapisz scenę i dodaj ją do kompilacji.

      1. Zrób to, wybierając pozycję Dodaj otwarte sceny. Zostanie wyświetlone okno zapisywania.

        Kliknij przycisk Dodaj otwarte sceny

      2. Wybierz przycisk Nowy folder , aby utworzyć nowy folder, nadaj mu nazwę Sceny.

        Tworzenie nowego folderu skryptów

      3. Otwórz nowo utworzony folder Sceny , a następnie w polu Nazwa pliku: tekst wpisz FaceRecScene, a następnie naciśnij przycisk Zapisz.

        Nadaj nowej scenie nazwę.

    7. Pozostałe ustawienia w obszarze Ustawienia kompilacji powinny być pozostawione jako domyślne na razie.

  6. W oknie Ustawienia kompilacji kliknij przycisk Ustawienia odtwarzacza , spowoduje to otwarcie powiązanego panelu w obszarze, w którym znajduje się inspektor .

    Otwórz ustawienia odtwarzacza.

  7. W tym panelu należy zweryfikować kilka ustawień:

    1. Na karcie Inne ustawienia :

      1. Wersja środowiska uruchomieniowegoskryptów powinna być eksperymentalna (odpowiednik platformy.NET 4.6). Zmiana tej zmiany spowoduje konieczność ponownego uruchomienia edytora.

      2. Zaplecze skryptów powinno mieć wartość .NET

      3. Poziom zgodności interfejsu API powinien mieć wartość .NET 4.6

        Zaktualizuj inne ustawienia.

    2. Na karcie Ustawienia publikowania w obszarze Możliwości sprawdź:

      • InternetClient

      • Kamerka internetowa

        Aktualizowanie ustawień publikowania.

    3. W dalszej części panelu w obszarze Ustawienia XR (znajdujące się poniżej ustawień publikowania) zaznacz opcję Virtual Reality Supported (Obsługa rzeczywistości wirtualnej), upewnij się, że dodano zestaw SDK Windows Mixed Reality.

      Zaktualizuj ustawienia X R.

  8. Po powrocie do ustawień kompilacjiprojekty języka C# aparatu Unity nie są już wyszarzone; zaznacz pole wyboru obok tego.

  9. Zamknij okno Build Settings (Ustawienia kompilacji).

  10. Zapisz scenę i projekt (PLIK > ZAPISZ SCENĘ / PLIK > ZAPISZ PROJEKT).

Rozdział 4 — Konfiguracja głównej kamery

Ważne

Jeśli chcesz pominąć składnik Unity Set up tego kursu i kontynuować bezpośrednio w kodzie, możesz pobrać ten pakiet unitypackage i zaimportować go do projektu jako pakiet niestandardowy. Należy pamiętać, że ten pakiet zawiera również importowanie biblioteki DLL Newtonsoft omówionej w rozdziale 5. Po zaimportowaniu można kontynuować pracę z rozdziału 6.

  1. W panelu hierarchii wybierz aparat główny.

  2. Po wybraniu opcji będzie można zobaczyć wszystkie składniki głównego aparatu w Panelu inspektora.

    1. Obiekt Camera musi mieć nazwę Main Camera (zanotuj pisownię!)

    2. Główny tag aparatu musi być ustawiony na MainCamera (zanotuj pisownię!)

    3. Upewnij się, że pozycja przekształcania jest ustawiona na 0, 0, 0

    4. Ustaw przezroczyste flagi na kolor stały

    5. Ustaw kolor tła składnika aparatu na Czarny, Alfa 0 (kod szesnastkowy: #00000000)

      konfigurowanie składników aparatu

Rozdział 5 — importowanie biblioteki Newtonsoft.Json

Ważne

Jeśli zaimportowaliśmy pakiet ".unitypackage" w ostatnim rozdziale, możesz pominąć ten rozdział.

Aby ułatwić deserializacji i serializacji odebranych i wysłanych do Bot Service należy pobrać bibliotekę Newtonsoft.Json. W tym pliku pakietu aparatu Unity znajdziesz już zgodną wersję zorganizowaną z prawidłową strukturą folderów aparatu Unity.

Aby zaimportować bibliotekę:

  1. Pobierz pakiet aparatu Unity.

  2. Kliknij pozycję Zasoby, Importuj pakiet, Pakiet niestandardowy.

    Importowanie pliku Newtonsoft.Json

  3. Poszukaj pobranego pakietu aparatu Unity, a następnie kliknij przycisk Otwórz.

  4. Upewnij się, że wszystkie składniki pakietu są zaznaczone i kliknij przycisk Importuj.

    Importowanie zasobów Newtonsoft.Json

Rozdział 6 . Tworzenie klasy FaceAnalysis

Celem klasy FaceAnalysis jest hostowanie metod niezbędnych do komunikowania się z usługą rozpoznawania twarzy platformy Azure.

  • Po wysłaniu usługi obraz przechwytywania przeanalizuje go i zidentyfikuje twarze w obrębie i określi, czy którakolwiek z osób należy do znanej osoby.
  • Jeśli zostanie znaleziona znana osoba, ta klasa wyświetli nazwę jako tekst interfejsu użytkownika w scenie.

Aby utworzyć klasę FaceAnalysis :

  1. Kliknij prawym przyciskiem myszy folder Assets znajdujący się w panelu projektu, a następnie kliknij pozycję Utwórz>folder. Wywołaj skrypty folderu.

    Utwórz klasę FaceAnalysis.

  2. Kliknij dwukrotnie właśnie utworzony folder, aby go otworzyć.

  3. Kliknij prawym przyciskiem myszy wewnątrz folderu, a następnie kliknij pozycję Utwórz>skrypt języka C#. Wywołaj skrypt FaceAnalysis.

  4. Kliknij dwukrotnie nowy skrypt FaceAnalysis , aby otworzyć go za pomocą programu Visual Studio 2017.

  5. Wprowadź następujące przestrzenie nazw powyżej klasy FaceAnalysis :

        using Newtonsoft.Json;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using System.Text;
        using UnityEngine;
        using UnityEngine.Networking;
    
  6. Teraz należy dodać wszystkie obiekty, które są używane do deserializacji. Te obiekty należy dodać poza skryptem FaceAnalysis (poniżej dolnego nawiasu klamrowego).

        /// <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. Metody Start() i Update() nie będą używane, dlatego usuń je teraz.

  8. W klasie FaceAnalysis dodaj następujące zmienne:

        /// <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 -";
    

    Uwaga

    Zastąp klucz i personGroupId kluczem usługi oraz identyfikatorem utworzonej wcześniej grupy.

  9. Dodaj metodę Awake(), która inicjuje klasę, dodając klasę ImageCapture do aparatu głównego i wywołuje metodę tworzenia etykiety:

        /// <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. Dodaj metodę CreateLabel(), która tworzy obiekt Label w celu wyświetlenia wyniku analizy:

        /// <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. Dodaj metodę DetectFacesFromImage() i GetImageAsByteArray(). Pierwsza z nich zażąda usługi rozpoznawania twarzy w celu wykrycia dowolnej możliwej twarzy na przesłanym obrazie, podczas gdy ta ostatnia jest niezbędna do przekonwertowania przechwyconego obrazu na tablicę bajtów:

        /// <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. Dodaj metodę IdentifyFaces(), która żąda usługi rozpoznawania twarzy, aby zidentyfikować wszystkie znane twarze wykryte wcześniej na przesłanym obrazie. Żądanie zwróci identyfikator zidentyfikowanej osoby, ale nie nazwę:

        /// <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. Dodaj metodę GetPerson(). Podając identyfikator osoby, ta metoda żąda, aby usługa rozpoznawania twarzy zwróciła nazwę zidentyfikowanej osoby:

        /// <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. Pamiętaj, aby zapisać zmiany przed powrotem do edytora aparatu Unity.

  15. W Edytorze aparatu Unity przeciągnij skrypt FaceAnalysis z folderu Scripts w panelu Project do obiektu Main Camera w panelu Hierarchia. Nowy składnik skryptu zostanie więc dodany do aparatu głównego.

Umieść aplikację FaceAnalysis na głównym aparacie

Rozdział 7 . Tworzenie klasy ImageCapture

Celem klasy ImageCapture jest hostowanie metod niezbędnych do komunikowania się z usługą rozpoznawania twarzy platformy Azure w celu przeanalizowania obrazu, który będzie przechwytywane, identyfikowania twarzy w nim i określania, czy należy do znanej osoby. Jeśli zostanie znaleziona znana osoba, ta klasa wyświetli nazwę jako tekst interfejsu użytkownika w scenie.

Aby utworzyć klasę ImageCapture :

  1. Kliknij prawym przyciskiem myszy w folderze Skrypty , który został utworzony wcześniej, a następnie kliknij pozycję Utwórz, skrypt języka C#. Wywołaj skrypt ImageCapture.

  2. Kliknij dwukrotnie nowy skrypt ImageCapture , aby go otworzyć za pomocą programu Visual Studio 2017.

  3. Wprowadź następujące przestrzenie nazw powyżej klasy ImageCapture:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  4. Wewnątrz klasy ImageCapture dodaj następujące zmienne:

        /// <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. Dodaj metody Awake() i Start() niezbędne do zainicjowania klasy i umożliwiają urządzeniu HoloLens przechwytywanie gestów użytkownika:

        /// <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. Dodaj funkcję TapHandler(), która jest wywoływana, gdy użytkownik wykonuje gest Naciśnięcie :

        /// <summary>
        /// Respond to Tap Input.
        /// </summary>
        private void TapHandler(TappedEventArgs obj)
        {
            tapsCount++;
            ExecuteImageCaptureAndAnalysis();
        }
    
  7. Dodaj metodę ExecuteImageCaptureAndAnalysis(), która rozpocznie proces przechwytywania obrazów:

        /// <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. Dodaj programy obsługi, które są wywoływane po zakończeniu procesu przechwytywania zdjęć:

        /// <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. Pamiętaj, aby zapisać zmiany przed powrotem do edytora aparatu Unity.

Rozdział 8 — Tworzenie rozwiązania

Aby przeprowadzić dokładny test aplikacji, należy załadować ją bezpośrednio do urządzenia HoloLens.

Przed wykonaniem tej czynności upewnij się, że:

  • Wszystkie ustawienia wymienione w rozdziale 3 są poprawnie ustawione.
  • Skrypt FaceAnalysis jest dołączony do obiektu Main Camera.
  • Zarówno klucz uwierzytelniania , jak i identyfikator grupy zostały ustawione w skryscie FaceAnalysis .

Ten punkt jest gotowy do utworzenia rozwiązania. Po utworzeniu rozwiązania możesz przystąpić do wdrażania aplikacji.

Aby rozpocząć proces kompilacji:

  1. Zapisz bieżącą scenę, klikając pozycję Plik, Zapisz.

  2. Przejdź do pozycji Plik, Ustawienia kompilacji, kliknij pozycję Dodaj otwarte sceny.

  3. Pamiętaj, aby zaznaczyć pozycje Projekty języka C# aparatu Unity.

    Wdrażanie rozwiązania programu Visual Studio

  4. Naciśnij pozycję Kompilacja. Po wykonaniu tej czynności środowisko Unity uruchomi okno Eksplorator plików, w którym należy utworzyć, a następnie wybierz folder do skompilowania aplikacji. Utwórz ten folder teraz w projekcie aparatu Unity i wywołaj go jako aplikację. Następnie po wybraniu folderu App naciśnij pozycję Wybierz folder.

  5. Środowisko Unity rozpocznie tworzenie projektu w folderze App.

  6. Po zakończeniu kompilowania aparatu Unity (może to zająć trochę czasu), zostanie otwarte okno Eksplorator plików w lokalizacji kompilacji.

    Wdrażanie rozwiązania z poziomu programu Visual Studio

  7. Otwórz folder Aplikacja, a następnie otwórz nowe rozwiązanie projektu (jak pokazano powyżej, MR_FaceRecognition.sln).

Rozdział 9 — Wdrażanie aplikacji

Aby wdrożyć na urządzeniu HoloLens:

  1. Potrzebujesz adresu IP urządzenia HoloLens (na potrzeby zdalnego wdrażania) i upewnij się, że urządzenie HoloLens jest w trybie dewelopera. W tym celu:

    1. Podczas noszenia urządzenia HoloLens otwórz pozycję Ustawienia.
    2. Przejdź do pozycji Opcje zaawansowane sieci & Internet > Wi-Fi >
    3. Zanotuj adres IPv4 .
    4. Następnie przejdź z powrotem do obszaru Ustawienia, a następnie w celu zaktualizowania & zabezpieczeń > dla deweloperów
    5. Ustaw tryb dewelopera włączony.
  2. Przejdź do nowej kompilacji aparatu Unity (folderu Aplikacja ) i otwórz plik rozwiązania za pomocą programu Visual Studio.

  3. W obszarze Konfiguracja rozwiązania wybierz pozycję Debuguj.

  4. W polu Platforma rozwiązania wybierz pozycję x86, Maszyna zdalna.

    Zmienianie konfiguracji rozwiązania

  5. Przejdź do menu Kompilacja i kliknij pozycję Wdróż rozwiązanie, aby załadować aplikację bezpośrednio do urządzenia HoloLens.

  6. Aplikacja powinna być teraz wyświetlana na liście zainstalowanych aplikacji na urządzeniu HoloLens, które będą gotowe do uruchomienia.

Uwaga

Aby wdrożyć w immersywnym zestawie słuchawkowym, ustaw wartość Platforma rozwiązania na Komputer lokalny i ustaw wartość Konfiguracja na Debugowanie z wartością x86 jako platforma. Następnie wdróż na komputerze lokalnym, korzystając z menu Kompilacja, wybierając pozycję Wdróż rozwiązanie.

Rozdział 10 — Korzystanie z aplikacji

  1. Na urządzeniu HoloLens uruchom aplikację.

  2. Przyjrzyj się osobie, która została zarejestrowana w interfejsie API rozpoznawania twarzy. Upewnij się, że:

    • Twarz osoby nie jest zbyt odległa i wyraźnie widoczna
    • Oświetlenie środowiska nie jest zbyt ciemne
  3. Użyj gestu naciśnięcia, aby uchwycić obraz osoby.

  4. Poczekaj, aż aplikacja wyśle żądanie analizy i otrzyma odpowiedź.

  5. Jeśli osoba została pomyślnie rozpoznana, imię i nazwisko osoby będzie wyświetlane jako tekst interfejsu użytkownika.

  6. Proces przechwytywania można powtórzyć za pomocą gestu naciśnięcia co kilka sekund.

Zakończona aplikacja interfejsu API rozpoznawania twarzy platformy Azure

Gratulacje, utworzono aplikację rzeczywistości mieszanej, która korzysta z usługi rozpoznawania twarzy platformy Azure do wykrywania twarzy na obrazie i identyfikowania znanych twarzy.

wynik ukończenia tego kursu

Ćwiczenia dodatkowe

Ćwiczenie 1

Interfejs API rozpoznawania twarzy platformy Azure jest wystarczająco zaawansowany, aby wykryć maksymalnie 64 twarze na jednym obrazie. Rozszerz aplikację, aby mogła rozpoznać dwie lub trzy twarze między wieloma innymi osobami.

Ćwiczenie 2

Interfejs API rozpoznawania twarzy platformy Azure może również udostępniać wszelkiego rodzaju informacje o atrybutach. Zintegruj to z aplikacją. Może to być jeszcze bardziej interesujące, w połączeniu z interfejsem API rozpoznawania emocji.