Cómo automatizar la vigilancia fácilmente con Deep Learning

Este artículo es un tutorial rápido para implementar un sistema de vigilancia utilizando la detección de objetos basada en el aprendizaje profundo. También compara el rendimiento de diferentes modelos de detección de objetos que utilizan multiprocesamiento por GPU para inferencia, en la detección de peatones.

La vigilancia es una parte integral de la seguridad y la patrulla. En su mayor parte, el trabajo implica períodos prolongados de vigilar que algo indeseable suceda. Es crucial que hagamos esto, pero también es una tarea muy mundana.

¿No sería la vida mucho más simple si hubiera algo que pudiera "vigilar y esperar" por nosotros? Bueno, estás de suerte. Con los avances tecnológicos en los últimos años, podríamos escribir algunos scripts para automatizar las tareas anteriores, y eso también, con bastante facilidad. Pero, antes de profundizar, preguntémonos:

¿Las máquinas son buenas como los humanos?

Cualquier persona familiarizada con Deep Learning sabría que los clasificadores de imágenes han superado la precisión a nivel humano.

Tasa de error en el conjunto de datos de ImageNet a lo largo del tiempo, para humanos, visión tradicional por computadora (CV) y aprendizaje profundo. (Fuente de la imagen: Enlace)

Entonces, sí, una máquina puede vigilar objetos con el mismo estándar (o mejor) en comparación con un humano. Dicho esto, el uso de la tecnología para realizar vigilancia es mucho más eficiente.

  • La vigilancia es una tarea repetitiva y mundana. Esto puede causar caídas de rendimiento para nosotros los seres humanos. Al permitir que la tecnología haga la vigilancia, podríamos centrarnos en tomar medidas si algo sale mal.
  • Para inspeccionar una gran franja de tierra, necesita mucho personal. Las cámaras estacionarias también tienen un rango de visión limitado. Con los bots de vigilancia móvil (como los micro drones), estos problemas pueden mitigarse.

Además, la misma tecnología se puede utilizar para una variedad de aplicaciones que no se limitan a la seguridad, como los monitores para bebés o la entrega automatizada de productos.

Lo suficientemente justo. ¿Pero cómo lo automatizamos?

Antes de idear teorías complicadas, pensemos en cómo funciona normalmente la vigilancia. Observamos un video y, si detectamos algo anormal, tomamos medidas. Entonces, en esencia, nuestra tecnología debería examinar cada fotograma del video, con la esperanza de detectar algo anormal. ¿Este proceso hace sonar una campana?

Como habrás adivinado, esta es la esencia misma de la detección de objetos con localización. Es ligeramente diferente de la clasificación que, necesitamos saber la ubicación exacta del objeto. Además, podemos tener múltiples objetos en una sola imagen.

Para encontrar la ubicación exacta, nuestro algoritmo debe inspeccionar cada parte de la imagen para encontrar la existencia de una clase. Es más difícil de lo que parece. Pero desde 2014, la investigación iterativa continua en Deep Learning ha introducido redes neuronales fuertemente diseñadas que pueden detectar objetos en tiempo real.

¡Mira cómo el rendimiento aumentó en solo un lapso de 2 años!

Existen varias arquitecturas de aprendizaje profundo que utilizan diferentes métodos internamente para realizar la misma tarea. Las variantes más populares son las redes Faster RCNN, YOLO y SSD.

Compensación de velocidad vs precisión. Un mAP más alto y un tiempo de GPU más bajo es óptimo.

Cada modelo depende de un clasificador base, lo que afecta en gran medida la precisión final y el tamaño del modelo. Además, la elección del detector de objetos puede influir mucho en la complejidad computacional y la precisión final.

Siempre hay una compensación de Velocidad vs Precisión vs Tamaño al elegir un algoritmo de Detección de Objetos.

En esta publicación de blog, aprenderemos cómo construir un sistema de vigilancia simple pero efectivo, utilizando la detección de objetos. Discutamos primero las limitaciones a las que estamos obligados debido a la naturaleza de la tarea de vigilancia.

Restricciones para el aprendizaje profundo en la vigilancia

A menudo nos gustaría vigilar una gran extensión de tierra. Esto presenta un par de factores que debemos considerar antes de automatizar la vigilancia.

1. Video Feed

Naturalmente, para vigilar un área grande, es posible que necesitemos varias cámaras. Además, estas cámaras necesitan almacenar estos datos en algún lugar; ya sea localmente o en una ubicación remota.

Típicas cámaras de vigilancia. (Foto de Scott Webb en Unsplash)

Un video de mayor calidad tomará mucha más memoria que uno de menor calidad. Además, un flujo de entrada RGB es 3 veces más grande que un flujo de entrada BW. Como solo podemos almacenar una cantidad finita del flujo de entrada, la calidad a menudo se reduce para maximizar el almacenamiento.

Por lo tanto, un sistema de vigilancia escalable debería ser capaz de interpretar imágenes de baja calidad. Por lo tanto, nuestro algoritmo de aprendizaje profundo también debe estar capacitado en imágenes de tan baja calidad.

2. Poder de procesamiento

Ahora que hemos resuelto la restricción de entrada, podemos responder una pregunta más grande. ¿Dónde procesamos los datos obtenidos de las fuentes de la cámara? Hay dos métodos para hacer esto.

  • Procesamiento en un servidor centralizado:

Las transmisiones de video de las cámaras se procesan cuadro por cuadro en un servidor remoto o un clúster. Este método es robusto y nos permite cosechar los beneficios de modelos complejos con altas precisiones. El problema obvio es la latencia; necesita una conexión rápida a Internet por retraso limitado. Además, si no está utilizando una API comercial, los costos de instalación y mantenimiento del servidor pueden ser altos.

Consumo de memoria vs Tiempo de GPU de inferencia (milisegundos). La mayoría de los modelos de alto rendimiento consumen mucha memoria. (Fuente)
  • Procesamiento en el borde:

Al conectar un pequeño microcontrolador, podemos realizar inferencias en tiempo real en la propia cámara. No hay retraso en la transmisión, y las anomalías se pueden informar más rápido que el método anterior. Además, este es un complemento excelente para los bots que son móviles, por lo que no necesitan estar limitados por el rango de WiFi / Bluetooth disponible. (como los microdrones).

Capacidad FPS de varios detectores de objetos. (Fuente)

La desventaja es que los microcontroladores no son tan potentes como las GPU y, por lo tanto, puede verse obligado a usar modelos con menor precisión. Este problema puede evitarse utilizando GPU integradas, pero esa es una solución costosa. Una solución interesante sería utilizar software como TensorRT, que puede optimizar su programa para inferencia.

Entrenamiento de un sistema de vigilancia

En esta sección, veremos cómo identificar a los peatones usando la detección de objetos. Utilizaremos la API de detección de objetos TensorFlow para crear nuestro módulo de detección de objetos. Exploraremos brevemente cómo configurar la API y capacitarla para nuestra tarea de vigilancia. Para una explicación más detallada, puede consultar esta publicación de blog.

Todo el proceso se puede resumir en tres fases:

  1. Preparación de datos
  2. Entrenando al modelo
  3. Inferencia
El flujo de trabajo implicado en la capacitación de un modelo de detección de objetos.

Si sientes que ver los resultados te motivaría más a probarlo, ¡puedes desplazarte hacia la Fase 3!

Fase 1: Preparación de datos

Paso 1: obtenga el conjunto de datos

Las imágenes de vigilancia tomadas en el pasado son probablemente el conjunto de datos más preciso que puede obtener. Pero, a menudo es difícil obtener este tipo de imágenes de vigilancia para la mayoría de los casos. En ese caso, podemos entrenar a nuestro detector de objetos para que generalmente reconozca nuestros objetivos a partir de imágenes normales.

Imagen anotada de muestra de nuestro conjunto de datos.

Como se discutió anteriormente, las imágenes en la alimentación de su cámara pueden ser de menor calidad. Por lo tanto, debe entrenar a su modelo para trabajar en tales condiciones. Una forma muy elegante de hacerlo es mediante el aumento de datos, que se explica en detalle aquí. Esencialmente, tenemos que agregar algo de ruido para degradar la calidad de imagen del conjunto de datos. También podríamos experimentar con efectos de desenfoque y erosión.

Utilizaremos el TownCentre Dataset para nuestra tarea de detección de objetos. Utilizaremos los primeros 3600 cuadros del video para capacitación y validación, y los 900 restantes para las pruebas. Puede usar los scripts en mi repositorio de GitHub para extraer el conjunto de datos.

Paso 2: anotar el conjunto de datos

Puede usar una herramienta como LabelImg para realizar las anotaciones. Esta es una tarea tediosa, pero importante de todos modos. Las anotaciones se guardan como archivos XML.

Afortunadamente, los propietarios del TownCentre Dataset han proporcionado anotaciones en formato csv. Escribí un script rápido para convertir las anotaciones al formato XML requerido, que puedes encontrar en mi repositorio de GitHub.

Paso 3: clonar el repositorio

Clonar el repositorio. Ejecute los siguientes comandos para instalar requisitos, compile algunas bibliotecas Protobuf y establezca variables de ruta

pip install -r required.txt
sudo apt-get install protobuf-compiler
protocolo object_detection / protos / *. proto --python_out =.
export PYTHONPATH = $ PYTHONPATH: `pwd`:` pwd` / slim

Paso 4: preparar las entradas de apoyo

Necesitamos asignar una identificación a nuestro objetivo. Definimos la ID en el archivo llamado label_map.pbtxt de la siguiente manera

articulo {
 id: 1
 nombre: "objetivo"
}

A continuación, debe crear un archivo de texto con los nombres de los archivos XML y de imagen. Por ejemplo, si tiene img1.jpg, img2.jpg e img1.xml, img2.xml en su conjunto de datos, su archivo trainval.txt debería tener este aspecto:

img1
img2

Separe su conjunto de datos en dos carpetas, a saber, imágenes y anotaciones. Coloque label_map.pbtxt y trainval.txt dentro de su carpeta de anotaciones. Cree una carpeta llamada xmls dentro de la carpeta de anotaciones y coloque todos sus XML dentro de ella. La jerarquía de tu directorio debería verse así:

-base_directory
| -imágenes
| -anotaciones
|| -xmls
|| -label_map.pbtxt
|| -trainval.txt

Paso 5: crear registros TF

La API acepta entradas en el formato de archivo TFRecords. Use el archivo create_tf_record.py provisto en mi repositorio para convertir su conjunto de datos en TFRecords. Debe ejecutar el siguiente comando en su directorio base:

python create_tf_record.py \
    --data_dir = `pwd` \
    --output_dir = `pwd`

Encontrará dos archivos, train.record y val.record, una vez que el programa finalice su ejecución.

Fase 2: Entrenando el modelo

Paso 1: Selección del modelo

Como se mencionó anteriormente, existe una compensación entre velocidad y precisión. Además, construir y entrenar un detector de objetos desde cero sería extremadamente lento. Por lo tanto, la API de detección de objetos TensorFlow proporciona un montón de modelos pre-entrenados, que puede ajustar a su caso de uso. Este proceso se conoce como Transfer Learning y acelera su proceso de capacitación en una cantidad enorme.

Un montón de modelos previamente entrenados en el conjunto de datos MS COCO

Descargue uno de estos modelos y extraiga el contenido en su directorio base. Recibirá los puntos de control del modelo, un gráfico de inferencia congelado y un archivo pipeline.config.

Paso 2: definición del trabajo de capacitación

Debe definir el "trabajo de capacitación" en el archivo pipeline.config. Coloque el archivo en el directorio base. Lo que realmente importa son las últimas líneas del archivo: solo necesita establecer los valores resaltados en sus ubicaciones de archivo respectivas.

gradient_clipping_by_norm: 10.0
  fine_tune_checkpoint: "model.ckpt"
  from_detection_checkpoint: true
  num_steps: 200000
}
train_input_reader {
  label_map_path: "anotaciones / label_map.pbtxt"
  tf_record_input_reader {
    input_path: "train.record"
  }
}
eval_config {
  num_examples: 8000
  max_evals: 10
  use_moving_averages: false
}
eval_input_reader {
  label_map_path: "anotaciones / label_map.pbtxt"
  barajar: falso
  num_epochs: 1
  num_readers: 1
  tf_record_input_reader {
    input_path: "val.record"
  }
}

Paso 3: Comienza el entrenamiento

Ejecute el siguiente comando para comenzar el trabajo de capacitación. Se recomienda utilizar una máquina con una GPU lo suficientemente grande (siempre que haya instalado la versión de gpu de tensorflow) para acelerar el proceso de capacitación.

python object_detection / train.py \
--logtostderr \
--pipeline_config_path = pipeline.config \
--train_dir = tren

Fase 3: inferencia

Paso 1: exportar el modelo entrenado

Antes de poder usar el modelo, debe exportar los archivos de puntos de control entrenados a un gráfico de inferencia congelado. En realidad, es más fácil de hacer que lo dicho: simplemente ejecute el siguiente código (Reemplace "xxxxx" con el número del punto de control):

python object_detection / export_inference_graph.py \
--input_type = image_tensor \
--pipeline_config_path = pipeline.config \
--trained_checkpoint_prefix = train / model.ckpt-xxxxx \
--output_directory = salida

Obtendrá un archivo llamado frozen_inference_graph.pb, junto con un montón de archivos de puntos de control.

Paso 2: Úselo en una transmisión de video

Necesitamos extraer cuadros individuales de nuestra fuente de video. Se puede hacer usando el método VideoCapture de OpenCV, de la siguiente manera:

cap = cv2.VideoCapture ()
bandera = verdadero
while (bandera):
    flag, frame = cap.read ()
    ## - Código de detección de objetos -

El código de extracción de datos utilizado en la Fase 1 crea automáticamente una carpeta "test_images" con nuestras imágenes de prueba. Podemos ejecutar nuestro modelo en el conjunto de prueba ejecutando lo siguiente:

python object_detection / inference.py \
--input_dir = {RUTA} \
--output_dir = {RUTA} \
--label_map = {RUTA} \
--frozen_graph = {RUTA} \
--num_output_classes = 1 \
--n_jobs = 1 \
- retraso = 0

Los experimentos

Como se mencionó anteriormente, existe una compensación entre velocidad y precisión al elegir un modelo de detección de objetos. Realicé algunos experimentos que midieron el FPS y contaron la precisión de las personas detectadas usando tres modelos diferentes. Además, los experimentos se ejecutaron en diferentes restricciones de recursos (restricciones de paralelismo de GPU). El resultado de estos experimentos puede proporcionarle información valiosa al seleccionar un modelo de detección de objetos.

Preparar

Los siguientes modelos fueron seleccionados para nuestro experimento. Estos están disponibles en el zoológico modelo de la API de detección de objetos TensorFlow.

  • RCNN más rápido con ResNet 50
  • SSD con MobileNet v1
  • SSD con InceptionNet v2

Todos los modelos fueron entrenados en Google Colab para 10k pasos (o hasta que su pérdida se saturara). Por inferencia, se usó una instancia de AWS p2.8xlarge. La precisión del conteo se midió comparando el número de personas detectadas por el modelo y la verdad básica. La velocidad de inferencia en fotogramas por segundo (FPS) se probó bajo las siguientes restricciones:

  • GPU individual
  • Dos GPU en paralelo
  • Cuatro GPU en paralelo
  • Ocho GPU en paralelo

Resultados

Aquí hay un extracto de la salida producida mediante el uso de FasterRCNN en nuestro conjunto de prueba. También adjunto un video que compara la salida producida por cada modelo cerca del final de este blog. ¡Siéntase libre de desplazarse hacia abajo y echarle un vistazo!

Tiempo de entrenamiento

La siguiente gráfica muestra el tiempo necesario para entrenar cada modelo para 10k pasos (en horas). Esto excluye el tiempo requerido para una búsqueda de hiperparámetros.

Cuando su aplicación es muy diferente del modelo previamente entrenado que usa para el aprendizaje de transferencia, es posible que necesite ajustar los hiperparámetros. Sin embargo, cuando su aplicación es similar, no necesitará hacer una búsqueda exhaustiva. No obstante, es posible que deba experimentar con parámetros de entrenamiento como la tasa de aprendizaje y la elección del optimizador.

Velocidad (cuadros por segundo)

Esta fue la parte más interesante de nuestro experimento. Como se indicó anteriormente, medimos el rendimiento de FPS de nuestros tres modelos en cinco restricciones de recursos diferentes. Los resultados se muestran a continuación:

Los SSD son extremadamente rápidos, superando fácilmente la velocidad de RCNN más rápido cuando usamos una sola GPU. Sin embargo, Faster RCNN se pone al día rápidamente con SSD cuando aumentamos el número de GPU (trabajando en paralelo). No hace falta decir que SSD con MobileNet es mucho más rápido que SSD con InceptionNet en un entorno de baja GPU.

Una característica notable del gráfico anterior es que, FPS disminuye ligeramente cuando aumentamos el número de GPU para SSD con MobileNet. En realidad, hay una respuesta simple a esta aparente paradoja. ¡Resulta que nuestra configuración procesó las imágenes más rápido de lo que estaban siendo suministradas por la función de lectura de imágenes!

La velocidad de su sistema de procesamiento de video no puede ser mayor que la velocidad a la que las imágenes se envían al sistema.

Para probar mi hipótesis, le di a la función de lectura de imagen una ventaja. El gráfico a continuación muestra la mejora en FPS para SSD con MobileNet cuando se agregó un retraso. La ligera reducción en FPS en el gráfico anterior se debe a la sobrecarga involucrada debido a múltiples GPU que solicitan entrada.

Huelga decir que observamos un fuerte aumento en FPS si introducimos retrasos. La conclusión es que necesitamos tener una tubería de transferencia de imágenes optimizada para evitar un cuello de botella en la velocidad. Pero dado que nuestro caso de uso previsto es la vigilancia, tenemos un cuello de botella adicional. El FPS de la cámara de vigilancia establece el límite superior para el FPS de nuestro sistema.

Contar precisión

Definimos la precisión del recuento como el porcentaje de personas reconocidas correctamente por nuestro sistema de detección de objetos. Sentí que es más adecuado con respecto a la vigilancia. Así es como se desempeñó cada uno de nuestros modelos:

No hace falta decir que Faster RCNN es el modelo más preciso. También sorprendentemente MobileNet funciona mejor que InceptionNet.

Con base en los experimentos, es evidente que de hecho existe una compensación entre velocidad y precisión. Sin embargo, podemos usar un modelo con alta precisión a una buena tasa de FPS si tenemos suficientes recursos. Observamos que RCNN más rápido con ResNet-50 ofrece la mejor precisión y una muy buena clasificación FPS cuando se implementa en 4+ GPU en paralelo.

¡Fueron muchos pasos!

Bueno ... no lo discutiría. De hecho, son muchos pasos. Además, configurar una instancia de nube para que este modelo funcione en tiempo real sería oneroso y costoso.

Una mejor solución sería utilizar un servicio API que ya esté implementado en servidores para que pueda preocuparse por desarrollar su producto. Ahí es donde entra en juego Nanonets. ¡Tienen su API implementada en hardware de calidad con GPU para que obtenga un rendimiento increíble sin ninguna molestia!

Convertí mis anotaciones XML existentes al formato JSON y las envié a la API de Nanonets. De hecho, si no desea anotar manualmente su conjunto de datos, puede solicitarles que lo anoten por usted. Aquí está el flujo de trabajo reducido cuando Nanonets se encarga del trabajo pesado.

Flujo de trabajo reducido con nanonetas

Anteriormente, mencioné cómo las unidades de vigilancia móviles como los micro drones pueden mejorar en gran medida la eficiencia. Podemos crear tales drones con bastante facilidad usando microcontroladores como Raspberry Pi, y podemos usar llamadas API para realizar inferencias.

Es bastante sencillo comenzar con la API de Nanonets para la detección de objetos, pero para obtener una guía bien explicada, puede consultar esta publicación de blog.

Resultados con nanonetas

Nanonets tardó aproximadamente 2 horas en finalizar el proceso de capacitación. Esto incluye el tiempo requerido para la búsqueda de hiperparámetros. En términos de tiempo necesario para el entrenamiento, Nanonets es el claro ganador. Nanonets también derrotó a FasterRCNN en términos de precisión de conteo.

Precisión de conteo más rápida de CRNN = 88.77%
Exactitud del recuento de nanonetas = 89.66%

Aquí está el rendimiento de los cuatro modelos en nuestro conjunto de datos de prueba. Es evidente que ambos modelos SSD son un poco inestables y tienen menor precisión. Además, aunque FasterRCNN y Nanonets tienen precisiones comparables, este último tiene cuadros delimitadores que son más estables.

¿Es responsable la vigilancia automatizada?

El aprendizaje profundo es una herramienta increíble que proporciona resultados ejemplares con facilidad. Pero, ¿en qué medida podemos confiar en que nuestro sistema de vigilancia actúe por sí solo? Hay algunas instancias donde la automatización es cuestionable.

Actualización: a la luz del GDPR y las razones que se detallan a continuación, es imperativo que reflexionemos sobre la legalidad y los problemas éticos relacionados con la automatización de la vigilancia. Este blog es solo para fines educativos y utiliza un conjunto de datos disponible públicamente. Es su responsabilidad asegurarse de que su sistema automatizado cumpla con la ley en su región.

1. Dudosas conclusiones

No sabemos cómo un algoritmo de aprendizaje profundo llega a una conclusión. Incluso si el proceso de alimentación de datos es impecable, puede haber muchos golpes espurios. Por ejemplo, este filtro de blasfemias de IA utilizado por la policía británica seguía eliminando imágenes de dunas de arena pensando que eran imágenes obscenas. Las técnicas como la propagación hacia atrás guiada pueden explicar las decisiones hasta cierto punto, pero todavía tenemos un largo camino por recorrer.

2. Ataques adversarios

Los sistemas de aprendizaje profundo son frágiles. Los ataques adversos son similares a las ilusiones ópticas para los clasificadores de imágenes. Pero la parte aterradora es que una perturbación imperceptible calculada puede obligar a un modelo de aprendizaje profundo a clasificar erróneamente. Utilizando el mismo principio, los investigadores han podido eludir los sistemas de vigilancia basados ​​en el aprendizaje profundo mediante el uso de "anteojos adversos".

3. falsos positivos

Otro problema es, ¿qué hacemos en caso de falsos positivos? La gravedad del problema depende de la aplicación en sí. Por ejemplo, un falso positivo en un sistema de patrulla fronteriza puede ser más significativo que un sistema de monitoreo de jardines. Debería haber cierta cantidad de intervención humana para evitar contratiempos.

4. Caras similares

Lamentablemente, su aspecto no es tan único como su huella digital. Es posible que dos personas (o más) se vean muy similares. Los gemelos idénticos son uno de los mejores ejemplos. Se informó que, Apple Face ID no pudo distinguir dos compañeros de trabajo chinos no relacionados. Esto podría dificultar la vigilancia e identificación de personas.

5. Falta de diversidad en los conjuntos de datos

Los algoritmos de aprendizaje profundo son tan buenos como los datos que usted proporciona. Los conjuntos de datos más populares de rostros humanos solo tienen muestras de personas blancas. Si bien puede parecer obvio para un niño que los humanos pueden existir en varios colores, los algoritmos de Deep Learning son algo tontos. De hecho, Google se metió en problemas porque clasificó incorrectamente a una persona negra como un gorila.

Acerca de Nanonets: Nanonets está creando API para simplificar el aprendizaje profundo para los desarrolladores. Visítanos en https://www.nanonets.com para más información)