ENG [#VS2015] Hello Face: #FaceAPIs in a Console App (2)

Hello!

New post for Azure Machine Learning Face APIs series

  1. Face APIs in Azure
  2. Hello Face: Face APIs in a Console App

After the setup of our Azure environment, we now can use Face APIs. Next step is to download the SDK and take a look at the examples. At this time the SDK contains examples for both, .Net and Android. Within the .Net sample there is a WPF app which consumes a PCL which is responsible for making the calls to the Machine Learning Face API services.

Clipboard03

The good thing about this model is that the PCL is easily portable to other projects. The following steps show how consume Face API services in a console app, using the PCL included in the SDK.

1. Add a new console application in the solution

2. Add a reference to ClientLibrary

3. Then in the Main we need to define a variable with our subscription key, and for this example we will open a local image to be processed

4. The following function displays the steps necessary for processing an image

Clipboard05

5. And the result is similar to the following one

Clipboard07

6 That’s it !

As always, can always download the complete sample from GitHub https://github.com/elbruno/ProjectOxford

Greetings @ Home

/El Bruno

Face APIs SDK, http://www.projectoxford.ai/sdk

[#AZURE] Hello Face: #FaceAPIs en una Console App (2)

Hola!

Nuevo post para la serie de Face Api en Azure

  1. Face APIs en Azure
  2. Hello Face: Face APIs en una Console App

Una vez configurado nuestro entorno de Azure para poder consumir Face APIs, lo siguiente es descargar el SDK y darle un vistazo a los ejemplos del mismo. En este momento el SDK contiene ejemplos para .Net y Android. Dentro del ejemplo para .Net hay una app WPF de ejemplo que consume un PCL que es el encargado de hacer las llamadas a los servicios de Machine Learning de Face API.

Clipboard03

Lo bueno de este modelo, es que el PCL es fácilmente portable a otro tipo de proyectos. Los siguientes pasos muestran como consumir los servicios de Face API en una app de Consola, utilizando el PCL del SDK.

1. Agregar una nueva aplicación de consola a la solucíón

2. Agregar una referencia a ClientLibrary

3. Luego en el Main debemos definir una variable con nuestra subscription key, y para este ejemplo abriremos una imagen local para procesarla

4. La siguiente función muestra los pasos necesarios para procesar una imagen

Clipboard05

5. El resultado es similar al siguiente

Clipboard07

6. Listo !!!

Y el ejemplo, como siempre se puede bajar desde GitHub https://github.com/elbruno/ProjectOxford

Saludos @ Home

/El Bruno

Face APIs SDK, http://www.projectoxford.ai/sdk

ENG [#IOT] Different behaviors for an App based on the app architecture (9 on N) #RaspberryPi2 #Windows10

Hello!

New post for Windows 10 and Raspberry Pi 2 series

  1. Hardware and software (1 on N)
  2. Boot from SD card in the device (2 of N)
  3. Hello World mode! (3 of N)
  4. Visual Studio deployment process and Web Management app (4 on N)
  5. Hello Blinky !!! (5 on N)
  6. Some admin tasks, like change password and change name (6 on N)
  7. List of connected devices in the Raspberry Pi 2 (7 on N)
  8. Deploy an app using the deploy package (8 on N)
  9. Different behaviors for an App based on the app architecture

If you’re an old school developer when you find a change one of the oldest APIs, for sure you’ll suffer a heart attack. That’s what happened with the classical System.Environment. The following image shows the difference that we have between a classic WPF app with .net 4.5 and a Universal App for Windows 10.

Clipboard07

Now a Universal App will execute in a controlled environment (Sandbox), whether on a laptop, a smartphone or a device. This implies that the app capabilities are tied to this Sandbox. For example, what formerly used to get from the Environment, now perhaps we must look for it in the Package of the application. The architecture of the processor is an example, and the following code shows an example to validate if the app is running on an ARM processor.

Clipboard10

While the idea behind Universal Apps is to have the maximum code unified for all platforms, should take into account the capabilities of each platform. For example, in ARM we don’t have the possibility to use MessageDialogs so if we want to show a message we have to do a bit of defensive programming .

Clipboard12

This allows us to display a message in the mode dialog on a laptop or tablet

Clipboard14

And for the case of ARM, the message in a TextBlock as part of the app.

Clipboard01

The sample code on github

https://github.com/elbruno/W10Rpi2/tree/master/SystemInfoV02

Saludos @ Madrid

/El Bruno

References

Environment.Is64BitProcess, https://msdn.microsoft.com/en-us/library/system.environment.is64bitprocess(VS.100).aspx

MessageDialog, https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.popups.messagedialog.aspx

[#IOT] Diferentes comportamientos en base arquitectura de la app (9 de N) #RaspberryPi2 y #Windows10

Hola !

Nuevo post para la serie de Windows 10 y Raspberry Pi 2

  1. Hardware y software (1 de N)
  2. Montando la SD en el device (2 de N)
  3. Ahora si el Hello World ! (3 de N)
  4. Sobre el proceso de despliegue desde VS y Web Management app (4 de N)
  5. Hello Blinky !!! (5 de N)
  6. Acciones de administrador, cambiar password, cambiar nombre, etc (6 de N)
  7. Accediendo a los devices conectados (7 de N)
  8. Desplegando una app desde un paquete (8 de N)
  9. Diferentes comportamientos en base arquitectura de la app

Si eres un developer de vieja escuela, cuando te cambian una de las APIs más antiguas te puede dar un infarto. Eso es lo que ha pasado con la clásica System.Environment. La siguiente imagen muestra la diferencia que tenemos entre una app clásica WPF con .Net 4.5 y una Universal App para Windows 10.

Clipboard07

Ahora bien, una Universal App se ejecuta en un entorno controlado (sandbox), ya sea en un laptop, un smartphone o un device. Esto implica que las capacidades de la app están atadas a este Sandbox. Por ejemplo, lo que antes solíamos obtener desde el Environment, ahora tal vez debemos buscarlo en el Package de la Aplicación. La arquitectura del procesador es un ejemplo, y el siguiente código muestra un ejemplo para validar si la app se está ejecutando en un procesador ARM.

Clipboard10

Si bien la idea detrás de las Universal Apps es tener el máximo código unificado para todas las plataformas, hay que tener en cuenta las capacidades de cada plataforma. Por ejemplo, en ARM no tenemos la posibilidad de mostrar MessageDialogs así que si queremos mostrar información tenemos que hacer un poco de programación defensiva.

Clipboard12

Esto nos permite mostrar un mensaje en modo diálogo en una laptop o tablet

Clipboard14

Y para el caso de ARM, el mensaje en un TextBlock como parte de la app.

Clipboard01

El código de ejemplo en github

https://github.com/elbruno/W10Rpi2/tree/master/SystemInfoV02

Saludos @ Madrid

/El Bruno

References

Environment.Is64BitProcess, https://msdn.microsoft.com/en-us/library/system.environment.is64bitprocess(VS.100).aspx

MessageDialog, https://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.popups.messagedialog.aspx

ENG [#IOT] #RaspberryPi2 and #Windows10, List of connected devices to the Raspberry Pi 2 (7 on N)

Hello!

New post for Windows 10 and Raspberry Pi 2 series

  1. Hardware and software (1 on N)
  2. Boot from SD card in the device (2 of N)
  3. Hello World mode! (3 of N)
  4. Visual Studio deployment process and Web Management app (4 on N)
  5. Hello Blinky !!! (5 on N)
  6. Some admin tasks, like change password and change name (6 on N)
  7. List of connected devices in the Raspberry Pi 2 (7 on N)
  8. Deploy an app using the deploy package (8 on N)

Today we will use a little class DeviceInformation which was quite improved in Windows 8.1 to list all the devices connected to our Raspbery PI.

The example is quite simple, just an async call to DeviceInformation.FindAllAsync(), a some LINQ to eliminate duplicates

Clipboard02

The output we have is something similar to this one

  1. Generic SU32G SD Card
    1. {-\\?\STORAGE#Volume#{06b09fe3-ebbb-11e4-8d8e-806e6f6e6963}#0000000004800000#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b id}
  2. MINWINPC
    1. {-\\?\ACPI#A_-_ARM_Family_7_Model_C07_Revision___5#1#{dbe4373d-3c81-40cb-ace4-e0e5d05f0c9f id}
  3. Generic USB Hub
    1. -Id \\?\USB#VID_0424 & PID_EC00 #5 & 3753427a & 0 & 1 #{a5dcbf10-6530-11d2-901f-00c04fb951ed}
  4. Generic Non-PnP Monitor
    1. -Id \\?\DISPLAY#Default_Monitor#1 & 8713bca & 0 & UID0 #{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
  5. Microsoft GS Wavetable Synth
    1. {-Id \\?\SWD#MMDEVAPI#MicrosoftGSWavetableSynth#{6dc23320-ab33-4ce4-80d4-bbb3ebbf2814}
  6. Microsoft USB Optical Mouse
    1. -Id \\?\USB#VID_045E & PID_0737 #5 & 3753427a & 0 & 5 #{a5dcbf10-6530-11d2-901f-00c04fb951ed}

In addition to the name property, it is important to take take a look at the ID property, which shows the full path to access the device. For example, in the list, the 6th item is the mouse, and we can infer the values of Vendor Id and Product Id very easily

  • ID:VID_045E&PID_0737\\?\USB# #5 & 3753427a & 0 & 5 #{a5dcbf10-6530-11d2-901f-00c04fb951ed}
  • Vendor Id = 045E
  • Product Id = us

Which are always useful when working with connected devices.

Just as a curiosity, this is part of the output of the same app run in local mode on my laptop. This Universal apps is liking me 😉

Clipboard04

As always the code on GitHub that can be downloaded from here.

Saludos @ Home

/El Bruno

MSDN Device Information, https://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.devices.enumeration.deviceinformation.aspx

[#IOT] #RaspberryPi2 y #Windows10, Accediendo a los devices conectados (7 de N)

Hola !

Nuevo post para la serie de Windows 10 y Raspberry Pi 2

  1. Hardware y software (1 de N)
  2. Montando la SD en el device (2 de N)
  3. Ahora si el Hello World ! (3 de N)
  4. Sobre el proceso de despliegue desde VS y Web Management app (4 de N)
  5. Hello Blinky !!! (5 de N)
  6. Acciones de administrador, cambiar password, cambiar nombre, etc (6 de N)
  7. Accediendo a los devices conectados (7 de N)
  8. Desplegando una app desde un paquete (8 de N)

Hoy vamos a utilizar un poco la clase DeviceInformation que fue bastante mejorada en Windows 8.1 para listar todos los devices conectados a nuestra Raspbery PI.

El ejemplo es bastante sencillo, solo llamar a DeviceInformation.FindAllAsync(), un poco de linq para eliminar los duplicados y listo

Clipboard02

El output que tenemos es el siguiente

  1. Generic SU32G SD Card 
    1. – Id \\?\STORAGE#Volume#{06b09fe3-ebbb-11e4-8d8e-806e6f6e6963}#0000000004800000#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}
  2. MINWINPC
    1. – Id \\?\ACPI#A_-_ARM_Family_7_Model_C07_Revision___5#1#{dbe4373d-3c81-40cb-ace4-e0e5d05f0c9f}
  3. Generic USB Hub
    1. – Id \\?\USB#VID_0424&PID_EC00#5&3753427a&0&1#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
  4. Generic Non-PnP Monitor
    1. – Id \\?\DISPLAY#Default_Monitor#1&8713bca&0&UID0#{e6f07b5f-ee97-4a90-b076-33f57bf4eaa7}
  5. Microsoft GS Wavetable Synth
    1. – Id \\?\SWD#MMDEVAPI#MicrosoftGSWavetableSynth#{6dc23320-ab33-4ce4-80d4-bbb3ebbf2814}
  6. Microsoft USB Optical Mouse
    1. – Id \\?\USB#VID_045E&PID_0737#5&3753427a&0&5#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

Además del nombre es importante tener en cuenta la propiedad ID que es la que nos muestra el path completo de acceso al device. Por ejemplo, si analizamos el 6to elemento correspondiente al mouse podemos inferir los valores de Vendor Id y Product Id

  • ID: \\?\USB#VID_045E&PID_0737#5&3753427a&0&5#{a5dcbf10-6530-11d2-901f-00c04fb951ed}
  • Vendor Id = 045E
  • Product Id = 0737

Que siempre son útiles cuando trabajamos con dispositivos conectados.

Solo como curiosidad, este es parte del output de la misma app ejecutada en modo local en mi laptop. Esto de las Universal Apps me está gustando 😉

Clipboard04

Como siempre el código en GitHub que se puede descargar desde aquí.

Saludos @ Home

/El Bruno

MSDN Device Information, https://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.devices.enumeration.deviceinformation.aspx

[#IOT] #RaspberryPi2 y #Windows10, Hola Blinky !!! (5 de N)

Hola !

Nuevo post para la serie de Windows 10 y Raspberry Pi 2

  1. Hardware y software (1 de N)
  2. Montando la SD en el device (2 de N)
  3. Ahora si el Hello World ! (3 de N)
  4. Sobre el proceso de despliegue desde VS y Web Management app (4 de N)
  5. Hello Blinky !!! (5 de N)
  6. Acciones de administrador, cambiar password, cambiar nombre, etc (6 de N)
  7. Accediendo a los devices conectados (7 de N)
  8. Desplegando una app desde un paquete (8 de N)

Después del último post queda pendiente ver un poco más en profundidad lo que podemos hacer con Windows IoT Core y un device, si queremos interactuar con algunos sensores en modo digital.

En el post de hoy mostraré lo que se conoce como el hola mundo en el mundo de makers: hacer que un led parpadee en un device. Para esta demo, estoy utilizando el Grove Raspberry Pi Starter Kit que me permite prototipar de forma rápida estos escenarios. En este ejemplo me basaré en uno de los que trae el Starter Kit utilizando un LED en el pin 4.

Clipboard04

En el post anterior expliqué como crear una Universal App, en este caso seguimos los siguientes pasos con la salvedad de que en el MainForm agregaremos un timer con el siguiente código.

Clipboard03

En cada tick del timer cambiaremos el estado del LED en el Pin 4 de ON a OFF, luego ON, etc. Para poder comenzar la interacción con los Pins digitales del device, necesitamos agregar una referencia en nuestro proyecto a Windows IoT Extension SDK

Clipboard01

Una vez agregada la referencia podemos agregar el código necesario para interactuar con el LED, el mismo queda similar al siguiente

Clipboard05

Ahora ya podemos desplegar la app en nuestra Raspberry Pi. Recuerda lo importante que es cambiar la plataforma a ARM, en lugar de X86

Clipboard03

Luego de unos segundos la app ya está en ejecución,  ver como el led comienza su parpadeo

El código fuente de esta solución está disponible en Github

https://github.com/elbruno/W10Rpi2.git

Saludos @ Madrid

/El Bruno

References

Grove Raspberry PI StarterKit, http://www.seeedstudio.com/depot/GrovePi-Starter-Kit-for-Raspberry-Pi-p-2240.html?cPath=122_154_151

[#IOT] #Windows10 y #RaspberryPi2, ahora si el Hello World ! (3 de N)

Hola !

Nuevo post para la serie de Windows 10 y Raspberry Pi 2

  1. Hardware y software (1 de N)
  2. Montando la SD en el device (2 de N)
  3. Ahora si el Hello World ! (3 de N)
  4. Sobre el proceso de despliegue desde VS y Web Management app (4 de N)
  5. Hello Blinky !!! (5 de N)
  6. Acciones de administrador, cambiar password, cambiar nombre, etc (6 de N)
  7. Accediendo a los devices conectados (7 de N)
  8. Desplegando una app desde un paquete (8 de N)

Hoy toca un poco de código con Visual Studio 2015 RC. Lo primero que haremos es crear un proyecto del tipo Windows Universal Blank App. Si no ves este tipo de proyectos en Visual Studio, tienes que ir a “Programs and Features” y cambiar las opciones de instalación de Visual Studio 2015 RC. La opción que debes seleccionar es “Universal Windows App Development Tools

Clipboard01

Ahora si, de vuelta a Visual Studio y a crear un nuevo proyecto con los siguientes pasos

1. Menu “File // New Project

2. Seleccionar “Templates // Visual C# // Windows // Windows Universal // Blank App

3. Como nombre vamos a innovar con un “HelloValentino”

Clipboard02

4. La app que crearemos será muy simple: al presionar un botón aparecerá un mensaje de welcome. Para esto agregaremos un botón en el XAML y su correspondiente controlador en el CS. El código de ambos es similar al siguiente

5. Esta app no tiene porque fallar, así que obviaremos ejecutarla en local 😉

Una vez que la Universal App funciona correctamente, ya podemos desplegarla a la Raspberry Pi con Windows 10. Si bien hay varias opciones para hacer esta acción, hoy optaremos por hacerlo desde Visual Studio 2015 RC.

6. Primero debemos verificar que la Raspberry PI 2 está online dentro de la red. En el post pasado expliqué que Windows IoT Core Watcher nos muestra los devices cuando los mismos están en nuestra red

Clipboard05

7. Mi RPI tiene el nombre por defecto que se crea con la imagen “minwinpc”. Este nombre o la IP es lo que utilizaremos en VS para desplegar la app en el device.

8. En las propiedades del proyecto, en la sección “Debug” cambiamos las opciones de inicio para que se despliegue y depure en modo remoto. En la sección Remote Machine pondremos el nombre o IP del device

Clipboard02

Importante: Si bien por defecto el proyecto está en modo DEBUG / X86, hay que cambiar la plataforma para que sea ARM para que funcione correctamente en el device.

9. Ahora volvemos al querido F5 y veremos como se despliega la app en la Raspberry PI 2.

10. En la RPI he conectado un mouse, así que puedo probar la app de una forma bastante rápida. Nada mejor que un video para mostrar esto.

Y, detalle importante, al solicitar la fecha y hora, vemos que la configuración regional del device está por defecto en USA 😉

IMG_20150508_133301

Pues bien, en el próximo post veremos un poco que hay detrás del proceso de publicación 😉

Saludos @ Home

/El Bruno

[#KINECTSDK] Beware of the array of bodies, not all bodies are tracked by defaultK in #KinectV2

Hello!

When you work with apps on Kinect that require a special code for each body recognized by the sensor, the entry point tends to be the collection of bodies returning to us in the line 15 of the first block in the following code example

The problem with these lines is the collection of bodies it is usually complete by 6 elements, however there are no 6 people in front of the Kinect. The following image shows the collection and at the same, the 6th element is a correct body, but with the property IsTracked = False .

KV2NotTrackedBdies

The solution is quite simple, a small array preprocessing, filtering by the bodies that are correctly identified. In line 16 of the second block of code we obtain the total number of bodies where IsTracked == True and from there to be processed.

Happy Codding

Greetings @ Home

/El Bruno

[#KINECTSDK] Cuidado con el array de bodies, no todos son “bodies” en #KinectV2

Hola!

Cuando trabajas con apps en Kinect que requieran un tratado especial para cada una de las personas que reconoce el sensor, el punto de entrada suele ser la colección de bodies que nos retorna la línea 15 en el primer bloque de código del ejemplo

El problema con estas líneas es que la colección de bodies suele estar completa por 6 elementos, sin embargo no hay 6 personas frente al Kinect. La siguiente imagen nos muestra la colección y como en la misma, el 6to elemento es un body correcto, pero con la propiedad IsTracked = False.

KV2NotTrackedBdies

La solución es bastante simple, un pequeño preproceso del array, filtrando por los bodies que esten correctamente identificados. En la línea 16 del segundo bloque de código de ejemplo, obtenemos el total de bodies en donde IsTracked == True y a partir de allí a procesar.

Happy Codding

Saludos @ Home

/El Bruno