HoloLens (1.ª generación) y Azure 307: Aprendizaje automático
Nota:
Los tutoriales de Mixed Reality Academy se han diseñado teniendo en cuenta HoloLens (1.ª generación) y los cascos envolventes de realidad mixta. Por lo tanto, creemos que es importante conservar estos tutoriales para los desarrolladores que sigan buscando instrucciones sobre el desarrollo para esos dispositivos. Estos tutoriales no se actualizarán con los conjuntos de herramientas o las interacciones más recientes que se usan para HoloLens 2. Se mantendrán para que sigan funcionando en los dispositivos compatibles. Habrá una nueva serie de tutoriales que se publicarán en el futuro que demostrarán cómo desarrollar para HoloLens 2. Este aviso se actualizará con un vínculo a esos tutoriales cuando se publiquen.
En este curso, aprenderá a agregar funcionalidades de Machine Learning (ML) a una aplicación de realidad mixta mediante Azure Machine Learning Studio (clásico).
Azure Machine Learning Studio (clásico) es un servicio de Microsoft, que proporciona a los desarrolladores un gran número de algoritmos de aprendizaje automático, que pueden ayudar con la entrada, salida, preparación y visualización de datos. A partir de estos componentes, es posible desarrollar un experimento de análisis predictivo, iterar en él y usarlo para entrenar el modelo. Después del entrenamiento, puede hacer que el modelo esté operativo en la nube de Azure para que pueda puntuar nuevos datos. Para más información, visite la página azure Machine Learning Studio (clásico).
Después de completar este curso, tendrá una aplicación de casco envolvente de realidad mixta y habrá aprendido cómo hacer lo siguiente:
- Proporcione una tabla de datos de ventas al portal de Azure Machine Learning Studio (clásico) y diseñe un algoritmo para predecir futuras ventas de artículos populares.
- Cree un proyecto de Unity, que puede recibir e interpretar los datos de predicción del servicio ml.
- Muestre los datos de predicación visualmente dentro del proyecto de Unity, a través de proporcionar los artículos de ventas más populares, en un estante.
En la aplicación, es el momento de integrar los resultados con el diseño. Este curso está diseñado para enseñar a integrar un servicio de Azure con el proyecto de Unity. Es su trabajo usar el conocimiento que obtiene de este curso para mejorar la aplicación de realidad mixta.
Este curso es un tutorial autocontenida, que no implica directamente ningún otro laboratorio de realidad mixta.
Compatibilidad con dispositivos
Curso | HoloLens | Cascos envolventes |
---|---|---|
MR y Azure 307: Aprendizaje automático | ✔️ | ✔️ |
Nota:
Aunque este curso se centra principalmente en cascos envolventes de Windows Mixed Reality (VR), también puede aplicar lo que aprende en este curso a Microsoft HoloLens. A medida que siga el curso, verá notas sobre los cambios que podría necesitar para admitir HoloLens. Al usar HoloLens, es posible que observe algún eco durante la captura de voz.
Requisitos previos
Nota:
Este tutorial está diseñado para desarrolladores que tienen experiencia básica con Unity y C#. Tenga en cuenta también que los requisitos previos y las instrucciones escritas de este documento representan lo que se ha probado y comprobado en el momento de redactarlo (mayo de 2018). Puede usar el software más reciente, como se muestra en el artículo de instalación de las herramientas, aunque no debe asumirse que la información de este curso coincidirá perfectamente con lo que encontrará en el software más reciente que lo que se muestra a continuación.
Se recomienda el siguiente hardware y software para este curso:
- Un equipo de desarrollo, compatible con Windows Mixed Reality para el desarrollo de cascos envolventes (VR)
- Windows 10 Fall Creators Update (o posterior) con el modo desarrollador habilitado
- El SDK de Windows 10 más reciente
- Unity 2017.4
- Visual Studio 2017
- Casco envolvente (VR) de Windows Mixed Reality o Microsoft HoloLens con el modo desarrollador habilitado
- Acceso a Internet para la configuración de Azure y la recuperación de datos de MACHINE
Antes de comenzar
Para evitar encontrar problemas al compilar este proyecto, se recomienda encarecidamente crear el proyecto mencionado en este tutorial en una carpeta raíz o casi raíz (las rutas de acceso de carpeta largas pueden causar problemas en tiempo de compilación).
Capítulo 1: Configuración de la cuenta de Azure Storage
Para usar Azure Translator API, deberá configurar una instancia del servicio para que esté disponible para la aplicación.
Inicie sesión en Azure Portal.
Nota:
Si aún no tiene una cuenta de Azure, deberá crear una. Si sigue este tutorial en una situación de clase o laboratorio, pida a su instructor o a uno de los proctores que le ayuden a configurar la nueva cuenta.
Una vez que haya iniciado sesión, haga clic en Cuentas de almacenamiento en el menú izquierdo.
Nota:
Es posible que la palabra New se haya reemplazado por Create a resource (Crear un recurso) en portales más recientes.
En la pestaña Cuentas de almacenamiento, haga clic en Agregar.
En el panel Crear cuenta de almacenamiento:
Inserte un nombre para su cuenta, tenga en cuenta que este campo solo acepta números y letras minúsculas.
En Modelo de implementación, seleccione Resource Manager.
En Tipo de cuenta, seleccione Almacenamiento (uso general v1) .
En Rendimiento, seleccione Estándar.
En Replicación, seleccione Almacenamiento con redundancia geográfica con acceso de lectura (RA-GRS).
Deje Transferencia segura necesaria como Deshabilitada.
Seleccione una opción en Suscripción.
Elija un grupo de recursos o cree uno nuevo. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar la facturación de una colección de recursos de Azure. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos laboratorios) en un grupo de recursos común).
Si desea obtener más información sobre los grupos de recursos de Azure, visite el artículo sobre el grupo de recursos.
Determine la ubicación del grupo de recursos (si va a crear un nuevo grupo de recursos). Idealmente, la ubicación estaría en la región donde se ejecutaría la aplicación. Algunos recursos de Azure solo están disponibles en determinadas regiones.
También deberá confirmar que ha comprendido los Términos y Condiciones aplicados a este Servicio.
Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.
Aparecerá una notificación en el portal una vez creada la instancia de servicio.
Capítulo 2: Azure Machine Learning Studio (clásico)
Para usar Azure Machine Learning, deberá configurar una instancia de Machine Learning Service para que esté disponible para la aplicación.
En Azure Portal, haga clic en Nuevo en la esquina superior izquierda y busque Área de trabajo de Machine Learning Studio y presione Entrar.
La nueva página proporcionará una descripción del servicio Área de trabajo de Machine Learning Studio . En la parte inferior izquierda de este símbolo del sistema, haga clic en el botón Crear para crear una asociación con este servicio.
Una vez que haya hecho clic en Crear, aparecerá un panel en el que deberá proporcionar algunos detalles sobre el nuevo servicio Machine Learning Studio:
Inserte el nombre del área de trabajo deseada para esta instancia de servicio.
Seleccione una opción en Suscripción.
Elija un grupo de recursos o cree uno nuevo. Un grupo de recursos proporciona una manera de supervisar, controlar el acceso, aprovisionar y administrar la facturación de una colección de recursos de Azure. Se recomienda mantener todos los servicios de Azure asociados a un único proyecto (por ejemplo, estos laboratorios) en un grupo de recursos común).
Si desea obtener más información sobre los grupos de recursos de Azure, visite el artículo sobre el grupo de recursos.
Determine la ubicación del grupo de recursos (si va a crear un nuevo grupo de recursos). Idealmente, la ubicación estaría en la región donde se ejecutaría la aplicación. Algunos recursos de Azure solo están disponibles en determinadas regiones. Debe usar el mismo grupo de recursos que usó para crear Azure Storage en el capítulo anterior.
En la sección Cuenta de almacenamiento , haga clic en Usar existente y, a continuación, haga clic en el menú desplegable y, desde allí, haga clic en la cuenta de almacenamiento que creó en el último capítulo.
Seleccione el plan de tarifa del área de trabajo adecuado para usted, en el menú desplegable.
En la sección Plan de servicio web, haga clic en Crear nuevo y, a continuación, inserte un nombre para él en el campo de texto.
En la sección Plan de tarifa del plan de servicio web, seleccione el plan de tarifa que prefiera. Un nivel de prueba de desarrollo denominado DEVTEST Standard debe estar disponible sin cargo alguno.
También deberá confirmar que ha comprendido los Términos y Condiciones aplicados a este Servicio.
Haga clic en Crear.
Una vez que haya hecho clic en Crear, tendrá que esperar a que se cree el servicio, esto puede tardar un minuto.
Aparecerá una notificación en el portal una vez creada la instancia de servicio.
Haga clic en la notificación para explorar la nueva instancia de servicio.
Haga clic en el botón Ir al recurso de la notificación para explorar la nueva instancia de servicio.
En la página que se muestra, en la sección Vínculos adicionales, haga clic en Iniciar Machine Learning Studio, que dirigirá el explorador al portal de Machine Learning Studio .
Use el botón Iniciar sesión , en la parte superior derecha o en el centro, para iniciar sesión en Machine Learning Studio (clásico).
Capítulo 3: Machine Learning Studio (clásico): Configuración del conjunto de datos
Una de las formas en que funcionan los algoritmos de Machine Learning consiste en analizar los datos existentes y, a continuación, intentar predecir los resultados futuros en función del conjunto de datos existente. Por lo general, esto significa que cuantos más datos existentes tenga, mejor será el algoritmo para predecir los resultados futuros.
Se proporciona una tabla de ejemplo para este curso, denominada ProductsTableCSV y se puede descargar aquí.
Importante
El archivo de .zip anterior contiene ProductsTableCSV y .unitypackage, que necesitará en el capítulo 6. Este paquete también se proporciona en ese capítulo, aunque independiente del archivo csv.
Este conjunto de datos de ejemplo contiene un registro de los objetos más vendidos cada hora de cada día del año 2017.
Por ejemplo, el día 1 de 2017, a las 1 p.m. (hora 13), el artículo más vendido era sal y pimienta.
Esta tabla de ejemplo contiene 9998 entradas.
Vuelva al portal de Machine Learning Studio (clásico) y agregue esta tabla como un conjunto de datos para el aprendizaje automático. Para ello, haga clic en el botón + Nuevo de la esquina inferior izquierda de la pantalla.
Una sección aparecerá desde la parte inferior y, dentro de ella, hay un panel de navegación a la izquierda. Haga clic en Conjunto de datos y, a la derecha, en Archivo local.
Cargue el nuevo conjunto de datos siguiendo estos pasos:
Aparecerá la ventana de carga, donde puede examinar el disco duro del nuevo conjunto de datos.
Una vez seleccionada y de nuevo en la ventana de carga, deje la casilla desactivada.
En el campo de texto siguiente, escriba ProductsTableCSV.csv como nombre del conjunto de datos (aunque debería agregarse automáticamente).
Con el menú desplegable Tipo, seleccione Archivo CSV genérico con un encabezado (.csv) .
Presione el tic en la parte inferior derecha de la ventana de carga y se cargará el conjunto de datos .
Capítulo 4: Machine Learning Studio (clásico): El experimento
Para poder crear el sistema de aprendizaje automático, deberá crear un experimento para validar la teoría sobre los datos. Con los resultados, sabrá si necesita más datos o si no hay ninguna correlación entre los datos y un posible resultado.
Para empezar a crear un experimento:
Haga clic de nuevo en el botón + Nuevo de la parte inferior izquierda de la página y, a continuación, haga clic en Experimento>en blanco.
Se mostrará una nueva página con un experimento en blanco:
En el panel de la izquierda, expanda Conjuntos de datos guardados Mis conjuntos> de datos y arrastre ProductsTableCSV al lienzo del experimento.
En el panel de la izquierda, expanda Ejemplo de transformación>de datos y División. A continuación, arrastre el elemento Dividir datos en al lienzo del experimento. El elemento Dividir datos dividirá el conjunto de datos en dos partes. Una parte que usará para entrenar el algoritmo de aprendizaje automático. La segunda parte se usará para evaluar la precisión del algoritmo generado.
En el panel derecho (mientras se selecciona el elemento Dividir datos en el lienzo), edite la fracción de filas del primer conjunto de datos de salida en 0,7. Esto dividirá los datos en dos partes, la primera parte será el 70 % de los datos y la segunda será el 30 %. Para asegurarse de que los datos se dividen aleatoriamente, asegúrese de que la casilla División aleatoria permanece activada.
Arrastre una conexión desde la base del elemento ProductsTableCSV en el lienzo hasta la parte superior del elemento Dividir datos. Esto conectará los elementos y enviará la salida del conjunto de datos ProductsTableCSV (los datos) a la entrada Dividir datos.
En el panel Experimentos del lado izquierdo, expanda Entrenamiento de Machine Learning>. Arrastre el elemento Entrenar modelo hacia fuera hasta el lienzo Experimento. El lienzo debe tener el mismo aspecto que el siguiente.
En la parte inferior izquierda del elemento Dividir datos , arrastre una conexión a la parte superior derecha del elemento Entrenar modelo . La primera división del 70 % del conjunto de datos la usará el modelo de entrenamiento para entrenar el algoritmo.
Seleccione el elemento Entrenar modelo en el lienzo y, en el panel Propiedades (en el lado derecho de la ventana del explorador), haga clic en el botón Iniciar selector de columnas.
En el cuadro de texto, escriba product (Producto ) y presione Entrar, el producto se establecerá como una columna para entrenar predicciones. Después, haga clic en el tic de la esquina inferior derecha para cerrar el cuadro de diálogo de selección.
Va a entrenar un algoritmo de regresión logística multiclase para predecir el producto más vendido en función de la hora del día y la fecha. Está fuera del ámbito de este documento para explicar los detalles de los distintos algoritmos proporcionados por el Estudio de Azure Machine Learning, sin embargo, puede obtener más información en la hoja de referencia rápida de algoritmos de Machine Learning.
En el panel de elementos del experimento de la izquierda, expanda Machine Learning>Initialize Model Classification (Inicializar clasificación de modelos>) y arrastre el elemento Multiclass Logistic Regression (Regresión logística multiclase) al lienzo del experimento.
Conecte la salida, desde la parte inferior de la regresión logística multiclase, a la entrada superior izquierda del elemento Entrenar modelo .
En la lista de elementos de experimento del panel de la izquierda, expanda Puntuación de Machine Learning>y arrastre el elemento Score Model (Puntuar modelo) al lienzo.
Conecte la salida, desde la parte inferior del modelo de entrenamiento, a la entrada superior izquierda del modelo de puntuación.
Conecte la salida inferior derecha de Split Data (Dividir datos) a la entrada superior derecha del elemento Score Model (Puntuar modelo ).
En la lista de elementos Experiment del panel de la izquierda, expanda Machine Learning>Evaluate y arrastre el elemento Evaluate Model (Evaluar modelo) al lienzo.
Conecte la salida desde Score Model (Puntuar modelo ) a la entrada superior izquierda de Evaluate Model (Evaluar modelo).
Ha creado su primer experimento de Machine Learning. Ahora puede guardar y ejecutar el experimento. En el menú de la parte inferior de la página, haga clic en el botón Guardar para guardar el experimento y, a continuación, haga clic en Ejecutar para iniciar el experimento.
Puede ver el estado del experimento en la parte superior derecha del lienzo. Espere unos instantes a que finalice el experimento.
Si tiene un conjunto de datos grande (mundo real), es probable que el experimento tarde horas en ejecutarse.
Haga clic con el botón derecho en el elemento Evaluar modelo en el lienzo y, en el menú contextual, mantenga el mouse sobre Resultados de evaluación y, a continuación, seleccione Visualizar.
Los resultados de la evaluación se mostrarán mostrando los resultados previstos frente a los resultados reales. Esto usa el 30 % del conjunto de datos original, que se dividió anteriormente, para evaluar el modelo. Puede ver que los resultados no son excelentes, lo ideal sería que el número más alto de cada fila sea el elemento resaltado en las columnas.
Cierre los resultados.
Para usar el modelo de Machine Learning recién entrenado, debe exponerlo como un servicio web. Para ello, haga clic en el elemento de menú Configurar servicio web en el menú de la parte inferior de la página y haga clic en Servicio web predictivo.
Se creará una nueva pestaña y se combinará el modelo de entrenamiento para crear el nuevo servicio web.
En el menú de la parte inferior de la página, haga clic en Guardar y, a continuación, haga clic en Ejecutar. Verá el estado actualizado en la esquina superior derecha del lienzo del experimento.
Una vez que haya terminado de ejecutarse, aparecerá un botón Implementar servicio web en la parte inferior de la página. Está listo para implementar el servicio web. Haga clic en Implementar servicio web (clásico) en el menú de la parte inferior de la página.
Es posible que el explorador le pida que permita un elemento emergente, que debe permitir, aunque puede que tenga que presionar Implementar servicio web de nuevo, si la página de implementación no se muestra.
Una vez que se haya creado el experimento, se le redirigirá a una página panel donde se mostrará la clave de API. Cópielo en un bloc de notas por el momento, lo necesitará en el código muy pronto. Una vez que haya anotado la clave de API, haga clic en el botón SOLICITUD/RESPUESTA de la sección Punto de conexión predeterminado debajo de la clave.
Nota:
Si hace clic en Probar en esta página, podrá escribir datos de entrada y ver la salida. Escriba el día y la hora. Deje en blanco la entrada del producto . A continuación, haga clic en el botón Confirmar . La salida de la parte inferior de la página mostrará el JSON que representa la probabilidad de que cada producto sea la opción.
Se abrirá una nueva página web, en la que se mostrarán las instrucciones y algunos ejemplos sobre la estructura de solicitudes requerida por Machine Learning Studio (clásico). Copie el URI de solicitud que se muestra en esta página en el Bloc de notas.
Ahora ha creado un sistema de aprendizaje automático que proporciona el producto más probable que se va a vender en función de los datos históricos de compra, correlacionados con la hora del día y el día del año.
Para llamar al servicio web, necesitará la dirección URL del punto de conexión de servicio y una clave de API para el servicio. Haga clic en la pestaña Consumir , en el menú superior.
La página Información de consumo mostrará la información que necesitará para llamar al servicio web desde el código. Realice una copia de la clave principal y la dirección URL de solicitud-respuesta . Los necesitará en el siguiente capítulo.
Capítulo 5: Configuración del proyecto de Unity
Configure y pruebe los cascos envolventes de Mixed Reality.
Nota:
No necesitará controladores de movimiento para este curso. Si necesita soporte técnico para configurar los auriculares inmersivos, haga clic aquí.
Abra Unity y cree un proyecto de Unity denominado MR_MachineLearning. Asegúrese de que el tipo de proyecto esté establecido en 3D.
Con Unity abierto, vale la pena comprobar que el Editor de scripts predeterminado está establecido en Visual Studio. Vaya a Editar>preferencias y, a continuación, en la nueva ventana, vaya a Herramientas externas. Cambie el Editor de scripts externos a Visual Studio 2017. Cierre la ventana Preferencias.
A continuación, vaya a Configuración> de compilación de archivos y cambie la plataforma a Plataforma universal de Windows haciendo clic en el botón Cambiar plataforma.
Asegúrese también de que:
El dispositivo de destino se establece en Cualquier dispositivo.
Para Microsoft HoloLens, establezca Dispositivo de destino en HoloLens.
Tipo de compilación se establece en D3D.
El SDK se establece en Latest installed (Versión más reciente instalada).
La versión de Visual Studio se establece en Latest installed (Versión más reciente instalada).
Build and Run (Compilar y ejecutar ) está establecido en Equipo local.
No se preocupe por configurar Escenas en este momento, ya que se proporcionan más adelante.
La configuración restante debe dejarse como predeterminada por ahora.
En la ventana Configuración de compilación, haga clic en el botón Configuración del reproductor; se abrirá el panel relacionado en el espacio donde se encuentra el Inspector.
En este panel, es necesario comprobar algunos valores:
En la pestaña Otros valores :
La versión del entorno de ejecución de scripting debe ser experimental (equivalente a .NET 4.6)
El back-end de scripting debe ser .NET
El nivel de compatibilidad de API debe ser .NET 4.6
En la pestaña Configuración de publicación, en Funcionalidades, active:
InternetClient
Más abajo en el panel, en Configuración de XR (que se encuentra a continuación de Configuración de publicación), marque Virtual Reality Supported (Realidad virtual compatible), asegúrese de que se agrega el SDK de Windows Mixed Reality.
De nuevo en Configuración de compilación, los proyectos de Unity de C# ya no están atenuados; marque la casilla situada junto a esto.
Cierre la ventana Build Settings (Configuración de compilación).
Guarde el proyecto (ARCHIVO > GUARDAR PROYECTO).
Capítulo 6: Importación del paquete de Unity MLProducts
Para este curso, deberá descargar un paquete de recursos de Unity denominado Azure-MR-307.unitypackage. Este paquete viene completo con una escena, con todos los objetos de ese precompilado, por lo que puede centrarse en conseguir que todo funcione. El script de ShelfKeeper se proporciona, aunque solo contiene las variables públicas, con el fin de la estructura de configuración de la escena. Tendrá que hacer todas las demás secciones.
Para importar este paquete:
Con el panel de Unity delante de usted, haga clic en Activos en el menú de la parte superior de la pantalla y, a continuación, haga clic en Importar paquete, Paquete personalizado.
Use el selector de archivos para seleccionar el paquete Azure-MR-307.unitypackage y haga clic en Abrir.
Se mostrará una lista de componentes para este recurso. Para confirmar la importación, haga clic en Importar.
Una vez que haya terminado de importarse, observará que algunas carpetas nuevas han aparecido en el Panel de proyectos de Unity. Estos son los modelos 3D y los materiales respectivos que forman parte de la escena pre-hecha en la que trabajará. Escribirá la mayoría del código en este curso.
En la carpeta Panel de proyectos, haga clic en la carpeta Escenas y haga doble clic en la escena dentro (denominada MR_MachineLearningScene). Se abrirá la escena (consulte la imagen siguiente). Si faltan los diamantes rojos, simplemente haga clic en el botón Gizmos, en la parte superior derecha del Panel de juegos.
Capítulo 7: Comprobación de los archivos DLL en Unity
Para aprovechar el uso de bibliotecas JSON (que se usan para serializar y deserializar), se ha implementado un archivo DLL de Newtonsoft con el paquete que ha incluido. La biblioteca debe tener la configuración correcta, aunque vale la pena comprobar (especialmente si tiene problemas con el código que no funciona).
Para ello:
Haga clic con el botón izquierdo en el archivo Newtonsoft dentro de la carpeta Plugins y examine el panel Inspector. Asegúrese de que Cualquier plataforma esté marcada. Ve a la pestaña UWP y asegúrate de que no se marca el proceso .
Capítulo 8: Creación de la clase ShelfKeeper
La clase ShelfKeeper hospeda métodos que controlan la interfaz de usuario y los productos generados en la escena.
Como parte del paquete importado, se le habrá proporcionado esta clase, aunque está incompleta. Ahora es el momento de completar esa clase:
Haga doble clic en el script ShelfKeeper, en la carpeta Scripts, para abrirlo con Visual Studio 2017.
Reemplace todo el código existente en el script por el código siguiente, que establece la hora y la fecha y tiene un método para mostrar un producto.
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); } }
Asegúrese de guardar los cambios en Visual Studio antes de volver a Unity.
De nuevo en el Editor de Unity, compruebe que la clase ShelfKeeper tiene el siguiente aspecto:
Importante
Si el script no tiene los destinos de referencia (es decir, Date (Text Mesh)), basta con arrastrar los objetos correspondientes desde el Panel de jerarquía, a los campos de destino. Consulte a continuación para obtener una explicación, si es necesario:
Abra la matriz Spawn Point en el script del componente ShelfKeeper ; para ello, haga clic con el botón izquierdo. Aparecerá una subsección denominada Size, que indica el tamaño de la matriz. Escriba 3 en el cuadro de texto junto a Tamaño y presione Entrar y se crearán tres ranuras debajo.
Dentro de hierarchy expande el objeto Time Display (haciendo clic con el botón izquierdo en la flecha situada junto a él). A continuación, haga clic en la Cámara principal desde la jerarquía para que el Inspector muestre su información.
Seleccione la cámara principal en el panel jerarquía. Arrastre los objetos Date and Time del Panel de jerarquía hasta las ranuras Texto de fecha y hora dentro del Inspector de la cámara principal en el componente ShelfKeeper.
Arrastre los puntos de generar desde el Panel de jerarquía (debajo del objeto Shelf) hasta los destinos de referencia de 3 elementos situados debajo de la matriz Spawn Point, como se muestra en la imagen.
Capítulo 9: Creación de la clase ProductPrediction
La siguiente clase que va a crear es la clase ProductPrediction .
Esta clase es responsable de:
Consulta de la instancia de Machine Learning Service , que proporciona la fecha y hora actuales.
Deserialización de la respuesta JSON en datos utilizables.
Interpretar los datos, recuperar los 3 productos recomendados.
Llamar a los métodos de clase ShelfKeeper para mostrar los datos en la escena.
Para crear esta clase:
Vaya a la carpeta Scripts , en el Panel de proyectos.
Haga clic con el botón derecho en la carpeta Create C# Script (Crear>script de C#). Llame al script ProductPrediction.
Haga doble clic en el nuevo script ProductPrediction para abrirlo con Visual Studio 2017.
Si aparece el cuadro de diálogo Modificación de archivos detectado , haga clic en *Volver a cargar solución.
Agregue los siguientes espacios de nombres a la parte superior de la clase 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;
Dentro de la clase ProductPrediction , inserte los dos objetos siguientes que se componen de una serie de clases anidadas. Estas clases se usan para serializar y deserializar el JSON para Machine Learning Service.
/// <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; } }
A continuación, agregue las siguientes variables encima del código anterior (de modo que el código relacionado con JSON se encuentra en la parte inferior del script, debajo del resto de código y fuera del camino):
/// <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;
Importante
Asegúrese de insertar la clave principal y el punto de conexión de solicitud-respuesta, desde el Portal de Machine Learning, en las variables aquí. En las imágenes siguientes se muestra dónde se habría tomado la clave y el punto de conexión.
Inserte este código en el método Start(). Se llama al método Start() cuando la clase inicializa:
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)); }
A continuación se muestra el método que recopila la fecha y hora de Windows y la convierte en un formato que nuestro experimento de Machine Learning puede usar para comparar los datos almacenados en la tabla.
/// <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(); }
Puede eliminar el método Update(), ya que esta clase no la usará.
Agregue el siguiente método que comunicará la fecha y hora actuales al punto de conexión de Machine Learning y recibirá una respuesta en formato 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); } }
Agregue el siguiente método, que es responsable de deserializar la respuesta JSON y de comunicar el resultado de la deserialización a la clase ShelfKeeper . Este resultado será los nombres de los tres artículos previstos para vender el máximo en la fecha y hora actuales. Inserte el código siguiente en la clase ProductPrediction , debajo del método anterior.
/// <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(); }
Guarde Visual Studio y vuelva a Unity.
Arrastre el script de clase ProductPrediction desde la carpeta Script hasta el objeto Main Camera .
Guarde la escena y el proyecto Archivo>guardar escena/Archivo>Guardar proyecto.
Capítulo 10: Compilación de la solución para UWP
Ahora es el momento de compilar el proyecto como una solución para UWP, de modo que se pueda ejecutar como una aplicación independiente.
Para compilar:
Guarde la escena actual haciendo clic en Guardar escenas de archivo>.
Vaya a Configuración de compilación de archivos.>
Active la casilla denominada Proyectos de C# de Unity (esto es importante porque le permitirá editar las clases una vez completada la compilación).
Haga clic en Agregar escenas abiertas,
Haga clic en Generar.
Se le pedirá que seleccione la carpeta donde desea compilar la solución.
Cree una carpeta BUILDS y, dentro de esa carpeta, cree otra carpeta con el nombre adecuado de su elección.
Haga clic en la nueva carpeta y, a continuación, haga clic en Seleccionar carpeta para comenzar la compilación en esa ubicación.
Una vez que Unity haya terminado de compilar (puede tardar algún tiempo), se abrirá una ventana de Explorador de archivos en la ubicación de la compilación (compruebe la barra de tareas, ya que puede que no siempre aparezca encima de las ventanas, pero le notificará la adición de una nueva ventana).
Capítulo 11: Implementación de la aplicación
Para implementar la aplicación:
Vaya a la nueva compilación de Unity (la carpeta Aplicación ) y abra el archivo de solución con Visual Studio.
Con Visual Studio abierto, debe restaurar paquetes NuGet, que se pueden realizar haciendo clic con el botón derecho en la solución de MachineLearningLab_Build, desde el Explorador de soluciones (que se encuentra a la derecha de Visual Studio) y, a continuación, haciendo clic en Restaurar paquetes NuGet:
En Configuración de la solución, seleccione Depurar.
En la Plataforma de soluciones, seleccione x86, Máquina local.
Para Microsoft HoloLens, es posible que le resulte más fácil establecerlo en Máquina remota, de modo que no esté anclado a su equipo. Sin embargo, también tendrá que hacer lo siguiente:
- Conoce la dirección IP de tu HoloLens, que se puede encontrar en las opciones avanzadas de Red de configuración > e Internet > Wi-Fi>; IPv4 es la dirección que debes usar.
- Asegúrese de que el modo de desarrollador está activado; se encuentra en Configuración > actualización y seguridad > para desarrolladores.
Vaya al menú Compilar y haga clic en Implementar solución para transferir localmente la aplicación al equipo.
La aplicación debería aparecer ahora en la lista de aplicaciones instaladas, lista para iniciarse.
Al ejecutar la aplicación mixed Reality, verá el banco que se configuró en la escena de Unity y, desde la inicialización, se capturarán los datos que configuró en Azure. Los datos se deserializarán dentro de la aplicación y los tres resultados principales de la fecha y hora actuales se proporcionarán visualmente, como tres modelos en el banco.
La aplicación de Machine Learning finalizada
Enhorabuena, ha creado una aplicación de realidad mixta que aprovecha Azure Machine Learning para realizar predicciones de datos y mostrarla en la escena.
Ejercicio
Ejercicio 1
Experimente con el criterio de ordenación de la aplicación y haga que las tres predicciones inferiores aparezcan en el estante, ya que estos datos podrían ser útiles también.
Ejercicio 2
El uso de tablas de Azure rellena una nueva tabla con información meteorológica y crea un nuevo experimento mediante los datos.