Hola a todos. Hemos visto que parte importante de un detector de objetos es la clasificación. Los clasificadores se basan en modelos que aprendemos automáticamente a partir de un conjunto de muestras. En el vídeo de hoy amos a ver cómo obtener esas muestras. Inicialmente habrá habido un proceso de adquisición de datos, a partir del cual pues obtenemos un conjunto de imágenes. Ahora se trata de los objetos que nos interesan, anotarlos en esas imágenes. Por ejemplo tenemos esta imagen, supongamos que queremos hacer un detector de peatones y por tanto nos interesan los peatones. Entonces lo que haremos, si queremos utilizar este peaton que tenemos aquí como muestra, lo que haremos es ajustarle una ventana. Es decir, vemos que anotar es realmente es un trabajo manual que puede hacerse a partir de una herramienta propia o alguna herramienta que permita a través de internet anotar numerosas imagen simultáneamente a partir del trabajo de varias personas. En cualquier caso you se ve que este es un trabajo cansado, subjetivo y por tanto sujeto a errores. Además, vamos a requerir que haya variedad en las muestras y tenemos que dar instrucciones precisas para eso. Para evitar alguno de los errores típicos lo que sí que se puede hacer es incorporar restricciones al a hora de hacer estas ventanas, por ejemplo si tenemos una ventana con un cierto tamaño canónico que vamos a usar durante el proceso de selección y aprendizaje de los modelos, pues lo que podemos hacer es que en el momento de anotar un peatón en este caso, o un objeto en general, siempre utilicemos una ventana que como mínimo sea de ese tamaño y si no es de ese tamaño pues que sea de un tamaño mayor pero nunca de un tamaño menor. Además si esta ventana tiene un determinado aspecto ratio, es decir un determinado, una determinada relación de aspecto podemos obligar a que todas las ventanas que se dibujen tengan esa misma relación de aspecto. No voy a entrar aquí en como se hacen esas herramientas y como se hace la interfaz de usuario porque eso sería otro tema y no merece ahora la pena. Otra cuestión es que una vez tenemos anotadas esas ventanas, pues resulta que para algunos descriptores es conveniente tener un marco rodeando realmente a las personas, porque se ha visto que esos detectores dan mejores resultados de esa manera. Cuando estos marcos se pueden añadir de forma automática, una vez nosotros hemos manualmente dado la ventana que se ajusta a la muestra, en este caso a la persona. Para aprender los modelos que nos interesan necesitamos muestras positivas y muestras negativas. Cuando hablamos de anotar nos referimos a manualmente anotar muestras positivas, mientras que las negativas se obtienen automáticamente una vez se han anotado las positivas. Esto se puede hacer de dos formas básicamente. En un caso tenemos un conjunto de imágenes que contienen objetos que nos interesan, por ejemplo peatones, y por tanto hemos anotado en este caso esos peatones con ventanas de una relación de aspecto fija en esas imágenes. Luego pues como sabemos estas anotaciones se pasarán a un tamaño canónico, se aprenderán sus descriptores y se utilizarán para aprender los modelos. Bien, con esas muestras positivas anotadas las negativas las podemos generar aleatoriamente como este ejemplo que vemos aquí, donde hay de distintos tamaños, en distintas posiciones, siempre con la misma relación de aspecto. Lo único que tienen que cumplir es que o bien no se solapen con las muestras positivas o se solapen lo suficientemente poco para que no se pueda considerar que el contenido de esas ventanas negativas sea una persona en este caso, o aunque se solape totalmente con una anotación de persona, pues el tamaño de esa anotación y el de la ventana que estamos ahora intentando usar como ejemplo de muestra negativa, pues sean tamaños muy diferentes de forma que realmente el contenido de esa muestra se pueda considerar fondo. Bien, con este mecanismo lo que sucede es que hemos de anotar todas las personas que haya en las imágenes. Si nos dejamos alguna puede pasar que aleatoriamente pues la utilicemos como muestra negativa. En realidad eso es muy difícil, pero si que en un proceso que veremos posteriormente llamado bootstrapping, si que sería fácil coger esa persona que hemos dejado de anotar y tomarla como muestra negativa. Por tanto en este mecanismo nos obligamos digamos a anotar todas las muestras positivas. Entonces una alternativa para evitar eso, para solo anotar algunas de las muestras positivas es tener un conjunto de imágenes al que llamaremos imágenes negativas, que son tales que no contienen ningún objeto de las que nos interesan, en este caso pues lo que sucede es que no contiene ninguna persona. De esa manera las muestras negativas las tomaríamos de este conjunto, donde podríamos poner ventanas en cualquier lugar y con cualquier tamaño siempre, eso sí con la misma relación de aspecto que las muestras positivas, y bueno estaríamos seguros de que esas ventanas no contienen ningún objeto de los que nos interesan. Y así cogeríamos los ejemplos positivos de estas imágenes, las muestras positivas de esas imágenes y las muestras negativas de esas otras. Y por tanto no es necesario que en estas imágenes de la izquierda anotemos todos los peatones. Otra cuestión importante es que en realidad hay muestras que son más importantes que otras. Por ejemplo, imaginemos este caso de aquí donde tenemos unas muestras negativas, otras negativas y queremos aprender la frontera que las separa. Por ejemplo supongamos una frontera lineal que sería esta de aquí. Bien, you se ve que para aprender esta frontera en realidad nos podríamos ahorrar anotar todas estas muestras que están lejos de la frontera, porque al final las fronteras quedan principalmente determinadas por las muestras que están cerca. Y por tanto esto sería un gran ahorro a la hora de anotar. En realidad, pues las muestras que están lejos de la frontera, por ejemplo si nos fijamos en el caso de las muestras negativas para el ejemplo de los peatones, pues las muestras que están lejos de la frontera son los casos fáciles, es decir que se parecen poco a los peatones. Y las muestras que están cerca son los casos difíciles, es decir que se parecen de alguna manera a los peatones, es decir de acuerdo a alguno de los descriptores que estamos usando. En definitiva lo que nos gustaría a nosotros es obtener muestras más útiles que nos ahorren anotar digamos tanta cantidad de muestras. Si simplemente muestreamos el espacio de posibles muestras de una forma cualquiera, nos puede pasar como en este caso de aquí que no estemos cogiendo las muestras que realmente son más importantes, es decir estamos cogiendo muestras que no necesariamente están alrededor de la frontera que son las que habían por aquí, y por tanto podemos acabar con una frontera sesgada. En realidad nosotros lo que nos interesa es obtener estas muestras de aquí, las que rodean la frontera. Y con eso pues, con ellas aprender la frontera de interesa. Bien, para hacer esto vamos a utilizar dos recetas. Una es el conocido como bootstrapping, que nos va a servir para seleccionar muestras negativas de interés, es decir las que hay por aquí y luego vamos a ver el aprendizaje activo que sirve también para seleccionar muestras negativas pero que en nuestro caso lo vamos a utilizar principalmente para anotar muestras positivas. El bootstrapping que es una palabra en inglés que he preferido no traducir, lo que persigue es que durante el proceso de aprendizaje de los modelos que nos interesan, se utilicen muestras negativas que estén cercanas a la frontera, es decir que sean difíciles, por eso se habla de muestras negativas difíciles o en inglés hard negatives. Aquí ilustramos un posible mecanismo de bootstrapping donde suponemos que tenemos un conjunto de imágenes que contienen objetos de los que que nos interesan por ejemplo peatones, y otro conjunto de imágenes que llamaremos negativas porque no contienen ejemplos de los objetos que nos interesan. Es decir, en este caso no contienen peatones. Con lo que haremos es que una persona anota las imágenes positivas, una serie de ejemplos, en este caso una serie de peatones y aleatoriamente obtendremos muestras negativas del conjunto de imágenes negativas. Inicialmente podemos partir por una relación uno uno y por cada uno de los peatones anotados podemos muestrear, podemos obtener una muestra de las imágenes negativas. Con estas ventanas positivas y negativas lo que haremos es pasarlas a su tamaño canónico, calcular los descriptores correspondientes, por ejemplo basados en LBP y utilizar esas muestras anotadas para realizar nuestro aprendizaje automático del modelo que nos interesa, por ejemplo utilizando regresión logística. Por tanto, esta primera etapa pues es simplemente el aprendizaje del clasificador, o del modelo que utilizaremos en el clasificador. Bien, a continuación lo que vamos a hacer es utilizar estas imágenes negativas en una fase de detección. Es decir, aquí tendremos nuestro clasificador con un cierto umbral, que podría decir umbral igual a cero y lo que vamos a hacer es utilizar el mecanismo de pirámide y de octava deslizante para realizar detecciones en estas imágenes. Y en realidad lo que vamos a estar haciendo es buscar los hard negatives, los negativos difíciles, porque en realidad sabemos que aquí no hay ningún peatón en este caso y por tanto todas las detecciones que se obtengan son lo que se llaman falsos positivos. Por tanto, como fruto de este procedimiento obtendremos una serie de ventanas que tenemos dibujadas aquí, que en realidad son incorrectas porque no contienen ningún peatón. Eso sucede porque este modelo que habíamos hemos aprendido no era suficientemente bueno. Bien, vamos a considerar estas ventanas como difíciles y lo que vamos a hacer es realimentar el sistema de aprendizaje con estas muestras negativas. Es lo que sucede aquí, las que habíamos detectado como peatones y no lo son, ahora pasarán a formar parte de las muestras negativas de nuestro conjunto y por tanto lo que vamos a hacer es volver a realizar el aprendizaje, volver a realizar la detección en las imágenes negativas y en definitiva pues esto es un proceso iterativo que iremos realizando hasta que llegue un momento en que los falsos positivos que se obtengan sean muy pocos o ninguno. Fijémonos que en todo este proceso el número de positivos no cambia, siempre el mismo. El bootstrapping se puede complementar con el conocido aprendizaje activo que lo que persigue en este caso es que la persona anote menos ejemplos positivos pero que sean más relevantes, o si anota el mismo número de ejemplos positivos que en cualquier caso sean más relevantes, es decir que estén más cerca a la frontera que ha de separar las muestras positivas de las negativas. Por ejemplo, en este caso seguimos anotando personas pero en lugar de anotar muchas, anotamos solo unas pocas. Y utilizamos un mecanismo similar al que hemos visto anteriormente, pero en este caso en la fase de detección no solo introducimos las imágenes negativas para obtener negativos difíciles sino que además también introducimos las imágenes que contienen en este caso peatones para ver cuáles peatones se detectan y cuáles no. Por ejemplo, aquí habíamos anotado estos dos que vemos que se detectan, no exactamente quizás con la misma ventana pero sí con una ventana muy solapada con la que ha anotado a la persona, y aparte ha habido otros como este de aquí que también se ha detectado gracias a este modelo que hemos aprendido. Pero aquí otros dos como este y este que no se han detectado. Bien, pues lo que sucede ahora es que este resultado pasa a manos del anotador. Entonces esta persona que está anotando los datos en vez de anotar cualquier peatón al azar en las imágenes, anota estos dos que sabe que el modelo que tiene en ese momento el sistema no es capaz de detectarlos. Por tanto son de alguna manera positivos difíciles para el sistema en ese momento. Y por otro lado pues el mecanismo de bootstrapping está funcionado igualmente. De hecho, en cada digamos iteración del sistema, primero se cumple con el bootstrapping, es decir se reentrena el modelo tantas veces como sea necesario par reducir el número de falsos positivos, y a continuación una vez you hemos parado de hacer bootstrapping, tendremos unos determinados resultados de detecciones en el conjunto de imágenes positivas y es en ese momento en el que la persona que anota los datos decide pues introducir un nuevo positivo. Es decir, el bucle de digamos del aprendizaje activo va en segundo lugar. Así pues, los conceptos claves que hemos visto en este vídeo son cómo se anotan muestras positivas y cómo se obtienen muestras negativas de forma automática una vez hemos introducido las positivas. Además hemos visto el procedimiento de bootstrapping para obtener muestras negativas cercanas a la frontera, es decir difíciles y también hemos visto como complemento al bootstrapping el mecanismo de aprendizaje activo para también obtener muestras difíciles, en este caso muestras positivas.