Conteo de multitudes | Construyendo un modelo de conteo de multitudes usando Python

Contenidos

Introducción

¡La inteligencia artificial y el aprendizaje automático serán nuestro mayor ayudante en la próxima década!

Hoy por la mañana, estaba leyendo un artículo que informaba que un sistema de inteligencia artificial ganó contra 20 abogados y los abogados estaban realmente felices de que la inteligencia artificial pueda ocuparse de una parte repetitiva de sus roles y ayudarlos a trabajar en temas complejos. Estos abogados se alegraron de que la inteligencia artificial les permita desempeñar funciones más satisfactorias.

Hoy, compartiré un ejemplo similar: cómo contar el número de personas en una multitud usando Aprendizaje profundo y visión artificial? Pero, antes de hacer eso, desarrollemos un sentido de lo fácil que es la vida para un científico de conteo de multitudes.

Actúe como un científico de conteo de multitudes

¡Empecemos!

¿Me pueden ayudar a contar / estimar el número de personas en esta imagen que asistirán a este evento?

crowd-at-a-stadium-in-johannesburg-south-africa-for-rugby-2741194

Ok, ¿qué tal este?

img_2-2634912

Fuente: Conjunto de datos de ShanghaiTech

Le coges el truco. Al final de este tutorial, crearemos un algoritmo para el conteo de multitudes con una precisión asombrosa (en comparación con humanos como tú y yo). ¿Usarás tal asistente?

PD Este artículo asume que tienes un conocimiento básico de cómo funcionan las redes neuronales convolucionales (CNN). Puede consultar la publicación a continuación para obtener más información sobre este tema antes de continuar:

Tabla de contenido

  1. ¿Qué es el conteo de multitudes?
  2. ¿Por qué se requiere el conteo de multitudes?
  3. Comprensión de las diferentes técnicas de visión por computadora para el conteo de multitudes
  4. La arquitectura y los métodos de formación de CSRNet
  5. Construyendo su propio modelo de conteo de multitudes en Python

Este artículo está muy inspirado en el artículo: CSRNet: Redes neuronales convolucionales dilatadas para comprender las escenas muy congestionadas.

¿Qué es el conteo de multitudes?

El conteo de multitudes es una técnica para contar o estimar la cantidad de personas en una imagen. Tómese un momento para analizar la siguiente imagen:

img_2-2634912

Fuente: Conjunto de datos de ShanghaiTech

¿Puede darme un número aproximado de cuántas personas hay en el cuadro? Sí, incluidos los que están presentes en segundo plano. El método más directo es contar manualmente a cada persona, pero ¿tiene eso sentido práctico? ¡Es casi imposible cuando la multitud es tan grande!

Los científicos de multitudes (sí, ¡ese es un título de trabajo real!) Cuentan la cantidad de personas en ciertas partes de una imagen y luego extrapolan para llegar a una estimación. Más comúnmente, hemos tenido que confiar en métricas crudas para estimar este número durante décadas.

Seguramente debe haber un enfoque mejor y más exacto.

¡Sí hay!

Si bien todavía no tenemos algoritmos que nos puedan dar el número EXACTO, la mayoría visión por computador Las técnicas pueden producir estimaciones impresionantemente precisas. Primero entendamos por qué el conteo de multitudes es importante antes de sumergirnos en el algoritmo detrás de él.

¿Por qué es útil el conteo de multitudes?

Comprendamos la utilidad del conteo de multitudes con un ejemplo. Imagínese esto: su empresa acaba de terminar de organizar una gran conferencia sobre ciencia de datos. Durante el evento se llevaron a cabo muchas sesiones diferentes.

Se le pide que analice y estime el número de personas que asistieron a cada sesión. Esto ayudará a su equipo a comprender qué tipo de sesiones atrajeron a las multitudes más grandes (y cuáles fallaron en ese sentido). Esto dará forma a la conferencia del próximo año, ¡así que es una tarea importante!

linux_conference_2013_opening-1090863

Hubo cientos de personas en el evento, ¡contarlas manualmente llevará días! Ahí es donde entran en juego sus habilidades como científico de datos. ¡Se las arregló para obtener fotos de la multitud en cada sesión y crear un modelo de visión por computadora para hacer el resto!

Hay muchos otros escenarios en los que los algoritmos de conteo de multitudes están cambiando la forma en que funcionan las industrias:

  • Contando el número de personas que asisten a un evento deportivo
  • Estimar cuántas personas asistieron a una inauguración o una marcha (manifestaciones políticas, tal vez)
  • Monitoreo de áreas de alto tráfico
  • Ayudar con la asignación de personal y la asignación de recursos.

¿Puedes pensar en otros casos de uso? ¡Házmelo saber en la sección de comentarios a continuación! Podemos conectarnos y tratar de descubrir cómo podemos usar técnicas de conteo de multitudes en su escenario.

Comprensión de las diferentes técnicas de visión por computadora para el conteo de multitudes

En términos generales, actualmente hay cuatro métodos que podemos usar para contar el número de personas en una multitud:

1. Métodos basados ​​en detección

Aquí, usamos un detector similar a una ventana en movimiento para identificar a las personas en una imagen y contar cuántas hay. Los métodos utilizados para la detección requieren clasificadores bien entrenados que puedan extraer características de bajo nivel. Aunque estos métodos funcionan bien para detectar rostros, no funcionan bien en imágenes llenas de gente, ya que la mayoría de los objetos de destino no son claramente visibles.

2. Métodos basados ​​en regresiones

No pudimos extraer características de bajo nivel con el enfoque anterior. Los métodos basados ​​en la regresión triunfan aquí. Primero recortamos los parches de la imagen y luego, para cada parche, extraemos las características de bajo nivel.

3. Métodos basados ​​en la estimación de la densidad

Primero creamos un mapa de densidad para los objetos. Luego, el algoritmo aprende un mapeo lineal entre las características extraídas y sus mapas de densidad de objetos. También podemos usar la regresión de bosque aleatoria para aprender el mapeo no lineal.

4. Métodos basados ​​en CNN

Ah, buenas y confiables redes neuronales convolucionales (CNN). En lugar de mirar los parches de una imagen, creamos un método de regresión de un extremo a otro utilizando CNN. Esto toma la imagen completa como entrada y genera directamente el recuento de personas. Las CNN funcionan muy bien con tareas de regresión o clasificación, y también han demostrado su valía en la generación de mapas de densidad.

CSRNet, una técnica que implementaremos en este artículo, implementa una CNN más profunda para capturar características de alto nivel y generar mapas de densidad de alta calidad sin expandir la complejidad de la red. Entendamos qué es CSRNet antes de pasar a la sección de codificación.

Comprensión de la arquitectura y el método de formación de CSRNet

CSRNet utiliza VGG-16 como interfaz debido a su gran capacidad de aprendizaje por transferencia. El tamaño de salida de VGG es una quinta parte del tamaño de entrada original. CSRNet también utiliza capas convolucionales dilatadas en la parte posterior.

Pero, ¿qué demonios son las circunvoluciones dilatadas? Es una pregunta justa. Considere la siguiente imagen:

screenshot-from-2019-02-01-16-49-21-2729482

El concepto básico de usar convoluciones dilatadas es agrandar el kernel sin aumentar los parámetros. Entonces, si la tasa de dilatación es 1, tomamos el kernel y lo convertimos en toda la imagen. Mientras que, si aumentamos la tasa de dilatación a 2, el núcleo se extiende como se muestra en la imagen de arriba (siga las etiquetas debajo de cada imagen). Puede ser una alternativa a la agrupación de capas.

Matemáticas subyacentes (recomendado, pero opcional)

Me voy a tomar un momento para explicar cómo funcionan las matemáticas. Tenga en cuenta que esto no es obligatorio para implementar el algoritmo en Python, pero le recomiendo que aprenda la idea subyacente. Esto será útil cuando necesite ajustar o modificar su modelo.

Suponga que tenemos una entrada x (m, n), un filtro w (i, j) y la tasa de dilatación r. La salida y (m, n) será:

screenshot-from-2019-02-01-16-56-14-3239944

Podemos generalizar esta ecuación usando un núcleo (k * k) con una tasa de dilatación r. El núcleo se agranda a:

([k + (k-1)*(r-1)] * [k + (k-1)*(r-1)])

Entonces se ha generado la verdad básica para cada imagen. La cabeza de cada persona en una imagen dada se difumina usando un kernel gaussiano. Todas las imágenes se recortan en 9 parches y el tamaño de cada parche es una cuarta parte del tamaño original de la imagen. ¿Conmigo hasta ahora?

Los primeros 4 parches se dividen en 4 cuartos y los otros 5 parches se recortan al azar. Finalmente, se toma el espejo de cada parche para duplicar el conjunto de entrenamiento.

Eso, en pocas palabras, son los detalles de la arquitectura detrás de CSRNet. A continuación, veremos sus detalles de entrenamiento, incluida la métrica de evaluación utilizada.

El descenso de gradiente estocástico se utiliza para entrenar CSRNet como una estructura de extremo a extremo. Durante el entrenamiento, la tasa de aprendizaje fija se establece en 1e-6. La función de pérdida se toma como la distancia euclidiana para medir la diferencia entre la verdad del terreno y el mapa de densidad estimado. Esto se representa como:

screenshot-from-2019-02-01-18-02-14-1319367

donde N es el tamaño del lote de entrenamiento. La métrica de evaluación utilizada en CSRNet es MAE y MSE, es decir, error absoluto medio y error cuadrático medio. Estos vienen dados por:

screenshot-from-2019-02-01-18-03-40-8146105

Aquí, Ci es el recuento estimado:

screenshot-from-2019-02-01-18-05-22-3405494

L y W son el ancho del mapa de densidad predicho.

Nuestro modelo primero predecirá el mapa de densidad para una imagen dada. El valor de píxel será 0 si no hay ninguna persona presente. Se asignará un cierto valor predefinido si ese píxel corresponde a una persona. Entonces, calcular los valores totales de píxeles correspondientes a una persona nos dará el recuento de personas en esa imagen. Impresionante, ¿verdad?

Y ahora, damas y caballeros, ¡es hora de finalmente construir nuestro propio modelo de conteo de multitudes!

Construyendo su propio modelo de conteo de multitudes

¿Listo con su portátil encendido?

Implementaremos CSRNet en el conjunto de datos de ShanghaiTech. Esto contiene 1198 imágenes anotadas de un total combinado de 330,165 personas. Puede descargar el conjunto de datos desde aquí.

Utilice el siguiente bloque de código para clonar el repositorio CSRNet-pytorch. Contiene todo el código para crear el conjunto de datos, entrenar el modelo y validar los resultados:

git clone https://github.com/leeyeehoo/CSRNet-pytorch.git

Por favor instalar CUDA y PyTorch antes de continuar. Estos son la columna vertebral detrás del código que usaremos a continuación.

Ahora, mueva el conjunto de datos al repositorio que clonó anteriormente y descomprímalo. Luego, necesitaremos crear los valores de verdad básicos. los make_dataset.ipynb archivo es nuestro salvador. Solo necesitamos hacer cambios menores en ese cuaderno:

#setting the root to the Shanghai dataset you have downloaded
# change the root path as per your location of dataset
root="/home/pulkit/CSRNet-pytorch/"

Ahora, generemos los valores reales básicos para las imágenes en part_A y part_B:

Generar el mapa de densidad para cada imagen es un paso de tiempo. Así que prepara una taza de café mientras se ejecuta el código.

Hasta ahora, hemos generado los valores de verdad básicos para las imágenes en part_A. Haremos lo mismo con las imágenes part_B. Pero antes de eso, veamos una imagen de muestra y tracemos su mapa de calor de verdad del suelo:

plt.imshow(Image.open(img_paths[0]))

screenshot-from-2019-02-01-19-00-11-6759532

¡Las cosas se están poniendo interesantes!

gt_file = h5py.File(img_paths[0].replace('.jpg','.h5').replace('images','ground-truth'),'r')
groundtruth = np.asarray(gt_file['density'])
plt.imshow(groundtruth,cmap=CM.jet)

screenshot-from-2019-02-01-19-00-37-9563568

Cuentemos cuántas personas están presentes en esta imagen:

np.sum(groundtruth)

270.32568

Del mismo modo, generaremos valores para part_B:

Ahora, tenemos las imágenes, así como sus correspondientes valores de verdad fundamental. ¡Es hora de entrenar a nuestro modelo!

Usaremos los archivos .json disponibles en el directorio clonado. Solo tenemos que cambiar la ubicación de las imágenes en los archivos json. Para hacer esto, abra el archivo .json y reemplace la ubicación actual con la ubicación donde se encuentran sus imágenes.

Tenga en cuenta que todo este código está escrito en Python 2. Realice los siguientes cambios si está utilizando cualquier otra versión de Python:

  1. En model.py, cambie xrange en la línea 18 a range
  2. Cambie la línea 19 en model.py con: list (self.frontend.state_dict (). Items ())[i][1].datos[:] = lista (mod.state_dict (). items ())[i][1].datos[:]
  3. En image.py, reemplace ground_truth con ground-truth

¿Hizo los cambios? Ahora, abra una nueva ventana de terminal y escriba los siguientes comandos:

cd CSRNet-pytorch
python train.py part_A_train.json part_A_val.json 0 0

Nuevamente, siéntese porque esto llevará algo de tiempo. Puede reducir el número de épocas en el train.py archivo para acelerar el proceso. Una buena opción alternativa es descargar los pesos pre-entrenados. de aquí si no tienes ganas de esperar.

Finalmente, verifiquemos el desempeño de nuestro modelo en datos invisibles. Usaremos el val.ipynb archivo para validar los resultados. Recuerde cambiar la ruta a los pesos e imágenes previamente entrenados.

#defining the image path
img_paths = []
for path in path_sets:
    for img_path in glob.glob(os.path.join(path, '*.jpg')):
       img_paths.append(img_path)

model = CSRNet()

#defining the model
model = model.cuda()

#loading the trained weights
checkpoint = torch.load('part_A/0model_best.pth.tar')
model.load_state_dict(checkpoint['state_dict'])

Compruebe el MAE (error absoluto medio) en las imágenes de prueba para evaluar nuestro modelo:

Tenemos un valor MAE de 75,69, que es bastante bueno. Ahora revisemos las predicciones en una sola imagen:

screenshot-from-2019-02-05-19-01-15-1985138Vaya, el recuento original era 382 y nuestro modelo estimó que había 384 personas en la imagen. ¡Esa es una actuación muy impresionante!

¡Felicitaciones por construir su propio modelo de conteo de multitudes!

Notas finales

Te animo a que pruebes este enfoque en diferentes imágenes y compartas tus resultados en la sección de comentarios a continuación. El conteo de multitudes tiene muchas aplicaciones diversas y ya está siendo adoptado por organizaciones y organismos gubernamentales.

Es una habilidad útil para agregar a su cartera. Un gran número de industrias buscarán científicos de datos que puedan trabajar con algoritmos de conteo de multitudes. ¡Aprende, experimenta con él y date el regalo del aprendizaje profundo!

¿Le resultó útil este artículo? No dude en dejarme sus sugerencias y comentarios a continuación, y estaré feliz de comunicarme con usted.

También debe consultar los recursos a continuación para aprender y explorar el maravilloso mundo de la visión por computadora:

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.

)?$/gm,"$1")],{type:"text/javascript"}))}catch(e){d="data:text/javascript;base64,"+btoa(t.replace(/^(?:)?$/gm,"$1"))}return d}-->