HoloLens (1-го поколения) и Azure 304: распознавание лиц
Примечание.
Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет появиться новая серия учебников, которые будут размещены в будущем, которые продемонстрировали, как разрабатывать для HoloLens 2. Это уведомление будет обновлено со ссылкой на эти учебники при публикации.
В этом курсе вы узнаете, как добавить возможности распознавания лиц в приложение смешанной реальности с помощью Azure Cognitive Services с API распознавания лиц Майкрософт.
API распознавания лиц Azure — это служба Майкрософт, которая предоставляет разработчикам самые сложные алгоритмы распознавания лиц, все в облаке. API распознавания лиц имеет две основные функции: обнаружение лиц с атрибутами и распознавание лиц. Это позволяет разработчикам просто задать набор групп для лиц, а затем отправить изображения запросов в службу позже, чтобы определить, кому принадлежит лицо. Дополнительные сведения см. на странице распознавания лиц Azure.
Завершив этот курс, у вас будет приложение смешанной реальности HoloLens, которое сможет выполнить следующие действия:
- Используйте жест касания, чтобы инициировать захват изображения с помощью камеры HoloLens на борту.
- Отправьте захваченное изображение в службу API распознавания лиц Azure.
- Получите результаты алгоритма API распознавания лиц.
- Используйте простой пользовательский интерфейс для отображения имени сопоставленных людей.
Вы узнаете, как получить результаты из службы API распознавания лиц в приложении смешанной реальности на основе Unity.
В приложении вы узнаете, как интегрировать результаты с проектом. Этот курс предназначен для обучения интеграции службы Azure с проектом Unity. Это ваша задача использовать знания, полученные от этого курса, чтобы улучшить ваше приложение смешанной реальности.
Поддержка устройств
Курс | HoloLens | Иммерсивные гарнитуры |
---|---|---|
MR и Azure 304: распознавание лиц | ✔️ | ✔️ |
Примечание.
Хотя этот курс в основном ориентирован на HoloLens, вы также можете применить то, что вы узнаете в этом курсе, к гарнитурам Windows Смешанная реальность иммерсивной (VR). Так как иммерсивные гарнитуры (VR) не имеют доступных камер, вам потребуется внешняя камера, подключенная к компьютеру. По мере выполнения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки иммерсивных гарнитур (VR).
Предварительные требования
Примечание.
Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Также помните, что предварительные требования и письменные инструкции в этом документе представляют тестируемые и проверенные на момент написания статьи (май 2018 г.). Вы можете использовать последнее программное обеспечение, как указано в статье об установке инструментов , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в новом программном обеспечении, чем указано ниже.
Для этого курса рекомендуется использовать следующее оборудование и программное обеспечение:
- Компьютер разработки, совместимый с Windows Смешанная реальность для разработки иммерсивной гарнитуры (VR)
- Windows 10 Fall Creators Update (или более поздней версии) с включенным режимом разработчика
- Последний пакет SDK для Windows 10
- Unity 2017.4
- Visual Studio 2017
- Гарнитура Windows Смешанная реальность иммерсивной (VR) или Microsoft HoloLens с включенным режимом разработчика
- Камера, подключенная к компьютеру (для разработки иммерсивной гарнитуры)
- Получение доступа к Интернету для установки Azure и получения API распознавания лиц
Перед началом работы
- Чтобы избежать проблем с сборкой этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
- Настройте и проверьте HoloLens. Если вам нужна поддержка настройки HoloLens, обязательно посетите статью о настройке HoloLens.
- Рекомендуется выполнять калибровку и настройку датчика при разработке нового приложения HoloLens (иногда это может помочь выполнить эти задачи для каждого пользователя).
Дополнительные сведения о калибровке см. по этой ссылке в статье о калибровке HoloLens.
Дополнительные сведения о настройке датчика см. по этой ссылке в статье по настройке датчика HoloLens.
Глава 1. Портал Azure
Чтобы использовать службу API распознавания лиц в Azure, необходимо настроить экземпляр службы для предоставления доступа к приложению.
Сначала войдите на портал Azure.
Примечание.
Если у вас еще нет учетной записи Azure, необходимо создать ее. Если вы используете это руководство в классе или лаборатории, попросите преподавателя или одного из прокторов, чтобы помочь настроить новую учетную запись.
После входа нажмите кнопку "Создать " в левом верхнем углу и найдите API распознавания лиц, нажмите клавишу ВВОД.
Примечание.
Возможно, слово New было заменено на создание ресурса на более новых порталах.
Новая страница предоставит описание службы API распознавания лиц. В нижней левой части этого запроса нажмите кнопку "Создать ", чтобы создать связь с этой службой.
После нажатия кнопки "Создать":
Вставьте требуемое имя для этого экземпляра службы.
Выберите подписку.
Выберите ценовую категорию, подходящую для вас, если это первый раз при создании службы API распознавания лиц, для вас должна быть доступна бесплатная категория (с именем F0).
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, контроля доступа, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется сохранить все службы Azure, связанные с одним проектом (например, такими, как эти лаборатории), в общей группе ресурсов.
Если вы хотите узнать больше о группах ресурсов Azure, посетите статью группы ресурсов.
Приложение UWP, Person Maker, которое вы используете позже, требует использования "Западная часть США" для расположения.
Вам также потребуется подтвердить, что вы поняли условия, примененные к этой службе.
Выберите Создать*.
После нажатия кнопки "Создать"* вам придется ждать создания службы, это может занять минуту.
Уведомление появится на портале после создания экземпляра службы.
Щелкните уведомления, чтобы изучить новый экземпляр службы.
Когда вы будете готовы, нажмите кнопку "Перейти к ресурсу " в уведомлении, чтобы изучить новый экземпляр службы.
В этом руководстве приложению потребуется выполнить вызовы к службе, которая выполняется с помощью подписки вашей службы "ключ". На начальной странице службы API распознавания лиц первая точка — номер 1, чтобы получить ключи.
На странице "Служба" выберите либо синюю гиперссылку "Ключи" (если на странице быстрого запуска), либо ссылку "Ключи" в меню навигации служб (слева, обозначенную значком "ключ") для отображения ключей.
Примечание.
Запишите один из ключей и защитите его, так как вам потребуется позже.
Глава 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 позволит вам:
Создайте группу person, которая представляет собой группу, состоящую из нескольких пользователей, с которыми вы хотите связаться. С помощью учетной записи Azure можно разместить несколько групп пользователей.
Создайте человека, являющегося членом группы пользователей. Каждый человек имеет ряд изображений лиц , связанных с ним.
Назначьте изображения лиц пользователю, чтобы служба API распознавания лиц Azure распознала человека соответствующим лицом.
Обучение службы API распознавания лиц Azure.
Помните, чтобы обучить это приложение для распознавания людей, вам потребуется десять (10) фотографий каждого человека, который вы хотите добавить в свою группу людей. Приложение Windows 10 Cam может помочь вам принять их. Необходимо убедиться, что каждая фотография понятна (избегайте размытия, скрытия или слишком далеко, от темы), имеют фотографию в формате jpg или png, при этом размер файла изображения не превышает 4 МБ и не менее 1 КБ.
Примечание.
Если вы следуете за этим руководством, не используйте собственное лицо для обучения, как при включении HoloLens, вы не можете посмотреть на себя. Используйте лицо коллеги или коллеги-студента.
Запуск Person Maker:
Откройте папку PersonMaker и дважды щелкните решение PersonMaker, чтобы открыть его с помощью Visual Studio.
После открытия решения PersonMaker убедитесь, что:
Для конфигурации решения задано значение Debug.
Платформа решения имеет значение x86
Целевая платформа — локальный компьютер.
Также может потребоваться восстановить пакеты NuGet (щелкните правой кнопкой мыши решение и выберите " Восстановить пакеты NuGet").
Щелкните локальный компьютер и приложение запустится. Помните, что на небольших экранах все содержимое может не отображаться, хотя вы можете прокрутить вниз, чтобы просмотреть его.
Вставьте ключ проверки подлинности Azure, который должен быть получен из службы API распознавания лиц в Azure.
Insert:
- Идентификатор, который вы хотите назначить группе пользователей. Идентификатор должен быть строчным регистром без пробелов. Запишите этот идентификатор, так как он потребуется позже в проекте Unity.
- Имя, которое вы хотите назначить группе пользователей (может содержать пробелы).
Нажмите кнопку "Создать группу лиц". Под кнопкой должно появиться сообщение подтверждения.
Примечание.
Если у вас есть ошибка "Отказано в доступе", проверьте расположение, заданное для службы Azure. Как уже упоминалось выше, это приложение предназначено для "Западной части США".
Внимание
Вы заметите, что вы также можете нажать кнопку "Получить известную группу": это так, если вы уже создали группу пользователей и хотите использовать ее, а не создать новую. Помните, что если щелкнуть " Создать группу пользователей" с известной группой , она также получит группу.
Вставьте имя создаваемого пользователя.
Нажмите кнопку "Создать пользователя ".
Под кнопкой должно появиться сообщение подтверждения.
Если вы хотите удалить созданного ранее пользователя, можно написать имя в текстовое поле и нажать клавишу DELETE Person
Убедитесь, что вы знаете расположение десяти (10) фотографий человека, которого вы хотите добавить в свою группу.
Нажмите кнопку "Создать и открыть папку ", чтобы открыть проводник Windows к папке, связанной с человеком. Добавьте в папку десять изображений (10). Они должны иметь формат JPG или PNG-файла .
Нажмите кнопку "Отправить в Azure". Счетчик отобразит состояние отправки, за которым следует сообщение после завершения.
После завершения счетчика появится сообщение подтверждения, чтобы обучить службу.
После завершения процесса вы будете готовы перейти в Unity.
Глава 3. Настройка проекта Unity
Ниже приведена типичная настройка для разработки с смешанной реальностью, и таким образом является хорошим шаблоном для других проектов.
Откройте Unity и нажмите кнопку "Создать".
Теперь необходимо указать имя проекта Unity. Вставка MR_FaceRecognition. Убедитесь, что для типа проекта задано значение 3D. Задайте расположение в нужном месте (помните, что ближе к корневым каталогам лучше). Затем нажмите кнопку "Создать проект".
При открытии Unity стоит проверить, установлен ли редактор скриптов по умолчанию в Visual Studio. Перейдите к разделу "Изменить > параметры", а затем в новом окне перейдите к внешним средствам. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно параметров.
Затем перейдите к параметрам сборки файлов > и переключите платформу на универсальная платформа Windows, нажав кнопку "Переключить платформу".
Перейдите к параметрам сборки файлов > и убедитесь, что:
Целевое устройство имеет значение HoloLens
Для иммерсивных гарнитур задайте для целевого устройства значение Any Device.
Тип сборки имеет значение D3D
Для пакета SDK установлено значение "Последняя версия"
Версия Visual Studio установлена в качестве последней версии
Для сборки и запуска задано значение Local Machine
Сохраните сцену и добавьте ее в сборку.
Для этого выберите "Добавить открытые сцены". Откроется окно сохранения.
Нажмите кнопку "Создать папку ", чтобы создать новую папку, назовите ее Сцены.
Откройте только что созданную папку "Сцены" , а затем в текстовом поле "Файл", введите FaceRecScene, а затем нажмите клавишу SAVE.
Остальные параметры в параметрах сборки должны оставаться по умолчанию.
В окне "Параметры сборки" нажмите кнопку "Параметры проигрывателя", откроется связанная панель в пространстве, где находится инспектор.
На этой панели необходимо проверить несколько параметров:
На вкладке "Другие параметры" :
Версия среды выполнения сценариев должна быть экспериментальной (эквивалентно .NET 4.6). Изменение этого приведет к возникновению необходимости перезапуска редактора.
Серверная часть скриптов должна быть .NET
Уровень совместимости API должен быть .NET 4.6
На вкладке "Параметры публикации" в разделе "Возможности" проверьте:
InternetClient;
Веб-камера
Далее вниз по панели в параметрах XR (приведенных ниже параметров публикации), установите флажок "Поддерживаемая виртуальная реальность", убедитесь, что пакет SDK для Windows Смешанная реальность добавлен.
Вернувшись в параметры сборки, проекты C# Unity больше не будут серыми. Установите флажок рядом с этим.
Закройте окно Build Settings (Параметры сборки).
Сохраните сцену и проект (ФАЙЛ > СОХРАНИТЬ СЦЕНУ или ФАЙЛ > СОХРАНИТЬ ПРОЕКТ).
Глава 4. Настройка основной камеры
Внимание
Если вы хотите пропустить компонент настройки Unity этого курса и перейти прямо в код, вы можете скачать этот пакет unitypackage и импортировать его в проект в виде пользовательского пакета. Помните, что этот пакет также включает импорт библиотеки DLL Newtonsoft, описанной в главе 5. С помощью этой импортированной версии можно продолжить работу из 6-й главы.
На панели иерархии выберите основную камеру.
После выбора вы сможете просмотреть все компоненты основной камеры на панели инспекторов.
Объект "Камера" должен называться Main Camera (обратите внимание на орфографию!)
Тег основной камеры должен иметь значение MainCamera (обратите внимание на орфографию!)
Убедитесь, что положение преобразования равно 0, 0, 0
Задайте для цвета сплошные флаги очистки
Задайте цвет фона компонента камеры черным, Альфа 0 (шестнадцатеричный код: #000000000)
Глава 5. Импорт библиотеки Newtonsoft.Json
Внимание
Если вы импортировали ".unitypackage" в последней главе, можно пропустить эту главу.
Для десериализации и сериализации объектов, полученных и отправленных в Служба Bot необходимо скачать библиотеку Newtonsoft.Json. Вы найдете совместимую версию, уже упорядоченную с правильной структурой папок Unity в этом файле пакета Unity.
Чтобы импортировать библиотеку, выполните следующие действия.
Скачайте пакет Unity.
Щелкните "Активы", "Импорт пакета", "Пользовательский пакет".
Найдите скачанный пакет Unity и нажмите кнопку "Открыть".
Убедитесь, что все компоненты пакета тикают и нажмите кнопку "Импорт".
Глава 6. Создание класса FaceAnalysis
Целью класса FaceAnalysis является размещение методов, необходимых для взаимодействия со службой распознавания лиц Azure.
- После отправки службы изображения записи он будет анализировать его и определять лица внутри и определять, принадлежит ли какой-либо известному человеку.
- Если известное лицо найдено, этот класс будет отображать свое имя как текст пользовательского интерфейса в сцене.
Чтобы создать класс FaceAnalysis, выполните следующие действия.
Щелкните правой кнопкой мыши папку "Ресурсы", расположенную на панели проекта, а затем щелкните "Создать>папку". Вызовите скрипты папок.
Дважды щелкните только что созданную папку, чтобы открыть ее.
Щелкните правой кнопкой мыши в папке и нажмите кнопку "Создать>скрипт C#". Вызовите скрипт FaceAnalysis.
Дважды щелкните новый скрипт FaceAnalysis , чтобы открыть его с помощью Visual Studio 2017.
Введите следующие пространства имен над классом FaceAnalysis :
using Newtonsoft.Json; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine; using UnityEngine.Networking;
Теперь необходимо добавить все объекты, которые используются для десериализации. Эти объекты необходимо добавить вне скрипта 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; } }
Методы Start() и Update() не будут использоваться, поэтому удалите их сейчас.
В классе 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 ключом службы и идентификатором созданной ранее группы.
Добавьте метод Awake(), который инициализирует класс ImageCapture в основную камеру и вызывает метод создания 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(); }
Добавьте метод 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 = "."; }
Добавьте метод 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); }
Добавьте метод 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); } } }
Добавьте метод 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; } }
Не забудьте сохранить изменения, прежде чем вернуться в редактор Unity.
В редакторе Unity перетащите скрипт FaceAnalysis из папки "Скрипты" на панели "Проект" в объект Main Camera на панели "Иерархия". Новый компонент скрипта будет добавлен в основную камеру.
Глава 7. Создание класса ImageCapture
Целью класса ImageCapture является размещение методов, необходимых для взаимодействия со службой распознавания лиц Azure для анализа изображения, который вы будете записывать, идентификации лиц в нем и определения того, принадлежит ли он известному человеку. Если известное лицо найдено, этот класс будет отображать свое имя как текст пользовательского интерфейса в сцене.
Чтобы создать класс ImageCapture, выполните следующие действия.
Щелкните правой кнопкой мыши папку "Скрипты" , созданную ранее, а затем нажмите кнопку "Создать", "Скрипт C#". Вызовите скрипт ImageCapture.
Дважды щелкните новый скрипт ImageCapture , чтобы открыть его с помощью Visual Studio 2017.
Введите следующие пространства имен над классом ImageCapture:
using System.IO; using System.Linq; using UnityEngine; using UnityEngine.XR.WSA.Input; using UnityEngine.XR.WSA.WebCam;
В классе 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;
Добавьте методы 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(); }
Добавьте tapHandler(), который вызывается при выполнении пользователем жеста Tap:
/// <summary> /// Respond to Tap Input. /// </summary> private void TapHandler(TappedEventArgs obj) { tapsCount++; ExecuteImageCaptureAndAnalysis(); }
Добавьте метод 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); }); }); }
Добавьте обработчики, которые вызываются при завершении процесса захвата фотографий:
/// <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()); }
Не забудьте сохранить изменения, прежде чем вернуться в редактор Unity.
Глава 8. Создание решения
Чтобы выполнить тщательный тест приложения, вам потребуется загрузить его на HoloLens.
Перед выполнением убедитесь, что:
- Все параметры, упомянутые в главе 3, задаются правильно.
- Скрипт FaceAnalysis подключен к объекту Main Camera.
- Ключ проверки подлинности и идентификатор группы были заданы в скрипте FaceAnalysis.
Эта точка готова к созданию решения. После создания решения вы будете готовы к развертыванию приложения.
Чтобы начать процесс сборки, выполните следующие действия.
Сохраните текущую сцену, нажав кнопку "Файл", "Сохранить".
Перейдите к файлу, параметрам сборки и нажмите кнопку "Добавить открытые сцены".
Убедитесь, что проектов C# Unity.
Нажмите клавишу BUILD. После этого Unity запустит окно проводник, в котором необходимо создать и выбрать папку для сборки приложения. Создайте папку в проекте Unity и вызовите ее приложение. Затем с выбранной папкой приложения нажмите клавишу SELECT FOLDER.
Unity начнет создание проекта в папку приложения.
После завершения сборки Unity (может потребоваться некоторое время), откроется окно проводник в расположении сборки.
Откройте папку приложения и откройте новое решение проекта (как показано выше, MR_FaceRecognition.sln).
Глава 9. Развертывание приложения
Чтобы развернуть в HoloLens, выполните приведенные действия.
Вам потребуется IP-адрес HoloLens (для удаленного развертывания) и убедиться, что HoloLens находится в режиме разработчика. Для этого:
- При ношении HoloLens откройте параметры.
- Переход к сети и расширенным параметрам Wi-Fi > в Интернете >
- Обратите внимание на IPv4-адрес .
- Затем вернитесь к параметрам, а затем в разделе "Обновление и безопасность > для разработчиков"
- Установите режим разработчика.
Перейдите к новой сборке Unity (папке приложения) и откройте файл решения с помощью Visual Studio.
В разделе "Конфигурация решения" выберите "Отладка".
На платформе решения выберите x86, удаленный компьютер.
Перейдите в меню "Сборка" и щелкните "Развернуть решение", чтобы загрузить неопубликованное приложение в HoloLens.
Теперь приложение должно появиться в списке установленных приложений в HoloLens, готовых к запуску!
Примечание.
Чтобы развернуть в иммерсивной гарнитуре, установите платформу решения на локальный компьютер и установите для конфигурации отладочную конфигурацию с x86 в качестве платформы. Затем развернитесь на локальном компьютере с помощью меню "Сборка", выбрав "Развернуть решение".
Глава 10. Использование приложения
При использовании HoloLens запустите приложение.
Просмотрите пользователя, зарегистрированного в API распознавания лиц. Убедитесь, что:
- Лицо человека не слишком далеко и ясно видно
- Освещение среды не слишком темное
Используйте жест касания, чтобы записать фотографию человека.
Подождите, пока приложение отправит запрос на анализ и получите ответ.
Если пользователь успешно распознался, имя пользователя будет отображаться как текст пользовательского интерфейса.
Процесс записи можно повторять с помощью жеста касания каждые несколько секунд.
Готовое приложение API распознавания лиц Azure
Поздравляем, вы создали приложение смешанной реальности, которое использует службу распознавания лиц Azure для обнаружения лиц в изображении и идентификации всех известных лиц.
Дополнительные упражнения
Упражнение 1
API распознавания лиц Azure достаточно мощный, чтобы обнаружить до 64 лиц на одном изображении. Расширьте приложение, чтобы он мог распознать два или три лица, среди многих других людей.
Упражнение 2
API распознавания лиц Azure также может предоставлять все виды сведений о атрибутах. Интегрируйте это в приложение. Это может быть еще более интересно, когда в сочетании с API эмоций.