
Compartilhar:
Misha é um Engenheiro de Soluções para Clientes na Vonage, onde se dedica ao desenvolvimento da Video API. Depois de trocar a agitação de São Francisco pelo charme de Milwaukee, em Wisconsin, ele agora passa seu tempo livre descobrindo as joias escondidas do Meio-Oeste.
Detecção de pessoas em tempo real com o OpenCV
Esta postagem no blog mostrará como montar sua própria câmera de vídeo “inteligente”. Ela explicará como capturar uma imagem do enquadramento de uma webcam, detectar se há uma pessoa no enquadramento e enviar um SMS por meio das APIs de comunicação da Vonage para notificá-lo sobre possíveis ameaças.
Introdução
Essa ideia me ocorreu depois que a casa dos meus pais foi assaltada. Eles moram em um local remoto, sem câmeras de segurança, e a polícia nunca conseguiu identificar quem cometeu o crime. Depois disso, meus pais decidiram equipar a casa com alguns dispositivos de segurança. Na época, eu era estudante universitário, então decidi assumir a responsabilidade de usar meus conhecimentos para montar um sistema de segurança para eles.
Fique à vontade para entrar em contato comigo, pois já desenvolvi isso completamente até se tornar um protótipo funcional que já foi utilizado pela minha família!
Requisitos de hardware
Você precisará usar um Raspberry Pi (eu usei um Raspberry Pi 2), uma câmera do Raspberry Pie uma câmera de segurança “falsa”.
Pré-requisitos
Para montar este projeto, você precisará dos seguintes itens, além do hardware:
Account das APIs de comunicação da Vonage (anteriormente conhecida como Nexmo)
SMS da Vonage documentação
O Algoritmo de Detecção de Objetos
Neste tutorial, utilizaremos o classificador de Haar. Trata-se de um método eficaz de detecção de objetos desenvolvido por Paul Viola e Michael Jones em seu artigo de 2001, intitulado “Rapid Object Detection using a Boosted Cascade of Simple Features”.
Inicialmente, o algoritmo precisa de muitas imagens positivas (no nosso caso, imagens de várias pessoas) e imagens negativas (imagens que não contenham uma pessoa no quadro) para treinar o classificador.
A partir daí, precisamos extrair certas características do classificador. Cada característica é um único valor obtido pela subtração da soma dos pixels sob o retângulo branco da soma dos pixels sob o triângulo preto.
Leia mais sobre o Classificador em Cascata e o algoritmo por trás dele neste artigo sobre o OpenCV: Classificador em Cascata.
Implementação
No seu Raspberry Pi, crie um novo arquivo Python e importe todas as bibliotecas necessárias usando as seguintes instruções de importação:
import cv2
import nexmo
import timeEssas bibliotecas são usadas para detectar pessoas, informar os usuários sobre as pessoas detectadas e calcular a diferença de tempo entre as mensagens enviadas.
Depois disso, precisaremos começar a gravar o Video com a câmera disponível:
video_captured = cv2.VideoCapture(0)Especificar 0 no parâmetro acima significa que usaremos a primeira câmera de vídeo disponível — normalmente, há apenas uma disponível, mas se você tiver uma câmera externa conectada, poderá especificar qual fluxo usar passando o parâmetro apropriado para o VideoCapture.
Agora, vamos inicializar o cliente SMS da API da Vonage. Para isso, você precisará da sua chave de API e do seu segredo, que podem ser encontrados no painel da conta da API da Vonage que você criou:
client_nexmo = nexmo.Client(key=’your_project_key’, secret=’your_secret_key’)Em seguida, carregaremos o classificador já pré-treinado. O classificador utilizado neste tutorial pode ser acessado seguindo o link e baixando o classificador que você deseja usar em seu projeto.
Vamos usar o haarcascade_fullbody.xml classificador.
Para fins de teste e para facilitar a inclusão de capturas de tela adequadas, utilizei o haarcascade_frontalface_default.xml classificador no meu repositório de exemplo, mas o haarcascade_fullbody.xml classificador é o mais adequado para o caso de uso de câmeras de segurança.
classifier = cv2.CascadeClassifier('haarcascade/haarcascade_fullbody.xml')A maior parte da detecção ocorre no trecho de código a seguir:
while (True):
# read frame-by-frame
ret, frame = video_captured.read()
# set the frame to gray as we do not need color, save up the resources
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# pass the frame to the classifier
persons_detected = classifier.detectMultiScale(gray_frame, 1.3, 5)
# check if people were detected on the frame
try:
human_count = persons_detected.shape[0]
else:
human_count = 0
# extract boxes so we can visualize things better
# for actual deployment with hardware, not needed
for (x, y, w, h) in persons_detected:
cv2.rectangle(frame, (x,y), (x+w, y+h), (255, 0, 0), 2)
cv2.imshow('Video footage', frame)
if (cv2.waitKey(1) & 0xFF == ord('q')):
break
Lemos cada quadro do nosso fluxo de Video capturado. Também é uma boa ideia convertê-lo para escala de cinza para economizar recursos. Feito isso, passamos o quadro para o classificador para verificar se há uma pessoa detectada. Se for esse o caso, um retângulo é desenhado no quadro ao redor da pessoa detectada.
Veja abaixo um exemplo de como meu rosto foi detectado:
Example below of my face being detected
Se você carregar um classificador diferente, como upperbody.xml ou fullbody.xml, você poderá usar o mesmo código para a detecção.
Observe que o classificador de corpo inteiro só reconhece a pessoa no quadro se todo o corpo estiver dentro dele. Apenas o rosto e/ou a parte superior do corpo não seriam suficientes. O mesmo vale para o classificador da parte superior do corpo — ter apenas o rosto no quadro não resultaria em uma detecção bem-sucedida.
Isso se deve a uma limitação dos classificadores fornecidos pelo OpenCV. Você sempre pode tentar treinar seus próprios classificadores; isso pode exigir tempo e recursos adicionais, mas é uma boa maneira de aprofundar este projeto, caso tenha interesse em aprender mais sobre esse aspecto.
Agora, vamos incorporar os recursos da SMS API da Vonage ao nosso aplicativo para que o usuário seja notificado caso seja detectada a presença de um estranho no quadro de vídeo.
Observação: É importante adicionar um intervalo a isso (especialmente durante os testes) para que o usuário não receba muitas mensagens SMS por um único evento de detecção.
No nosso exemplo, vamos usar um time.sleep(number of seconds) método para fazer isso; no entanto, fique à vontade para desenvolver seu próprio método, mais sofisticado, caso tenha um.
Adicione o código a seguir após o bloco try/else no código:
if (human_count > 0):
client_nexmo.send_message({
'from': ‘your_outbound_phone_number’,
'to': ‘your_inbound_phone_number’,
'text': 'There has been ' + str(human_count) + ' human(s) detected!',
})
A mensagem SMS só será enviada se houver pelo menos uma pessoa detectada no quadro. Para garantir que não enviemos mensagens em excesso, vamos colocar o thread em espera por cerca de cinco segundos e, em seguida, procurar a pessoa no quadro.
É isso aí! Com apenas 50 linhas de código, você já está pronto para detectar pessoas bisbilhotando sua propriedade e receber notificações convenientes quando isso acontecer, usando a SMS API da Vonage.
O código-fonte desta postagem pode ser encontrado no seguinte link do GitHub. Também incluí os classificadores Haar Cascade usados neste projeto para que você possa começar a trabalhar rapidamente.
Possíveis melhorias
É claro que ainda há muito a ser feito para tornar esse projeto mais sofisticado e eficiente.
Em primeiro lugar, o time.sleep() método implica que haja um intervalo de pelo menos cinco segundos entre a análise dos quadros, o que não é uma situação ideal e poderia ser melhorado. Também seria uma boa ideia recortar a imagem do quadro de vídeo recebida da câmera para apenas uma área específica de detecção, a fim de melhorar a eficiência da detecção — menos pixels para verificar significam detecções mais rápidas.
Referências
https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html https://github.com/opencv/opencv/tree/master/data/haarcascades
Compartilhar:
Misha é um Engenheiro de Soluções para Clientes na Vonage, onde se dedica ao desenvolvimento da Video API. Depois de trocar a agitação de São Francisco pelo charme de Milwaukee, em Wisconsin, ele agora passa seu tempo livre descobrindo as joias escondidas do Meio-Oeste.