Cómo hacer una clasificación en tiempo real con CNN

Simplemente con cualquier problema en Inteligencia Artificial, primero tenemos que formular nuestro problema. Concretamente, determinemos los objetos específicos que queremos detectar y clasificar. Digamos que estamos interesados ​​en solo 10 objetos: avión, automóvil, pájaro, gato, venado, perro, rana, caballo, barco y camión.

Ahora que tenemos una lista de objetos, necesitamos decidir la cantidad de objetos que queremos detectar y clasificar en una sola imagen. Por ejemplo, todas nuestras imágenes podrían tener un solo objeto, dos objetos o incluso un número variable de objetos. Es decir, tenemos que preguntarnos, ¿el número de objetos en nuestras imágenes será fijo o variable? Supongamos que todas nuestras imágenes tendrán un solo objeto.

Ahora aquí está nuestro problema de juguete bien definido: dada una imagen, encuentre el objeto y luego determine cuál es el objeto.

Con estas preguntas resueltas, podemos pasar al aspecto más crucial de nuestro problema: los datos . Nuestros datos deben cumplir con la especificación del problema que acabamos de definir. Para seguir con nuestro problema con los juguetes, necesitaremos un conjunto de datos etiquetado en el que cada imagen tendrá una coordenada de recuadro delimitador para el objeto de interés y la etiqueta de ese objeto. Una vez que tengamos en nuestras manos el conjunto de datos, el problema se resolverá en un 80%. Supongamos que tenemos este conjunto de datos en la web (nunca sucede). Ahora solo tenemos que configurar o modelar y hacer girar la rutina de entrenamiento.

Pero, ¿cómo lo hacemos realmente? Primero tratemos con el problema de clasificación. Como nuestro conjunto de datos ya contiene las coordenadas del cuadro delimitador del objeto de interés dentro de cada imagen, simplemente procesemos previamente todas las imágenes y recortemos los objetos. Ahora nuestro conjunto de datos se ha reducido a los objetos recortados con sus etiquetas. Afortunadamente, CIFAR-10 es exactamente el mismo conjunto de datos que necesitamos en nuestro problema hipotético. Contiene las imágenes etiquetadas de los mismos objetos que también nos interesan: CIFAR-10 – Reconocimiento de objetos en imágenes. Como ahora tenemos el conjunto de datos para la clasificación, configuremos nuestro modelo. Pero espera. Los buenos en TensorFlow ya han escrito un tutorial ordenado para la clasificación de objetos CIFAR-10 que explica muy bien cómo se puede usar un ConvNet para clasificar objetos: Redes neuronales convolucionales | TensorFlow.

Ahora supongamos que ha leído el tutorial, entendido los aspectos básicos de la clasificación de objetos con ConvNets y entrenado a AlexNet con pérdida de cross_entropy, y ahora está obteniendo una precisión de clasificación decente en CIFAR-10. Entonces, ¿qué hacemos con la detección? Como hemos restringido nuestro problema de juguetes para que solo tenga un objeto en cada imagen, podríamos extender fácilmente el modelo que entrenamos para la clasificación para detectar objetos.

Entonces, ¿qué implica un problema de detección? La detección es un problema de regresión. Para encontrar un objeto, necesitamos retroceder el cuadro delimitador de ese objeto. Es decir, para cada imagen, debemos predecir cuatro valores reales que definen el cuadro delimitador: coordenada x, coordenada y, ancho de caja y altura de caja . Afortunadamente, podemos extender nuestro modelo ConvNet para la clasificación para detectar también el objeto. En nuestra arquitectura ConvNet, tenemos un Mapa de características de convolución (pool2 en el tutorial), seguido de capas completamente conectadas (local3 y local4) y puntajes de clase individuales (softmax_linear). Para extender nuestro modelo, alimentaremos nuestro Mapa de características de convolución a un conjunto separado de capas completamente conectadas y transformaremos la última capa completamente conectada para generar 4 valores para predecir las coordenadas del cuadro delimitador. Luego podemos calcular la pérdida de L2 para estas coordenadas con respecto al cuadro delimitador de la verdad fundamental (recuerde, nuestro conjunto de datos tenía una coordenada del cuadro delimitador y una etiqueta de objeto para cada imagen) y agregarlo a la pérdida que ya estamos usando para la clasificación. Una vez que la arquitectura está configurada, podemos entrenar nuestro detector + clasificador de una vez usando backprop. Aquí hay una figura que ilustra cómo podría ramificar la capa pool2 (mapa de características de conv final) a dos flujos, el encabezado de clasificación y el encabezado de regresión.

Fuente de la imagen: Localización y detección de objetos

Bien, ahora sabemos (algo) cómo detectar un solo objeto y clasificarlo. Obviamente, cualquier problema real no estará ni remotamente cerca de lo que acabamos de hacer. Un problema real requerirá que detectemos un número variable de objetos de una lista arbitraria de objetos. Podemos hacerlo utilizando Faster-RCNN, un potente detector que puede detectar un número variable de objetos en tiempo casi real: rbgirshick / py-rapid-rcnn. Podríamos detectar prácticamente cualquier objeto con este detector. Por supuesto, es posible que Faster-RCNN no nos dé exactamente lo que queremos, y en ese caso, siempre podemos modificar el código o reescribirlo desde cero utilizando los principios de diseño de Faster-RCNN. Una vez que hemos detectado el objeto, debemos clasificarlo. Podemos hacerlo utilizando el modelo pre-entrenado de GoogleNet en ImageNet (1000 objetos): tensorflow / models. Si nuestra lista de objetos difiere de ImageNet, podemos tomar un modelo ImageNet previamente entrenado como punto de partida y ajustarlo con los datos de nuestro conjunto de objetos. Esto se llama Transfer Learning y puede leer más sobre esto en CS231n Redes neuronales convolucionales para el reconocimiento visual

Fácil, solo encuentre algún modelo CNN en github (hay literalmente cientos), encuentre uno que funcione bien, luego, una vez que haya entrenado el modelo, encuentre la función utilizada para volcar el modelo entrenado en un archivo.

A continuación, escriba un script que lea los valores de datos utilizando alguna API REST u otro sistema de base de datos y haga predicciones sobre esos valores de datos utilizando el modelo entrenado.

regalando el vudú