Reconocimiento de imagenes para Raspberry Pi


La famosa librería TensorFlow fue originalmente desarrollada por investigadores e ingenieros que trabajan  dentro de la organización de investigación de la máquina de Inteligencia de Google estando el sistema  diseñado para facilitar la investigación en el aprendizaje de máquina, y para que sea rápido y fácil de transición del prototipo de investigación al sistema de producción.

Aunque se piense que es una librería consolida (la ultima versión es la 10,Release 0)  , TensorFlow no está completa, pues está construida  pensando en ser  mejorada, y extendida. El equipo de desarrollo ha hecho una versión inicial del código fuente, y en la actualidad están haciendo esfuerzos internos de desarrollo a utilizar un repositorio público de los cambios del día a día realizados por el equipo en Google. Esperan construir una comunidad de código abierto activa que impulse el futuro de esta biblioteca, proveyendo de retroalimentación y contribuyendo activamente al código fuente.

 

Nuestro cerebro hacen que la visión parecen fácil pues no se necesita ningún esfuerzo para el ser humano de distinguir un león y un jaguar, leer una señal, o reconocer el rostro de un ser humano. Pero estos son en realidad problemas difíciles de resolver con un ordenador: sólo parece fácil porque nuestros cerebros son muy buenos en la comprensión de las imágenes.

En los últimos años el campo de aprendizaje de la máquina ha hecho enormes progresos en hacer frente a estos problemas difíciles. En particular, hemos encontrado que una especie de modelo  llamado convolutional neural network  puede lograr un rendimiento razonable en las tareas de reconocimiento visual duros igualando o superar el rendimiento humano en algunos dominios.

Los investigadores han demostrado un progreso constante en la visión por ordenador mediante la validación de su trabajo contra IMAGEnet ( un punto de referencia académica para la visión por ordenador). Modelos sucesivos siguen mostrando mejoras, y cada vez que ese consigue un  logro,el  resultado nuevo mejora el estado de la técnica: QuocNet , AlexNet , Inception (GoogLeNet) , BN-Inception-v2 . Los investigadores tanto internos como externos a Google han publicado artículos que describen todos estos modelos, pero los resultados son todavía difíciles de reproducir .En este momento se esta  dando el siguiente paso mediante la liberación de código para ejecutar el reconocimiento de imágenes en nuestro último modelo, Inception-v3 .

Inception-v3 está capacitado para el IMAGEnet grande Reconocimiento Visual Challenge utilizando los datos de 2012. Se trata de una tarea estándar en la visión por ordenador, donde los modelos tratan de clasificar las imágenes completas en 1000 clases , al igual que la «cebra», «dálmata», y «lavavajillas «. Por ejemplo, aquí están los resultados de AlexNet la clasificación de algunas imágenes:

 

Para comparar los modelos, examinamos la frecuencia con que el modelo no puede predecir la respuesta correcta como uno de sus 5 mejores conjeturas mediante el denominado «top-5 índice de error» . AlexNet ha logrado mediante el establecimiento de un top 5 , llegar  a una tasa de error del 15,3% en un dataset de validaciones de  2012 . BN-Inception-v2 alcanzan el 6,66% y  Inception-v3 alcanza el 3,46%.Karpathy intentó medir su propio rendimiento y  alcanzó el top-5 tasa de error de 5,1%.

Ahora vamos a ver  un ejemplo  en Python  para cómo utilizar Inception-v3 para  cómo clasificar las imágenes en 1000 clases en Python o C ++ . También es interesante saber cómo extraer características de nivel superior de este modelo que pueden ser reutilizado para otras tareas de visión.

 

Descargue el modelo  classify_image.py  de tensorflow.org cuando el programa se ejecute por primera vez. Usted necesitará unos 200 Mbs de espacio libre disponible en el disco duro.

Las siguientes instrucciones puede ejecutarla  suponiendo  que ha instalado TensorFlow de un paquete PIP y que su terminal reside en el directorio raíz TensorFlow.

cd tensorflow/models/image/imagenet python classify_image.py

El comando anterior clasificar una imagen suministrada de un oso panda.

Si el modelo se ejecuta correctamente, la secuencia de comandos producirá el siguiente resultado:

giant panda, panda, panda bear, coon bear, Ailuropoda melanoleuca (score = 0.88493) indri, indris, Indri indri, Indri brevicaudatus (score = 0.00878) lesser panda, red panda, panda, bear cat, cat bear, Ailurus fulgens (score = 0.00317) custard apple (score = 0.00149) earthstar (score = 0.00127)

Si desea suministrar otras imágenes JPEG, puede hacerlo editando el  argumento  –image_file.

Si descarga los datos del modelo en un directorio diferente, tendrá que señalar –model_dir al directorio utilizado.

 

Como ejemplo de uso  se  puede  utilizar  una combinación de OpenCV junto con la librería TensorFlow de Google para utilizar redes de neuronas en Google Cloud para entrenar un modelo de clasificación en la nube.

El japones  Kazunori Sato  ha intentado clasificar verdura ( pepinos )   con el uso de esta  librería implementada  en una Raspberry Pi junto a una webcam para analizar visualmente cada  pieza de verdura  y poder clasificarlos  por tamaños  de una manera eficiente.

Mediante una pequeña máquina casera que han diseñado, a la que  han añadido varios  servos(para expulsar las  muestra clasificadas)  junto a  una cinta transportadora  para transportar las muestras ,  todos controlados  por la raspberry pi  consiguen una eficiencia teórica de más de 95% de acierto,   si bien como se puede ver en el ejemplo, el funcionamiento es algo lento.

En el siguiente video puede ver pues una aplicación practica de uso de esta librería:

 

 

 

 

Para obtener información sobre las redes neuronales en general, de Michael Nielsen su libro online gratis es un excelente recurso. Para las redes neuronales convolucionales, en particular, Chris Olah tiene algunas buenas entradas de blog , y el libro de Michael Nielsen tiene un gran capítulo que forman parte. Para obtener más información sobre la aplicación de redes neuronales convolucionales, puede saltar a la TensorFlow redes convolucionales profunda tutorial , o empezar un poco más suavemente con nuestra principiante ML o expertos ML tutoriales MNIST de arranque. Por último, si desea ponerse al día sobre la investigación en esta área, se puede leer la obra reciente de todos los documentos referenciados en este tutorial.» Michael Nielsen es un excelente recurso. Para las redes neuronales convolucionales, en particular, Chris Olah tiene algunas buenas entradas de blog , y el libro de Michael Nielsen tiene un gran capítulo sobre estas.

Para obtener más información sobre la aplicación de redes neuronales convolucionales, puede mirar el tutorial de TensorFlow sobre  redes convolucionales  o empezar un poco más suavemente con  ML 

 

Proyecto en c# para Raspberry pi


 

En efecto , aunque hemos hablado en muchísimas ocasiones de múltiples ejemplos en c# usando la plataforma Netduino  es poco frecuente ver aun ejemplos que usen la plataforma de desatollo de Microsoft de IoT  en otros entornos.

Precisamente  en el siguinte  ejemplo  de como implementar  una estación  meteorológica  en una Raspberry Pi , se demuestra cómo aprovechar la potencia de Windows 10 IO Core, y crear una estación meteorológica con  un escudo de Sparkfun(Sparkfun DEV-12081)  en una Raspberry pi que corre Windows 10 (puede ser la versión  2 o también la  3).

Este proyecto forma parte de la iniciativa de Microsoft llamada  Hack the Home , que proporciona componentes de código abierto para minimizar  el esfuerzo en la creación de  interfazes con los dispositivos y servicios a  usar para enfrentarse a sus hogares.

Antes de describir   como lo han hecho en el vídeo podemos ver  una introducción a la plataforma de windows IoT;

 

El nuevo espacio de nombres Windows.Devices de las API de Windows Plataforma universal (UWP) en Windows 10, permite a los desarrolladores aprovechar la potencia de Windows  en la interacción con el mundo real a través de sensores y actuadores utilizando el bus I2C y los puertos de uso general de entrada / salida (GPIO) disponibles en el Raspberry Pi 2, para crear una estación meteorológica conectada a Internet utilizando la protección contra la intemperie Sparkfun.

Las instrucciones proporcionadas darán un desarrollador de primera mano la configuración del hardware requerida junto con la escritura y depuración de Windows recientemente disponible en  windows 10 llamada UWP Windows.Devices API’s.

En este ejemplo,  también se demostrará cómo agregar sus datos en la nube utilizando el Azure Event Hub y  ConnectTheDots API.

Para  empezar , lo primero es conexionar   los  pines desde la Raspberry Pi 2 a la placa Sparkfun(Sparkfun DEV-12081)

Este es el conector de la Raspberry Pi 2:

GPIO esquemática (pata 1 está marcada con una almohadilla de soldadura cuadrada)

El diagrama de conexiones de  la Raspberry Pi  hacia la placa de Sparkfun   es el siguiente:

  •  GND (negro) —— GND
  • 5V (rojo) ——— VIN
  • 3V3 ——- (marrón) —— 5V (escudo truco; no es un error)
  • GPIO2 —– (amarillo) —- SDA
  • GPIO3 —- (naranja) —- SCL
  • GPIO5 —– (verde) —– D8
  • GPIO6 —– (azul) ——- D7

Cableado de cerca del carril exterior (negro, rojo)

 

Con la placa Weather Shield es muy fácil de hacer funcionar con Arduino  ofreciendo  de por sí la presión barométrica, humedad relativa, luminosidad y temperatura. También hay conexiones para sensores opcionales tales como la velocidad del viento, dirección, pluviómetro y GPS para la ubicación.

Utiliza el sensor de humedad HTU21D, de presión barométrica MPL3115A2, un sensor de luz ALS-PT19 y se basa en la librería HTU21D y MPL3115A2 para Arduino. Dispone de dos posiciones para soldar conectores RJ11 (para sensores opcionales de lluvia y viento) y un conector GPS de 6 pines (para conectar un GPS opcional). Puede funcionar desde 3.3V hasta 16V y tiene un regulador de voltaje integrado.

 

En cuanto al sw de  la estación meteorológica  en realidad se compone de  dos aplicaciones:

  • La primera es una bucle largo por tiempo indefinido, que trabaja  de fondo leyendo el estado de los sensores y actúando como un servidor de estación meteorológica.
  • La segunda, una interfaz de usuario que realiza una solicitud al puerto 50001 del servidor mostrando los datos. La aplicación de interfaz de usuario es universal y se puede implementar en cualquier dispositivo Windows desde el Raspberry Pi 2 hasta el final a un PC de escritorio – y en cualquier lugar en el medio!

Es necesario encontrar la siguiente línea en el archivo `Mainpage.xaml.cs` del proyecto` build2015-tiempo-station`, y vuelva a colocar el nombre del equipo, «MINWINPC», en la dirección URL con el nombre de su dispositivo IO.

//TODO: On the following line, replace "minwinpc" with the computer name of your IoT device (ie "http:// :50001").

private Uri weatherUri = new Uri("http://minwinpc:50001");

 

1-Seleccione la rama «lab_ConnectTheDots», si desea aprender a utilizar connectthedots y completar el código manualmente

2-Abrir «WeatherStation \ WeatherStation.sln» en Visual Studio 2015

3-Vaya a «WeatherStationTask.cs» en el panel «Explorador de soluciones»

4-Utilice la «Lista de tareas» para saltar a cada «TODO //:» y escribir el código necesario

Los archivos AppSettings, ConnectTheDotsSensor, y ConnectTheDotsHelper son parte del código creado para ayudarle a utilizar la interfaz connectthedots al Hub Evento Azure.

AppSettings: Guarda los ajustes para la conexión al hub de eventos

Esta información se puede encontrar bajo su ServiceBus en Azure.

5-Vaya a su «* ns» instancia ServiceBus -> Evento Ejes -> ehdevices -> Información de conexión -> Busca el SAS «D1»

6-Copiar la cadena de conexión que debe tener este aspecto (Contiene información para sus AppSettings)

"Endpoint=sb://iotbuildlab-ns.servicebus.windows.net/;SharedAccessKeyName=D1;SharedAccessKey=iQFNbyWTYRBwypMtPmpfJVz+NBgR32YHrQC0ZSvId20="

  • servicio de espacio de nombres de autobús (Ej: «iotbuildlab-ns»)
  • nombre del evento cubo (Ej: «ehdevices» – siempre usar esto)
  • nombre de la clave (Ej: «D1»)
  • clave (Ej: «iQFNbyWTYRBwypMtPmpfJVz + NBgR32YHrQC0ZSvId20 =»)
  • nombre de visualización (Ej: «WeatherStation1» – Esto le da un nombre a los datos del dispositivo)
  • organización (Ej: «Construir la IO Lab» – Cambio de personalizar)
  • ubicación (Ej: «EE.UU.» – Cambio de personalizar)

ConnectTheDotsSensor: Contiene la información de un sensor

  • GUID
  • mostrar nombre
  • organización
  • ubicación
  • nombre de la medida
  • unidad de medida
  • hora de creación
  • valor

ConnectTheDotsHelper: Las funciones auxiliares para inicializar el Hub de eventos

  • establece la conexión
  • crea los tokens de autenticación

Si desea iniciar su propio concentrador de sucesos de servicios de fondo, siga las instrucciones del connectthedots GitHub repositorio:https://github.com/msopentech/connectthedots/blob/master/Azure/AzurePrep/AzurePrep.md

.

7-Una vez que haya que desplegado, debe iniciar el envío de datos al cubo evento y los datos debe ser visible en http://iotbuildlab.azurewebsites.net/ o en su propio sitio web.

 

Fuente  aqui