HoloLens (1-го поколения) и Azure 302: компьютерное зрение
Примечание
Руководства Mixed Reality Academy были разработаны для иммерсивных гарнитур HoloLens (1-го поколения) и иммерсивных гарнитур Mixed Reality. Поэтому мы считаем, что важно оставить эти руководства для разработчиков, которые ищут рекомендации по разработке для этих устройств. Данные руководства не будут обновляться с учетом последних наборов инструментов или возможностей взаимодействия для HoloLens 2. Они будут сохранены для работы на поддерживаемых устройствах. В будущем будет опубликована новая серия учебников, демонстрирующих разработку для HoloLens 2. Это уведомление будет обновлено со ссылкой на эти учебники при их публикации.
В этом курсе вы узнаете, как распознавать визуальное содержимое в предоставленном изображении с помощью возможностей Azure Компьютерное зрение в приложении смешанной реальности.
Результаты распознавания будут отображаться в виде описательных тегов. Эту службу можно использовать без необходимости обучения модели машинного обучения. Если для реализации требуется обучение модели машинного обучения, см. статью Mr и Azure 302b.
Microsoft Компьютерное зрение — это набор API, предназначенный для предоставления разработчикам обработки и анализа изображений (с возвращаемыми сведениями) с использованием расширенных алгоритмов из облака. Разработчики отправляют изображение или URL-адрес изображения, а алгоритмы API Microsoft Компьютерное зрение анализируют визуальное содержимое на основе входных данных, выбранных пользователем, которые затем могут возвращать информацию, включая определение типа и качества изображения, обнаружение человеческих лиц (возвращая их координаты), а также добавление тегов или классификацию изображений. Дополнительные сведения см. на странице API Компьютерное зрение Azure.
Завершив этот курс, вы получите приложение HoloLens смешанной реальности, которое сможет выполнять следующие действия:
- С помощью жеста Касание камера HoloLens запечатлеет изображение.
- Образ будет отправлен в службу API Компьютерное зрение Azure.
- Распознаваемые объекты будут перечислены в простой группе пользовательского интерфейса, размещенной в сцене Unity.
В приложении вы можете определить, как вы будете интегрировать результаты с проектом. Этот курс предназначен для обучения интеграции службы Azure с проектом Unity. Это ваша работа, чтобы использовать знания, полученные из этого курса, для улучшения приложения смешанной реальности.
Поддержка устройств
Курс | HoloLens | Иммерсивные гарнитуры |
---|---|---|
302. Смешанная реальность и Azure: компьютерное зрение | ✔️ | ✔️ |
Примечание
Хотя в этом курсе основное внимание уделяется HoloLens, вы также можете применить полученные в этом курсе знания, чтобы Windows Mixed Reality иммерсивные гарнитуры (VR). Так как иммерсивные гарнитуры (VR) не имеют доступных камер, вам потребуется внешняя камера, подключенная к компьютеру. По мере прохождения курса вы увидите заметки о любых изменениях, которые могут потребоваться для поддержки иммерсивных гарнитур (VR).
Предварительные требования
Примечание
Это руководство предназначено для разработчиков, имеющих базовый опыт работы с Unity и C#. Кроме того, имейте в виду, что предварительные требования и письменные инструкции в этом документе представляют то, что было проверено и проверено на момент написания статьи (май 2018 г.). Вы можете использовать последнюю версию программного обеспечения, как указано в статье установка инструментов , хотя не следует предполагать, что информация в этом курсе будет идеально соответствовать тому, что вы найдете в более новом программном обеспечении, чем указано ниже.
Для этого курса мы рекомендуем использовать следующее оборудование и программное обеспечение:
- Компьютер разработки, совместимый с Windows Mixed Reality для разработки иммерсивных гарнитур (VR)
- Windows 10 Fall Creators Update (или более поздней версии) с включенным режимом разработчика
- Последняя версия пакета SDK для Windows 10
- Unity 2017.4
- Visual Studio 2017
- Windows Mixed Reality иммерсивная гарнитура (VR) или Microsoft HoloLens с включенным режимом разработчика
- Камера, подключенная к компьютеру (для разработки иммерсивной гарнитуры)
- Доступ к Интернету для установки Azure и получения API Компьютерное зрение
Перед началом работы
- Чтобы избежать проблем при сборке этого проекта, настоятельно рекомендуется создать проект, упомянутый в этом руководстве, в корневой или почти корневой папке (длинные пути к папкам могут вызвать проблемы во время сборки).
- Настройте и протестируйте HoloLens. Если вам нужна поддержка по настройке HoloLens, ознакомьтесь со статьей о настройке HoloLens.
- Рекомендуется выполнять калибровку и настройку датчика при разработке нового приложения HoloLens (иногда это может помочь выполнить эти задачи для каждого пользователя).
Чтобы получить справку по калибровке, перейдите по этой ссылке на статью Калибровка HoloLens.
Чтобы получить справку по настройке датчиков, перейдите по этой ссылке на статью Настройка датчика HoloLens.
Глава 1. Портал Azure
Чтобы использовать службу API Компьютерное зрение в Azure, необходимо настроить доступ к экземпляру службы для вашего приложения.
Сначала войдите на портал Azure.
Примечание
Если у вас еще нет учетной записи Azure, ее необходимо создать. Если вы выполняете это руководство в учебной или лабораторной ситуации, обратитесь к преподавателю или одному из прокторов за помощью в настройке новой учетной записи.
Выполнив вход в систему, щелкните Создать в левом верхнем углу, выполните поиск Компьютерное зрение API и нажмите клавишу ВВОД.
Примечание
Возможно, на новых порталах слово New было заменено на Create a resource (Создать ресурс).
На новой странице будет представлено описание службы API Компьютерное зрение. В левом нижнем углу этой страницы нажмите кнопку Создать , чтобы создать связь с этой службой.
После нажатия кнопки Создать:
Вставьте нужное имя для этого экземпляра службы.
Выберите подписку.
Выберите подходящую ценовую категорию. Если это первый раз при создании службы API Компьютерное зрение, вам должна быть доступна бесплатная категория (F0).
Выберите группу ресурсов или создайте новую. Группа ресурсов предоставляет способ мониторинга, управления доступом, подготовки и управления выставлением счетов для коллекции ресурсов Azure. Рекомендуется хранить все службы Azure, связанные с одним проектом (например, этими лабораториями), в общей группе ресурсов.
Дополнительные сведения о группах ресурсов Azure см. в этой статье.
Определите расположение группы ресурсов (если вы создаете новую группу ресурсов). Расположение в идеале должно находиться в регионе, где будет выполняться приложение. Некоторые ресурсы Azure доступны только в определенных регионах.
Вам также потребуется подтвердить, что вы поняли условия, применяемые к этой Службе.
Щелкните Создать.
После нажатия кнопки Создать вам придется подождать, пока служба будет создана. Это может занять минуту.
После создания экземпляра службы на портале появится уведомление.
Щелкните уведомление, чтобы просмотреть новый экземпляр службы.
Нажмите кнопку Перейти к ресурсу в уведомлении, чтобы просмотреть новый экземпляр службы. Вы перейдете к новому экземпляру службы API Компьютерное зрение.
В рамках этого руководства приложению потребуется выполнять вызовы к службе, что осуществляется с помощью ключа подписки службы.
На странице Быстрый запуск службы API Компьютерное зрение перейдите к первому шагу Захват ключей и щелкните Ключи (это также можно сделать, щелкнув синюю гиперссылку Ключи, расположенную в меню навигации служб и обозначенную значком ключа). Вы увидите ключи службы.
Создайте копию одного из отображаемых ключей, так как это потребуется позже в проекте.
Назад на страницу Быстрого запуска и выберите конечную точку. Имейте в виду, что ваш код может отличаться в зависимости от региона (если это так, вам потребуется внести изменения в код позже). Возьмите копию этой конечной точки для последующего использования:
Совет
Здесь можно проверка, что представляют собой различные конечные точки.
Глава 2. Настройка проекта Unity
Ниже приведена типичная настройка для разработки со смешанной реальностью и, таким образом, хороший шаблон для других проектов.
Откройте Unity и нажмите кнопку Создать.
Теперь необходимо указать имя проекта Unity. Вставка MR_ComputerVision. Убедитесь, что для типа проекта задано значение 3D. Задайте для параметра Расположение подходящее место (помните, что лучше ближе к корневым каталогам). Затем щелкните Создать проект.
При открытии Unity стоит проверить, что для редактора скриптов по умолчанию задано значение Visual Studio. Перейдите в раздел Изменение > параметров , а затем в новом окне перейдите к разделу Внешние инструменты. Измените внешний редактор скриптов на Visual Studio 2017. Закройте окно Параметры .
Затем перейдите в раздел Параметры сборки файла > и выберите универсальная платформа Windows, а затем нажмите кнопку Переключить платформу, чтобы применить выбранный вариант.
Оставаясь в параметрах сборки файла > и убедитесь, что:
Для целевого устройствазадано значение HoloLens
Для иммерсивных гарнитур установите для параметра Целевое устройствозначение Любое устройство.
Для параметра Тип сборки задано значение D3D.
Для пакета SDK задано значение Последняя установленная
Для версии Visual Studio задано значение Последняя установленная версия
Для сборки и запуска задано значение Локальный компьютер.
Сохраните сцену и добавьте ее в сборку.
Для этого выберите Добавить открытые сцены. Появится окно сохранения.
Создайте новую папку для этой и любой будущей сцены, а затем нажмите кнопку Создать папку , чтобы создать новую папку, назовите ее Scenes.
Откройте только что созданную папку Scenes , а затем в текстовом поле Имя файла введите MR_ComputerVisionScene, а затем нажмите кнопку Сохранить.
Имейте в виду, что сцены Unity необходимо сохранить в папке Assets , так как они должны быть связаны с проектом Unity. Создание папки scenes (и других аналогичных папок) — типичный способ структурирования проекта Unity.
Оставшиеся параметры в разделе Параметры сборки на данный момент следует оставить по умолчанию.
В окне Параметры сборки нажмите кнопку Параметры проигрывателя . Откроется соответствующая панель в пространстве, где находится инспектор .
На этой панели необходимо проверить несколько параметров:
На вкладке Другие параметры :
Версия среды выполнения сценариев должна быть стабильной (эквивалентная .NET 3.5).
Серверная часть сценариев должна быть .NET
Уровень совместимости API должен быть .NET 4.6
На вкладке Параметры публикации в разделе Возможности проверка:
InternetClient;
Веб-камера
Далее вниз по панели в разделе XR Settings (см. раздел Параметры публикации) установите флажок Virtual Reality Supported (Поддерживается виртуальная реальность) и убедитесь, что пакет SDK для Windows Mixed Reality добавлен.
Вернувшись в параметры сборки, проекты C# Unity больше не выделены серым цветом; Установите флажок рядом с этим.
Закройте окно Build Settings (Параметры сборки).
Сохраните сцену и проект (ФАЙЛ > СОХРАНИТЬ СЦЕНУ или ФАЙЛ > СОХРАНИТЬ ПРОЕКТ).
Глава 3. Настройка основной камеры
Важно!
Если вы хотите пропустить компонент Unity Set up этого курса и перейти непосредственно к коду, скачайте этот пакет .unitypackage, импортируйте его в проект в качестве пользовательского пакета, а затем перейдите к главе 5.
На панели Иерархия выберите основную камеру.
После выбора вы увидите все компоненты основной камеры на панели инспектора.
Объект Camera должен называться Main Camera (обратите внимание на орфографию!)
Для тега основной камеры необходимо задать значение MainCamera (обратите внимание на орфографию!)
Убедитесь, что для позиции преобразования задано значение 0, 0, 0.
Установите для параметра Очистить флаги значение Сплошной цвет (игнорируйте это значение для иммерсивной гарнитуры).
Задайте для параметра Цвет фона компонента камеры значение Черный, Альфа 0 (шестнадцатеричный код: #00000000) (игнорируйте это значение для иммерсивной гарнитуры).
Далее необходимо создать простой объект Cursor, прикрепленный к основной камере, который поможет расположить выходные данные анализа изображения при запуске приложения. Этот курсор определяет центральную точку фокуса камеры.
Чтобы создать курсор, выполните следующие действия.
На панели Иерархия щелкните правой кнопкой мыши главную камеру. В разделе Трехмерный объект щелкните Sphere.
Переименуйте sphere в Cursor (дважды щелкните объект Cursor или нажмите клавишу F2 с выбранным объектом) и убедитесь, что объект находится как дочерний элемент основной камеры.
На панели Иерархия щелкните курсор левой кнопкой мыши. Выбрав курсор, настройте следующие переменные на панели инспектора:
Задайте для положения преобразования значение 0, 0, 5
Задайте для масштабированиязначение 0,02, 0,02, 0,02.
Глава 4. Настройка системы меток
После захвата изображения с помощью камеры HoloLens это изображение будет отправлено в экземпляр службы API Azure Компьютерное зрение для анализа.
Результатом этого анализа будет список распознаваемых объектов с именем Tags.
Вы будете использовать метки (как трехмерный текст в мировом пространстве) для отображения этих тегов в месте, где была сделана фотография.
Ниже показано, как настроить объект Label .
Щелкните правой кнопкой мыши в любом месте панели иерархии (расположение на данном этапе не имеет значения), в разделе Трехмерный объект добавьте трехмерный текст. Назовите его LabelText.
На панели иерархии щелкните элемент LabelText левой кнопкой мыши. Выбрав LabelText , измените следующие переменные на панели инспектора:
- Задайте для свойства Положение значение 0,0,0.
- Задайте для масштабированиязначение 0,01, 0,01, 0,01.
- В компоненте Сетка текста:
- Замените весь текст в тексте на "..."
- Установите для привязкизначение Центр посередине
- Задайте для выравниваниязначение По центру
- Задайте для параметра Размер вкладки значение 4
- Задайте для параметра Размер шрифта значение50.
- Задайте для параметра Colorзначение #FFFFFFFF
Перетащите элемент LabelText с панели иерархии в папку Asset (Ресурс) на панели проектов. Это сделает LabelText префабом, чтобы его можно было создать в коде.
Необходимо удалить LabelText с панели иерархии, чтобы он не отображался в открывающей сцене. Так как теперь это заготовка, которую вы будете вызывать для отдельных экземпляров из папки Assets, нет необходимости хранить его в сцене.
Окончательная структура объекта на панели иерархии должна выглядеть так, как показано на рисунке ниже.
Глава 5. Создание класса ResultsLabel
Первый скрипт, который необходимо создать, — это класс ResultsLabel , который отвечает за следующее:
- Создание меток в соответствующем мировом пространстве относительно положения камеры.
- Отображение тегов из объекта Image Anaysis.
Чтобы создать этот класс, выполните указанные ниже действия.
Щелкните правой кнопкой мыши панель проекта и выберите Создать > папку. Назовите папку Scripts.
Дважды щелкните папку Scripts , чтобы открыть ее. Затем в этой папке щелкните правой кнопкой мыши и выберите Создать > , а затем скрипт C#. Назовите скрипт ResultsLabel.
Дважды щелкните новый скрипт ResultsLabel, чтобы открыть его в Visual Studio.
Внутри класса вставьте следующий код в класс ResultsLabel :
using System.Collections.Generic; using UnityEngine; public class ResultsLabel : MonoBehaviour { public static ResultsLabel instance; public GameObject cursor; public Transform labelPrefab; [HideInInspector] public Transform lastLabelPlaced; [HideInInspector] public TextMesh lastLabelPlacedText; private void Awake() { // allows this instance to behave like a singleton instance = this; } /// <summary> /// Instantiate a Label in the appropriate location relative to the Main Camera. /// </summary> public void CreateLabel() { lastLabelPlaced = Instantiate(labelPrefab, cursor.transform.position, transform.rotation); lastLabelPlacedText = lastLabelPlaced.GetComponent<TextMesh>(); // Change the text of the label to show that has been placed // The final text will be set at a later stage lastLabelPlacedText.text = "Analysing..."; } /// <summary> /// Set the Tags as Text of the last Label created. /// </summary> public void SetTagsToLastLabel(Dictionary<string, float> tagsDictionary) { lastLabelPlacedText = lastLabelPlaced.GetComponent<TextMesh>(); // At this point we go through all the tags received and set them as text of the label lastLabelPlacedText.text = "I see: \n"; foreach (KeyValuePair<string, float> tag in tagsDictionary) { lastLabelPlacedText.text += tag.Key + ", Confidence: " + tag.Value.ToString("0.00 \n"); } } }
Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.
Вернитесь в редактор Unity и перетащите класс ResultsLabel из папки Scripts в объект Main Camera на панели иерархии.
Щелкните основную камеру и перейдите на панель инспектора.
Вы заметите, что из скрипта, который вы только что перетащили в камеру, есть два поля: Курсор и Метка Prefab.
Перетащите объект Cursor из панели иерархии в слот с именем Cursor, как показано на рисунке ниже.
Перетащите объект LabelText из папки Assets на панели проекта в слот Label Prefab, как показано на рисунке ниже.
Глава 6. Создание класса ImageCapture
Следующий класс, который вы собираетесь создать, — это класс ImageCapture . Этот класс отвечает за:
- Захват изображения с помощью камеры HoloLens и его сохранение в папке приложения.
- Захват жестов касания от пользователя.
Чтобы создать этот класс, выполните указанные ниже действия.
Перейдите в папку Скрипты, созданную ранее.
Щелкните правой кнопкой мыши в папке Создать > скрипт C#. Вызовите скрипт ImageCapture.
Дважды щелкните новый скрипт ImageCapture , чтобы открыть его в Visual Studio.
Добавьте следующие пространства имен в начало файла:
using System.IO; using System.Linq; using UnityEngine; using UnityEngine.XR.WSA.Input; using UnityEngine.XR.WSA.WebCam;
Затем добавьте следующие переменные в класс ImageCapture над методом Start():
public static ImageCapture instance; public int tapsCount; private PhotoCapture photoCaptureObject = null; private GestureRecognizer recognizer; private bool currentlyCapturing = false;
Переменная tapsCount будет хранить количество жестов касания, полученных от пользователя. Это число используется при именовании захваченных изображений.
Теперь необходимо добавить код для методов Awake() и Start(). Они будут вызываться при инициализации класса:
private void Awake() { // Allows this instance to behave like a singleton instance = this; } void Start() { // subscribing to the HoloLens API gesture recognizer to track user gestures recognizer = new GestureRecognizer(); recognizer.SetRecognizableGestures(GestureSettings.Tap); recognizer.Tapped += TapHandler; recognizer.StartCapturingGestures(); }
Реализуйте обработчик, который будет вызываться при выполнении жеста касания.
/// <summary> /// Respond to Tap Input. /// </summary> private void TapHandler(TappedEventArgs obj) { // Only allow capturing, if not currently processing a request. if(currentlyCapturing == false) { currentlyCapturing = true; // increment taps count, used to name images when saving tapsCount++; // Create a label in world space using the ResultsLabel class ResultsLabel.instance.CreateLabel(); // Begins the image capture and analysis procedure ExecuteImageCaptureAndAnalysis(); } }
Метод TapHandler() увеличивает количество касаний, полученных от пользователя, и использует текущее положение курсора, чтобы определить, где следует разместить новую метку.
Затем этот метод вызывает метод ExecuteImageCaptureAndAnalysis(), чтобы начать работу с основными функциями этого приложения.
После записи и сохранения образа будут вызваны следующие обработчики. Если процесс выполнен успешно, результат передается в VisionManager (который вы еще предстоит создать) для анализа.
/// <summary> /// Register the full execution of the Photo Capture. If successful, it will begin /// the Image Analysis process. /// </summary> void OnCapturedPhotoToDisk(PhotoCapture.PhotoCaptureResult result) { // Call StopPhotoMode once the image has successfully captured photoCaptureObject.StopPhotoModeAsync(OnStoppedPhotoMode); } void OnStoppedPhotoMode(PhotoCapture.PhotoCaptureResult result) { // Dispose from the object in memory and request the image analysis // to the VisionManager class photoCaptureObject.Dispose(); photoCaptureObject = null; StartCoroutine(VisionManager.instance.AnalyseLastImageCaptured()); }
Затем добавьте метод, который приложение использует для запуска процесса записи образа и сохранения образа.
/// <summary> /// Begin process of Image Capturing and send To Azure /// Computer Vision service. /// </summary> private void ExecuteImageCaptureAndAnalysis() { // Set the camera resolution to be the highest possible Resolution cameraResolution = PhotoCapture.SupportedResolutions.OrderByDescending((res) => res.width * res.height).First(); Texture2D targetTexture = new Texture2D(cameraResolution.width, cameraResolution.height); // Begin capture process, set the image format PhotoCapture.CreateAsync(false, delegate (PhotoCapture captureObject) { photoCaptureObject = captureObject; CameraParameters camParameters = new CameraParameters(); camParameters.hologramOpacity = 0.0f; camParameters.cameraResolutionWidth = targetTexture.width; camParameters.cameraResolutionHeight = targetTexture.height; camParameters.pixelFormat = CapturePixelFormat.BGRA32; // Capture the image from the camera and save it in the App internal folder captureObject.StartPhotoModeAsync(camParameters, delegate (PhotoCapture.PhotoCaptureResult result) { string filename = string.Format(@"CapturedImage{0}.jpg", tapsCount); string filePath = Path.Combine(Application.persistentDataPath, filename); VisionManager.instance.imagePath = filePath; photoCaptureObject.TakePhotoAsync(filePath, PhotoCaptureFileOutputFormat.JPG, OnCapturedPhotoToDisk); currentlyCapturing = false; }); }); }
Предупреждение
На этом этапе на панели консоли редактора Unity появится ошибка. Это связано с тем, что код ссылается на класс VisionManager , который вы создадите в следующей главе.
Глава 7. Вызов Azure и анализ изображений
Последний скрипт, который необходимо создать, — это класс VisionManager .
Этот класс отвечает за:
- Загрузка последнего изображения, записанного в виде массива байтов.
- Отправка массива байтов в экземпляр службы API Azure Компьютерное зрение для анализа.
- Получение ответа в виде строки JSON.
- Десериализация ответа и передача результирующих тегов в класс ResultsLabel .
Чтобы создать этот класс, выполните указанные ниже действия.
Дважды щелкните папку Скрипты , чтобы открыть ее.
Щелкните правой кнопкой мыши в папке Скрипты и выберите Создать > скрипт C#. Присвойте скрипту имя VisionManager.
Дважды щелкните новый скрипт, чтобы открыть его в Visual Studio.
Обновите пространства имен, чтобы они совпадали со следующими значениями в верхней части класса VisionManager :
using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using UnityEngine.Networking;
В верхней части скрипта в классе VisionManager (над методом Start() теперь необходимо создать два класса , которые будут представлять десериализованный ответ JSON из Azure:
[System.Serializable] public class TagData { public string name; public float confidence; } [System.Serializable] public class AnalysedObject { public TagData[] tags; public string requestId; public object metadata; }
Примечание
Классы TagData и AnalysedObject должны иметь атрибут [System.Serializable] перед объявлением, чтобы можно было десериализовать с помощью библиотек Unity.
В класс VisionManager необходимо добавить следующие переменные:
public static VisionManager instance; // you must insert your service key here! private string authorizationKey = "- Insert your key here -"; private const string ocpApimSubscriptionKeyHeader = "Ocp-Apim-Subscription-Key"; private string visionAnalysisEndpoint = "https://westus.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags"; // This is where you need to update your endpoint, if you set your location to something other than west-us. internal byte[] imageBytes; internal string imagePath;
Предупреждение
Вставьте ключ проверки подлинности в переменную authorizationKey . Вы заметите свой ключ проверки подлинности в начале этого курса, глава 1.
Предупреждение
Переменная visionAnalysisEndpoint может отличаться от переменной, указанной в этом примере. "Западная часть США" относится только к экземплярам служб, созданным для региона "Западная часть США". Обновите его, указав URL-адрес конечной точки; Ниже приведены некоторые примеры того, как это может выглядеть:
- Западная Европа:
https://westeurope.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
- Юго-Восточная Азия:
https://southeastasia.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
- Восточная Австралия:
https://australiaeast.api.cognitive.microsoft.com/vision/v1.0/analyze?visualFeatures=Tags
- Западная Европа:
Теперь необходимо добавить код для пробуждения.
private void Awake() { // allows this instance to behave like a singleton instance = this; }
Затем добавьте сопрограмму (с методом статического потока под ней), которая получит результаты анализа изображения, записанного классом ImageCapture .
/// <summary> /// Call the Computer Vision Service to submit the image. /// </summary> public IEnumerator AnalyseLastImageCaptured() { WWWForm webForm = new WWWForm(); using (UnityWebRequest unityWebRequest = UnityWebRequest.Post(visionAnalysisEndpoint, webForm)) { // gets a byte array out of the saved image imageBytes = GetImageAsByteArray(imagePath); unityWebRequest.SetRequestHeader("Content-Type", "application/octet-stream"); unityWebRequest.SetRequestHeader(ocpApimSubscriptionKeyHeader, authorizationKey); // the download handler will help receiving the analysis from Azure unityWebRequest.downloadHandler = new DownloadHandlerBuffer(); // the upload handler will help uploading the byte array with the request unityWebRequest.uploadHandler = new UploadHandlerRaw(imageBytes); unityWebRequest.uploadHandler.contentType = "application/octet-stream"; yield return unityWebRequest.SendWebRequest(); long responseCode = unityWebRequest.responseCode; try { string jsonResponse = null; jsonResponse = unityWebRequest.downloadHandler.text; // The response will be in Json format // therefore it needs to be deserialized into the classes AnalysedObject and TagData AnalysedObject analysedObject = new AnalysedObject(); analysedObject = JsonUtility.FromJson<AnalysedObject>(jsonResponse); if (analysedObject.tags == null) { Debug.Log("analysedObject.tagData is null"); } else { Dictionary<string, float> tagsDictionary = new Dictionary<string, float>(); foreach (TagData td in analysedObject.tags) { TagData tag = td as TagData; tagsDictionary.Add(tag.name, tag.confidence); } ResultsLabel.instance.SetTagsToLastLabel(tagsDictionary); } } catch (Exception exception) { Debug.Log("Json exception.Message: " + exception.Message); } yield return null; } }
/// <summary> /// Returns the contents of the specified file as a byte array. /// </summary> private 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); }
Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.
Вернитесь в редактор Unity, щелкните и перетащите классы VisionManager и ImageCapture из папки Scripts в объект Main Camera на панели иерархии.
Глава 8. Перед сборкой
Чтобы выполнить тщательную проверку приложения, необходимо загрузить его неопубликованное приложение на Устройство HoloLens. Прежде чем это сделать, убедитесь в том, что:
- Все параметры, упомянутые в главе 2 , заданы правильно.
- Все скрипты прикрепляются к объекту Main Camera .
- Все поля на панели инспектора основной камеры назначены правильно.
- Вставьте ключ проверки подлинности в переменную authorizationKey .
- Убедитесь, что вы также проверили конечную точку в сценарии VisionManager и что она соответствует вашему региону (в этом документе по умолчанию используется west-us ).
Глава 9. Создание решения UWP и загрузка неопубликованного приложения
Все необходимое для раздела Unity этого проекта завершено, поэтому пришло время создать его из Unity.
Перейдите в раздел Параметры сборки - Параметры сборки файла > ...
В окне Параметры сборки щелкните Сборка.
Если это еще не сделано, установите флажок Проекты C# для Unity.
Щелкните Построить. Unity запустит окно проводник, в котором необходимо создать, а затем выбрать папку для сборки приложения. Создайте папку и присвойте ей имя App. Затем, выбрав папку приложения , нажмите кнопку Выбрать папку.
Unity начнет сборку проекта в папку App .
После завершения сборки Unity (это может занять некоторое время), откроется окно проводник в расположении сборки (проверка панели задач, так как она может не всегда отображаться над окнами, но будет уведомлять вас о добавлении нового окна).
Глава 10. Развертывание в HoloLens
Чтобы развернуть в HoloLens, выполните приведенные далее действия.
Вам потребуется IP-адрес HoloLens (для удаленного развертывания) и убедитесь, что HoloLens находится в режиме разработчика. Для этого выполните следующие действия.
- При ношении HoloLens откройте раздел Параметры.
- Перейдите в раздел Сетевые & Internet > Wi-Fi > Дополнительные параметры
- Запишите IPv4-адрес .
- Затем вернитесь к разделу Параметры, а затем выберите Обновить безопасность & > для разработчиков.
- Установите режим разработчика включено.
Перейдите к новой сборке Unity (папке App ) и откройте файл решения в Visual Studio.
В разделе Конфигурация решения выберите Отладка.
В разделе Платформа решения выберите x86, Удаленный компьютер.
Перейдите в меню Сборка и щелкните Развернуть решение, чтобы загрузить неопубликованное приложение в HoloLens.
Теперь ваше приложение должно появиться в списке установленных приложений на HoloLens, готовых к запуску!
Примечание
Чтобы выполнить развертывание на иммерсивной гарнитуре, задайте для параметра Платформа решениязначение Локальный компьютер, а для параметра Конфигурация — значение Отладка с x86 в качестве платформы. Затем выполните развертывание на локальном компьютере, выбрав в меню Сборкапункт Развернуть решение.
Готовое приложение API Компьютерное зрение
Поздравляем, вы создали приложение смешанной реальности, которое использует API Компьютерное зрение Azure для распознавания реальных объектов и отображения уверенности в том, что было увидено.
Дополнительные упражнения
Упражнение 1.
Так же, как вы использовали параметр Tags (как указано в конечной точке , используемой в VisionManager), расширьте приложение для обнаружения других сведений; посмотрите, какие другие параметры у вас есть доступ к HERE.
Упражнение 2
Отображение возвращаемых данных Azure в более разговорном и удобочитаемом виде, возможно, скрытие чисел. Как будто бот может говорить с пользователем.