21 marzo 2019

Detección de movimientos



Antes que todo, un Aleluya por mi buen amigo Alejandro y su generosa donación a la Benemérita Fundación Mi Billetera. Como es dinero mal habido que me quema las manos, partí de inmediato a comprar unas cervezas ¡Salud!.

Estoy muy entretenido con el asunto de las cámaras de seguridad, desde que las empecé a usar en mi proyecto con Raspberry  con una cámara web de bajo precio he ido tratando de mejorar el sistema y en el camino he aprendido muchas cosas.

La grabación contínua
El problema es el siguiente: imaginemos una cámara como las que usan en seguridad ciudadana para vigilancia, cuando yo hacía como que trabajaba en la Municipalidad de Tacna, me tocó conocer y supervisar un sistema de esos, que a primera vista parece perfecto, graba las 24 horas del día 7 días a la semana, pero tiene varios inconvenientes. El más obvio es la cantidad de espacio que se necesita para almacenar esos videos.

Si se graba en buena calidad, a 24 cuadros por segundo, el movimiento se verá fluido, pero en 24 horas se deberán almacenar 86.400 fotogramas, para que se entienda mejor hablemos de "fotos" o imágenes estáticas, porque un video es una colección de imágenes estáticas que se ven en secuencia. En resolución de 1280x920 (una buena calidad de imagen), cada foto ocupa unos 200 Kb, es decir, una grabación de buena calidad, que permita identificar una cara por ejemplo, cada 24 horas necesita uns 17 gigabytes de disco (si la neurona no me falla), o sea unos 510 Gigabytes por mes.

Esa cantidad masiva de espacio nos limita el tiempo que podemos mantener guardadas las imágenes. Supongamos que se comete un delito y en tres meses más el tribunal ordena el registro de la cámara de seguridad, es probable que este ya no exista, porque los videos deben borrarse cada cierto tiempo. Además tenemos muchas horas de la noche por ejemplo, donde no hay ningún movimiento y la grabación es inútil. Sin embargo sabemos que en la noche es cuando ocurren más delitos...

La detección del movimiento
Existe otro problema peor y es que la grabación continua nos obliga a tener una vigilancia humana continua ¿que pasa si se produce un delito y nadie se da cuenta aunque quede registrado el video, no es razonable tener a alguien las 24 horas revisando los videos, en los que muy rara vez habrá un segmento de 20 o 30 segundos que vale la pena registrar. La solución a este problema es el software de detección de movimiento.

Este software no necesita sensores ni nada de eso y aunque parece sofistcado, su principio de funcionamiento es muy sencillo: simplemente compara fotogramas consecutivos que va captando la cámara: si un fotograma es igual (o muy parecido) al anterior, entonces no graba, si hay diferencia entre ambos entonces empieza a grabar, hasta ue llega el momento que detecta dos fotogramas iguales, entonces deja pasar una cierta cantidad (digamos unos 5) y detiene la grabación. Y así sigue comparando, cuando encuentra diferencias, graba, cuando no hay diferencias no graba.

El problema del movimiento
Esta idea maravillosamente simple ha sido implementada en muchos software, el más famoso es Motion y sus secuelas, MotionEye y MotionEyeOS. Existen otros sistemas comerciales que graban detectando movimiento como Xeoma y Axxon y son básicamente lo mismo, aunque tienen algunas características adicionales para necesidades más específicas.

En teoría, detectar el movimiento debería ser sencillo, pero el diablo está en los detalles. El primer problema son los "falso-positivos". Por ejemplo en mi calle hay una bolsa que la mueve el viento, y pueden pasar horas grabando eso, miren




El cuadro rojo muestra el área donde detecta el movimiento. Para estos movimientos pequeños una solución es bajar la "sensibilidad" de la detección, es decir que no grabe hasta que los cambios entre dos fotogramas sean, por ejemplo, del 5%. Esto puede producir el otro problema: que  un movimieto pequeño pero significativo no dispare la grabación, y así vemos que la figura que se mueve "aparece" de la nada o que la grabación se interrumpe antes de tiempo



Otras veces por malas condiciones de uz o poca calidad de la cámara, no solo se corta antes de tiempo sino que no es posible distinguir las caras




Una detección de movimiento bien ajustada debe producir un video que registre el movimiento completo, ya sea de un vehículo



O de una persona


No es fácil conseguir una buena detección de movimiento porque son muchos los factores que influyen, hay un largo trabajo de prueba y error. Para mejorar la detección podemos por ejemplo bajar el framerrate (la cantidad de pictogramas por segundo) por ejemplo a unos 11, a esa velocidad están los videos que muestro en esta entrada y eso también achica el tamaño de los archivos, pero hace que el movimiento se vea más "saltón" y menos fluido, como esas películas de principios del Siglo XX.

También influyen las condiciones de luz, la calidad de la cámara, el ajuste del brillo, contraste, tinte y saturación. Para eliminar los falsos positivos podemos definir "máscaras" es decir pintamos áreas donde le decimos al software que no compare movimiento, aunque lo detecte, también podemos jugar con la sensibilidad y filtro de ruido. He leído bastantes comentarios de los usuarios de estos sistemas y ninguno ha encontrado el ajuste perfecto, parece que siempre habr´que aceptar cierto rango de error, en todo casoo es preferible tener falsos positivos que perderse grabaciones que podrían ser importantes.

En fin, estoy recién empezando en esto, me parece un asunto bien entretenido, útil y barato de implementar. En al medida que tenga plata voy a ir comprando mejores cámaras y cosas por el estilo, por ahora la cosa va bastante bien.


9 comentarios:

  1. ...una condición podría ser, si es que es programable, que si la posición y forma del " cuadro rojo" no varía en X tiempo, deje de grabar. Los efectos del viento agitando cosas, luces que titilan, perros echados o borrachos durmiendo en la vereda es que acotan el área de movimiento a lo mismo. Mientras que acciones que afectan la seguridad implican algún tipo de desplazamiento más amplio y variado. Uls

    ResponderBorrar
  2. Lamentablemente no es programable Ulschmidt y dudo que lo sea en e futuro, toda la posible programación se hace cambiando los controles de configuración, que serían los parámetros con que trabaja el detector de movimiento.

    Existe un recurso que sirve para muchos de los casos que mencionas que es la "máscara", es decir uno pinta una zona donde el control de movimiento simplemente no opera, es decir uno puede definir zonas "muertas" ara el detector, en un control bastante fino.

    El cuadro rojo también es opcional e indica, solo aproximadamente, cual es el área donde se detectó la diferencia, es decir el movimiento, tmbién sirve para saber si está grabando o no, para eso es muy útil. Cuando no hay movimiento no hay cuadro rojo, el cuadro es un indicador que los fotogramas cambiaron.

    El problema de fondo es que dos fotogramas consecutivos pueden variar o no en un determinado porcentaje por muchas causas distintas al movimiento y para muchas de esas "fuentes de ruido" hay filtros (cambio repentino de luces, ruido eléctrico, etc.) también influye mucho la calidad de la cámara, la mía es prácticamente de juguete, la compré en US$ 3.80

    ResponderBorrar
  3. Para ser tan barata, la cámara tiene buena resolución y buen framerate, da hasta casi 30 fps. Pero donde se cae es en el balance de blancos y en el poco manejo del contraste, eso es típico de toda cámara barata que en lugares donde hay sol y sombra oscurece exageradamente la sombra y "quema" todas las áreas donde da el sol.

    El efecto de mal balance de blancos se ve en el tinte anaranjado oazul que toman las imágenes

    ResponderBorrar
  4. Excelente artículo!! Lo interesante es que hoy el almacenamiento no es tema, por lo que podrías almacenar gigas y gigas sin problemas, mejorando ostensiblemente la calidad de la imagen. Ahí viene el desafío; una súper cámara y muchos gigas... ¿cual es la mejor técnica o combinación de estas para optimizar la detección de movimiento? Un abrazo!

    ResponderBorrar
  5. Justamente John, el almacenamiento no es tema por capacidad, ni siquiera para aplicaciones caseras porque por ejemplo con el mismo Motion se puede almacenar en la nube por ejemplo, via FTP y es fácil tener 20 o más GB gratis en Google, Dropbox, etc.

    Pero si es un problema si se graba TODO que hay que revisarlo, entonces debes tener a una persona (o varias) mirando horas y horas de video "inerte", donde no pasa nada. A mi me tocó ver este problema en Tacna, con las cámaras de seguridad ciudadana, ahora tienen una gran central con muchos monitores, pero cuando yo conocí el sistema era incipiente, habían solo 8 o 10 cámaras y ea un gran problema revisarlas. Resulta que el vigilante se "hipnotiza" cuando pasa horas mirando una cámara y después de un tiempo deja de ser eficiente.

    La idea de detectar solo el movimiento es tener un "digest" de video, que capte solo lo relevante, cosa que se puedan eviras de manera rápida y encontrar imágenes relevantes, algo así a como Google encuentra el contenido rápidamente indexando los textos.

    El problema no es tanto guardar todo, sino guardar solo lo relevante y poder encontrar la secuencia que nos interesa con rapidez.Porejemplo en los videos de mi casa se graban entre 200 y 300 secuencias de unos pocos segundos cada día, entonces yo las puedo revisar rápidamente dando un vistazo alas "miniaturas" de cada video, que dan una idea de que se trata, creo que esa es la parte mas relevante.

    Actualmente hay cámaras muybuenas, capaces de detectar nfrarojo y con una gran resolución, balance de blancos y todo eso por menos de 100 dólares, una cámara profesional debe andar por los 100 dólares más o menos. Otra cosa que voy a probar cuando tenga lucas es con cámaras IP que no necesitan cable para conectarse a la Raspberry, eso da mucha mas flexibilidad.

    La detección óptima de movimiento es un trabajo de ajuste de muchas cosas, pruba y error que cambia según las condiciones. No es lo mismo por ejemplo en una calle tranquila como mi casa que en un lugar con mucho movimiento, por ejemplo un supermercado, donde los falso-positivo son más abundantes.

    Ah, y también está el tema de subir el streaming y poder hacer toda la optimización a través de la web, eso también tiene sus problemas de seguridad, porque uno tiene que abrir puertos en la red privada. Hay mucho para experimentar en todo eso.

    ResponderBorrar
  6. Tomas, video no comprimido ocupa harto ancho de banda. No se nota con la conexión USB pero enviado por red hay varias cosas para tomar en cuenta. El formato básico, MJPEG, de una sola cámara puede fácilmente ocupar 10Mb/s según framerate y resolución. Las cámaras modernas IP emplean codec H.264 y 265 para solucionar el problema logrando una imagen adecuada con 1-2 Mb/s, pero el cpu cliente tiene mas trabajo decodificando el imagen, sobre todo cuando hay ruido o mucho movimiento. Aquí hay una calculadora: http://www.stardot.com/bandwidth-and-storage-calculator

    ResponderBorrar
  7. Hola John, leyendo tu blog es que me interesé en el asunto de las cámaras!

    Las cámaras usb más baratas codifican en MPG, H.264 o5 que parece que ya es un estandar, ya casi no veo en AVI u otros formatos, yo estuve viendo ayer una cámara profesional Sony de las que usan las mineras, con un alcance muy grande y gran resolución, usa cable coaxial para conectarlo al DVD, no ceo que sirva mucho para vigilancia casera, la misma cámara es un anzuelo para que se la roben, lo mismo con muchas cámaras IP.

    Estoy tentado por comprar una de esas cámaras IP disfrazadas de ampolleta LED, parecen bastante bien al menos las pruebas que he visto n Youtube.

    Muy buena la calculadora! supongo que eso es para grabación continua 24x7 para instalar en casas yo descartaría eso, no me imagino pasar horas revisando los videos.

    Mi sistema casero en 2 días lleva ocupado 4.2 GB en total, lo tengo seteado a resolución 1280x920 (debe hacer una interpolación feroz, pero permite reconocer caras más o menos bien) a 11 fps. Lo bueno de la cámara USB sobre la IP es que no me ocupa ancho de banda de mi conexión, aparte del ancho que ocupa el Wifi de la raspberry que es prácticamente nada. No se como será con 2 o 3 cámaras más simultáneamente, pero con una cámara, no hace diferencia en la velocidad de mi red. Cuando tenga más cámaras lo probaré.

    Creo que la resolución no es un gran problema pero si la óptica de la cámara y su balance de blancos, me parece que eso es lo que más distorsiona en una cámara de US$ 3.80

    ResponderBorrar
  8. Ah, pensar que durante la 2da guerra una propuesta para las bombas autodirigidas era acostumbrar una paloma a reconocer la figura de un barco y picar sobre ella en una pantalla - luego encerrar la paloma en el cohete y dejarla que dirija el ataque.

    ResponderBorrar
  9. jaja los gloriosos tiempos de la tecnología analógica ¡la paloma kamikase!

    supongo que los chiflados animalistas hoy pondrían el grito en el cielo jaja

    ResponderBorrar

"Send me a postcard, drop me a line
Stating point of view
Indicate precisely what you mean to say
Yours sincerely, wasting away
Give me your answer, fill in a form
Mine for evermore
Will you still need me, will you still feed me
When I'm sixty-four"