Inicio » Como automatizar la Vigilancia fácilmente con Aprendizaje Profundo
EDUCACION INTELIGENCIA ARTIFICIAL

Como automatizar la Vigilancia fácilmente con Aprendizaje Profundo

Aprendizaje Profundo Videovigilancia

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

¿No sería la vida mucho más sencilla si hubiera algo que pudiera hacer el “observar y esperar” por nosotros? Bueno, estás de suerte. Con los avances en tecnología 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 seres humanos?

Cualquier persona familiarizada con Deep Learning sabría que los clasificadores de imagen 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 en el mismo estándar (o mejor) en comparación con un humano. Dicho esto, usar la tecnología para realizar la vigilancia es mucho más eficiente.

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

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

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

Antes de crear teorías complicadas, pensemos en cómo funciona normalmente la vigilancia. Miramos un video, y si detectamos algo anormal, actuamos. Así que, en esencia, nuestra tecnología debe examinar cada fotograma del video, con la esperanza de detectar algo anormal. ¿Este proceso suena como una campana?

Como habrá adivinado, esta es la esencia misma de la detección de  objetos con localización. Es un poco 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 altamente diseñadas que pueden detectar objetos en tiempo real.

¡Mire cómo el rendimiento aumentó en tan solo 2 años!

Hay varias arquitecturas de Aprendizaje Profundo, que usan diferentes métodos internamente, para realizar la misma tarea. Las variantes más populares son las redes Faster RCNN, YOLO y SSD.

Compensación entre velocidad y precisión. Un mAP más alto y un tiempo de GPU más bajo son óptimos.

Cada modelo depende de un clasificador de base, 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 en gran medida en la complejidad computacional y la precisión final.

Siempre hay un compromiso entre velocidad vs precisión y tamaño al elegir un algoritmo de detección de objetos.

En esta publicación del 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 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.

Cámaras de vigilancia típicas. (Foto por  Scott Webb  en  Unsplash )

Un video de mayor calidad requerirá 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 de la corriente de entrada, la calidad a menudo se reduce para maximizar el almacenamiento.

Por lo tanto, un sistema de vigilancia escalable debe poder interpretar imágenes de baja calidad. Por lo tanto, nuestro algoritmo de aprendizaje profundo también debe ser entrenado en imágenes de 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:

Los flujos de video de las cámaras se procesan fotograma a fotograma en un servidor remoto o un clúster. Este método es robusto y nos permite obtener 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 Inferencia Tiempo de GPU (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 inferencia en tiempo real en la propia cámara. No hay retraso en la transmisión, y las anomalías pueden notificarse más rápido que el método anterior. Además, este es un excelente complemento 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, es posible que se vea obligado a usar modelos con menor precisión. Este problema puede evitarse mediante el uso de 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 mediante la detección de objetos. Usaremos 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, puedes ver esta  publicación de blog .

Todo el proceso se puede resumir en tres fases:

  1. Preparación de datos
  2. Entrenando el modelo
  3. Inferencia
El flujo de trabajo involucrado en la formación de un modelo de detección de objetos.

Si siente que ver los resultados lo motivaría más a probarlo, ¡siéntase libre de desplazarse a la Fase 3!

Fase 1: Preparación de datos

Paso 1: Obtener 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 video de vigilancia para la mayoría de los casos. En ese caso, podemos entrenar a nuestro detector de objetos para que reconozca generalmente nuestros objetivos a partir de imágenes normales.

Muestra la imagen anotada de nuestro conjunto de datos.

Como se mencionó anteriormente, las imágenes de su cámara pueden ser de menor calidad. Así que debes entrenar a tu 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, debemos 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.

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

Paso 2: Anota el conjunto de datos

Podría usar una herramienta como LabelImg para realizar las anotaciones. Esta es una tarea tediosa, pero igualmente importante. Las anotaciones se guardan como archivos XML.

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

Paso 3: Clonar el repositorio

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

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

Paso 4: Prepare las entradas de apoyo

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

item { 
id: 1 
name: 'target' 
}

A continuación, debe crear un archivo de texto con los nombres de los archivos de imagen y XML. Por ejemplo, si tiene img1.jpg, img2.jpg e img1.xml, img2.xml en su conjunto de datos, el 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 el  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 su directorio debería verse así:

-base_directorio 
| -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  proporcionado en mi  repositorio  para convertir su conjunto de datos en TFRecords. Debes ejecutar el siguiente comando en tu directorio base:

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

Encontrarás dos archivos,  train.record  y  val.record , después de que el programa termine su ejecución.

Fase 2: Entrenando el modelo.

Paso 1: Selección de modelo

Como se mencionó anteriormente, hay una compensación entre la velocidad y la precisión. Además, construir y entrenar un detector de objetos desde cero requeriría mucho tiempo. 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  transferencia de aprendizaje y acelera su proceso de capacitación en una cantidad enorme.

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

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

Paso 2: Definir el trabajo de entrenamiento

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 respectivas ubicaciones de archivos.

gradient_clipping_by_norm: 10,0 
  fine_tune_checkpoint: " model.ckpt " 
  from_detection_checkpoint: verdaderos 
  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: falsa 
} 
eval_input_reader { 
  label_map_path: " anotaciones / label_map.pbtxt " 
  shuffle: false 
  num_epochs: 1 
  num_readers: 1 
  tf_record_input_reader {
    ruta de entrada: " val.record " 
  } 
}

Paso 3: Comienza el entrenamiento

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

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

Fase 3: Inferencia

Paso 1: Exportar el modelo entrenado.

Antes de poder usar el modelo, debe exportar los archivos de puntos de control capacitados a un gráfico de inferencia congelado. En realidad, es más fácil de lo que se dice; simplemente ejecute el código siguiente (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 = output

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

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

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

cap = cv2.VideoCapture () 
flag = True
while (flag): 
    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 conjunto de prueba. Podemos ejecutar nuestro modelo en el conjunto de pruebas ejecutando lo siguiente:

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

Experimentos

Como se mencionó anteriormente, existe un intercambio 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 utilizando tres modelos diferentes. Además, los experimentos se realizaron en diferentes restricciones de recursos (restricciones de paralelismo de GPU). El resultado de estos experimentos puede brindarle 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 de modelos de la TensorFlow Object Detection API.

  • 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 pasos de 10k (o hasta que se saturaron). Para inferencia, una instancia de AWS p2.8xlarge fue utilizada. 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 cuadros por segundo (FPS) se probó bajo las siguientes restricciones:

  • GPU única
  • Dos GPUs en paralelo
  • Cuatro GPUs en paralelo
  • Ocho GPUs en paralelo

Resultados

Aquí hay un extracto de la salida producida usando FasterRCNN en nuestro conjunto de prueba. También he adjuntado un video que compara la salida producida por cada modelo cerca del final de este blog. Siéntase libre de desplazarse hacia abajo y verlo!

Tiempo de entrenamiento

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

Cuando su aplicación es muy diferente del modelo pre-entrenado que usa para la transferencia de aprendizaje, es posible que necesite ajustar los hiperparámetros. Sin embargo, cuando su aplicación es similar, no tendría que hacer una búsqueda exhaustiva. No obstante, es posible que aún necesite 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 y superan fácilmente la velocidad de Faster RCNN cuando usamos una sola GPU. Sin embargo, Faster RCNN se pone rápidamente al día con SSD cuando aumentamos el número de GPU (trabajando en paralelo). No hace falta decir que el SSD con MobileNet es mucho más rápido que el SSD con InceptionNet en un entorno de GPU bajo.

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 eran suministradas por la función de lectura de imagen!

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

Para probar mi hipótesis, le di un impulso a la función de lectura de imagen. La gráfica a continuación muestra la mejora en FPS para SSD con MobileNet cuando se agregó un retraso. La ligera reducción de FPS en el gráfico anterior se debe a la sobrecarga que implica el hecho de que varias GPU solicitan información.

No hace falta decir que observamos un fuerte aumento en el 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 como 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.

Precisión de conteo

Definimos la precisión de conteo 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 cada uno de nuestros modelos realizó:

No hace falta decir que Faster RCNN es el modelo más preciso. También sorprendentemente, MobileNet se desempeña mejor que InceptionNet.

Sobre la base de los experimentos, es evidente que de hecho hay un equilibrio 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 Faster RCNN con ResNet-50 ofrece la mejor precisión y una calificación FPS muy buena cuando se implementa en 4+ GPU en paralelo.

¡Eso fue un montón de pasos!

Bueno … yo no discutiría. De hecho es un montón de 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 de API que ya esté implementado en servidores para que pueda preocuparse por el desarrollo de su producto. Ahí es donde entra en  juego Nanonets  . Tienen su API desplegada en hardware de calidad con GPU, ¡de modo que obtienes un rendimiento insano sin ninguna molestia!

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

Flujo de trabajo reducido con nanonets

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

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

Resultados con nanonets

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

FasterRCNN Precisión de recuento = 88.77% 
Nanonets Exactitud de recuento = 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, a pesar de que FasterRCNN y Nanonets tienen precisiones comparables, este último tiene cuadros de límites que son más estables.


¿La vigilancia automatizada es responsable?

El aprendizaje profundo es una herramienta sorprendente que proporciona resultados ejemplares con facilidad. Pero, ¿en qué medida podemos confiar en que nuestro sistema de vigilancia actuará por sí solo? Hay algunos casos donde la automatización es cuestionable.

Actualización:  A la luz de GDPR y las razones que se indican 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 disponibles públicamente. Es su responsabilidad asegurarse de que su sistema automatizado cumpla con la ley de su región.

1. Conclusiones dudosas

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 falsos. Por ejemplo, este filtro de profanidad de la IA utilizado por los policías británicos siguió eliminando imágenes de las dunas de  arena pensando que eran imágenes obscenas . Técnicas como la  propagación  hacia atrás guiada pueden explicar las decisiones en cierta medida, pero aún nos queda mucho camino por recorrer.

2. Ataques Adversarios

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

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. Debe haber una 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 ejemplos principales. Se informó que, Apple Face ID  no distinguió a  dos compañeros de trabajo chinos no relacionados. Esto podría dificultar la vigilancia y la identificación de las personas.

5. Falta de diversidad en los conjuntos de datos.

Los algoritmos de aprendizaje profundo son tan buenos como los datos que 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 Aprendizaje Profundo son algo tontos. De hecho, Google se metió en problemas porque clasificaba incorrectamente a una persona negra  como un gorila .


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

X