HoloLens (1-го поколения) и Azure 307: Машинное обучение


Примечание

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


конечный продукт -start

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

Студия машинного обучения Azure (классическая) — это служба Майкрософт, которая предоставляет разработчикам большое количество алгоритмов машинного обучения, которые могут помочь с вводом, выводом, подготовкой и визуализацией данных. На основе этих компонентов можно разработать эксперимент прогнозной аналитики, выполнить итерацию по нему и использовать для обучения модели. После обучения вы сможете обеспечить работоспособность модели в облаке Azure, чтобы затем оценить новые данные. Дополнительные сведения см. на странице Студии машинного обучения Azure (классическая модель).

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

  1. Предоставьте таблицу данных о продажах на портале Студии машинного обучения Azure (классическая версия) и разработайте алгоритм для прогнозирования будущих продаж популярных товаров.
  2. Создайте проект Unity, который может получать и интерпретировать прогнозирующие данные из службы машинного обучения.
  3. Визуальное отображение данных предикаций в проекте Unity путем предоставления наиболее популярных элементов продаж на полке.

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

Этот курс является автономным учебником, в котором непосредственно не участвуют другие Смешанная реальность Labs.

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

Курс HoloLens Иммерсивные гарнитуры
307. Смешанная реальность и Azure: машинное обучение ✔️ ✔️

Примечание

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

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

Примечание

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

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

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

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

Глава 1. Настройка учетной записи хранения Azure

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

  1. Войдите на портал Azure.

    Примечание

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

  2. После входа щелкните Учетные записи хранения в меню слева.

    Снимок экрана: окно Microsoft Azure с элементом

    Примечание

    На более новых порталах слово "Создать " может быть заменено на "Создать ресурс".

  3. На вкладке Учетные записи хранения щелкните Добавить.

    Снимок экрана: окно Microsoft Azure с экраном учетных записей хранения и выделенной кнопкой

  4. На панели Создание учетной записи хранения выполните следующие действия.

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

    2. В поле Модель развертывания выберитеResource Manager.

    3. В поле Тип учетной записи выберите Хранилище (общего назначения версии 1) .

    4. В разделе Производительность выберите Стандартная.

    5. Для параметра Репликация выберите Хранилище с доступом на чтение и геоизбыточное хранилище (RA-GRS).

    6. Для параметра Требуется безопасное перемещение значение Отключено.

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

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

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

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

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

    Снимок экрана: диалоговое окно

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

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

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

Глава 2. Студия машинного обучения Azure (классическая)

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

  1. На портале Azure щелкните Создать в левом верхнем углу и найдите рабочую область Студии машинного обучения и нажмите клавишу ВВОД.

    Снимок экрана: окно Microsoft Azure, в котором показана рабочая область Студии машинного обучения в области содержимого.

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

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

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

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

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

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

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

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

    6. Выберите в раскрывающемся меню соответствующую ценовую категорию Рабочая область .

    7. В разделе План веб-службы щелкните Создать, а затем вставьте его имя в текстовое поле.

    8. В разделе Ценовая категория плана веб-службы выберите ценовую категорию по своему выбору. Уровень тестирования разработки DEVTEST Standard должен быть доступен бесплатно.

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

    10. Нажмите кнопку Создать.

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

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

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

    Снимок экрана: окно Microsoft Azure, в котором отображается непрочитанное уведомление в меню навигации.

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

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

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

  8. На отображаемой странице в разделе Дополнительные ссылки щелкните Запустить Студию машинного обучения, чтобы перенаправить браузер на портал Студии машинного обучения .

    Снимок экрана: окно Microsoft Azure с выделенной ссылкой Запуск Студии машинного обучения в области содержимого.

  9. Нажмите кнопку Войти в правом верхнем углу или в центре, чтобы войти в Студию машинного обучения (классическая модель).

    Снимок экрана: окно Студии машинного обучения с выделенной кнопкой

Глава 3. Студия машинного обучения (классическая): настройка набора данных

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

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

Важно!

Приведенный выше .zip файл содержит как ProductsTableCSV , так и unitypackage, которые потребуются в главе 6. Этот пакет также предоставляется в этой главе, хотя и отдельно от CSV-файла.

Этот пример набора данных содержит запись о самых продаваемых объектах в каждый час каждого дня 2017 года.

Снимок экрана: окно Microsoft Excel, в котором показан пример набора данных о наиболее продаваемых объектах в каждый час каждого дня в 2017 году.

Например, на 1 день 2017 года в 13:00 (час 13) самым продаваемым товаром была соль и перец.

Этот пример таблицы содержит 9998 записей.

  1. Вернитесь на портал Студии машинного обучения (классическая модель) и добавьте эту таблицу в качестве набора данных для машинного обучения. Для этого нажмите кнопку + Создать в левом нижнем углу экрана.

    Снимок экрана: классический портал Машинное обучение Microsoft Azure Studio с выделенной кнопкой Создать в меню.

  2. Снизу появится раздел, в нем находится панель навигации слева. Щелкните Набор данных, а затем справа от нее — Из локального файла.

    Снимок экрана: диалоговое окно

  3. Отправьте новый набор данных , выполнив следующие действия.

    1. Откроется окно отправки, в котором можно просмотреть новый набор данных на жестком диске.

      Снимок экрана: диалоговое окно

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

    3. В текстовом поле ниже введите ProductsTableCSV.csv в качестве имени набора данных (хотя он должен быть добавлен автоматически).

    4. В раскрывающемся меню для параметра Тип выберите Универсальный CSV-файл с заголовком (.csv).

    5. Нажмите галочку в правом нижнем углу окна отправки, и набор данных будет отправлен.

Глава 4. Студия машинного обучения (классическая): эксперимент

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

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

  1. Нажмите еще раз кнопку + Создать в левом нижнем углу страницы, а затем щелкните Эксперимент>пустой эксперимент.

    Снимок экрана: окно Машинное обучение Microsoft Azure Studio с выбранным пунктом меню

  2. Откроется новая страница с пустым экспериментом:

  3. На панели слева разверните сохраненные наборы данных Мои наборы>данных и перетащите ProductsTableCSV на холст эксперимента.

    Снимок экрана: окно

  4. На панели слева разверните раздел Пример преобразования> данныхи Разбиение. Затем перетащите элемент Разделение данных в на холст эксперимента. Элемент Разделение данных разделит набор данных на две части. Одна часть, используемая для обучения алгоритма машинного обучения. Вторая часть будет использоваться для оценки точности созданного алгоритма.

    Снимок экрана: окно

  5. На правой панели (при выборе элемента Разделение данных на холсте) измените значение 0,7для параметра Доля строк в первом выходном наборе данных. При этом данные будут разделены на две части: первая часть будет составлять 70 % данных, а вторая — оставшиеся 30 %. Чтобы убедиться, что данные разделены случайным образом, установите флажок Случайный разбиение .

    Снимок экрана: панель

  6. Перетащите соединение из базы элемента ProductsTableCSV на холсте в верхнюю часть элемента Разделение данных. При этом элементы будут соединены и отправлены выходные данные набора данных ProductsTableCSV (данные) во входные данные разделения.

    Снимок экрана: холст эксперимента, на котором показана связь между таблицей Products C S V dot c s v и разделением данных.

  7. На панели Эксперименты слева разверните узел Машинное обучение>. Перетащите элемент Train Model (Обучение модели ) на холст эксперимента. Холст должен выглядеть так же, как показано ниже.

    Снимок экрана: холст эксперимента, на котором показана связь между таблицей Products C S V dot c s v и разделением данных с обучением модели ниже.

  8. В левом нижнем углу элемента Разделение данных перетащите подключение в правый верхний углу элемента Обучение модели . Первые 70 % разделения из набора данных будут использоваться моделью обучения для обучения алгоритма.

    Снимок экрана: холст эксперимента, на котором показана связь между таблицей Products C S V dot c s v, разделением данных и обучением модели.

  9. Выберите элемент Обучение модели на холсте и на панели Свойства (в правой части окна браузера) нажмите кнопку Запустить селектор столбца .

  10. В текстовом поле введите product и нажмите клавишу ВВОД, и product будет задан в качестве столбца для обучения прогнозов. После этого щелкните галочку в правом нижнем углу, чтобы закрыть диалоговое окно выбора.

    Снимок экрана: диалоговое окно

  11. Вы собираетесь обучить алгоритм многоклассовой логистической регрессии , чтобы спрогнозировать наиболее продаваемый продукт на основе часа дня и даты. Помимо область этого документа, можно объяснить сведения о различных алгоритмах, предоставляемых Студия машинного обучения Azure, однако вы можете узнать больше из памятки по алгоритмам машинного обучения.

  12. На панели элементов эксперимента слева разверните узел Машинное обучение>Инициализировать классификацию модели> и перетащите элемент Мультиклассовая логистическая регрессия на холст эксперимента.

  13. Подключите выходные данные из нижней части многоклассовой логистической регрессии к верхнему левому входу элемента Обучение модели .

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

  14. В списке элементов эксперимента на панели слева разверните узелОценкамашинного обучения> и перетащите элемент Оценка модели на холст.

  15. Подключите выходные данные из нижней части обучающей модели к левому верхнему входному значению модели оценки.

  16. Соедините выходные данные в правом нижнем углу из раздела Разделение данных к правому верхнему углу элемента Оценка модели .

    Снимок экрана: холст эксперимента, на котором показана оценка модели, подключенная к обучению модели и разделите данные.

  17. В списке Элементов эксперимента на панели слева разверните узел Оценка машинного обучения> и перетащите элемент Оценка модели на холст.

  18. Соедините выходные данные из score model (Оценка модели ) с левым верхним левым входным значением элемента Evaluate Model (Оценка модели).

    Снимок экрана: холст эксперимента, на котором показан элемент

  19. Вы создали свой первый эксперимент машинного обучения. Теперь вы можете сохранить и запустить эксперимент. В меню в нижней части страницы нажмите кнопку Сохранить , чтобы сохранить эксперимент, а затем нажмите кнопку Выполнить , чтобы начать эксперимент.

    Снимок экрана: меню

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

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

    Снимок экрана: окно

  21. Щелкните правой кнопкой мыши элемент Оценка модели на холсте и в контекстном меню наведите указатель мыши на Результаты оценки, а затем выберите Визуализировать.

    Снимок экрана: меню правой кнопкой мыши элемента

  22. Результаты оценки будут показаны спрогнозированными и фактическими результатами. Для оценки модели используется 30 % исходного набора данных, который был разделен ранее. Вы можете видеть, что результаты не велики, в идеале вы должны иметь наибольшее число в каждой строке, выделенный элемент в столбцах.

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

  23. Закройте результаты.

  24. Чтобы использовать недавно обученную модель машинного обучения, необходимо предоставить ее в виде веб-службы. Для этого щелкните пункт меню Настройка веб-службы в меню в нижней части страницы и щелкните Прогнозная веб-служба.

    Снимок экрана: меню

  25. Будет создана новая вкладка, а модель обучения будет объединена для создания новой веб-службы.

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

    Снимок экрана: меню

  27. После завершения работы в нижней части страницы появится кнопка Развернуть веб-службу . Вы готовы к развертыванию веб-службы. Щелкните Развернуть веб-службу (классическую) в меню в нижней части страницы.

    Снимок экрана: меню

    Браузер может предложить разрешить всплывающее окно, которое следует разрешить, хотя, возможно, потребуется нажать кнопку Развернуть веб-службу еще раз, если страница развертывания не отображается.

  28. После создания эксперимента вы будете перенаправлены на страницу панели мониторинга , где будет отображаться ключ API . Скопируйте его в блокнот на данный момент, он вам понадобится в коде очень скоро. Заметив ключ API, нажмите кнопку ЗАПРОС/ОТВЕТ в разделе Конечная точка по умолчанию под ключом.

    Снимок экрана: окно Машинное обучение Microsoft Azure Studio, в котором показана клавиша A P I и выделенная ссылка

    Примечание

    Если нажать кнопку Тест на этой странице, вы сможете ввести входные данные и просмотреть выходные данные. Введите день и час. Оставьте запись продукта пустой. Затем нажмите кнопку Подтвердить . В выходных данных в нижней части страницы будет отображаться JSON, представляющий вероятность выбора каждого продукта.

  29. Откроется новая веб-страница с инструкциями и примерами структуры запросов, требуемой Студией машинного обучения (классической). Скопируйте URI запроса , отображаемый на этой странице, в блокнот.

    Снимок экрана: страница документации по запросу A P I, на которой показан выделенный идентификатор запроса запроса.

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

Чтобы вызвать веб-службу, вам потребуется URL-адрес конечной точки службы и ключ API для службы. В верхнем меню щелкните вкладку Использование .

На странице Сведения о потреблении отображаются сведения, необходимые для вызова веб-службы из кода. Создайте копию первичного ключа и URL-адреса запроса и ответа . Они понадобятся в следующей главе.

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

Настройте и протестируйте иммерсивную гарнитуру Смешанная реальность.

Примечание

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

  1. Откройте Unity и создайте проект Unity с именем MR_MachineLearning. Убедитесь, что для типа проекта задано значение 3D.

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

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

  4. Кроме того, убедитесь, что:

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

      Для Microsoft HoloLens задайте для параметра Целевое устройство значение HoloLens.

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

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

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

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

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

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

      Снимок экрана: диалоговое окно

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

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

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

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

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

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

        Снимок экрана: вкладка

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

      • InternetClient;

        Снимок экрана: вкладка

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

      Снимок экрана: вкладка

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

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

  9. Сохраните проект (ФАЙЛ > СОХРАНИТЬ ПРОЕКТ).

Глава 6. Импорт пакета MLProducts Unity

Для этого курса необходимо скачать пакет ресурсов Unity с именем Azure-MR-307.unitypackage. Этот пакет поставляется в комплекте со сценой со всеми объектами в предварительно созданном виде, чтобы вы могли сосредоточиться на том, чтобы все это работало. Скрипт ShelfKeeper предоставляется, хотя и содержит только общедоступные переменные, для целей структуры настройки сцены. Вам потребуется выполнить все остальные разделы.

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

  1. На панели мониторинга Unity щелкните Активы в меню в верхней части экрана, а затем выберите Импорт пакета, Пользовательский пакет.

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

  2. С помощью средства выбора файлов выберите пакет Azure-MR-307.unitypackage и нажмите кнопку Открыть.

  3. Отобразится список компонентов для этого ресурса. Подтвердите импорт, нажав кнопку Импорт.

    Снимок экрана: диалоговое окно импорта пакета Unity, в котором показано импорт пакета Машинного обучения Azure.

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

    Снимок экрана: панель проекта Unity, на которой показаны недавно импортированные папки в папке Assets.

  5. В папке Панель проекта щелкните папку Сцены и дважды щелкните сцену внутри ( называется MR_MachineLearningScene). Откроется сцена (см. рисунок ниже). Если красные бриллианты отсутствуют, просто нажмите кнопку Gizmos в правом верхнем углу панели игр.

    Снимок экрана: окно сцены Unity, в котором показан выделенный пункт меню Gizmos в верхней области навигации.

Глава 7. Проверка библиотек DLL в Unity

Чтобы использовать библиотеки JSON (используемые для сериализации и десериализации), была реализована библиотека DLL Newtonsoft с пакетом, который вы принесли. Библиотека должна иметь правильную конфигурацию, хотя ее стоит проверить (особенно если у вас возникли проблемы с кодом не работает).

Для этого сделайте следующее:

  • Щелкните файл Newtonsoft левой кнопкой мыши в папке Plugins и перейдите на панель Инспектор. Убедитесь, что установлен флажок Любая платформа . Перейдите на вкладку UWP и убедитесь, что флажок Не обрабатывать установлен.

    Импорт библиотек DLL в Unity

Глава 8. Создание класса ShelfKeeper

Класс ShelfKeeper содержит методы, управляющие пользовательским интерфейсом и продуктами, порожденными в сцене.

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

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

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

    using UnityEngine;
    
    public class ShelfKeeper : MonoBehaviour
    {
        /// <summary>
        /// Provides this class Singleton-like behavior
        /// </summary>
        public static ShelfKeeper instance;
    
        /// <summary>
        /// Unity Inspector accessible Reference to the Text Mesh object needed for data
        /// </summary>
        public TextMesh dateText;
    
        /// <summary>
        /// Unity Inspector accessible Reference to the Text Mesh object needed for time
        /// </summary>
        public TextMesh timeText;
    
        /// <summary>
        /// Provides references to the spawn locations for the products prefabs
        /// </summary>
        public Transform[] spawnPoint;
    
        private void Awake()
        {
            instance = this;
        }
    
        /// <summary>
        /// Set the text of the date in the scene
        /// </summary>
        public void SetDate(string day, string month)
        {
            dateText.text = day + " " + month;
        }
    
        /// <summary>
        /// Set the text of the time in the scene
        /// </summary>
        public void SetTime(string hour)
        {
            timeText.text = hour + ":00";
        }
    
        /// <summary>
        /// Spawn a product on the shelf by providing the name and selling grade
        /// </summary>
        /// <param name="name"></param>
        /// <param name="sellingGrade">0 being the best seller</param>
        public void SpawnProduct(string name, int sellingGrade)
        {
            Instantiate(Resources.Load(name),
                spawnPoint[sellingGrade].transform.position, spawnPoint[sellingGrade].transform.rotation);
        }
    }
    
  3. Перед возвращением в Unity обязательно сохраните изменения в Visual Studio.

  4. В редакторе Unity проверка, что класс ShelfKeeper выглядит следующим образом:

    Снимок экрана класса Shelf Keeper, в котором показано, что целевым объектам ссылок заданы значения Сетка текста даты и Сетка текста времени.

    Важно!

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

    1. Откройте массив Spawn Point в скрипте компонента ShelfKeeper , щелкнув его левой кнопкой мыши. Появится подраздел с именем Size, который указывает размер массива. Введите 3 в текстовое поле рядом с полем Размер и нажмите клавишу ВВОД, и под ним будут созданы три слота.

    2. В иерархии разверните объект Time Display (щелкнув стрелку рядом с ним левой кнопкой мыши). Затем щелкните основную камеру в иерархии, чтобы в инспекторе отображались сведения о ней.

    3. Выберите основную камеру на панели Иерархия. Перетащите объекты Date и Time с панели иерархии в области Текст даты и Текст времени в инспекторе основной камеры компонента ShelfKeeper.

    4. Перетащите элемент "Точки порождения " с панели иерархии (под объектом Shelf ) к целевым объектам ссылки "3элемента " под массивом Spawn Point , как показано на изображении.

      Снимок экрана: панель иерархии, на которой показано, что элементы меню Дата, Время и три пункта меню Spawn Point находятся в классе Shelf Keeper.

Глава 9. Создание класса ProductPrediction

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

Этот класс отвечает за:

  • Запрос экземпляра Службы машинного обучения с указанием текущей даты и времени.

  • Десериализация ответа JSON в пригодные для использования данные.

  • Интерпретация данных, получение 3 рекомендуемых продуктов.

  • Вызов методов класса ShelfKeeper для отображения данных в сцене.

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

  1. Перейдите в папку Скрипты на панели проекта.

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

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

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

  5. Добавьте следующие пространства имен в начало класса ProductPrediction:

    using System;
    using System.Collections.Generic;
    using UnityEngine;
    using System.Linq;
    using Newtonsoft.Json;
    using UnityEngine.Networking;
    using System.Runtime.Serialization;
    using System.Collections;
    
  6. Внутри класса ProductPrediction вставьте следующие два объекта, состоящие из нескольких вложенных классов. Эти классы используются для сериализации и десериализации JSON для Службы машинного обучения.

        /// <summary>
        /// This object represents the Prediction request
        /// It host the day of the year and hour of the day
        /// The product must be left blank when serialising
        /// </summary>
        public class RootObject
        {
            public Inputs Inputs { get; set; }
        }
    
        public class Inputs
        {
            public Input1 input1 { get; set; }
        }
    
        public class Input1
        {
            public List<string> ColumnNames { get; set; }
            public List<List<string>> Values { get; set; }
        }
    
        /// <summary>
        /// This object containing the deserialised Prediction result
        /// It host the list of the products
        /// and the likelihood of them being sold at current date and time
        /// </summary>
        public class Prediction
        {
            public Results Results { get; set; }
        }
    
        public class Results
        {
            public Output1 output1;
        }
    
        public class Output1
        {
            public string type;
            public Value value;
        }
    
        public class Value
        {
            public List<string> ColumnNames { get; set; }
            public List<List<string>> Values { get; set; }
        }
    
  7. Затем добавьте следующие переменные над предыдущим кодом (чтобы код, связанный с JSON, был в нижней части скрипта, под всем другим кодом и не в стороне):

        /// <summary>
        /// The 'Primary Key' from your Machine Learning Portal
        /// </summary>
        private string authKey = "-- Insert your service authentication key here --";
    
        /// <summary>
        /// The 'Request-Response' Service Endpoint from your Machine Learning Portal
        /// </summary>
        private string serviceEndpoint = "-- Insert your service endpoint here --";
    
        /// <summary>
        /// The Hour as set in Windows
        /// </summary>
        private string thisHour;
    
        /// <summary>
        /// The Day, as set in Windows
        /// </summary>
        private string thisDay;
    
        /// <summary>
        /// The Month, as set in Windows
        /// </summary>
        private string thisMonth;
    
        /// <summary>
        /// The Numeric Day from current Date Conversion
        /// </summary>
        private string dayOfTheYear;
    
        /// <summary>
        /// Dictionary for holding the first (or default) provided prediction 
        /// from the Machine Learning Experiment
        /// </summary>    
        private Dictionary<string, string> predictionDictionary;
    
        /// <summary>
        /// List for holding product prediction with name and scores
        /// </summary>
        private List<KeyValuePair<string, double>> keyValueList;
    

    Важно!

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

    Снимок экрана: Машинное обучение Microsoft Azure Studio, на котором показана ссылка

    Снимок экрана: страница документации по API ответа на запрос, на которой показан выделенный url-адрес запроса POST.

  8. Вставьте этот код в метод Start(). Метод Start() вызывается при инициализации класса:

        void Start()
        {
            // Call to get the current date and time as set in Windows
            GetTodayDateAndTime();
    
            // Call to set the HOUR in the UI
            ShelfKeeper.instance.SetTime(thisHour);
    
            // Call to set the DATE in the UI
            ShelfKeeper.instance.SetDate(thisDay, thisMonth);
    
            // Run the method to Get Predication from Azure Machine Learning
            StartCoroutine(GetPrediction(thisHour, dayOfTheYear));
        }
    
  9. Ниже приведен метод, который собирает дату и время из Windows и преобразует их в формат, который наш эксперимент машинного обучения может использовать для сравнения с данными, хранящимися в таблице.

        /// <summary>
        /// Get current date and hour
        /// </summary>
        private void GetTodayDateAndTime()
        {
            // Get today date and time
            DateTime todayDate = DateTime.Now;
    
            // Extrapolate the HOUR
            thisHour = todayDate.Hour.ToString();
    
            // Extrapolate the DATE
            thisDay = todayDate.Day.ToString();
            thisMonth = todayDate.ToString("MMM");
    
            // Extrapolate the day of the year
            dayOfTheYear = todayDate.DayOfYear.ToString();
        }
    
  10. Метод Update() можно удалить, так как этот класс не будет использовать его.

  11. Добавьте следующий метод, который будет передавать текущие дату и время в конечную точку машинного обучения и получать ответ в формате JSON.

        private IEnumerator GetPrediction(string timeOfDay, string dayOfYear)
        {
            // Populate the request object 
            // Using current day of the year and hour of the day
            RootObject ro = new RootObject
            {
                Inputs = new Inputs
                {
                    input1 = new Input1
                    {
                        ColumnNames = new List<string>
                        {
                            "day",
                            "hour",
                        "product"
                        },
                        Values = new List<List<string>>()
                    }
                }
            };
    
            List<string> l = new List<string>
            {
                dayOfYear,
                timeOfDay,
                ""
            };
    
            ro.Inputs.input1.Values.Add(l);
    
            Debug.LogFormat("Score request built");
    
            // Serialize the request
            string json = JsonConvert.SerializeObject(ro);
    
            using (UnityWebRequest www = UnityWebRequest.Post(serviceEndpoint, "POST"))
            {
                byte[] jsonToSend = new System.Text.UTF8Encoding().GetBytes(json);
                www.uploadHandler = new UploadHandlerRaw(jsonToSend);
    
                www.downloadHandler = new DownloadHandlerBuffer();
                www.SetRequestHeader("Authorization", "Bearer " + authKey);
                www.SetRequestHeader("Content-Type", "application/json");
                www.SetRequestHeader("Accept", "application/json");
    
                yield return www.SendWebRequest();
                string response = www.downloadHandler.text;
    
                // Deserialize the response
                DataContractSerializer serializer;
                serializer = new DataContractSerializer(typeof(string));
                DeserialiseJsonResponse(response);
            }
        }
    
  12. Добавьте следующий метод, который отвечает за десериализацию ответа JSON и передачу результата десериализации классу ShelfKeeper . Таким результатом будут названия трех товаров, которые, по прогнозам, будут продаваться больше всего в текущую дату и время. Вставьте приведенный ниже код в класс ProductPrediction под предыдущим методом.

        /// <summary>
        /// Deserialize the response received from the Machine Learning portal
        /// </summary>
        public void DeserialiseJsonResponse(string jsonResponse)
        {
            // Deserialize JSON
            Prediction prediction = JsonConvert.DeserializeObject<Prediction>(jsonResponse);
            predictionDictionary = new Dictionary<string, string>();
    
            for (int i = 0; i < prediction.Results.output1.value.ColumnNames.Count; i++)
            {
                if (prediction.Results.output1.value.Values[0][i] != null)
                {
                    predictionDictionary.Add(prediction.Results.output1.value.ColumnNames[i], prediction.Results.output1.value.Values[0][i]);
                }
            }
    
            keyValueList = new List<KeyValuePair<string, double>>();
    
            // Strip all non-results, by adding only items of interest to the scoreList
            for (int i = 0; i < predictionDictionary.Count; i++)
            {
                KeyValuePair<string, string> pair = predictionDictionary.ElementAt(i);
                if (pair.Key.StartsWith("Scored Probabilities"))
                {
                    // Parse string as double then simplify the string key so to only have the item name
                    double scorefloat = 0f;
                    double.TryParse(pair.Value, out scorefloat);
                    string simplifiedName =
                        pair.Key.Replace("\"", "").Replace("Scored Probabilities for Class", "").Trim();
                    keyValueList.Add(new KeyValuePair<string, double>(simplifiedName, scorefloat));
                }
            }
    
            // Sort Predictions (results will be lowest to highest)
            keyValueList.Sort((x, y) => y.Value.CompareTo(x.Value));
    
            // Spawn the top three items, from the keyValueList, which we have sorted
            for (int i = 0; i < 3; i++)
            {
                ShelfKeeper.instance.SpawnProduct(keyValueList[i].Key, i);
            }
    
            // Clear lists in case of reuse
            keyValueList.Clear();
            predictionDictionary.Clear();
        }
    
  13. Сохраните Visual Studio и вернитесь в Unity.

  14. Перетащите скрипт класса ProductPrediction из папки Script в объект Main Camera .

  15. Сохраните сцену и проект Файл>Сохранить сцену или Файл>Сохранить проект.

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

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

Для сборки:

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

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

  3. Установите флажок Проекты Unity C# (это важно, так как оно позволит изменять классы после завершения сборки).

  4. Щелкните Добавить открытые сцены,

  5. Щелкните Построить.

    Снимок экрана: диалоговое окно

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

  7. Создайте папку BUILDS и создайте в ней другую папку с нужным именем.

  8. Щелкните новую папку и нажмите кнопку Выбрать папку, чтобы начать сборку в этом расположении.

    Снимок экрана: окно проводник, в котором показана выделенная папка Builds.

    Снимок экрана: окно проводник, в котором отображается содержимое папки

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

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

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

  1. Перейдите к новой сборке Unity (папке App ) и откройте файл решения в Visual Studio.

  2. Открыв Visual Studio, необходимо восстановить пакеты NuGet, что можно сделать, щелкнув правой кнопкой мыши решение MachineLearningLab_Build в Обозреватель решений (находится справа от Visual Studio), а затем щелкнув Восстановить пакеты NuGet:

    Снимок экрана: окно Visual Studio, в котором показан выделенный пункт меню

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

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

    Для Microsoft HoloLens может оказаться проще установить значение Удаленный компьютер, чтобы не привязаться к компьютеру. Однако вам также потребуется выполнить следующие действия.

    • Узнайте IP-адрес holoLens, который можно найти в разделе Параметры > сети & Internet > Wi-Fi > Дополнительные параметры. IPv4 — это адрес, который следует использовать.
    • Убедитесь, что режим разработчикавключен; находится в разделе Параметры Обновление > & безопасность > для разработчиков.

    Снимок экрана: меню Microsoft Visual Studio, в котором показано, что в разделе

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

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

При запуске приложения Смешанная реальность вы увидите скамейку, настроенную в сцене Unity, и после инициализации будут получены данные, настроенные в Azure. Данные будут десериализоваться в приложении, а три лучших результата для текущей даты и времени будут представлены визуально в виде трех моделей на стенде.

Готовое приложение машинного обучения

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

Снимок экрана: окно Microsoft Visual Studio, в котором показана полка с тремя объектами и карта с текстом 15 часов 23 февраля.

Упражнение

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

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

Упражнение 2

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