Full text
i Equation Chapter 1 Section 1 Proyecto Fin de Grado Grado en Ingeniería Robótica, Electrónica y Mecatrónica Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Autor: Juan Salinas Hernández Tutor: Rubén Martín Clemente Dpto. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020
Índice de Tablas ii
iii iii Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Proyecto Fin de Grado Grado en Ingeniería Electrónica, Robótica y Mecatrónica Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Autor: Juan Salinas Hernández Tutor: Rubén Martín Clemente Profesor titular Dpto. de Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2020
Índice de Tablas iv
v v Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Proyecto Fin de Grado: Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Autor: Juan Salinas Hernández Tutor: Rubén Martín Clemente El tribunal nombrado para juzgar el Proyecto arriba indicado, compuesto por los siguientes miembros: Presidente: Vocales: Secretario: Acuerdan otorgarle la calificación de: Sevilla, 2020 El Secretario del Tribunal
Índice de Tablas vi
vii vii Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas A mis padres
Índice de Tablas viii
ix ix Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Agradecimientos A mi familia, mi padre, mi madre y mi hermano, no sólo por su apoyo anímico y económico, sino por ser referentes constantes en mi vida. Les debo mis éxitos, presentes y futuros, serían imposibles sin ellos. A mis amigos de siempre, que me acompañáis desde que tengo uso de razón y con los que sé que siempre puedo contar. Gracias por vuestro inconmensurable apoyo. A mis compañeros de carrera, amigos todos, por su gran calidad humana y estar siempre dispuestos a ayudar al grupo. Los largos días de universidad y estudio no hubiesen sido igual sin vosotros. A Alejandra, esa persona siempre dispuesta a escucharme y soportarme en esos momentos en los que nada parece salir bien, por ser capaz de ayudarme y sacarme una sonrisa siempre. Finalmente, a esos profesores que han demostrado entrega y vocación por nuestro aprendizaje, y que han conseguido despertar cada día más nuestro interés por la ingeniería. Principalmente a mi tutor Rubén, que a pesar de los tiempos raros y complicados que hemos vivido recientemente, se ha sabido adapatar y persistir con su ayuda desde la distancia. Juan Salinas Hernández Sevilla, 2020
Índice de Tablas xvi ÍNDICE DE TABLAS Tabla 5.1 Frames y tiempos de procesamiento de cada video 35 Tabla 5.2 Tiempo corriendo de los jugadores 4 y 12 del video 1 38
xvii xvii Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas
Índice de Figuras xviii ÍNDICE DE FIGURAS Ilustración 1.1 Sistema de visión del ojo de halcón 4 Ilustración 2.1 Extracción del fondo con condición de color 5 Ilustración 2.2 Aplicación filtro de Sobel 7 Ilustración 2.3 Extracción con filtro de Sobel y condición de color 7 Ilustración 2.4 Ejemplo de dilatación, erosión, cerrado y apertura 8 Ilustración 2.5 Máscara del terreno de juego 9 Ilustración 2.6 Medidad tranformada de Hough [8] 9 Ilustración 2.7 Espacio de Hough [8] 10 Ilustración 2.8 Detección de rectas con transformada de Hough 10 Ilustración 2.9 Problema corte de jugasdores 11 Ilustración 2.10 Resolución corte de jugadores 11 Ilustración 2.10 Detección de jugadores 12 Ilustración 3.1 Medida de posición 15 Ilustración 3.2 Posición en el siguiente instante 16 Ilustración 3.3 Predicción con velocidad aleatoria 16 Ilustración 4.3 Implementación filtro de Kalman en Matlab 19 Ilustración 5.1 Detecciones de jugadores por frame 26 Ilustración 5.2 Falsos positivos en video 2 26 Ilustración 5.3 Faslo positivo del algoritmo de detección 27 Ilustración 5.4 Falso positivo por predicción del Filtro de Kalman 27 Ilustración 5.5 Secuencia predición de Kalman 27 Ilustración 5.6 Secuencia de oclusión del balón 28 Ilustración 5.7 Secuencia predicción de Kalman ante oclusión del balón 28 Ilustración 5.8 Imagen binarizada de juagadores en contacto 29 Ilustración 5.9 Resultado del filtro de Kalman en oclusión de jugadores 29 Ilustración 5.10 Detección ante 7 jugadores juntos 30 Ilustración 5.11 Detección de jugadores juntos en instantes posteriores 30 Ilustración 5.12 Ejemplo de iluminación no homogénea 31 Ilustración 5.13 Problemática de transformada de Hough ante jugadores cercanos 32 Ilustración 5.14 Tranformada de Hough sobre jugadores con línea discontinua 32 Ilustración 5.15 Varios jugadores sobre línea del terreno de juego 33 Ilustración 5.16 Fallo de correspondencia por predicciones imprecisas 33 Ilustración 5.17 Jugadores detectados al inicio y a lo largo del video 34 Ilustración 5.18 FPS de procesamiento por video 35
xix xix Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Ilustración 5.19 Mapa de calor del jugador 4 y 12 del video 1 37 Ilustración 5.20 Velocidad de los jugadores 4 y 12 del video 1 37 Ilustración 6.1 Procesado de jugada de rugby 40
Índice de Figuras xx
1 1 INTRODUCCIÓN n este capítulo se explicará de forma general las principales disciplinas científicas en las que se basarán el proyecto, poniéndolas en contexto y detallando su uso y alcance actual. Además, se definirá y acotará el objetivo concreto de este proyecto, exponiendo también los resultados que se esperan del mismo. Finalmente, se contextualizará con trabajos previos ya implementados en la industria y en el ámbito en el que se enfoca el proyecto. 1.1 Visión por computador La visión por computador es una disciplina científica que incluye métodos para adquirir, procesar, analizar y comprender las imágenes del mundo real con el fin de producir información numérica o simbólica para que puedan ser tratados por un ordenador [1]. Esta disciplina comenzó en la década de los 60, con el objetivo de emular la forma en la que los humanos reconocemos nuestro entorno para así dotar de inteligencia a una máquina. Uno de los primeros investigadores de los que se tiene constancia en estudiar esta disciplina es Larry Roberts, considerado uno de los padres de internet. El objetivo de su investigación fue el de extraer información 3D a partir de imágenes 2D, de forma que pudiera ver distintas perspectivas de un sólido. Esto lo consiguió captando diferentes imágenes de un bloque, y, procesándolas posteriormente para detector bordes según cambios bruscos en la intensidad de grises [2]. Desde entonces, esta rama ha seguido evolucionando, sobre todo en las últimas, debido a los grandes avances tanto en la captación de imágenes, consiguiendo cada vez mayor calidad y cantidad de información, con equipos más pequeños y ligeros, como en el postprocesado, contando con equipo de una gran capacidad de computación. Como en gran cantidad de avances tecnológicos, en la visión por computador se ha tratado de aprender de la propia naturaleza, en cómo vemos los seres humanos, y posteriormente tratar de emularla con la tecnología que disponemos. Como sabemos, el ojo es el órgano que nos dota del sentido de la vista, sobre el cual incide la luz provocando una serie de impulsos nerviosos en la retina. Esto es gracias a nuestros foto-receptores, los conos y los bastones. Los conos son células sensibles a los colores, de forma que existen tres tipos de conos, cada uno sensibles a una longitud de onda distinta, las correspondientes a los colores rojo, verde y azul. Por otro lado, los bastones serán células sensibles a la intensidad de luz, es decir el brillo. El encargado de emular este funcionamiento en el ámbito de la visión artificial son las cámaras y sensores ópticos, de forma que disponemos de una serie de fotodiodos dispuestos en matriz, cada uno capaz de capar la intensidad para los colores rojo, verde o azul, y posteriormente almacenando una carga correspondiente a los fotones incidentes. Esta imagen es posteriormente digitalizada y procesada por un procesador. Como vemos, la visión por computador tiene gran cantidad de aplicaciones en distintos ámbitos, como puede ser la edición y filtrado para el ámbito fotográfico, la capacidad de dotar de percepción a un robot para que pueda tomar decisiones en consecuencia en el ámbito de la robótica, manipulación de objetos en la industria, realizar un diagnóstico por medio de una imagen en el ámbito de la medicina, tomar y recomponer imágenes tomadas por un satélite en el ámbito de la astronomía, vigilancia automática en el ámbito de la seguridad o capacidad de detectar vehículos y leer matrículas para el control del tráfico. Su misión principal en todos ellos es la de hacer más comprensibles para el ser humano las imágenes captadas y, sobre todo, extraer la mayor cantidad de información de ellas de cara a poder automatizar al máximo nivel posible distintos procesos. En todos estos ámbitos, y otros más que no se han nombrado, la visión artificial está jugando un importante siendo una de las principales ramas a investigar para los futuros avances tecnológicos. Además de estar presente en muchos ámbitos, la visión también tiene una gran cantidad de campos con los que está relacionado y en los que se basa. Como uno de los principales relacionados tenemos la inteligencia artificial, ya que, por un lado, la visión ayuda a la extracción de características con los que formar los datasets con los que entrenar los distintos algoritmos y redes neuronales, y por otro lado la visión se ayuda de la inteligencia artificial para la detección automática de ciertos elementos o patrones en una imagen, como por ejemplo el E
Introducción 2 2 reconocimiento facial. Otro campo en el cual también se basa de forma directa la visión artificial es el de procesamiento de señales ya que, gran parte de los métodos usados para procesar señales de una variable, se extienden de manera natural a señales de dos variables o multivariable que forman la visión. Por otro lado, tenemos la optoelectrónica, de la que se depende directamente ya que es la encargada de fabricar los distintos sensores con los que captamos las imágenes, de forma que ayuda con la investigación de distintos tipos de sensores que se ajusten a las características concretas que se deseen para determinada aplicación. Finalmente, también hay que destacar la aportación de la ciencia de computación, ya que el procesamiento de las imágenes conlleva un gran costo computacional, teniendo que operar sobre miles de píxeles por frame, y muchas veces, con la necesidad de procesar dichos frames a tiempo real, cosa que sería impensable sin los equipos actuales. 1.2 Objetivos Tras exponer las bases de la visión por computador y los distintos ámbitos en los que puede actuar, pasamos a explicar la función que tendrá en este proyecto, y establecer la estructura que tendrá. Como hemos visto en el apartado anterior, la visión por computador tiene infinidad de aplicaciones, muchas de ellas orientadas a poder automatizar una tarea para la que antes se necesitaba de la dedicación de una o más personas. El caso ante el que nos enfrentamos tiene la misma intención. La función del programa que desarrollaremos será la detección y seguimiento automática de los jugadores a partir de las imágenes que ya se obtienen para las retransmisiones deportivas. Esta tecnología pretende ser útil para realizar las distintas estadísticas referentes al juego, como puede ser distancia recorrida por los jugadores, mapas de calor según la zona en la que se haya movido el jugador, porcentajes de posesión por equipo… Existen gran cantidad de estadísticas que pueden ser automatizadas tan solo con las imágenes captadas por las distintas cámaras, y obtenerlas a tiempo real, lo cual es muy interesante tanto por el lado del espectador, que puede conocer las estadísticas al instante según sucede el partido, como por parte del cuerpo técnico, ya que pueden contar con valiosa información para la toma de decisiones. Además, también ayudará al posterior análisis de los partidos, tanto del propio equipo para estudiar en que aspectos mejorar, como en el estudio del equipo contrario, para comprobar su estilo de juego y ver las posibles debilidades del equipo, muy útil en un mundo deportivo en el que los datos y su análisis juegan cada vez un papel más importante. También hay que destacar que el método propuesto es poco intrusivo con el juego, ya que es aplicable con la tecnología y cámaras que ya se usan en los eventos deportivos profesionales, y no tiene ninguna repercusión ni lastre en la actuación de los atletas, como si pudieran ser otros métodos aplicados como equipar al propio atleta de sensores como ya se hace para recopilar otra serie de parámetros, sobre todo en este caso usados para parametrizar el estado físico del deportista. Para todo esto, tendremos los siguientes objetivos por pasos: 1. Detección de la pelota 2. Detección de los jugadores 3. Seguimiento de ambos con filtro del Kalman Para todo esto aplicaremos una sucesión de técnicas existentes usadas en este ámbito, como puede ser la eliminación del fondo según unos márgenes en las intensidades de los colores RGB, el gradiente de Sobel para la detección de elementos en una imagen, la transformada de Hough para la detección de rectas, el filtro de Kalman, y otras técnicas morfológicas. En consecuencia, el objetivo será aplicar todas estas técnicas de la forma correcta, definiendo los parámetros concretos que se ajusten a los mejores resultados posibles, con la intención de poder comprobar su bondad para la aplicación que se pretende que desempeñe. Para esto, estudiaremos cuánto tiempo es capaz nuestro programa de realizar el seguimiento de forma acertada, comprobando la cantidad de falsos positivos y falsos negativos que obtenemos, y mediremos cómo de efectiva es la predicción del filtro de Kalman según la posición real del jugador. También atenderemos al coste computacional que todo esto requiere, de forma que podamos valorar las capacidades del programar para actuar en tiempo real o no. Una vez ajustados todos estos a los resultados, usaremos estos datos para calcular algunas estadísticas de forma automática, a modo de ejemplo del alcance y potencial que pueden tener estas técnicas aplicadas en casos reales.
3 3 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas 1.3 Herramientas Para facilitar esta tarea, usaremos la libraría OpenCV. Esta librería (Open Source Computer Vision), es una librería de Código abierto dedicada a la visión por computador y al aprendizaje automático, de forma que contiene más de 2500 funciones de algoritmos optimizados, entre los que se incluyen las técnicas más clásicas usadas en la industria. Estos algoritmos pueden usarse para detectar y reconocer caras, identificar objetos, clasificar acciones de personas en videos, seguir el movimiento de objetos, extraer modelos 3D de objetos, etc. Esta es una librería muy usada en empresas, grupos de investigación, por cuerpos gubernamentales y en toda la industria en general [3]. Además, esta librería estará implementada en diversos lenguajes como C++, Python, Java y MATLAB. Para este proyecto concreto usaremos Python. El lenguaje escogido es Python, en primer lugar, debido a mi conocimiento y manejo previo del lenguaje, y, en segundo lugar, porque es un lenguaje muy usado para tareas de este tipo, donde OpenCV está implementado y en el que funciona con una eficiencia más que correcta. Además de OpenCV, otras de las librerías que se usarán para leer las imágenes y videos será la creada por Adrian Rosebrock y publicada por medio de su blog de divulgación de visión por computador e inteligencia artificial, PyImageSearch. Esta será la libraría imutils.video, que usaremos para capturar cada uno de los frames de los videos que procesemos, en lugar del método implementado en OpenCV, ya que nos soluciona varios problemas, sobre todo en lo que respecta a velocidad y eficiencia. Esta función implementa sus procesos por medio de hilos, de forma que puede mejorar el procesamiento del pipeline hasta un 52% [6]. Finalmente se hará uso de otras librerías como argparse, con la que podremos introducir algunos argumentos por la línea de comandos, de forma que podamos modificar algunos parámetros como el video a leer o el modo del programa sin necesidad de realizar ningún cambio en la programación. Además, usaremos otras librerías de uso común como pueden ser numpy, time y math, para diversas operaciones necesarias a lo largo del programa. 1.4 Estado del arte Desde inicios del siglo XXI son muchas las incorporaciones tecnológicas que se han realizado en el deporte, principalmente en tres líneas diferentes. La primera de ellas para obtener la mayor cantidad posible de información de cómo se sucede la competición, de forma que ayuden a analizar estrategias de juego, estado físico del atleta, etc. Por otro lado, se han realizado muchos avances para ofrecer una experiencia más completa para los telespectadores en las retransmisiones, de forma que no solo se ha avanzado en la calidad con la que se emiten los eventos, sino que también se ha avanzado en las distintas perspectivas que se captan, recomponiendo una imagen prácticamente en 3D con la que poder sumergirte en el juego y no perderte prácticamente nada de lo que ocurre sobre el terreno. Finalmente, una de las líneas en las que se están realizando nuevas incorporaciones y que está muy de moda en los últimos años, es la asistencia en el arbitraje por medio del video, con el objetivo a hacer la competición lo más justo posible, corrigiendo así el error humano que siempre conlleva la supervisión por una persona. Con respecto a este último, uno de los deportes pioneros, por su aplicación desde hace década y media, y por su buena implementación, por acierto y por ser poco intrusivo en el ritmo de juego, es el tenis, con el sistema conocido como ojo de halcón. Este es un sistema de origen británico, que ha sido aplicado también en otros deportes con menos repercusión a nivel internacional como el billar inglés o el criquet. El objetivo de esta tecnología es esclarecer el bote de las bolas según su trayectoria y velocidad, para poder corroborar si ha entrado dentro o fuera. Este sistema se compone de un total de 10 cámaras que captan toda la pista, de forma que un programa informático es el encargado de procesar dichas imágenes para determinar donde ha botado la bola. El propio programa es capaz de a partir de los datos realizar una animación 3D con los datos recopilados, en tan solo unos segundos, de forma que se puede ver casi al instante tanto en el estadio como en la televisión. Además, tan solo cuenta con un error de unos 2-3 milímetros, por lo que este sistema es uno de los mejores ejemplos de aplicación de la visión artificial en el deporte, por los grandes resultados que arroja tanto en precisión como en tiempo [4].
Introducción 4 4 Ilustración 1.1 Sistema de visión del ojo de halcón Este tipo de sistemas de video arbitraje ya se aplican también en gran cantidad de deportes olímpicos desde hace años con extraordinarios resultados. Uno de los últimos deportes con repercusión mundial en aplicarlos es el fútbol, donde las principales ligas y competiciones internacionales ya hacen uso de lo que denominan VAR (Video Assistan Referee). Este caso, a pesar de tener buenos resultados en algunos aspectos como determinar si el balón ha entrado en la portería o no, cosa que puede saber el árbitro de forma instantánea ya que llega la información a su reloj, todavía queda un largo camino en el que investigar para automatizar todavía más estas decisiones, ya que actualmente algunas de ellas pueden tardar hasta 2-3 minutos en decidirse, rompiendo el ritmo de juego. En el aspecto en el que el fútbol si es un gran referente es en las retransmisiones deportivas, contando con nuevas incorporaciones como los sistemas de repetición 3D. Estos nuevos sistemas de repetición de jugadas en 3D utilizan hasta 42 cámaras de visión artificial ubicadas alrededor de un estadio para capturar imágenes que se reconstruyen en vistas 3D estereoscópicas de la acción y que luego se añaden a la transmisión en directo. Otros sistemas utilizan múltiples cámaras de visión artificial para generar vistas de 360 grados de la propia acción que se transmiten a los espectadores a través de cascos de realidad virtual para sumergirlos totalmente en la experiencia deportiva. La tecnología de las cámaras de visión artificial también se utiliza normalmente para realizar un seguimiento de los jugadores y del balón, mejorar el entrenamiento de los jugadores y reforzar la supervisión del estadio y los espectadores. El seguimiento del movimiento de los jugadores y sus parámetros, como las tácticas y la estrategia del partido, brindan tanto a los entrenadores como a los medios que retransmiten el partido una herramienta valiosa para el análisis general del juego. Los datos de las imágenes y los metadatos, como el tiempo en el campo y la distancia recorrida, se pueden usar para analizar rendimiento de los jugadores [5]. Hemos visto tan solo unos ejemplos de la infinidad de aplicaciones que tiene la visión artificial en el mundo del deporte, que como comprobamos, a pesar de tener ya múltiples aplicaciones en funcionamiento con espectaculares resultados, la industria tiene aún la necesidad de seguir avanzando en este sentido, por lo que se esperan grandes inversiones económicas que apoyen nuevas investigaciones al respecto.
5 5 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas 2 DETECCIÓN DE JUGADORES Y BALÓN n el presente capítulose abordará todo lo relativo a la detección de las pelota y los jugadores. Para ello, explicaremos las distintas técnicas que se han ido aplicando y los parámetros con los que se han ajustado dichas ténicas para obtener los mejores resultados. 2.1 Extracción del fondo En primer lugar, procesaremos cada frame para determinar cuál es el fondo de nuestra imagen, que en el caso del fútbol será el terreno de juego y la grada, de forma que los separaremos de los jugadores y la pelota, que son los elementos principales que queremos procesar. Para ello, seguiremos el algoritmo propuesto en [7], en el que se propone extraer el campo por medio de dos métodos distintos, uno en el que discriminaremos según una condición de color de cada pixel RGB, y otra en el que haremos uso del gradiente de Sobel para la detección de bordes. 2.1.1 Condición G>R>B En este método, binarizaremos la imagen según un criterio de color para extraer el terreno de juego. Como sabemos previamente que este terreno de juego será mayoritariamente verde, sabemos que cumplirá lo siguiente: Green>Red>Blue, según la información que tengamos del RGB de la imagen. De esta forma pondremos a 0 los píxeles de la imagen que cumplan dicha condición (visualmente como negro) y a 1 los que no la cumplan. Este método presenta un problema debido a que los grises también cumple la condición mencionada, por lo que el método no sólo discriminaría el terreno de juego que es lo que deseamos, sino que también discriminaría las líneas que limitan las distintas zonas del campo de juego y el balón. A nivel de programación podremos hacerlo de forma sencilla gracias a la función cv2.split(), con la que separaremos los tres canales rgb en tres matrices distintas, por lo que podremos aplicar dicha condición tan solo con un par de comparaciones en estos canales. El resultado de aplicar esta condición es el siguiente: Ilustración 2.1 Extracción del fondo con condición de color 2.1.2 Gradiente de Sobel Para corregir el problema anterior en el que se discriminaba elementos importantes como el balón, implementaremos otro método que trabajará en conjunto con el anterior. Este método se basará en el gradiente de Sobel, que es un algoritmo muy usado en visión artificial ya que es muy eficiente para la detección de bordes E
Detección de jugadores y balón 12 12 salida de la función de connected components y con algunas operaciones matemáticas simples. Como sabemos, el objetivo es detectar los jugadores y el balón, de forma que con este método seremos capaces de realizar tal función de forma separada, es decir, según las características mencionadas, podremos diferenciar si un elemento es un jugador, si es el balón, o si es cualquier otro elemento que no se haya conseguido eliminar en el resto del proceso, pero al no cumplir con las características sería eliminado. Este procedimiento se asemeja al proceso de aprendizaje máquina, en el que en primer lugar se hace una extracción de características y posteriormente se clasifica según estas características y los experimentos anteriores, ajustando las características para evitar falsos positivos y falsos negativos. En caso de cumplir las características mencionadas, obtenemos los parámetros para el bounding box de las propias características de connected components, que, junto con la característica del centroide, podemos representar, con las funciones de dibujado de OpenCV, un punto y un rectángulo alrededor del jugador en cuestión. Vemos a continuación la imagen que devolvería esta función: Ilustración 2.10 Detección de jugadores Además, la función nos devolverá la información de la localización de los distintos jugadores, lo que nos será útil posteriormente para el seguimiento de los jugadores y el balón. Como vemos, si ajustamos los distintos parámetros de cada procesado, podemos llegar a tener resultados bastante buenos: si atendemos a la cantidad de jugadores detectados, de todos los que aparecen en la imagen (verdaderos positivos), frente a la detección de otros elementos indeseados que no sean jugadores o pelota (falsos positivos). No obstante esta metodología tiene sus limitaciones, como veremos más adelante en el estudio de los resultados. Podemos adelantar que este algoritmo tendrá dificultades para detectar los elementos en determinadas ocasiones, como por ejemplo cuando exista cercanía u oclusión entre distintos elementos o haya mala calidad en la imagen. Por este motivo, planteamos el siguiente método de seguimiento, para que funcione en conjunto a este método y consiga solventar en la medida de lo posible estos problemas.
13 13 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas 3 SEGUIMIENTO ste capítulo detallará como se ha abarcado el problema del seguimiento tanto de los atletas como del balón. Para ello se explicará en profundidad que algoritmo se ha desarrollado para la relación del jugador detectado en un frame con el mismo detectado en el siguiente frame, y además se explicará todo lo que se necesita saber de las técnicas predictivas implementadas. 3.1 Algoritmo de seguimiento En primer lugar, será necesario desarrollar un algoritmo que nos permita asignar el elemento detectado en un frame con otro detectado en el frame anterior, de forma que determinemos que son el mismo y podamos realizarle un seguimiento a lo largo de todo el video. Además, esto será necesario para poder aplicar posteriormente el filtro de Kalman, ya que necesitaremos actualizar la posición de cada jugador en cada frame. En primer lugar, dado que sabemos que solo habrá un balón en el terreno de juego y que además gracias a la distinción según características realizadas en el apartado, podemos diferenciarlo del resto de elementos, no será necesario realizar ningún algoritmo para el balón, puesto que solo debería de haber detectado uno en toda la imagen. En el caso de los jugadores sí será más complejo, puesto que tendremos una gran cantidad de ellos en la imagen, y además no será una cantidad fija, ya que por lo general estas grabaciones no abarcan todo el campo de juego, por lo que los jugadores pueden entrar o salir del plano. Para esta tarea, tomaremos como criterio principal la distancia. Dado que los elementos captados serán jugadores, por lo que sabemos que no alcanzarán una gran velocidad, junto que generalmente estas grabaciones se realizan a 24 FPS, se asume que la posición entre un jugador en el frame anterior y el actual será muy cercana. Para que sea más sencillo de entender, atenderemos en primer lugar al siguiente diagrama de flujos, y posteriormente detallaremos las distintas partes de este algoritmo. E Inicio ¿Es el primer frame? Sí Crear lista vacía del tamaño de la lista de jugadores en el frame anterior Guardamos posición No
Seguimiento 14 14 Como vemos, este algoritmo se basará en una comparación entre los jugadores captados en este frame, con los captados en el frame anterior, ambos guardados en listas distintas. Para esta comparación, tendremos una distancia límite a partir de la cual consideraremos que es posible que dicho jugador se pueda corresponder con el anterior. De esta forma, si no hay ningún jugador cercano, consideraremos que es un nuevo jugador que no aparecía en la escena en frames anteriores, por lo que lo añadiremos a la lista. Por otro lado, tendremos la posibilidad de que un jugador que anteriormente sí fue detectado, ahora no se detecte. Para este caso, como inicializamos una lista vacía del tamaño de los jugadores anteriores, si no se encuentra ningún jugador cercano para ese jugador, constará en dicha lista como None. Como el hecho de que no se haya detectado no implica necesariamente que no aparezca en la imagen, lo dejamos como None. De esta forma, Para cada jugador del frame actual Comparamos distancia con jugadores del frame anterior Guardamos posición del jugador más cercano ¿Todos los jugadores recorridos? Sí No Reorganizamos lista para coincidir el jugador del frame anterior con su correspondiente del actual Fin ¿Algún jugador cercano? Añadimos nuevo jugador Sí No
15 15 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas como ya explicaremos más en profundidad más adelante, podremos estimar, mediante la predicción del filtro de Kalman, donde se encontrarían los jugadores no detectados. 3.2 Filtro de Kalman Para esta parte del seguimiento, nos basaremos en el artículo Vision-based human tracking and activity recognition [10], en el cual se propone estudiar el movimiento de una persona, apoyándose en algoritmos predictivos basados en el filtro de Kalman, con el objetivo de reconocer su actividad en función de su posición y velocidad. En este artículo, al igual que en el presente proyecto, habrá dos etapas, una en la que inicialmente se detecte el elemento deseado, y otra posterior en la que se realice el seguimiento. En este caso, como el estudio está orientado a la seguridad y vigilancia, propone realizar avisos si el peatón va muy rápido, si se acerca a una zona de seguridad o si merodea o está mucho tiempo en un mismo sitio. Para mi estudio concreto, se plantea la inclusión de un filtro de Kalman, basándonos en los estados de posición y velocidad, de cara a mejorar la eficiencia de nuestro algoritmo para reconocer tanto a los deportistas como al balón de juego. 3.2.1 Teoría del filtro de Kalman El objetivo del filtro de Kalman será el de estimar ciertas variables de un sistema basándose en medidas con ruido, de forma que el algoritmo calculará las distintas probabilidades del estado del sistema. El filtro de Kalman consta principalmente de dos etapas: predicción y corrección. • Predicción: Será la etapa en la que se estime el estado actual del sistema basándose en el estado anterior del sistema y las ecuaciones del modelo de dicho sistema. • Corrección: En esta etapa se corregirá la estimación hecha en la etapa anterior haciendo uso de los datos de medición actuales. Para mayor claridad del fundamento matemático de este algoritmo, lo explicaremos en un principio con un ejemplo sencillo con variables simples hasta llegar a las ecuaciones matriciales que forma este teorema. Imaginémonos un móvil que se mueve en línea recta (una dimensión) a una velocidad concreta. Podemos conocer la localización de dicho móvil gracias a un dispositivo GPS que nos da la posición, pero como sabemos, los sensores tendrán una cierta incertidumbre, por lo que en este caso la posición será una variable aleatoria que seguirá una distribución normal, es decir tendrá una media y una varianza, y la probabilidad tendrá una distribución así: Ilustración 3.1 Medida de posición Si sabemos que este móvil se mueve con una velocidad constante, pongamos 4 m/s, podremos estimar la posición de dicho móvil un incremento de tiempo después, según las siguientes ecuaciones: 𝑝𝑘=𝑝𝑘−1+𝑉𝑘−1∆𝑡
Seguimiento 16 16 𝜇𝑝|𝑘=𝜇𝑝|𝑘−1+𝑉𝑘−1Δ𝑡 𝜎𝑝|𝑘 2=𝜎𝑝|𝑘−1 2 Que representado gráficamente será así: Ilustración 3.2 Posición en el siguiente instante En este caso, tomamos la velocidad como una medida exacta en nuestro sistema, pero como sabemos la medida de velocidad también tendrá una incertidumbre, por lo que también será una variable aleatoria, quedando nuestras variables de la siguiente forma: 𝑃~Ν(𝜇𝑝,𝜎𝑝2) 𝑉~Ν(𝜇𝑣,𝜎𝑣2) Sabiendo esto, y atendiendo a las propiedades de la esperanza y la media tenemos las siguientes ecuaciones: 𝐸[𝑃+𝑉∆𝑡]=𝐸[𝑃]+𝐸[𝑉]∆𝑡 𝑉𝑎𝑟[𝑃+𝑉∆𝑡]=𝑉𝑎𝑟[𝑃]+∆𝑡2𝑉𝑎𝑟[𝑉] De esta forma, podremos seguir realizando una predicción en los sucesivos instantes, pero debido a la velocidad aleatoria, aumentaremos la varianza en cada instante, por lo que si solo realizamos la predicción en cada instante obtendríamos lo siguiente: Ilustración 3.3 Predicción con velocidad aleatoria
17 17 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Para la segunda etapa, la etapa de corrección, usaremos la nueva medida que nos ofrecen los sensores en ese instante. Esta medida también tendrá ruido, por lo que juntaremos el resultado de la predicción con el de la corrección, con el objetivo de calcular cual es la posición más probable en función de las dos etapas. Matemáticamente sabemos que la distribución conjunta de las dos variables aleatorias normales unidas será otra distribución normal. De esta forma para las siguientes variables aleatorias obtenidas en ambas etapas: 𝑝~Ν(𝜇𝑝,𝜎𝑝2) 𝑧~Ν(𝜇𝑧,𝜎𝑧2) Obtenemos el siguiente resultado siendo p’ la posición corregida: 𝑘= 𝜎𝑝2 𝜎𝑧2+𝜎𝑝2 𝜇𝑝′=𝜇𝑝−𝑘(𝜇𝑧−𝜇𝑝) 𝜎𝑝′=𝜎𝑝−𝑘𝜎𝑝 Si observamos el resultado que nos ofrece esta nueva varianza, podemos apreciar que reducimos la incertidumbre respecto a la fase de predicción, por lo que estamos mejorando nuestra medición. Por lo tanto, el diagrama general del algoritmo queda de la siguiente forma: Ahora todo este proceso que hemos explicado con variable simples, procederemos a enunciarlo de forma análoga de forma matricial, que es como normalmente implementaremos el filtro de Kalman. Las ecuaciones para la predicción serán: 𝑥𝑘=𝑥𝑘−1+𝐴𝑥𝑘′+𝐵𝑢+𝑤𝑘 𝑃𝑘=𝐴𝑃𝑘−1𝐴𝑇+𝑄𝑘 Donde: • X: Vector con las variables del sistema • A: Matriz de predicción del siguiente estado • B: Matriz de entradas externas al sistema • U: Vector de entradas • 𝑃𝑘: Matriz de covarianza de la variable de estado en el instante k • 𝑄𝑘: Ruido que añade el entorno al sistema, o como de fiable es nuestro modelo Si seguimos con el ejemplo anterior, tendremos que nuestra matriz A será: 𝐴=[1 ∆𝑡 0 1] Y teniendo en cuenta que este sistema no tiene entrada, obtenemos el siguiente resultado, que es el mismo que el obtenido anteriormente: Predicción Correción Estado inicial Medición 𝑝 𝑝′
Seguimiento 18 18 [𝑝𝑘 𝑣𝑘]=[1 ∆𝑡 0 1][𝑝𝑘−1 ′ 𝑣′𝑘−1] 𝑝𝑘=𝑝𝑘−1+𝑉𝑘−1∆𝑡 𝑣𝑘=𝑣𝑘−1 ′ De forma análoga, tendremos las siguientes ecuaciones matriciales para la fase de corrección: 𝑥=𝑥𝑘−𝐾′(𝑧𝑘−𝐻𝑥𝑘) 𝑃′=𝑃−𝐾′𝐻𝑃 𝐾′=𝑃𝐻𝑇(𝐻𝑃𝐻𝑇−𝑅)−1 Donde: • 𝑧𝑘: Será la medida en ese instante • 𝑅𝑘: Varianza del sensor de medida • 𝐻: La matriz que asocial el estado del sistema con las medidas • K’: El resultado de la multiplicación de las variables normales de la predicción y la medición Con estas cinco ecuaciones podremos calcular el filtro de Kalman en cada instante, tan solo necesitaremos definir correctamente las variables y realizar una estimación correcta de las varianzas de ruido de las variables. Para probar estas ecuaciones, y ver de una forma práctica el funcionamiento de este filtro, hemos desarrollado un pequeño programa en Matlab. En este programa simularemos las medidas de un vehículo que se desplaza en el plano x e y, donde provocaremos un cambio de dirección de la velocidad en el eje y para comprobar cómo se comportaría el filtro en esa situación. Las medidas serán tomadas por sensores con una determinada incertidumbre, por lo que para similar esto, generamos un ruido aleatorio en estas medidas. Para este caso práctico, el estado del sistema serán las variables de posición x e y, y las de velocidad en x e y, es decir tendrá un tamaño de 4. Por otro lado, tan solo se tomarán medidas de posición, por lo que nuestras medidas tendrán una dimensión de 2, es decir, las posiciones en los dos ejes. Teniendo esto en cuenta, declararemos las siguientes matrices, según lo visto en la teoría: 𝐴=[1 0 𝑇 0 0 1 0 𝑇 0 0 1 0 0 0 0 1] 𝐻=[1 0 0 0 0 1 0 0] 𝑅=[𝑟20 0 𝑟2] 𝑄= [ 𝑞20 0 0 0 𝑞20 0 0 0 𝑞20 0 0 0 𝑞4 ] Donde r será el error aleatorio de la medida de la posición, y q será la confianza o el error de nuestro modelo. En este caso, r tendrá un valor de 5, ya que es el error introducido para la medida en la simulación, y q, tendrá un valor de 0.1, que en este caso ha sido ajustado experimentalmente según los resultados que se obtenían. Finalmente, T será el tiempo de muestro, para este ejemplo 1. Por otro lado, simularemos también que durante unos instantes perderemos las medidas de nuestra posición (en un caso práctico podría ser perder la señal GPS al entrar en un túnel), de forma que probaremos el funcionamiento del filtro actualizando solo la fase de predicción. Los resultados obtenidos son los siguientes:
19 19 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Ilustración 3.3 Implementación filtro de Kalman en Matlab Como vemos, el filtro mejora las medidas tomadas por los sensores, ajustándose más a la posición real en caso de estar bien definidas las matrices que conforman el filtro. Si observamos los segundos del 25 al 75, es donde hemos simulado la pérdida de la medida de la posición. Como vemos, el filtro intentará predecir la posición según las medidas y predicciones anteriores, por lo que cabe esperar que aumentemos el error con la posición real, pero no demasiado según vemos en la práctica, y donde, además, conseguiremos recuperarnos rápidamente en cuanto llega la primera medida de posición. 3.2.2 Implementación del filtro con OpenCV Al igual que sucedía ya con otras técnicas vistas anteriormente, el algoritmo del filtro de Kalman ya viene implementado en las funciones de OpenCV. En este caso, tendremos la clase de KalmanFilter(), de forma que podremos declarar un nuevo objeto por cada elemento a seguir. Al declarar un nuevo objeto de esta clase, deberemos indicar en los parámetros de entrada tanto la dimensión del estado como la dimensión de la medida. Posteriormente, la clase dispone de una serie de propiedades que deben ser declaradas por nosotros, ya que estos serán las variables a definir que hablábamos anteriormente en la teoría. La correspondencia entre estas será la siguiente: • measurementMatrix: H • measurementNoiseCov: R • processNoiseCov: Q • transistorMatrix: A Estas matrices las declararemos igual que en el ejemplo práctico de Matlab realizado en el apartado anterior, es decir, tendremos como estados del sistema la posición y la velocidad en los ejes x e y, y como medidas la posición en los ejes x e y en cada frame. Lo que si variaremos respecto al ejemplo en Matlab serán las variables q y r. Si recordamos, la variable r era la que nos indicaba el ruido en la toma de medida de los sensores, dato que conocíamos exacto en nuestro ejemplo, pero que en este caso no podemos conocer con exactitud por lo que tendremos que estimarlo experimentalmente. Con respecto a la variable q, al igual que ya hicimos en el ejemplo, la estimaremos experimentalmente, dándole en esta ocasión menos confianza al modelo. Para la actualización de cada una de las fases tendremos los métodos predict() y correct(), los cuales como su propio nombre indica serán los encargados de las fases de predicción y corrección. Para las actualizaciones, de
Seguimiento 20 20 forma análoga a lo hecho en el ejemplo en Matlab, no realizaremos la fase de corrección en caso de no conseguir detectar al jugador por los métodos de detección ya explicados, de forma que estimaremos su posición tan solo con la predicción del filtro. Más adelante, en el estudio de los resultados del proyecto, analizaremos el funcionamiento del filtro para la aplicación que nos ocupa, y mostraremos ejemplos y gráficas representativas que nos ayuden a dicha tarea.
21 21 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas 4 PROGRAMA Y FUNCIONALIDADES n este apartado, se explicará los distintos programas realizados para el proyecto, su estructura y sus distintas funcionalidades. El programa principal básicamente consistirá en una implementación en Python de las técnicas aplicadas anteriormente, y desarrollaremos un segundo programa que nos facilite la tarea de obtener los distintos videos para el testeo del programa principal. El objetivo que se ha perseguido en este sentido es el de poder realizar todas las pruebas y ajustes del programa desde la ventana de comandos. 4.1 Descargas de videos tests El objetivo de este programa, como ya hemos introducido, será el de poder obtener nuestra base de testeo del programa principal de una forma sencilla desde la propia ventana de comandos. Como veremos más adelante, para este proyecto jugará un papel muy importante el testeo del programa con una gran cantidad de situaciones reales distintas. Esto es debido en primer lugar a que la visión artificial es muy dependiente de muchos factores externos, como puede ser la iluminación, que pueden hacer que nuestro programa funcione a la perfección en unas situaciones, y que en otras no sea capaz de detectar un solo jugador. Por otro lado, en el deporte que nos estamos centrando, el fútbol, existen también otra gran cantidad de factores variables que pueden alterar el funcionamiento de nuestra aplicación, puesto que el terreno de juego no tiene por qué ser exactamente igual, los distintos equipos llevarán equipaciones distintas, y, además, existen infinidad de situaciones de juego distintas que alterarán la detección y el seguimiento. Por este motivo, se ha desarrollado este programa, facilitando la tarea de obtención de videos con los que comprobar donde actúa bien el programa y donde no, pudiendo así mejorarlo según la experiencia. Este programa se basará en la librería de código abierto pytube [12]. Esta librería dispone de una serie de funciones con las que podremos descargar videos de la plataforma de www.youtube.com de forma sencilla, ofreciendo además la posibilidad de descargarlo con la configuración de calidad que deseemos, siempre que el video subido a la plataforma lo permita. Además de esta librería, usaremos otra también usada en el programa principal, llamada argparse [13], con la que podremos programar distintos argumentos que puedan ser introducidos desde la ventana de comandos al realizar la llamada al programa. De esta forma podremos, sin abrir el programa ni modificarlo, indicar que video queremos descargar, con que nombre y donde queremos guardarlo, la resolución del video, y que parte concreta queremos descargar, ya que normalmente lo que buscaremos para este proyecto serán clips concretos, evitando así cambios de planos y poder estudiar el movimiento completo. Para esto último, se ha usado la librería de moviepy [14], que nos permite recortar los videos una vez ya descargados. El programa se llamará yt_descarga.py, y podremos ver el código completo en el anexo del presente documento. Los argumentos del programa serán los siguientes: • “-l” o “--link”: link del video de yotube a descargar. • “-n” o “--name”: nombre del video destino, donde además podremos indicar la ruta concreta donde queremos que se guarde. • “r” o “--resolution”: resolución a la que queremos descargar el video. • “-i” o “--inicio”: segundo inicial del clip a guardar. • “-f” o “--final”: segundo final del clip a guardar. De esta forma introduciendo en la ventana de comandos lo siguiente: python yt_descarga.py -l https://www.youtube.com/watch?v=vR9ERQxq9BA -n VideoEjemplo -r 720p -i 20 -f 30 Descargaremos el video del link introducido, con el nombre VideoEjemplo, a una resolución de 720p, del segundo 20 al 30. Cabe destacar que todos los argumentos serán necesarios introducirlos a excepción de la E
Análisis y resultados 28 28 Además, sabemos que las predicciones son menos fiables cuanto más tiempo llevamos sin actualizar con las posiciones reales, por lo que también acarreamos falsos positivos debidos a este motivo, y por el cual se estimó en el algoritmo que se desecharan a partir de 10 frames sin obtener medidas. 5.1.2 Oclusión momentánea Otro de los problemas que nos encontramos en la visión en relación con el seguimiento de personas u objetos, es que durante la secuencia pueda ser parcial o totalmente ocluidos por otros elementos. Evidentemente, podemos prever que el algoritmo puramente de visión encargado de detectar a dicha persona u objeto no será capaz de detectarlo correctamente, puesto que ni si quiera lo ve. De hecho, el ser humano si tan solo viese ese frame, y estando completamente ocluido tampoco sería capaz de terminar que ahí hay una persona, pero si ve la secuencia entera, gracias a la información previa, si es capaz de saber que ahí hay una persona a pesar de no verla necesariamente. En este caso, al igual que en muchas otras aplicaciones tecnológicas, tomamos como ejemplo la forma en el que el ser humano o la naturaleza es capaz de hacer o saber ciertas cosas. Si nos fijamos, el filtro de Kalman emularía exactamente esto, la visión es capaz de detectar al jugador durante unos instantes determinados de tiempo, y posteriormente es ocluido, momento en el cual el filtro de Kalman, gracias a la información recopilada de los instantes anteriores es capaz de predecir donde está ese jugador. En el entorno en el que nos encontramos, un partido de futbol, esta circunstancia que comentamos se dará con mucha frecuencia, ya que nos encontramos en un entorno con 22 jugadores, más los árbitros, en un espacio limitado. Los principales casos serán cuando un jugador tape a otro, o en el caso del balón, que lo tape al estar en contacto con el jugador, lo cual sucederá con mucha frecuencia. La siguiente secuencia es un claro ejemplo que se repite con frecuencia: Ilustración 5.6 Secuencia de oclusión del balón Aquí vemos como el jugador recibe un pase y controla el balón, momento en el cual el balón queda entre sus pies resultando parcialmente tapado para la cámara. En este caso, la visión no será capaz de distinguir el balón, porque además de estar parcialmente tapado, se encuentra junto con otro de los elementos a detectar, el jugador, de forma que resulta prácticamente imposible que el algoritmo actual sea capaz de diferenciar el balón de la silueta del jugador. Este sería el instante en el que Kalman realizaría su predicción. Vemos a continuación el resultado que nos ofrece nuestro programa para esta secuencia: Ilustración 5.7 Secuencia predicción de Kalman ante oclusión del balón En la secuencia vemos en un primer instante como el balón es detectado por nuestro algoritmo de detección, ya que lo vemos rodeado por el bounding box. En el siguiente instante, vemos como el algoritmo ya no es capaz de detectar el balón puesto que no aparece el bounding box dibujado, pero si vemos el punto que marcaría el centro del objeto. Este punto corresponde con la predicción que realiza el filtro de Kalman. Vemos como el punto realiza una predicción bastante fiable en la segunda secuencia, y aceptable en tercera. Pero si avanzamos
29 29 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas unos pocos instantes más, vemos la cuarta imagen de nuestra secuencia, en la cual la predicción ya tiene un error considerable. Esto se debe principalmente a la misma causa que exponíamos en el apartado 5.1.1 con respecto a cómo actúa el filtro de Kalman con los cambios de ritmo. Este caso es exactamente el mismo, tenemos el balón moviéndose a gran velocidad hasta que llega a los pies del jugador que lo controla, coincidiendo además con el momento en el cual perdemos la información de la detección. En este caso el filtro realiza sus predicciones como si el balón no se hubiese frenado, ocasionando una gran imprecisión cuando el jugador controla la pelota. Como sabemos, la oclusión también puede ocurrir entre dos jugadores distintos, donde uno quede por encima de otro. Además, debido al funcionamiento del algoritmo, en este caso no es necesario ni si quiera que estén ocluidos en gran parte, sino con que tan solo estén en contacto ya provoca que ambas siluetas se identifiquen como solo una, alterando las características que tenemos en cuenta para determinar si es un jugador o no. Un ejemplo sería el de la siguiente imagen binarizada: Ilustración 5.8 Imagen binarizada de juagadores en contacto Los dos jugadores que vemos en la imagen se detectarán como un único elemento, de forma que el algoritmo detectará o un solo jugador, en caso de coincidir con las caracterísicas de un jugador, o ninguno en caso de no hacerlo. Vamos a continuación que resultado nos ofrece el programa tras aplicar el filtro de Kalman: Ilustración 5.9 Resultado del filtro de Kalman en oclusión de jugadores Vemos como en este caso el filtro realiza una predicción para ambos jugadores, puesto que lo vemos con el bounding box verde indicador de que es una predicción de Kalman. Además, el resultado que ofrece la predicción es bastante buena para ambos jugadores, por lo que podemos comprobar cómo de útil es la aplicación de este filtro para suplir este tipo de problemas en la visión. Finalmente, expondremos el caso más crítico que puede suceder a este respecto. Este será el caso en el que tengamos una gran cantidad de jugadores juntos, y además desde el inicio de la secuencia, de forma que tenemos poca información previa de la posición y velocidad de cada jugador. Eso será recurrente en jugados del tipo falta o saque de esquina en los cuales los jugadores suelen partir todos de un espacio reducido. En la siguiente imagen, vemos una jugada de saque de esquina, donde tenemos hasta siete jugadores todos juntos, y donde el algoritmo de detección solo es capaz de detectar dos de ellos:
Análisis y resultados 30 30 Ilustración 5.10 Detección ante 7 jugadores juntos Como vemos es una situación complicada, y como tal tan solo se consigue detectar un porcentaje pequeño de todos los jugadores que aparecen. Pero este es el primer frame de la secuencia, por lo que todo el proceso y la información que dispone el programa se limita a este primer frame. Ahora mostramos dos resultados obtenidos en dos instantes posteriores a esta misma jugada: Ilustración 5.11 Detección de jugadores juntos en instantes posteriores Vemos en la primera imagen, como en ese instante el algoritmo si ha sido capaz de detectar un mayor número de jugadores que en un inicio. En este caso en la imagen aparecen un total de ocho jugadores y se han detectado 6, dónde ha habido un par de fallos debido a un jugador en oclusión y otros dos que por cercanía los ha detectado como uno solo, pero teniendo en cuenta lo complicado de la situación podemos decir que es un buen resultado. Ahora pasamos a un instante poco posterior de la misma jugada. Observamos, en los rectángulos rojos, como otra vez el algoritmo de detección solo ha sido capaz de detectar dos jugadores, pero, sin embargo, gracias a la aplicación del filtro de Kalman, y apoyándonos en la información del instante anterior, conseguimos predecir con bastante acierto en que lugar se encuentran los otros cuatro jugadores detectados anteriormente. Hemos podido comprobar como para este tipo de problemática, en el cual los jugadores están tapados o muy juntos, el filtro de Kalman, a pesar de tener algunos fallos reconocidos, ayuda bastante a mejorar los resultados en este tipo de circunstancias. 5.1.3 Iluminación no homogénea Otro de los problemas que nos hemos encontrado en el funcionamiento del programa es debido a la iluminación. Es bien sabido que en el campo de la visión por computador, uno de los mayores problemas, que a su vez se convierte en uno de los principales puntos a perfeccionar para mejorar el funcionamiento de la aplicación, es la iluminación. La iluminación por un lado puede crear sombra o efectos indeseados, y nos otro modifica las tonalidades con las que percibimos los distintos colores del espacio grabado. Normalmente, cuando preparas un entorno para un sistema de visión, como se puede hacer por ejemplo en el mundo de la industria para la automatización de procesos industriales, la luz se convierte en el principal elemento para adecuar el entorno, implementando normalmente una iluminación difusa que ilumine la escena uniformemente. Concretamente, para la aplicación de nuestro programa que es la detección y seguimiento en partidos de fútbol,
31 31 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas usando las imágenes de las retransmisiones por televisión, no tenemos la opción de adecuar el entorno y la iluminación según nuestras necesidades para tener mejores prestaciones, puesto la imagen se ha capturado con otro fin distinto a la visión por computador. Sin embargo, nos encontramos con un entorno bastante amigable, ya que los estadios para competir en competiciones profesionales necesitan por normativa unos determinados lúmenes, producido por una serie de focos distribuidos uniformemente por todo el estadio, lo que nos produce una iluminación bastante uniforme. Por lo general, en los resultados que hemos obtenido no ha habido ningún problema a este respecto en partidos que se disputan por la noche, ya que prácticamente la única iluminación es la de los focos del estadio. Cuando si se han tenido más dificultades ha sido en partidos disputados por el día, ya que la iluminación sola nos provoca una serie de sombras que dificultan la tarea de la visión. Vemos un ejemplo en las siguientes imágenes: Ilustración 5.12 Ejemplo de iluminación no homogénea Vemos dos imágenes correspondientes al procesamiento del video 2, a la izquierda la imagen original con los jugadores detectados y a la derecha la imagen binarizada de la que extraemos la información. Como podemos observar, estas imágenes proceden de un partido disputado de día, provocando sombras y una franja del campo donde incide el sol directamente. Si nos fijamos en la imagen de la derecha, esta diferencia en la iluminación nos provoca ruido e imprecisiones en la detección. Principalmente esto es debido al detector de bordes de Sobel, puesto que este cambio de iluminación es tomado por el gradiente como un borde. En este caso concreto no supone un gran problema ya que la mayoría de jugadores excepto uno se encuentran fuera de esta zona, pero para este jugador en concreto que se encuentra en dicha zona, el programa tiene grandes dificultades para llegar a detectarlo, por lo que esta iluminación no uniforme hace menos eficiente nuestro algoritmo. 5.1.4 Líneas del terreno de juego Como ya se introdujo en la explicación de la transformada de Hough, la eliminación de las líneas de campo supone un problema. Por un lado, sabemos que es necesario eliminarlas puesto que, si no las eliminas y un jugador esta sobre ella el algoritmo no sería capaz de detectar a este jugador, pero por otro lado su eliminación conlleva otro tipo de problemas, ya que, si el jugador se encuentra sobre ella, eliminaremos parte el jugador junto con la línea, lo que ocasiona que el jugador quede partido en dos, de forma que se detectarán o dos jugadores distintos o ninguno. Además del mencionado problema, la eliminación de las líneas por medio de la transformada de Hough conlleva otro problema visto en los resultados, y es que en ocasiones puede suceder que varios jugadores se alineen, de forma que la transformada determine la existencia de una línea recta compuesta por dichos jugadores.
Análisis y resultados 32 32 Ilustración 5.13 Problemática de transformada de Hough ante jugadores cercanos Para la solución de ambos problemas, se planteó borrar las líneas con la transformada de Hough, pero de forma discontinua, es decir en vez de dibujar la línea entera de forma que pueda separar a los jugadores, se dibujará “a trozos”, de forma que lo más probable es que no acabe “partiendo” a los jugadores, sino que quedará siempre conectado por algún punto. Esto sí soluciona el mayor problema que tenían las líneas del campo, que era el conectar a todos los elementos sobre ella y marcarlos como uno solo, ya que identificamos las siluetas por medio de la función connectedComponentes(). Teniendo las líneas discontinuas, si conseguimos separar los elementos sin interferir demasiado en el resto del funcionamiento. Vemos por ejemplo como actuaría en el caso anterior, ya en la imagen binarizada: Ilustración 5.14 Tranformada de Hough sobre jugadores con línea discontinua Como vemos si podremos seguir teniendo problemas aún con la línea discontinua, pero bastante menos que con la línea continua, de forma que al ocurrir con menos frecuencia si puede ser más fácilmente suplible con el filtro de Kalman, realizando predicciones en esos breves instantes que no detectemos los jugadores. Vemos a continuación un ejemplo donde encontramos varios jugadores sobre una línea que conecta a todos ellos, y como el algoritmo es capaz de detectarlos a pesar de ello. Además, si observamos detenidamente el binarizado de dicha imagen podemos comprobar como efectivamente el hecho de que estas líneas sean discontinuas, ayuda a su detección.
33 33 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Ilustración 5.15 Varios jugadores sobre línea del terreno de juego 5.1.5 Correspondencia de jugadores Otro de los problemas que nos encontramos en nuestra aplicación es la de la correspondencia de los jugadores de un instante a otro. Esta función es primordial para realizar un buen seguimiento, por que, a pesar de realizar una buena detección de cada jugador en cada frame, necesitamos complementar esta información con la asignación a un jugador ya detectado anteriormente, ya que, entre otras cosas, es necesario para la actualización del estado en el filtro de Kalman, herramienta fundamental en nuestro programa. Como bien hemos explicado, la correspondencia se ha realizado según un criterio de cercanía, y se deja de realizar a partir de ciertos frames sin localizar al jugador. Este procedimiento tiene buenos resultados llevado a la práctica cuando el jugador es reconocido en cada frame directamente por el algoritmo de detección, que es el que ofrece posiciones más precisas. El mayor problema que nos encontramos es cuando se dejan de detectar dichos jugadores, y empieza a actuar el filtro de Kalman. Por lo general el filtro suele dar buenas predicciones, pero con cierta se dan dos casos que perjudican a los resultados, por un lado, tenemos cuando el jugador no es detectado durante varios frames seguidos, como sabemos en ese caso se da por perdido el jugador, de forma que, si posteriormente se vuelve a detectar, será tomado por el programa como un jugador nuevo. Al perder el jugador anterior, perdemos su seguimiento, y aunque lo hayamos vuelto a encontrar posteriormente, no tenemos forma a nivel de programa de relacionarlo con el seguimiento que ya teníamos del anterior, por lo que a nivel de estadísticas y demás es tomado como un jugador totalmente nuevo. Además, esta opción no puede ser eliminada por dos motivos. El primero es que a partir de un cierto número de predicciones seguidas sin actualizar la posición real del jugador el filtro de Kalman aumenta demasiado su incertidumbre, tanto que no podemos tomarlo como un dato fiable. Por otro lado, al ser retransmisiones deportivas es posible, y muy frecuente, además, que jugadores entren y salgan de plano, por lo que también se necesita un método en el que determinemos que un jugador ya no se encuentra en nuestro campo de visión, lo cual lo determinamos en nuestro programa cuando ya no somos capaces de detectar a dicho jugador. Además, la segunda fuente de error más importante en este aspecto es cuando tenemos cambios de estados muy bruscos justo en el momento en el que dejamos de detectar el jugador, empleando solo la medición de la predicción del filtro de Kalman. En este caso, las medidas que se obtendrán estarán muy alejadas de la posición real del jugador, de forma que cuando volvamos a detectarlo ya no se relacionará con las medidas anteriores. Ilustración 5.16 Fallo de correspondencia por predicciones imprecisas Vemos en la secuencia de imágenes como un jugador, detectado como jugador 25, tras perderse en las detecciones y determinar su posición solo con predicciones, vemos como estas son imprecisas, de forma que al volver a detectarlo lo determinamos como un jugador nuevo, en este caso jugador 29. Por otro lado, ya que la única condición es la proximidad, también podemos encontrarnos con fallos de correspondencia al cruzarse dos jugadores, aunque debido a los poco que varían las posiciones de un frame a otro, esto no sucede con mucha frecuencia.
Análisis y resultados 34 34 Una vez explicado las causas que provocan este problema, vamos a tratar de cuantificarlo de cara a evaluar con qué frecuencia sucede. Para esto, expondremos gráficos de distintos videos con los datos de la cantidad de jugadores detectados en un inicio más los falsos positivos, la cantidad de jugadores totales que se han detectado a lo largo del video, y la cantidad de jugadores que han entrado en plano a lo largo del video, considerándolos como los únicos nuevos jugadores que pueden aparecer. De esta forma, para una detección y correspondencia perfecta, si tenemos siete jugadores en un inicio y entran dos nuevos en la imagen, al final del video tendríamos nueve jugadores totales detectados en toda la secuencia. Con estos datos, realmente no estamos cuantificando solo el buen funcionamiento de la correspondencia, sino que también es influido por falsos negativos que también serían considerados como nuevos jugadores, por lo que en estos datos veremos reflejados en realidad el resultado de la acumulación de los errores que hemos ido exponiendo en el análisis. Ilustración 5.17 Jugadores detectados al inicio y a lo largo del video A la vista de los gráficos comprobamos como el número de detectados a lo largo del video son entre 2 y 4 veces mayor de los que deberían ser en un caso ideal. Como decimos, en estos datos se reflejan tanto los fallos de correspondencia que se han comentado en este apartado, como los falsos positivos ocasionados por las distintas circunstancias ya mencionadas. Principalmente, si analizamos el comportamiento de nuestro programa de una forma más “manual”, podemos ver como estos problemas, tanto de fallo de correspondencia como de falso positivo, son más frecuentes cuando la jugada se centra en el aérea de la portería. Si analizamos lo sucedido en esta zona, comprobamos como aglutina la gran mayoría de inconvenientes que se pueden tener para la detección de los jugadores y su seguimiento, ya que suelen haber gran cantidad de jugadores concentrados en una misma zona y hay numerosas líneas de terreno de juego que entorpecen la correcta detección. Es fácil comprobar cómo tan solo dos o tres jugadores en el área cercanos entre sí pueden dar numerosos fallos de correspondencia, aumentando significativamente las estadísticas anteriores. Sin embargo, si ponemos nuestra atención en este caso al resto de jugadores, que corren por la banda o se mueven por el centro del campo, lo usual es que el 15 46 6 0 10 20 30 40 50 Jugadores Inicio Jugadores Final Jugadores Entrantes Jugadores detectados video 1 Detectados Falsos Negativos 11 38 0 6 0 0 0 5 10 15 20 25 30 35 40 Jugadores Inicio Jugadores Final Jugadores Entrantes Jugadores detectados video 2 Detectados Falsos Negativos 11 69 5 4 0 0 10 20 30 40 50 60 70 80 Jugadores Inicio Jugadores Final Jugadores Entrantes Jugadores detectados video 4 Detectados Falsos Negativos 12 60 0 7 0 0 0 10 20 30 40 50 60 70 Jugadores Inicio Jugadores Final Jugadores Entrantes Jugadores detectados video 5 Detectados Falsos Negativos
35 35 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas algoritmo lo detecte correctamente a lo largo de toda la secuencia, consiguiendo determinar que es el mismo jugador desde que empieza la jugada hasta que acaba. 5.1.6 Coste computacional Un importante aspecto a la hora de mostrar los resultados de un programa es cuantificar cuanto tarda nuestro ordenador en procesarlo. Concretamente, para nuestra aplicación es un punto muy a tener en cuenta, ya que este tipo de herramienta podría ser empleada para un análisis en tiempo real, de forma que necesitaríamos que el programa sea capaz de realizar sus cálculos a la misma velocidad a la que capturamos el juego. Para evaluar y mostrar cómo se comporta nuestro programa en este aspecto, realizaremos una sencilla cuenta con cada video que será la cantidad de frame que compone el video dividido por el tiempo en segundos que tarda en ejecutarse el programa para el video entero, obteniendo así los frames por Segundo que es capaz de procesar el programa. En este aspecto, también es muy importante tener en cuenta el equipo que se usa para ejecutar el programa, ya que dependiendo de la capacidad de cómputo de cada equipo el rendimiento del programa podrá ser mejor o peor. Las especificaciones del ordenador con las que se han realizado las pruebas son: • SO Windows 10 Pro 64 bits • Procesador i5 3.2GHz • 8 GB RAM • GTX 1060 3GB Obtenemos los siguientes resultados: Tabla 5.1 Frames y tiempos de procesamiento de cada video Ilustración 5.18 FPS de procesamiento por video A la vista del gráfico, de puede destacar rápidamente el video 3 por su gran diferencia en velocidad con respecto al resto. Esto es debido a que este es el único video con una resolución menor a 720p y que además realiza muy pocas detecciones. Este video a menor resolución ha sido escogido por un motivo que expondremos en el siguiente apartado, pero de momento, no lo tendremos muy en cuenta a la hora del análisis del coste computacional. Si observamos el resto de videos, vemos como los FPS rondan entre los 14 y 17 según el video. Esta varianza es principalmente debido a la cantidad de jugadores que tenemos y detectamos en pantalla, ya que mientras más jugadores más veces tendremos que procesar algunos algoritmos pesados como el del filtro de Kalman, que correspondería a un filtro por jugador detectado, además del balón. Si atendemos a los FPS de media que nos ofrecen los videos, excluyendo el video 3, comprobamos que se obtienen más o menos unos 15 FPS por video. Estas retransmisiones deportivas suelen tener algo más de FPS Video 1 Video 2 Video 3 Video 4 Video 5 Video 6 Video 7 Video 8 Frames 250 126 720 276 225 75 250 250 Tiempo (s) 14,76 8,21 12,6 17,51 14,52 5,36 16,94 15,36 FPS 16,93766938 15,3471376 57,1428571 15,7624215 15,4958678 13,9925373 14,7579693 16,2760417 0 10 20 30 40 50 60 Video 1 Video 2 Video 3 Video 4 Video 5 Video 6 Video 7 Video 8 FPS de procesamiento por video
Análisis y resultados 36 36 capturados, normalmente 24 FPS. Por lo que podemos comprobar fácilmente como está cercano a una velocidad de procesamiento de tiempo real pero no llega. Pero esto sería en caso de procesar todos lo frames ofrecidos por la retransmisión, pero realmente, según lo visto en los resultados, no necesitamos tal cantidad de fotogramas para realizar una buena detección y seguimiento, ya que de un frame a otro la escena apenas cambia. De esta forma, se podría procesar la imagen cada 2 o 3 frames capturados, velocidad a la cual llega sin problemas, por lo que podemos determinar que podría tener una buena aplicación como procesamiento en tiempo real. 5.1.7 Resolución del video Como ultimo problema a destacar en este análisis de los resultados, antes de proceder a mostrar los resultados de las posibles aplicaciones reales, es el de la resolución del video. Básicamente la resolución del video representa la cantidad de pixeles con los que se compone cada imagen, de forma que, a mayor resolución, mayor cantidad de pixels tenemos. En este aspecto el programa presenta un problema de compatibilidad, y es que, al cambiar la resolución, cambia muchos de los parámetros que usamos para las mediciones que determinan si el elemento es un jugador o no. El mayor ejemplo es la característica de área, que en este caso al tener menos cantidad de pixels en general, es de suponer que los propios jugadores estarán compuestos por menos pixels. Por este motivo se ha incluido el análisis del video 3, un video de 480p, frente a los 720p del resto de videos. Si lo vemos, comprobamos fácilmente como el algoritmo no consigue detectar la mayoría de los jugadores, por el motivo que comentamos. Para este proyecto nos hemos centrado en videos 720p que son los más comunes en la actualidad, pero en caso de querer adaptar el programa a otros formatos, tan solo sería necesario modificar y ajustar algunos parámetros del programa. 5.2 Aplicación real En este apartado mostraremos las utilidades que puede tener esta herramienta en una aplicación real. Como sabemos, en el ámbito deportivo las estadísticas juegan cada vez un papel más importante, tanto por el lado del espectador y la retransmisión, ya que ayudan a tener más información y saber con mayor precisión que está sucediendo, como por el lado de los deportistas y entrenadores, ya que estos datos ayudan a poder perfeccionar estrategias y entrenamientos. Para esta tarea, nuestro programa tiene mucho que aportar, ya que permite obtener estas estadísticas de forma automatizada, simplemente haciendo uso de las capturas de las retransmisiones. Para la recopilación de estadísticas y demás datos útiles, de cara a usarlo en un entorno real, nos hemos inspirado en el artículo [15], el cual trata de como automatizar estos datos precisamente con visión artificial para ofrecer las estadísticas en una aplicación web. De esta manera, plantearemos una serie de estadísticas dentro de todas las posibles a modo de ejemplo. Estas estadísticas podremos visualizarlas si ejecutamos el programa en el modo 3 y agregamos el jugador al cual queremos realizar la recopilación de datos. Las estadísticas han sido centralizadas en este ejemplo para un único jugador por sencillez y ligereza del programa, pero el programa debería estar capacitado para realizarlas para todos los jugadores detectados. 5.2.1 Mapa de calor La primera de las estadísticas planteadas es la de mapa de calor. Este mapa de calor usualmente marca sobre el terreno de juego por donde se ha ido moviendo dicho jugador, a lo largo de todos los datos guardados. Para esto, teniendo ya la posición del jugador en cada frame, obtenida con el programa, tan solo necesitamos realizar un registro de estas posiciones y posteriormente representarlas todas juntas sobre un rectángulo que represente el terreno de juego. Esta es una estadística muy útil puesto que representa todos los movimientos que ha realizado el jugador sobre el terreno de juego, indicándonos por qué zonas se mueve más. Mostramos a continuación algunos ejemplos de esta estadística:
37 37 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas Ilustración 5.19 Mapa de calor del jugador 4 y 12 del video 1 Esta herramienta depende directamente de la detección, al igual que el resto de estadística que mostraremos en este apartado, de forma que, si tenemos una buena detección para los jugadores seleccionados, dispondremos de unas buenas características fiables y representativas de la realidad. En este caso tan solo destacar como el jugador 12 acaba saliéndose del plano durante el video, por lo que evidentemente dejamos de verlo representado en el mapa de calor. Además, complementamos el mapa de calor con la información de la distancia total recorrida por el jugador. En cuanto al funcionamiento general si se ha destacar que este mapa de calor representa las posiciones de los jugadores según su posición captada con la cámara, que no se corresponde con su posición real en el terreno de juego. Para esto último, sería necesario detectar el terreno de juego al completo, de forma que detectando sus límites se pueda determinar la transformación matemática de las coordenadas en pixel de la cámara, a las coordenadas en metros del espacio real. Realizar esto tan solo a partir de la información captada por las cámaras de las retransmisiones sería más complicado, fuera del alcance del actual proyecto. 5.2.2 Velocidad del jugador Otra de las estadísticas que podemos obtener de forma sencilla con este programa es la velocidad de los jugadores en cada instante. En este caso será fácil partiendo de los cálculos de distancia recorrida de la estadística anterior. Simplemente la distancia que se mueve un jugador en un frame será la velocidad de ese jugador en ese instante. De esta forma obtenemos la velocidad por frame, que en caso de quererlas por segundo tan solo sería necesario multiplicar el dato por los fps a los que graba la cámara. En este caso no se ha realizado, porque tampoco tendremos la distancia en metros por la problemática comentada en el apartado anterior, por lo que igualmente no podemos aportar la información en metros por segundo, que sería la unidad más adecuada. Vemos a continuación las velocidades de los mismos jugadores representados en el mapa de calor del apartado 5.2.1. Ilustración 5.20 Velocidad de los jugadores 4 y 12 del video 1 El mayor problema de esta estadística, derivado del problema de no poder obtener las posiciones en las coordenadas reales del terreno de juego, es que un jugador en movimiento puede aparecer como si estuviese estático. Esto es debido a que la cámara está grabando con un plano dinámico, de forma que si mueve el plano a la misma velocidad y en el mismo sentido que el jugador, este aparecerá en las estadísticas como si estuviese
Códigos 44 44 if (alto/ancho > 1 and alto/ancho <3 ): if (densidad>0.3 and densidad<0.9): x_bb = stats[label, cv.CC_STAT_LEFT] y_bb = stats[label, cv.CC_STAT_TOP] cv.rectangle(imgOrig, (x_bb, y_bb), (x_bb+ancho, y_bb+alto), (0,0,255), 2) cv.circle(imgOrig, (int(centroids[label,0]), int(centroids[label, 1])), 3, (0,255,0), -1) jugadores.append([int(centroids[label,0]), int(centroids[label, 1])]) #Caracteristicas del balon if (area > 100) and (area < 300): if (alto/ancho > 0.5 and alto/ancho <=1.5 ): if (densidad>0.7 and densidad<0.9): x_bb = stats[label, cv.CC_STAT_LEFT] y_bb = stats[label, cv.CC_STAT_TOP] cv.rectangle(imgOrig, (x_bb, y_bb), (x_bb+ancho, y_bb+alto), (0,0,255), 2) cv.circle(imgOrig, (int(centroids[label,0]), int(centroids[label, 1])), 3, (255,0,0), -1) x_ball = int(centroids[label,0]) y_ball = int(centroids[label,1]) #print(area, densidad) return imgOrig, x_ball, y_ball, jugadores def TransformadaHough(img, orig, rho, theta, threshold, minLenght, maxGap): """ Función para calcular la tranformada de hough de nuestra imagen a fin de detectar la lineas rectas del terreno de juego y eliminarlas """ lines = cv.HoughLinesP(img, rho, theta, threshold, lines = np.array([]), minLineLength = minLenght, maxLineGap = maxGap) for line in lines: for x1, y1, x2, y2 in line: #cv.line(img, (x1, y1), (x2, y2), (0,0,0), 8) img = line_disc(img, (x1,y1), (x2,y2), (0,0,0), 7) return img #inicializamos el video a leer print("[INFO] Leyendo clip...") vs = FileVideoStream(args["video"]).start() time.sleep(2.0) jugadores_ant = 0 registro_posiciones=[] kernal = np.ones((2,2), np.uint8) KFJug = []
45 45 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas jug_perdido_cont = [] KFBall = FiltroKalman() predictedCoords = np.zeros((2, 1), np.float32) if (args["modo"]==1): ejecuta = 0 else: ejecuta = 1 #Bucle de lectura de cada frame while True: try: frame = vs.read() height = frame.shape[0] width = frame.shape[1] #Condición g>r>b bgExtract, bgMask = condicionRGB(frame) #Aplicamos gradiente de sobel SobelG = gradiente_sobel(frame, 40) #Sumamos resultado de ambos procesosa imgFinal = bgExtract + SobelG #Aplicamos máscara de región de interés imgFinal = cv.bitwise_and(imgFinal,bgMask) #Destacamos siluetas con operaciones morfológicas imgFinal = cv.morphologyEx(imgFinal,cv.MORPH_CLOSE, kernal, iterations=2) #Buscamos rectas predominantes en la imagen imgFinal = TransformadaHough(imgFinal, frame, 6, np.pi / 60, 500, 80, 15) #Etiquetamos entra las siluetas detectadas, cual correspoende a jugadores y pelota frame, x_b, y_b, jugadores_act = etiquetado(imgFinal, frame) #Hacemos el seguimiento de los jugadores detectados if (jugadores_ant!=0): #Relacionamos los jugadores detectados con los detectados anteriormente pos_actualizada = relaccion_jugadores(jugadores_ant, jugadores_act) print("## NUEVO FRAME ##") print(pos_actualizada) if (args["modo"]==3): #Se guarda la información del jugador seleccionado try: registro_posiciones.append([int(jugadores_ant[args["jugador"]][0]),int(jugadores_ant[args["jugador"]][1])] ) except: print("No existe ese jugador\n") if (args["modo"]==1): #Ponemos texto identificador encima de cada jugador num_jug = 0 for jugador in pos_actualizada: if jugador != None:
Códigos 46 46 frame = cv.putText(frame, 'Player ' + str(num_jug), (jugador[0], jugador[1]), cv.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 1, cv.LINE_AA) num_jug = num_jug + 1 #Agregamos a la lista aquellos jugadores detectados nuevos while (len(KFJug) != len(pos_actualizada)): KFJug.append(FiltroKalman()) jug_perdido_cont.append(0) jugadores_ant = pos_actualizada else: jugadores_ant = jugadores_act #Estimación con filtro de kalman for j in range(len(KFJug)): #Comprobamos que el jugador no lleve más de 10 frames sin detectarse if jug_perdido_cont[j]<11: #Si se ha actualizado la posición, actualizamos Kalman con las nuevas medidas if (pos_actualizada[j] != None): JugCoords = KFJug[j].Estimate(pos_actualizada[j][0], pos_actualizada[j][1]) jug_perdido_cont[j] = 0 #Si no se ha actualizado la posición, realizamos una predicción con Kalman else: JugCoords = KFJug[j].Estimate(0, 0) jugadores_ant[j] = [JugCoords[0], JugCoords[1]] jug_perdido_cont[j] = jug_perdido_cont[j]+1 #Ponemos texto identificado para los jugadores detectados por predicción if (args["modo"]==1): frame = cv.putText(frame, 'Player ' + str(j), (int(JugCoords[0]), int(JugCoords[1])), cv.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 1, cv.LINE_AA) cv.rectangle(frame, (int(JugCoords[0])-25, int(JugCoords[1])-50), (int(JugCoords[0])+25, int(JugCoords[1])+50), (0,255,0), 2) cv.circle(frame, (int(JugCoords[0]), int(JugCoords[1])), 3, (0,0,255), -1) #Damos por perdido el jugador si no aparece durante 10 frames consecutivos else: jugadores_ant[j] = [0,0] #Estimación de la pelota con filtro de Kalman predictedCoords = KFBall.Estimate(x_b, y_b) print(predictedCoords) cv.circle(frame, (int(predictedCoords[0]), int(predictedCoords[1])), 3, (0,0,255), -1) ''' print("##Reales##") print(x_b, y_b) print("##Predichas##") print(int(predictedCoords[0]), int(predictedCoords[1])) ''' #Abrimos ventana con la visualización de las distintas imágenes procesadas #cv.imshow('Sobel', SobelG) #cv.imshow('bgExtract', bgExtract) if (args["output"]==1): cv.imshow('Original', frame) if (args["output"]==2): cv.imshow('Discriminacion color', bgExtract)
47 47 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas if (args["output"]==3): cv.imshow('Sobel', SobelG) if (args["output"]==4): cv.imshow('Procesado Final', imgFinal) #Comprobamos si qe ha pulsado la tecla para salir key = cv.waitKey(ejecuta) & 0xFF if key == ord("q"): break #Si pulsamos la letra "s" guardaremos el actual frame como una imagen png elif key == ord("s"): cv.imwrite("Imagenes/last_save.png", frame) except: """ Esta excepción saltará cuando el video llegue a su fin. En esta rutina de excepción se finalizarán determinados procesos y se sacarán las estadísticas de la jugada """ cv.destroyAllWindows() vs.stop() if (args["modo"]==3): mapa_calor = np.zeros((height,width,3), np.uint8) mapa_calor[:] = (0,100,0) distancia_recorrida = 0 tiempo_corriendo = 0 velocidades = [] for j in range(1,len(registro_posiciones)): if (registro_posiciones[j][0]!=0 or registro_posiciones[j][1]!=0): cv.line(mapa_calor, (registro_posiciones[j][0],registro_posiciones[j][1]), (registro_posiciones[j-1][0],registro_posiciones[j-1][1]), (0,0,150), 3) distancia_actual = distancia((registro_posiciones[j][0],registro_posiciones[j][1]), (registro_posiciones[j-1][0],registro_posiciones[j- 1][1])) distancia_recorrida = distancia_recorrida + distancia_actual velocidades.append(distancia_actual) if distancia_recorrida > 3: tiempo_corriendo = tiempo_corriendo + 1 print(distancia_actual) print("ESTADÍSTICAS RECOPILADAS DEL VIDEO") print("DISTANCIA RECORRIA POR EL JUGADOR:") print(distancia_recorrida) print("VELOCIDAD MÁXIMA DEL JUGADOR:") print(max(velocidades)) print("TIEMPO QUE HA ESTADO EL JUGADOR CORRIENDO:") print(tiempo_corriendo/25) plt.plot(range(len(velocidades)),velocidades) plt.xlabel('tiempo (1/25 s)') plt.ylabel('velocidad (pixel/frame)') plt.suptitle('Velocidad del jugador') plt.show() cv.putText(mapa_calor, 'Distancia Total: ' + str(distancia_recorrida), (40,40), cv.FONT_HERSHEY_SIMPLEX, 1, (255,255,255), 1, cv.LINE_AA) cv.imshow('Estadistica 1', mapa_calor) cv.waitKey(0)
Códigos 48 48 break 7.2 Código programa de descarga de videos de prueba """ Pequeño script para guardar los clips de los momentos concretos de videos de youtube de forma sencilla y rápida. """ #importar librerias necesarias import argparse import pytube from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip from os import remove #construir los argumentos necesarios para el programa ap = argparse.ArgumentParser() ap.add_argument("-l", "--link", required=True, help="link del video") ap.add_argument("-n", "--name", required=True, help="nombre de destino del video") ap.add_argument("-r", "--resolution", type=str, default="720p", help="resolucion de descarga") ap.add_argument("-i", "--inicio", required=True, type=int, help="segundo inicial del video") ap.add_argument("-f", "--final", required=True, type=int, help="segundo final del video") args = vars(ap.parse_args()) #proceso de descargar del video print("[INFO] Descargando video de YouTube...") yt = pytube.YouTube(args["link"]) try: yt.streams.get_by_resolution(args["resolution"]).download() #Lo guarda en el mismo directorio que el programa, con yt.title tengo el titulo #Lanzamos una excepcion puesto que con algunos videos falla obtener el video filtrando la resolucion except: print("[INFO] Descargando del primer stream") stream = yt.streams.first() stream.download() #proceso para extraer el clip concreto del video print("[INFO] Extrayendo clip indicado...") try: ffmpeg_extract_subclip("{}.mp4".format(yt.title), args["inicio"], args["final"], targetname="{}.mp4".format(args["name"])) except: ffmpeg_extract_subclip("descarga.mp4", args["inicio"], args["final"], targetname="{}.mp4".format(args["name"])) #Para listar todos los stream del video #lstst=yt.streams.all() #for st in lstst: # print(st) #Finalmente eliminamos el video completo de la carpeta remove("{}.mp4".format(yt.title))
49 49 Sistema para el Seguimiento de Atletas en Retransmisiones Deportivas 8 REFRERENCIAS [1] Visión artificial. (2020, 20 octubre). En Wikipedia, la enciclopedia libre. https://es.wikipedia.org/wiki/Visi%C3%B3n_artificial#:%7E:text=La%20visi%C3%B3n%20artificial%2C%2 0tambi%C3%A9n%20conocida,simb%C3%B3lica%20para%20que%20puedan%20ser [2] Roberts, Lawrence. (1963). Machine Perception of Three-Dimensional Solids. [3] https://opencv.org/about/ [4] A. (2019, 17 septiembre). ¿Cómo funciona el ojo de halcón en tenis? Ertheo, education and sports. https://www.ertheo.com/blog/ojo-halcon-tenis-2/ [5] I. (2020, 1 abril). Del «replay» al control de «hooligans»: la visión artificial en el deporte. [R]evolución artificial. https://blog.infaimon.com/del-replay-al-control-de-hooligans-la-vision-artificial-en-el-deporte/ [6] Rosebrock, A. (2020, 18 abril). Faster video file FPS with cv2.VideoCapture and OpenCV. PyImageSearch. https://www.pyimagesearch.com/2017/02/06/faster-video-file-fps-with-cv2-videocapture-and-opencv/ [7] M. M. Naushad Ali, M. Abdullah-Al-Wadud and Seok-Lyong Lee. An Efficient Algorithm for Detection of Soccer Ball and Players. Department of Industrial and Management Engineering Hankuk University of Foreign Studies, REPUBLIC of KOREA [9] Cem Direkoglu. Melike Sah. Noel E. O’Connor. (2017, 5 December). Player detection in field sports. Springer Nature. [10] Robert Bodor, Bennett Jackson, Nikolaos Papanikolopoulos. Vision-Based Human Tracking and Activity Recognition. Dept. of Computer Science and Engineering, University of Minnesota. [11] G. (2020a, enero 30). Filtro de Kalman: Deducción y... Lab. Gluón. https://www.laboratoriogluon.com/filtro-de-kalman-deduccion-ejemplos/ [12] pytube — pytube 9.6.4 documentation. (s. f.). pytube. Recuperado 28 de octubre de 2020, de https://python-pytube.readthedocs.io/en/latest/ [13] https://docs.python.org/3/library/argparse.html [14] moviepy. (2020, 7 mayo). PyPI. https://pypi.org/project/moviepy/
Refrerencias 50 50 [15] J.M.F. Rodrigues, P.J.S. Cardoso, T. Vilas, S. Bruno, P. Rodrigues, A. Belguinha, C. Gomes. A computer visión based web application for tracking soccer players. University of the Algarve.