HoloLens (1-го поколения) и Azure 304: распознавание лиц


Примечание

Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, демонстрирующих разработку для HoloLens 2. Это уведомление будет обновлено со ссылкой на эти учебники при их публикации.


результат прохождения этого курса

В этом курсе вы узнаете, как добавить возможности распознавания лиц в приложение смешанной реальности с помощью Azure Cognitive Services с ПОМОЩЬЮ API распознавания лиц (Майкрософт).

API распознавания лиц Azure — это служба Майкрософт, которая предоставляет разработчикам самые сложные алгоритмы распознавания лиц в облаке. API распознавания лиц имеет две функции main: обнаружение лиц с помощью атрибутов и распознавание лиц. Это позволяет разработчикам просто задать набор групп для лиц, а затем отправить изображения запросов в службу позже, чтобы определить, кому принадлежит лицо. Дополнительные сведения см. на странице распознавания лиц Azure.

Завершив этот курс, вы получите приложение HoloLens смешанной реальности, которое сможет выполнять следующие действия:

  1. Используйте жест касания для запуска захвата изображения с помощью встроенной камеры HoloLens.
  2. Отправьте захваченное изображение в службу API распознавания лиц Azure .
  3. Получение результатов алгоритма API распознавания лиц .
  4. Используйте простой пользовательский интерфейс, чтобы отобразить имена сопоставленных людей.

Вы узнаете, как получить результаты из службы API распознавания лиц в приложении смешанной реальности на основе Unity.

В приложении вы можете определить, как вы будете интегрировать результаты с проектом. Этот курс предназначен для обучения интеграции службы Azure с проектом Unity. Это ваша работа, чтобы использовать знания, полученные из этого курса, для улучшения приложения смешанной реальности.

Поддержка устройств

Курс HoloLens Иммерсивные гарнитуры
304. Смешанная реальность и Azure: распознавание лиц ✔️ ✔️

Примечание

Хотя в этом курсе основное внимание уделяется HoloLens, вы также можете применить полученные в этом курсе знания, чтобы Windows Mixed Reality иммерсивные гарнитуры (VR). Так как иммерсивные гарнитуры (VR) не имеют доступных камер, вам потребуется внешняя камера, подключенная к компьютеру. По мере прохождения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки иммерсивных гарнитур (VR).

Предварительные требования

Примечание

Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, имейте в виду, что предварительные требования и письменные инструкции в этом документе представляют то, что было проверено и проверено на момент написания статьи (май 2018 г.). Вы можете использовать последнюю версию программного обеспечения, как указано в статье установка инструментов , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.

Для этого курса мы рекомендуем использовать следующее оборудование и программное обеспечение:

Перед началом работы

  1. Чтобы избежать проблем при сборке этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
  2. Настройте и протестируйте HoloLens. Если вам нужна поддержка по настройке HoloLens, ознакомьтесь со статьей о настройке HoloLens.
  3. Рекомендуется выполнять калибровку и настройку датчика при разработке нового приложения HoloLens (иногда это может помочь выполнить эти задачи для каждого пользователя).

Чтобы получить справку по калибровке, перейдите по этой ссылке на статью Калибровка HoloLens.

Чтобы получить справку по настройке датчиков, перейдите по этой ссылке на статью Настройка датчика HoloLens.

Глава 1. Портал Azure

Чтобы использовать службу API распознавания лиц в Azure, необходимо настроить экземпляр службы, чтобы сделать его доступным для приложения.

  1. Сначала войдите на портал Azure.

    Примечание

    Если у вас еще нет учетной записи Azure, ее необходимо создать. Если вы выполняете это руководство в учебной или лабораторной ситуации, обратитесь к преподавателю или одному из прокторов за помощью в настройке новой учетной записи.

  2. После входа щелкните Создать в левом верхнем углу и найдите API распознавания лиц, нажмите клавишу ВВОД.

    поиск api распознавания лиц

    Примечание

    Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).

  3. На новой странице будет представлено описание службы API распознавания лиц . В левом нижнем углу этого запроса нажмите кнопку Создать , чтобы создать связь с этой службой.

    Сведения об API распознавания лиц

  4. После нажатия кнопки Создать:

    1. Вставьте нужное имя для этого экземпляра службы.

    2. Выберите подписку.

    3. Выберите подходящую ценовую категорию. Если служба API распознавания лиц создается впервые, вам должна быть доступна бесплатная категория (F0).

    4. Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.

      Дополнительные сведения о группах ресурсов Azure см. в этой статье.

    5. Приложение UWP Person Maker, которое вы используете позже, требует использования "Западная часть США" для расположения.

    6. Вам также потребуется подтвердить, что вы поняли условия, применяемые к этой Службе.

    7. Выберите Создать.*

      создание службы API распознавания лиц

  5. После нажатия кнопки Создать* вам придется подождать, пока служба будет создана. Это может занять минуту.

  6. После создания экземпляра службы на портале появится уведомление.

    Уведомление о создании службы

  7. Щелкните уведомления, чтобы просмотреть новый экземпляр службы.

    Перейти к уведомлению о ресурсе

  8. Когда все будет готово, нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы.

    доступ к ключам API распознавания лиц

  9. В рамках этого руководства приложению потребуется выполнить вызовы к службе, что осуществляется с помощью ключа подписки службы. На странице Быстрого запуска службы API распознавания лиц первая точка — номер 1, чтобы получить ключи.

  10. На странице Служба выберите синюю гиперссылку Ключи (если на странице Быстрого запуска) или ссылку Ключи в меню навигации служб (слева, обозначенную значком "ключ"), чтобы открыть ключ.

    Примечание

    Запишите один из ключей и защитите его, так как он понадобится вам позже.

Глава 2. Использование приложения UWP Person Maker

Обязательно скачайте предварительно созданное приложение UWP с именем Person Maker. Это приложение не является конечным продуктом для этого курса, а просто инструментом, который поможет вам создать записи Azure, на которые будет опираться последующий проект.

Person Maker позволяет создавать записи Azure, связанные с людьми и группами людей. Приложение разместит все необходимые сведения в формате, который затем может использоваться FaceAPI, чтобы распознавать лица людей, которых вы добавили.

[ВАЖНО] Person Maker использует некоторые базовые ограничения, чтобы гарантировать, что вы не превысите количество вызовов служб в минуту для уровня бесплатной подписки. Зеленый текст в верхней части изменится на красный и изменится на "ACTIVE" при регулировании; В этом случае просто подождите приложение (оно будет ожидать, пока оно не сможет продолжить доступ к службе распознавания лиц, обновив его как "IN-ACTIVE", когда вы сможете использовать его снова).

Это приложение использует библиотеки Microsoft.ProjectOxford.Face , которые позволяют в полной мере использовать API распознавания лиц. Эта библиотека доступна бесплатно в виде пакета NuGet. Дополнительные сведения об этом и аналогичных API см. в справочной статье об API.

Примечание

Это только необходимые действия. Инструкции по выполнению этих действий приведены далее в документе. Приложение Person Maker позволяет:

  • Создайте группу пользователей, состоящую из нескольких пользователей, с которыми вы хотите связаться. С помощью учетной записи Azure можно разместить несколько групп пользователей.

  • Создайте пользователя, который является членом группы пользователей. С каждым человеком связано несколько изображений лиц .

  • Назначьте изображения лицпользователю, чтобы служба API распознавания лиц Azure распознала пользователя по соответствующему лицу.

  • Обучениеслужбы API распознавания лиц Azure.

Имейте в виду, что чтобы обучить это приложение распознавать людей, вам потребуется десять (10) фотографий с каждым человеком крупным планом, которые вы хотите добавить в группу пользователей. Приложение Windows 10 Cam поможет вам сделать это. Вы должны убедиться, что каждая фотография является четкой (избегайте размытия, скрытия или слишком далеко от темы), а также иметь фотографию в формате JPG или PNG, при этом размер файла изображения не превышает 4 МБ и не менее 1 КБ.

Примечание

Если вы выполняете это руководство, не используйте собственное лицо для обучения, так как, когда вы надеваете HoloLens, вы не сможете смотреть на себя. Используйте лицо коллеги или учащегося.

Запуск Person Maker:

  1. Откройте папку PersonMaker и дважды щелкните решение PersonMaker , чтобы открыть его с помощью Visual Studio.

  2. После открытия решения PersonMaker убедитесь, что:

    1. Для параметра Конфигурация решения задано значение Отладка.

    2. Платформа решения имеет значение x86.

    3. Целевая платформалокальный компьютер.

    4. Также может потребоваться восстановить пакеты NuGet (щелкните правой кнопкой мыши решение и выберите Восстановить пакеты NuGet).

  3. Щелкните Локальный компьютер , и приложение запустится. Имейте в виду, что на небольших экранах все содержимое может быть невидимым, хотя вы можете прокрутить страницу вниз, чтобы просмотреть его.

    пользовательский интерфейс person maker

  4. Вставьте нужный ключ проверки подлинности Azure из службы API распознавания лиц в Azure.

  5. Вставить:

    1. Идентификатор, который вы хотите назначить группе пользователей. Идентификатор должен быть в нижнем регистре без пробелов. Запишите этот идентификатор, так как он потребуется позже в проекте Unity.
    2. Имя, которое вы хотите назначить группе пользователей (может содержать пробелы).
  6. Нажмите кнопку Создать группу пользователей . Под кнопкой должно появиться сообщение с подтверждением.

Примечание

Если возникла ошибка "Отказано в доступе", проверка расположение, заданное для службы Azure. Как было сказано выше, это приложение предназначено для "Западной части США".

Важно!

Вы заметите, что вы также можете нажать кнопку Получить известную группу : это касается, если вы уже создали группу пользователей и хотите использовать ее, а не создавать новую. Имейте в виду, что если нажать кнопку Создать группу пользователей с известной группой, вы также сможете получить группу.

  1. Вставьте имяпользователя , которого вы хотите создать.

    1. Нажмите кнопку Создать пользователя .

    2. Под кнопкой должно появиться сообщение с подтверждением.

    3. Если вы хотите удалить ранее созданного пользователя, вы можете записать его имя в текстовое поле и нажать кнопку Delete Person (Удалить пользователя).

  2. Убедитесь, что вы знаете расположение десяти (10) фотографий человека, которого вы хотите добавить в свою группу.

  3. Нажмите кнопки Создать и Открыть папку, чтобы открыть Windows Обозреватель к папке, связанной с пользователем. Добавьте десять (10) изображений в папку . Они должны иметь формат файлов JPG или PNG .

  4. Щелкните Отправить в Azure. Счетчик покажет состояние отправки, за которым следует сообщение по завершении.

  5. После завершения работы счетчика и отображения сообщения с подтверждением щелкните Обучение , чтобы обучить службу.

После завершения процесса вы можете перейти в Unity.

Глава 3. Настройка проекта Unity

Ниже приведена типичная настройка для разработки со смешанной реальностью и, следовательно, хороший шаблон для других проектов.

  1. Откройте Unity и нажмите кнопку Создать.

    Запустите новый проект Unity.

  2. Теперь необходимо указать имя проекта Unity. Вставка MR_FaceRecognition. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.

    Укажите сведения о новом проекте Unity.

  3. При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение > параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .

    Обновление настроек редактора скриптов.

  4. Затем перейдите в раздел Параметры сборки файлов > и переключите платформу на универсальная платформа Windows, нажав кнопку Переключить платформу.

    Окно параметров сборки, переключение платформы на UWP.

  5. Перейдите в раздел Параметры сборки файлов > и убедитесь, что:

    1. Для целевого устройствазадано значение HoloLens

      Для иммерсивных гарнитур установите для параметра Целевое устройствозначение Любое устройство.

    2. Для параметра Тип сборки задано значение D3D.

    3. Для пакета SDK задано значение Последняя установленная версия.

    4. Версия Visual Studio имеет значение Последняя установленная

    5. Для сборки и запуска задано значение Локальный компьютер.

    6. Сохраните сцену и добавьте ее в сборку.

      1. Для этого выберите Добавить открытые сцены. Откроется окно сохранения.

        Нажмите кнопку

      2. Нажмите кнопку Создать папку , чтобы создать новую папку и назовите ее Сцены.

        Создание папки скриптов

      3. Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла: введите FaceRecScene, а затем нажмите кнопку Сохранить.

        Присвойте новой сцене имя.

    7. Остальные параметры в разделе Параметры сборки пока следует оставить по умолчанию.

  6. В окне Параметры сборки нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .

    Откройте параметры проигрывателя.

  7. На этой панели необходимо проверить несколько параметров:

    1. На вкладке Другие параметры :

      1. Версия среды выполненияскриптов должна быть экспериментальной (эквивалент .NET 4.6). Изменение этого параметра вызовет необходимость перезапуска редактора.

      2. Серверная часть сценариев должна быть .NET

      3. Уровень совместимости API должен быть .NET 4.6

        Обновите другие параметры.

    2. На вкладке Параметры публикации в разделе Возможности проверка:

      • InternetClient;

      • Веб-камера

        Обновление параметров публикации.

    3. Далее вниз по панели в разделе Параметры XR (см. раздел Параметры публикации) установите флажок Виртуальная реальность Поддерживается, убедитесь, что пакет SDK для Windows Mixed Reality добавлен.

      Обновите параметры X R.

  8. Вернувшись в параметры сборки, проекты Unity C# больше не выделены серым цветом; Установите флажок рядом с этим.

  9. Закройте окно Build Settings (Параметры сборки).

  10. Сохраните сцену и проект (ФАЙЛ > СОХРАНИТЬ СЦЕНУ или ФАЙЛ > СОХРАНИТЬ ПРОЕКТ).

Глава 4. Настройка основной камеры

Важно!

Если вы хотите пропустить компонент Unity Set up этого курса и перейти непосредственно к коду, скачайте этот пакет unitypackage и импортируйте его в проект в виде пользовательского пакета. Имейте в виду, что этот пакет также включает импорт библиотеки DLL Newtonsoft, как описано в главе 5. После импорта можно продолжить работу с главой 6.

  1. На панели Иерархия выберите основную камеру.

  2. После выбора вы увидите все компоненты основной камеры на панели инспектора.

    1. Объект Camera должен называться Main Camera (обратите внимание на орфографию!)

    2. Для тега основной камеры должно быть задано значение MainCamera (обратите внимание на орфографию!)

    3. Убедитесь, что для позиции преобразования задано значение 0, 0, 0.

    4. Установите для параметра Очистить флаги значение Сплошной цвет

    5. Задайте для параметра Цвет фона компонента камеры значение Черный, Альфа 0 (шестнадцатеричный код: #00000000)

      настройка компонентов камеры

Глава 5. Импорт библиотеки Newtonsoft.Json

Важно!

Если вы импортировали .unitypackage в последней главе, эту главу можно пропустить.

Чтобы упростить десериализацию и сериализацию объектов, полученных и отправленных в Служба Bot необходимо скачать библиотеку Newtonsoft.Json. В этом файле пакета Unity вы найдете совместимую версию с правильной структурой папок Unity.

Чтобы импортировать библиотеку, выполните следующие действия.

  1. Скачайте пакет Unity.

  2. Щелкните Активы, Импорт пакета, Пользовательский пакет.

    Импорт Newtonsoft.Json

  3. Найдите скачанный пакет Unity и нажмите кнопку Открыть.

  4. Убедитесь, что все компоненты пакета отмечены галочками, и нажмите кнопку Импорт.

    Импорт ресурсов Newtonsoft.Json

Глава 6. Создание класса FaceAnalysis

Класс FaceAnalysis предназначен для размещения методов, необходимых для взаимодействия со службой распознавания лиц Azure.

  • После отправки службе изображения захвата она проанализирует его, определит лица внутри и определит, принадлежат ли они известному человеку.
  • При обнаружении известного человека этот класс будет отображать свое имя в виде текста пользовательского интерфейса в сцене.

Чтобы создать класс FaceAnalysis , выполните следующие действия.

  1. Щелкните правой кнопкой мыши папку Assets , расположенную на панели проектов, и выберите команду Создать>папку. Вызовите папку Scripts.

    Создайте класс FaceAnalysis.

  2. Дважды щелкните только что созданную папку, чтобы открыть ее.

  3. Щелкните правой кнопкой мыши папку и выберите команду Создать>скрипт C#. Вызовите скрипт FaceAnalysis.

  4. Дважды щелкните новый скрипт FaceAnalysis , чтобы открыть его в Visual Studio 2017.

  5. Введите следующие пространства имен над классом FaceAnalysis :

        using Newtonsoft.Json;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using System.Text;
        using UnityEngine;
        using UnityEngine.Networking;
    
  6. Теперь необходимо добавить все объекты, используемые для десериализации. Эти объекты необходимо добавить вне скрипта FaceAnalysis (под нижней фигурной скобкой).

        /// <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. Методы Start() и Update() не будут использоваться, поэтому удалите их сейчас.

  8. В классе 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 -";
    

    Примечание

    Замените ключ и personGroupId ключом службы и идентификатором созданной ранее группы.

  9. Добавьте метод Awake(), который инициализирует класс , добавив класс ImageCapture в Main Camera и вызовите метод создания Label:

        /// <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. Добавьте метод CreateLabel(), который создает объект Label для отображения результата анализа:

        /// <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. Добавьте метод DetectFacesFromImage() и GetImageAsByteArray(). Первый запросит службу распознавания лиц для обнаружения любого возможного лица на отправленном изображении, а второй необходим для преобразования захваченного изображения в массив байтов:

        /// <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. Добавьте метод IdentifyFaces(), который запрашивает службу распознавания лиц для идентификации любого известного лица, ранее обнаруженного на отправленном изображении. Запрос вернет идентификатор идентифицированного пользователя, но не имя:

        /// <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. Добавьте метод GetPerson(). Предоставляя идентификатор пользователя, этот метод запрашивает, чтобы служба распознавания лиц возвращала имя идентифицированного лица:

        /// <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. Не забудьте сохранить изменения, прежде чем возвращаться в редактор Unity.

  15. В редакторе Unity перетащите скрипт FaceAnalysis из папки Скрипты на панели Проект в объект Main Camera на панели Иерархия. Новый компонент скрипта будет добавлен в основную камеру.

Размещение FaceAnalysis на основной камере

Глава 7. Создание класса ImageCapture

Класс ImageCapture предназначен для размещения методов, необходимых для взаимодействия со службой распознавания лиц Azure , для анализа изображения, который будет записываться, идентификации лиц на нем и определения того, принадлежит ли оно известному человеку. При обнаружении известного человека этот класс будет отображать свое имя в виде текста пользовательского интерфейса в сцене.

Чтобы создать класс ImageCapture , выполните следующие действия.

  1. Щелкните правой кнопкой мыши папку Скрипты , которую вы создали ранее, а затем выберите Создать, скрипт C#. Вызовите скрипт ImageCapture.

  2. Дважды щелкните новый скрипт ImageCapture , чтобы открыть его в Visual Studio 2017.

  3. Введите следующие пространства имен над классом ImageCapture:

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  4. В класс 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. Добавьте методы Awake() и Start(), необходимые для инициализации класса и разрешения HoloLens записывать жесты пользователя:

        /// <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. Добавьте TapHandler(), который вызывается при выполнении пользователем жеста Касания :

        /// <summary>
        /// Respond to Tap Input.
        /// </summary>
        private void TapHandler(TappedEventArgs obj)
        {
            tapsCount++;
            ExecuteImageCaptureAndAnalysis();
        }
    
  7. Добавьте метод ExecuteImageCaptureAndAnalysis(), который начнет процесс захвата изображений:

        /// <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. Добавьте обработчики, которые вызываются после завершения процесса фотосъемки:

        /// <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. Не забудьте сохранить изменения, прежде чем возвращаться в редактор Unity.

Глава 8. Создание решения

Чтобы выполнить тщательный тест приложения, необходимо загрузить его неопубликованное приложение на HoloLens.

Прежде чем сделать, убедитесь, что:

  • Все параметры, упомянутые в главе 3, заданы правильно.
  • Скрипт FaceAnalysis присоединяется к объекту Main Camera.
  • Ключ проверки подлинности и идентификатор группы были заданы в скрипте FaceAnalysis.

На этом этапе вы готовы к сборке решения. После создания решения вы будете готовы к развертыванию приложения.

Чтобы начать процесс сборки, выполните следующие действия.

  1. Сохраните текущую сцену, щелкнув Файл, Сохранить.

  2. Перейдите в раздел Файл, Параметры сборки и щелкните Добавить открытые сцены.

  3. Установите флажок Проекты Unity C#.

    Развертывание решения Visual Studio

  4. Нажмите кнопку Сборка. После этого Unity запустит окно проводник, в котором необходимо создать и выбрать папку для сборки приложения. Создайте папку в проекте Unity и назовите ее App. Затем, выбрав папку Приложения, нажмите кнопку Выбрать папку.

  5. Unity начнет сборку проекта в папку App.

  6. После завершения сборки Unity (это может занять некоторое время), откроется окно проводник в расположении сборки.

    Развертывание решения из Visual Studio

  7. Откройте папку App, а затем откройте новое решение Project (как показано выше, MR_FaceRecognition.sln).

Глава 9. Развертывание приложения

Чтобы развернуть в HoloLens, выполните приведенные далее действия.

  1. Вам потребуется IP-адрес HoloLens (для удаленного развертывания) и убедитесь, что HoloLens находится в режиме разработчика. Для этого выполните следующие действия.

    1. При ношении HoloLens откройте раздел Параметры.
    2. Перейдите в раздел Сетевые & Internet > Wi-Fi > Дополнительные параметры
    3. Запишите IPv4-адрес .
    4. Затем вернитесь к разделу Параметры, а затем выберите Обновить безопасность & > для разработчиков.
    5. Установите режим разработчика включено.
  2. Перейдите к новой сборке Unity (папке App ) и откройте файл решения в Visual Studio.

  3. В разделе Конфигурация решения выберите Отладка.

  4. В разделе Платформа решения выберите x86, Удаленный компьютер.

    Изменение конфигурации решения

  5. Перейдите в меню Сборка и щелкните Развернуть решение, чтобы загрузить неопубликованное приложение в HoloLens.

  6. Теперь ваше приложение должно появиться в списке установленных приложений на HoloLens, готовых к запуску!

Примечание

Чтобы выполнить развертывание на иммерсивной гарнитуре, задайте для параметра Платформа решениязначение Локальный компьютер, а для параметра Конфигурациязначение Отладка с x86 в качестве платформы. Затем выполните развертывание на локальном компьютере, выбрав в меню Сборкапункт Развернуть решение.

Глава 10. Использование приложения

  1. Надел HoloLens, запустите приложение.

  2. Посмотрите на пользователя, которого вы зарегистрировали с помощью API распознавания лиц. Убедитесь, что выполнены следующие условия:

    • Лицо человека не слишком далеко и четко видно
    • Окружающая среда освещения не слишком темная
  3. Используйте жест касания, чтобы записать изображение человека.

  4. Дождитесь, пока приложение отправит запрос на анализ, и получите ответ.

  5. Если пользователь успешно распознается, его имя будет отображаться в виде текста пользовательского интерфейса.

  6. Процесс записи можно повторять с помощью жеста касания каждые несколько секунд.

Готовое приложение API распознавания лиц Azure

Поздравляем! Вы создали приложение смешанной реальности, которое использует службу распознавания лиц Azure для обнаружения лиц на изображении и идентификации всех известных лиц.

результат прохождения этого курса

Дополнительные упражнения

Упражнение 1.

API распознавания лиц Azure достаточно мощный для обнаружения до 64 лиц на одном изображении. Расширьте приложение, чтобы оно могло распознавать два или три лица среди многих других людей.

Упражнение 2

API распознавания лиц Azure также может предоставлять все виды сведений об атрибутах. Интегрируйте его в приложение. Это может быть еще более интересным в сочетании с API распознавания эмоций.