Como contar pessoas em uma multidão?
Quem nunca se deparou com uma notícia na qual, por algum motivo, havia um grande número de pessoas e, de alguma maneira, a “contagem” desse número? Seja no carnaval, em manifestações, ou até mesmo em grandes lugares fechados? Você já se perguntou como se faz para chegar a esse número estimado? Obviamente, sabemos que é uma tarefa impraticável, para não dizer impossível, obter esse resultando fazendo a conta pessoa por pessoa. Por outro lado, com toda a tecnologia disponível atualmente, deve haver algum método que nos permita obter com razoável exatidão o número de pessoas em uma multidão. Esta é mais uma das muitas aplicações que as técnicas de inteligência artificial podem alcançar. Neste artigo, vamos dar uma olhada nos métodos mais utilizados para realizar a contagem de pessoas em multidões e utilizar um algoritmo baseado em redes neurais convolucionais para fazer essa estimativa.
Atualmente, pode-se dizer que existem quatro principais abordagens para resolver o problema de crowd counting: 1- baseadas em detecção; 2- baseadas em regressão; 3- baseadas em estimativa de densidade e 4- utilizando técnicas de deep learning, mais especificamente, redes neurais convolucionais.
1 - Métodos baseados em detecção
Os métodos baseados em detecção fazem justamente o que o nome sugere, ou seja, eles buscam chegar num valor razoável para o número de pessoas em uma imagem por meio da detecção de rostos. Esses métodos funcionam a partir da análise de partes menores da imagem a fim de extrair as chamadas low-level features, que são propriedades referentes àquela porção da imagem, que podem conter informações para diversos fins (por exemplo, informações suficientes para entender uma porção da imagem como um rosto). Com isso, na verdade, o problema que está sendo resolvido é ainda mais abrangente, não somente um valor agregado (no caso, não estamos apenas analisando o total de pessoas em uma imagem, mas também a localização dessas pessoas). Esses métodos, em geral, funcionam bem em imagens nas quais há poucas pessoas ou onde não há uma “bagunça”, e nas quais os rostos das pessoas estão bem definidos e facilmente detectáveis (olhando aproximadamente em direção à câmera, sem muitos adereços que possam dificultar sua detecção, com qualidade razoável etc.). Logo, em imagens mais gerais e com maior número de pessoas, não costuma ser o método ideal.
2 - Métodos baseados em regressão
Estes estão atualmente entre os mais utilizados para a contagem de multidões. De forma simplificada, eles funcionam inicialmente com a demarcação da região de interesse da imagem, onde se encontram as pessoas a se contar, e a partir daí as low-level features são extraídas, tais como arestas e contornos. Com isso, modelos de regressão são criados de forma a estabelecer uma relação entre essas características e o número de pessoas na imagem.
3 — Métodos baseados em estimação de densidade
Conforme o próprio nome sugere, utilizam estimadores de densidade aplicados à imagem de forma a obter uma relação entre as características da imagem e sua densidade local. A partir desse mapa de densidade ao longo da imagem, o número de pessoas pode ser estimado.
4 — Métodos baseados em redes neurais (deep learning)
Chegamos à classe dos métodos mais em alta nos últimos anos. Os métodos baseados em redes neurais, ou deep learning têm sido utilizados para a contagem de multidões com bastante sucesso. Em se tratando de redes neurais aplicadas a imagens, os métodos mais eficientes utilizam algoritmos de convolução, também conhecidos por Convolutional Neural Networks, popularmente conhecidos por CNN. As redes neurais convolucionais, basicamente, têm todo o processo embutido em seu funcionamento, desde a extração das low-level features até o resultado final, que é basicamente um número que dá a estimativa da contagem de pessoas.
Redes Neurais Convolucionais
A operação de convolução no contexto de redes neurais tem basicamente duas entradas principais: uma representação da imagem, que pode ser, por exemplo, os valores RGB, e um filtro, que é aplicado ao longo dessa imagem. Dependendo do problema, o pré-tratamento na imagem pode ser tão importante quanto a arquitetura da própria rede neural, pois diferentes features serão geradas, contendo maior ou menor nível de informação relevante para a solução do problema em questão. O filtro, de forma resumida, é representado por uma matriz de valores que será aplicada de forma sistemática à matriz de representação da imagem a fim de, ao final do processo, obter uma nova matriz, que poderá conter novas informações úteis para o problema.
A animação abaixo ilustra a operação de convolução:
Acima, temos a imagem a ser tratada representada pela matriz de cor azul, que pode ser, por exemplo, os valores da cor verde do espectro em sua representação RGB. A matriz cinza que se movimenta representa o filtro, aplicado às diferentes regiões da imagem de forma sistemática, e a matriz verde é a matriz resultante da aplicação desse filtro: o resultado da operação de convolução. Abaixo, temos um exemplo da operação sendo realizada de forma que a matriz resultante da operação de convolução é obtida a partir da multiplicação dos valores do filtro com os valores da matriz.
Há diversos detalhes para os parâmetros de uma convolução que deixaremos de lado neste texto, por não ser o objetivo desta publicação, mas que podem ser encontrados facilmente na internet ou nas referências abaixo.
Podemos ver um exemplo de filtro abaixo. Quando aplicado a uma imagem, ele faz com que suas linhas verticais sejam realçadas.
Para fins de aplicação dessas redes na contagem de multidões, utilizamos neste post a arquitetura descrita em CSRNET: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes. Nesse artigo, os autores propuseram a utilização de uma rede neural convolucional dilatada, na qual a operação de convolução se diferencia levemente em relação à operação tradicional de convolução apresentada acima. A implementação dessa rede utilizou a biblioteca PyTorch e foi baseada neste repositório. Para a implementação do código, foi utilizado o Google Colab, onde é possível utilizar GPUs para realizar toda a computação paralela necessária com auxílio da plataforma CUDA. O conjunto de imagens utilizadas para treinamento e teste da rede neural foi o ShanghaiTech, que foi inclusive um dos conjuntos de dados utilizados pelos autores no artigo. Esse conjunto contém quase 1200 imagens, todas com informação do real do número de pessoas que, somadas, ultrapassam o número de 330.000. Parte dessas imagens foi reservada para o treinamento da rede e parte separada para que pudesse ser feita a validação via imagens que a rede não tivesse visto durante o treinamento. Foram utilizadas 400 épocas de treinamento para a obtenção dos dados aqui apresentados.
Resultados
Abaixo podemos ver que no conjunto de dados podem ser encontradas imagens bastante diversas, tanto em relação ao número de pessoas, à qualidade da imagem, ao ângulo de captura, à presença ou ausência de objetos próximos às pessoas, além de imagens totalmente congestionadas de pessoas e outras em que as pessoas estão mais concentradas em determinadas regiões. É importante esclarecer que a qualidade das previsões depende fortemente do que a rede neural foi treinada para “aprender”, ou seja, se desejamos obter boas estimativas para as mais diversas condições, devemos utilizar como treinamento imagens com tais características. Quanto mais alimentarmos uma rede neural com dados para uma aplicação específica, mais ela será especializada e trará resultados melhores para aquela tarefa. Consequentemente, menor será seu poder de generalizar aquela tarefa para condições que fujam muito do que foi “ensinado” a ela. Como exemplo, se treinarmos uma rede neural somente com imagens contendo um número muito alto de pessoas, ao mesmo tempo em que ela poderá chegar a um nível muito bom de estimativa para estas condições, esta mesma rede poderá produzir resultados não tão precisos para imagens com um número pequeno de pessoas. Por isso, é importante ter o conhecimento tanto para selecionar o melhor método para o propósito da solução de um problema, como utilizar dados de treinamento da rede coerentes com a tarefa a ser resolvida.
As imagens acima, por exemplo, diferem na quantidade de pessoas, em qualidade, em proporção e a na própria distribuição. O resultado da rede, neste caso, foi muito melhor para a imagem da direita, embora para o caso da esquerda o resultado seja provavelmente muito melhor do que qualquer tipo de contagem ou estimativa analógica.
Abaixo, vemos dois exemplos completamente diferentes daqueles acima, onde à esquerda, o ângulo de captura é bastante inclinado, sendo, portanto, capaz de capturar um número maior de pessoas, mas ao mesmo dificultando a detecção dessas pessoas, já que a falta de nitidez fica cada vez maior conforme entramos na perspectiva da imagem. Neste caso, o erro do resultado da rede neural beira 25%. Na imagem à direita, além do número de pessoas ser muito menor, a detecção é mais fácil, inclusive para nós humanos, dado que há uma maior nitidez de cada um dos presentes. Aqui, a rede neural faz um excelente trabalho, com um erro inferior a 0,5%.
Conclusão
Apesar do poder que essas redes têm, ainda assim não existe um método que consiga resultados perfeitos para qualquer tipo de situação. Ainda assim, podemos concluir que a contagem de pessoas em uma multidão pode trazer resultados bastante interessantes com o uso das redes neurais convolucionais.
Referências
- CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes
- Intuitively Understanding Convolutions for Deep Learning
- It’s a Record-Breaking Crowd! A Must-Read Tutorial to Build your First Crowd Counting Model using Deep Learning
- Comparing different crowd counting methods
- Dense and Sparse Crowd Counting Methods and Techniques: A Review