Поделиться через


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, которое сможет выполнить следующие действия:

  1. С помощью жеста Tap камера HoloLens запечатлеет изображение.
  2. Образ будет отправлен в службу API Компьютерное зрение Azure.
  3. Распознанные объекты будут перечислены в простой группе пользовательского интерфейса, размещенной в сцене Unity.

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

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

Курс HoloLens Иммерсивные гарнитуры
MR и Azure 302: компьютерное зрение ✔️ ✔️

Примечание.

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

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

Примечание.

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

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

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

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

Дополнительные сведения о калибровке см. по этой ссылке в статье о калибровке HoloLens.

Дополнительные сведения о настройке датчика см. по этой ссылке в статье по настройке датчика HoloLens.

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

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

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

    Примечание.

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

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

    Создание ресурса в Azure

    Примечание.

    Возможно, слово New было заменено на создание ресурса на более новых порталах.

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

    Сведения о службе API компьютерного зрения

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

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

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

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

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

      Если вы хотите узнать больше о группах ресурсов Azure, посетите статью группы ресурсов.

    5. Определите расположение группы ресурсов (если вы создаете новую группу ресурсов). Расположение в идеале будет находиться в регионе, где будет выполняться приложение. Некоторые ресурсы Azure доступны только в определенных регионах.

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

    7. Щелкните Создать.

      Сведения о создании службы

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

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

    Просмотр нового уведомления для новой службы

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

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

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

    Новый образ службы API Компьютерное зрение

  9. В этом руководстве приложению потребуется выполнить вызовы к службе, которая выполняется с помощью ключа подписки вашей службы.

  10. На странице быстрого запуска службы API Компьютерное зрение перейдите к первому шагу, захватите ключи и нажмите кнопку "Ключи" (вы также можете добиться этого, щелкнув синюю гиперссылку Key, расположенную в меню навигации служб, обозначенную значком ключа). Откроется ключи службы.

  11. Скопируйте один из отображаемых ключей, так как вам потребуется позже в проекте.

  12. Вернитесь на страницу быстрого запуска и получите конечную точку. Обратите внимание, что ваши данные могут отличаться в зависимости от региона (если это так, вам потребуется внести изменения в код позже). Скопируйте эту конечную точку для последующего использования:

    Новая служба API Компьютерное зрение

    Совет

    Вы можете проверить, какие конечные точки находятся здесь.

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

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

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

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

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

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

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

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

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

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

  5. Хотя все еще в параметрах сборки файлов > и убедитесь, что:

    1. Целевое устройство имеет значение HoloLens

      Для иммерсивных гарнитур задайте для целевого устройства значение Any Device.

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

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

    4. Версия Visual Studio установлена в качестве последней версии

    5. Для сборки и запуска задано значение Local Machine

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

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

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

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

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

      3. Откройте только что созданную папку "Сцены" , а затем в поле "Файл": текстовое поле, введите MR_ComputerVisionScene, а затем нажмите кнопку "Сохранить".

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

        Помните, что сцены Unity должны сохраняться в папке "Активы ", так как они должны быть связаны с проектом Unity. Создание папки сцен (и других аналогичных папок) — это типичный способ структурирования проекта Unity.

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

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

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

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

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

      1. Версия среды выполнения сценариев должна быть стабильной (эквивалентная .NET 3.5).

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

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

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

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

      1. InternetClient;

      2. Веб-камера

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

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

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

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

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

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

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

Внимание

Если вы хотите пропустить компонент настройки Unity этого курса и перейти прямо в код, вы можете скачать этот пакет unitypackage, импортировать его в проект в качестве пользовательского пакета, а затем продолжить с главы 5.

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

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

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

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

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

    4. Задайте для параметра Clear Flags значение Solid Color (игнорируйте этот параметр для иммерсивной гарнитуры).

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

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

  3. Затем необходимо создать простой объект Cursor, подключенный к основной камере, который поможет вам разместить выходные данные анализа изображений при запуске приложения. Этот курсор определяет центральную точку фокуса камеры.

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

  1. На панели иерархии щелкните правой кнопкой мыши главную камеру. В разделе 3D-объект щелкните Sphere.

    Выберите объект курсора.

  2. Переименуйте sphere на курсор (дважды щелкните объект Cursor или нажмите клавишу F2 с выбранным объектом) и убедитесь, что она находится в качестве дочернего элемента основной камеры.

  3. На панели иерархии щелкните курсор слева. При выборе курсора настройте следующие переменные на панели инспектора:

    1. Задайте для позиции преобразования значение 0, 0, 5

    2. Задайте для масштабирования значение 0.02, 0.02, 0.02

      Обновите положение преобразования и масштаб.

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

После записи изображения с камерой HoloLens это изображение будет отправлено в экземпляр службы API Azure Компьютерное зрение для анализа.

Результаты этого анализа будут списком распознанных объектов с именем Tags.

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

Ниже показано, как настроить объект Label .

  1. Щелкните правой кнопкой мыши в любом месте панели иерархии (расположение не имеет значения на этом этапе), в разделе трехмерный объект добавьте трехмерный текст. Назовите его LabelText.

    Создайте трехмерный текстовый объект.

  2. На панели иерархии щелкните элемент LabelText слева. Выбрав LabelText, настройте следующие переменные на панели инспектора:

    1. Задайте для позиции значение 0,0,0
    2. Задайте для масштабирования значение 0.01, 0.01, 0.01
    3. В текстовой сетке компонента:
    4. Замените весь текст в тексте на "..."
    5. Установка привязки в центр среднего центра
    6. Установка выравнивания в центр
    7. Задайте размер вкладки 4
    8. Задайте размер шрифта 50
    9. Задайте для цвета значение #FFFFFFFF

    Текстовый компонент

  3. Перетащите labelText из панели иерархии в папку ресурса в области проекта. Это сделает LabelText префабом, чтобы его можно было создать в коде.

    Создайте префаб объекта LabelText.

  4. Необходимо удалить LabelText из панели иерархии, чтобы он не отображался в открывающей сцене. Так как теперь это префаб, который будет вызываться для отдельных экземпляров из папки "Активы", его не нужно хранить в сцене.

  5. Последняя структура объекта на панели иерархии должна быть похожа на ту, которая показана на рисунке ниже:

    Окончательная структура панели иерархии.

Глава 5. Создание класса ResultsLabel

Первый скрипт, который необходимо создать, — это класс ResultsLabel , который отвечает за следующее:

  • Создание меток в соответствующем пространстве мира относительно положения камеры.
  • Отображение тегов из Образа Anaysis.

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

  1. Щелкните правой кнопкой мыши панель проекта и создайте > папку. Назовите скрипты папок.

    Создайте папку скриптов.

  2. Создав папку "Скрипты" , дважды щелкните ее, чтобы открыть ее. Затем в этой папке щелкните правой кнопкой мыши и выберите команду "Создать>" и "Скрипт C#". Назовите скрипт ResultsLabel.

  3. Дважды щелкните новый скрипт ResultsLabel, чтобы открыть его с помощью Visual Studio.

  4. Внутри класса вставьте следующий код в класс 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");
                }    
            }
        }
    
  5. Не забудьте сохранить изменения в Visual Studio , прежде чем вернуться в Unity.

  6. Вернитесь в редактор Unity, щелкните и перетащите класс ResultsLabel из папки "Скрипты " в объект Main Camera на панели иерархии.

  7. Щелкните главную камеру и просмотрите панель инспектора.

Вы заметите, что из скрипта, который вы только что перетащили в камеру, есть два поля: курсор и префаб метка.

  1. Перетащите объект с именем Cursor из панели иерархии в слот с именем Cursor, как показано на рисунке ниже.

  2. Перетащите объект LabelText из папки ресурсов на панели проекта в слот с именем Prefab метки, как показано на рисунке ниже.

    Задайте целевые объекты ссылки в Unity.

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

Следующий класс, который вы собираетесь создать, — это класс ImageCapture . Этот класс отвечает за:

  • Захват изображения с помощью камеры HoloLens и его хранения в папке приложения.
  • Захват жестов касания от пользователя.

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

  1. Перейдите в папку "Скрипты", созданную ранее.

  2. Щелкните правой кнопкой мыши в папке скрипт > C#. Вызовите скрипт ImageCapture.

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

  4. Добавьте следующие пространства имен в начало файла :

        using System.IO;
        using System.Linq;
        using UnityEngine;
        using UnityEngine.XR.WSA.Input;
        using UnityEngine.XR.WSA.WebCam;
    
  5. Затем добавьте следующие переменные в класс ImageCapture над методом Start( ):

        public static ImageCapture instance; 
        public int tapsCount;
        private PhotoCapture photoCaptureObject = null;
        private GestureRecognizer recognizer;
        private bool currentlyCapturing = false;
    

Переменная tapsCount будет хранить количество жестов касания, захваченных пользователем. Это число используется в именовании захваченных изображений.

  1. Теперь необходимо добавить код для методов 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();
        }
    
  2. Реализуйте обработчик, который будет вызываться при возникновении жеста касания.

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

  1. После записи и хранения образа будут вызываться следующие обработчики. Если процесс выполнен успешно, результат передается в 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()); 
        }
    
  2. Затем добавьте метод, который приложение использует для запуска процесса захвата изображений и хранения образа.

        /// <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 .

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

  1. Дважды щелкните папку "Скрипты" , чтобы открыть ее.

  2. Щелкните правой кнопкой мыши в папке "Скрипты" , нажмите кнопку "Создать > скрипт C#". Назовите скрипт VisionManager.

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

  4. Обновите пространства имен так же, как и в начале класса VisionManager :

        using System;
        using System.Collections;
        using System.Collections.Generic;
        using System.IO;
        using UnityEngine;
        using UnityEngine.Networking;
    
  5. В верхней части скрипта в классе 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.

  6. В классе 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
  7. Теперь необходимо добавить код для пробуждения.

        private void Awake()
        {
            // allows this instance to behave like a singleton
            instance = this;
        }
    
  8. Затем добавьте корутин (с методом статического потока под ним), который получит результаты анализа изображения, захваченного классом 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);
        }  
    
  9. Не забудьте сохранить изменения в Visual Studio , прежде чем вернуться в Unity.

  10. Вернитесь в редактор Unity, щелкните и перетащите классы VisionManager и ImageCapture из папки "Скрипты " в объект Main Camera на панели иерархии.

Глава 8. Перед сборкой

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

  • Все параметры, упомянутые в главе 2 , задаются правильно.
  • Все скрипты присоединяются к объекту Main Camera .
  • Все поля в панели инспектора основной камеры назначены должным образом.
  • Убедитесь, что ключ проверки подлинности вставляется в переменную authorizationKey.
  • Убедитесь, что вы также проверили конечную точку в скрипте VisionManager и выравниваете ее в регионе (в этом документе используется западная часть сша по умолчанию).

Глава 9. Создание решения UWP и загрузка неопубликованных приложений

Все необходимое для раздела Unity этого проекта завершено, поэтому пришло время создать его из Unity.

  1. Перейдите к параметрам сборки файлов > сборки - ...

  2. В окне "Параметры сборки" нажмите кнопку "Сборка".

    Создание приложения из Unity

  3. Если это еще не так, обратитесь к проектам C# Unity.

  4. Нажмите кнопку " Создать". Unity запустит окно проводник, в котором необходимо создать, а затем выбрать папку для сборки приложения. Создайте папку и присвойте ей имя приложения. Затем с выбранной папкой приложения нажмите клавишу SELECT FOLDER.

  5. Unity начнет создание проекта в папку приложения .

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

Глава 10. Развертывание в HoloLens

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

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

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

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

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

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

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

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

Примечание.

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

Готовое приложение API Компьютерное зрение

Поздравляем, вы создали приложение смешанной реальности, которое использует API Azure Компьютерное зрение для распознавания реальных объектов и отображения уверенности в том, что было видно.

результат лаборатории

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

Упражнение 1

Так же, как вы использовали параметр Tags (как свидетельство в конечной точке , используемой в VisionManager), расширьте приложение для обнаружения других сведений; просмотрите другие параметры, к которым у вас есть доступ к HERE.

Упражнение 2

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