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


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

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

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

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

Примечание

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

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

Примечание

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

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

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

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

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

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

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

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

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

    Примечание

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

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

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

    Примечание

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

  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 Компьютерное зрение перейдите к первому шагу Захват ключей и щелкните Ключи (это также можно сделать, щелкнув синюю гиперссылку Ключи, расположенную в меню навигации служб и обозначенную значком ключа). Вы увидите ключи службы.

  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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      1. InternetClient;

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

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

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

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

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

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

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

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

Важно!

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

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

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

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

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

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

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

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

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

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

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

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

    Выберите объект Cursor.

  2. Переименуйте sphere в Cursor (дважды щелкните объект 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. Задайте для параметра Colorзначение #FFFFFFFF

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

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

    Создайте заготовку объекта LabelText.

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

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

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

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

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

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

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

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

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

  2. Дважды щелкните папку Scripts , чтобы открыть ее. Затем в этой папке щелкните правой кнопкой мыши и выберите Создать > , а затем скрипт 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. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

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

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

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

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

  2. Перетащите объект LabelText из папки Assets на панели проекта в слот Label 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. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

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

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

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

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

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

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

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

  2. В окне Параметры сборки щелкните Сборка.

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

  3. Если это еще не сделано, установите флажок Проекты C# для Unity.

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

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

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

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

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

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

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

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

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

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

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

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

Примечание

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

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

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

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

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

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

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

Упражнение 2

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