2020 Pec 2

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 38

Visión Artificial

Prueba de evaluación continua 2


2019-2020

Alumno: Alberto Martínez Montenegro


DNI:
Centro Asociado: Pontevedra-Vigo
Teléfono de contacto:
Email:
Página 2 de 38

Índice
Ejercicio 1 .................................................................................................. 3
Ejercicio 2 .................................................................................................11
Ejercicio 3 ................................................................................................ 22
Ejercicio 4 ................................................................................................ 32

Visión Artificial Alberto Martínez Montenegro


Página 3 de 38

1) Segmentación con conocimiento del dominio.

a) ¿Cuáles son los parámetros a tener en cuenta en la configuración de


cv2.HoughCircles, cv2.HoughLines y cv2.HoughLinesP? Indique su utilidad.

A continuación, se detalla la utilidad de los parámetros requeridos por cada una de


las funciones. Los parámetros usados por la función cv2.HoughCircles son los
siguientes:
• Imagen de entrada: La imagen sobre la que se aplicará la función. Debe ser
una imagen de 8 bits de profundidad, monocanal y en escala de grises. Su
utilidad es evidente, nos permite procesar la imagen que deseemos.
• Variable círculos: Es la variable de salida en dónde se almacenarán los círculos
encontrados (tipo cv.CV_32FC3). Cada círculo se almacenarán mediante un
vector de tres elementos (x, y, radio), cada uno de estos tres elementos será
un número de coma flotante.
• Método de detección: Esté parámetro nos permitirá indicarle a la función qué
método queremos utilizar para la detección de círculos. Según la
documentación, el único método implementado en la actualidad es
HOUGH_GRADIENT.
• Ratio de resolución del acumulador: Nos permite controlar la resolución que
va a manejar el acumulador con respecto a la resolución de la imagen de
entrada.
• Distancia mínima: Nos permite establecer una distancia mínima entre los
círculos encontrados.
• Parámetro de método 1: Es el primer parámetro que se le pasará al método
que hayamos establecido con el parámetro “Método de detección”. Nos
permite controlar el comportamiento de nuestro método pasándole cierto
valor. En el caso concreto del método HOUGH_GRADIENT, es el valor umbral
superior para del detector de bordes Canny, a partir de él se establece el inferior,
que es dos veces más pequeño.
• Parámetro de método 2: Es el segundo parámetro que se le pasará al método
que hayamos establecido con el parámetro “Método de detección”. Nos
permite controlar el comportamiento de nuestro método pasándole cierto
valor. En el caso concreto del método HOUGH_GRADIENT, es el valor umbral
del acumulador para los centros de círculo en la etapa de detección, cuanto más
pequeño sea, más riesgo habrá de detectar círculos falsos.
• Radio mínimo de círculo: Nos permite establecer un radio mínimo para los
círculos detectados.
• Radio máximo de círculo: Nos permite establecer un radio máximo para los
círculos detectados.
Los parámetros usados por la función cv2.HoughLines son los siguientes:
• Imagen de entrada: La imagen sobre la que se aplicará la función. Debe ser
una imagen binaria, así que se debe aplicar umbralización o detección de
bordes antes de cv2.HoughLines. Su utilidad es evidente, nos permite
procesar la imagen que deseemos.

Visión Artificial Alberto Martínez Montenegro


Página 4 de 38

• Precisión de ρ: ρ es la distancia perpendicular desde el origen hasta la línea.


Este parámetro nos permite definir la precisión de ρ con la que queremos
trabajar. Por ejemplo, si queremos que la precisión de ρ sea de 1 píxel,
deberemos pasar 1 como parámetro. Cuanto mayor sea la precisión más
recursos serán necesarios, ya que se generará una matriz con un
número de filas igual a la precisión de ρ y un número de columnas igual
a la precisión de θ.
• Precisión de θ: θ es el ángulo que forma la línea perpendicular ρ con el eje
horizontal. Este parámetro nos permite definir la precisión de θ con la que
queremos trabajar. Por ejemplo, si queremos que la precisión de θ sea de un
grado, deberemos pasar un parámetro que genere una matriz de 180
columnas.
• Valor umbral: El cuarto parámetro es un valor umbral que nos permitirá
decidir la longitud mínima que debe tener una línea para ser considerada
como tal.
Los parámetros usados por la función cv2.HoughLinesP son los mismos que los usados
en cv2.HoughLines, con la excepción de dos nuevos argumentos:
• Longitud mínima de línea: Es el valor mínimo de longitud que puede tener una
línea, nos permitirá rechazar cualquier línea con longitud inferior al
parámetro pasado (al igual que hace el parámetro ‘Valor umbral’).
• Brecha máxima de línea: Es el valor máximo de longitud que puede tener una
brecha entre dos segmentos de línea, nos permitirá rechazar cualquier línea
en la que exista una brecha de longitud mayor al parámetro pasado.

b) Hemos visto que la transformada de Hough se puede aplicar a la detección de


líneas y de círculos. ¿Se puede aplicar a otros modelos? ¿Qué condición debe
cumplir un modelo para poder aplicar la transformada de Hough?

Sí, la transformada de Hough puede aplicarse a cualquier modelo. El único requisito


es que la forma buscada sea una forma que conocemos de antemano, y que se pueda
expresar matemáticamente.
Explicado de una manera informal, la forma en la que funciona la transformada de
Hough para detectar líneas es la siguiente:
1. Se selecciona un píxel de la imagen.
2. Se calculan las líneas que pasan por dicho píxel, usando el modelo
matemático de línea recta: ρ = x · cos θ + 𝑦 · sin θ. Cada línea que pase
por dicho píxel incrementará su acumulador en 1.
3. Se repiten los pasos 1 y 2 hasta procesar todos lo píxeles.
4. Las líneas cuyo acumulador supere el umbral establecido serán las líneas
detectadas.
Esto puede extrapolarse a cualquier forma que queramos detectar, siempre que
consigamos crear un modelo matemático para el paso 2.
En los apuntes base de la asignatura se explica el caso general de uso para la

Visión Artificial Alberto Martínez Montenegro


Página 5 de 38

transformada de Hough. En dicha explicación puede comprobarse como es posible


incluso construir un modelo matemático para formas irregulares de las cuales
desconocemos su orientación.

c) Aplique la transformada de Hough a la detección de la dirección del texto en la


figura textoMolinos.png. A continuación, aplique una transformación afín para que
las líneas de texto queden en horizontal y segmente las letras. Finalmente,
normalícelas en tamaño, de manera que las letras tengan un tamaño de 20x20
pixeles. Implemente estas dos opciones:
1. Simplemente estire la dimensión más estrecha de la letra para que la
dimensión final sea de 20x20.
2. No las deforme, simplemente ajuste la escala para que o la altura o la anchura
de la letra sea de 20 píxeles (la dimensión mayor) y rellene el espacio en la otra
dimensión para que el tamaño final sea de 20x20 y la letra esté centrada.

Para realizar la transformada de Hough, se ha aplicado la implementación descrita en


el tutorial que enlaza el enunciado. Tras realizar varios intentos, se han obtenido
unos resultados óptimos utilizando los siguientes parámetros:
• Precisión de ρ: 1
𝜋
• Precisión de θ:
180
• Valor umbral: 250
Con estos parámetros, se han obtenido 72 líneas que cumplen los requisitos de
longitud:

Visión Artificial Alberto Martínez Montenegro


Página 6 de 38

Para hallar el ángulo de inclinación del texto, se ha calculado la media aritmética


para los 72 valores de θ, obteniendo un valor de 15 grados sexagesimales.

A continuación, se ha rotado la imagen 15 grados a la derecha mediante warpAffine,


y se ha aplicado umbralización binaria. Se ha usado un valor umbral diferente para
cada párrafo para poder umbralizar correctamente todo el texto:

El siguiente paso es el segmentado de letras. Para realizar esta operación se ha


hecho lo siguiente:
1. Se han seleccionado todas las zonas blancas individuales.
2. Se han descartado las que tenían un tamaño mayor de 30x30 (los cuatro
triángulos de las esquinas)
3. Se han descartado las que tenían un tamaño menor de 5x5 (puntos, comas,
acentos y comillas)
Por último, se ha aplicado la redimensión pedida para cada una de las variantes. En

Visión Artificial Alberto Martínez Montenegro


Página 7 de 38

ambas variantes se ha aplicado una redimensión personalidada para las ies y las eles
para una mayor legibilidad. En la variante 2, también se han centrado las letras
vertical y horizontalmente también para hacer más legible el texto.
Los resultados han sido los siguientes, variante 1:

Variante 2:

El principal defecto, de estos resultados, es la ausencia de los elementos descartados


(puntos, comas, acentos y comillas). La principal dificultad que tendría incluirlos
radica en que muchos de ellos están enlazados a una letra (las ies con sus respectivos
puntos, los acentos con su letra acentuada, los puntos de las interrogaciones).
Para solucionar esto, se podría añadir una función al programa que procesase estos
caracteres pequeños e hiciese lo siguiente:
1. Se detecta un carácter pequeño de menos de 5x5
2. Se examina la zona vertical del carácter para determinar si es un carácter
aislado, o si tiene otra letra detecta en su zona superior o inferior.
3. Si está asilado, se procesa con una redimensión personalizada que aumente un
poco su tamaño (si usamos la redimensión de las demás letras quedaría
enorme y dificultaría la legibilidad). Si no está aislado se fusiona con la letra
que tenga encima o debajo, formando una única letra detectada que será
procesada como las demás.
4. Se vuelve al paso 1 hasta que se hayan procesado todos los elementos
menores de 5x5

Visión Artificial Alberto Martínez Montenegro


Página 8 de 38

d) Otro método actualmente muy interesante para el ajuste de modelos es


RANSAC (Random Sample Consensus). Indique los parámetros a tener en cuenta
en este método.
El método RANSAC es un algoritmo de estimación robusta que nos permite calcular
los parámetros de un modelo matemático a partir de un conjunto de puntos
observados. Aunque estos puntos observados contengan ruido o valores atípicos,
pueden obtenerse unos buenos resultados. No es un método determinista, por lo que
no está garantizado un resultado correcto.
Los parámetros a tener en cuenta cuando se aplica el algoritmo RANSAC son los
siguientes:
• Datos de entrada: Una serie de puntos observados cuya distribución será
examinada por el algoritmo.
• Modelo: Un modelo que se puede ajustar a los puntos observados, por
ejemplo, una línea recta.
• Número mínimo de valores de ajuste de modelo (n): El número mínimo de
puntos observados que se ajustan al modelo necesarios para producir un
ajuste total válido.
• Número máximo de iteraciones (k): Iteraciones máximas que se le permite al
algoritmo, se usa para impedir que el algoritmo exceda un tiempo límite o
unos recursos máximos.
• Valor umbral (t): Valor umbral para determinar cuándo un punto observado se
ajusta al modelo buscado.
• Número de valores cercanos requeridos (d): Si el número de puntos cercanos
al modelo es superior a un umbral requerido d, entonces el ajuste será válido.

e) Obtenga la dirección de la línea principal (la más larga) en la imagen


lineaRuidosa.png

Para resolver este apartado se ha modificado la implementación en Python del


algoritmo RANSAC que se enlaza en el enunciado.
Se ha hecho la llamada a la función linear_model.RANSACRegressor() sin ningún
parámetro, al igual que se hace en la implementación de ejemplo del tutorial. El
hecho de no pasar ningún parámetro provoca que los parámetros enumerados en el
apartado anterior adquieran su valor por defecto, es decir, los valores que los
creadores de la librería linear_model han considerado adecuados para un caso
genérico de ajuste de modelo mediante RANSAC.
Mediante la ejecución del algoritmo, se ha obtenido el siguiente gráfico:

Visión Artificial Alberto Martínez Montenegro


Página 9 de 38

Si representamos la línea calculada directamente sobre la imagen:

Como los resultados obtenidos han sido correctos, no he visto necesario aplicar el
algoritmo con diferentes parámetros.

f) Revise esta presentación y compare el funcionamiento de ambos métodos.


https://cs.gmu.edu/~kosecka/cs682/lect-fitting.pdf

En los apartados anteriores se ha descrito el algoritmo RANSAC. En la presentación


del enlace de este apartado se nos presenta, además de RANSAC, otro algoritmo de
ajuste llamado algoritmo de los mínimos cuadrados.
Los dos algoritmos funcionan de manera diferente, descrito de una manera informal,
el algoritmo RANSAC realiza las siguientes operaciones:
1. Se selecciona aleatoriamente de entre todos los píxeles una muestra de n
píxeles
2. Se calculan los parámetros del modelo (por ejemplo, una recta) que pasan por
los n píxeles
3. Se determinan los pixeles de la imagen que se ajustan al modelo hallado con

Visión Artificial Alberto Martínez Montenegro


Página 10 de 38

superen el valor umbral t.


4. Si el número de inliers es el más alto encontrado, se guarda el modelo actual.
5. Se repiten los pasos del 1 al 4 k veces (número de iteraciones).
6. Si el número de puntos cercanos al modelo es superior al número de valores
cercanos requeridos d, entonces el ajuste será válido.
El algoritmo de los mínimos cuadrados simplemente busca encontrar la línea recta
que minimice la suma de cuadrados de las diferencias entre los puntos a examinar.

Si tenemos una serie de puntos 𝑋𝑖 , 𝑌𝑖 , el algoritmo consiste en encontrar una recta


tal que la distancia perpendicular desde ésta a los puntos 𝑋𝑖 , 𝑌𝑖 (ax + by = d)
sea mínima. Es decir, encontrar los valores a,b y d para minimizar la siguiente
ecuación.
𝑛

𝐸 = ∑(𝑎𝑥𝑖 + 𝑏𝑦𝑖 − 𝑑)2


𝑖=1

Tal y como se nos muestra en la presentación, el principal problema de este


algoritmo es que la presencia de ruido o de valores atípicos pueden provocar
resultados poco precisos o incluso totalmente incorrectos. Por lo tanto, para
aplicar este algoritmo en visión artificial tendremos que tener información
precisa sobre el ruido y los valores atípicos presentes en la imagen antes de
procesarla.
En cuanto al algoritmo RANSAC, tiene la ventaja de ser simple y general, y
será aplicable a diferentes problemas incluso aunque contengan ruido o
valores atípicos. En la práctica suele funcionar bien, como se ha visto en el
apartado anterior. Por otro lado, al usar RANSAC debemos tener en cuenta que
podría consumir demasiados recursos dependiendo del número de iteraciones
y el número de datos observados, así que en ciertas circunstancias convendría
evaluar con cuidado cual de los dos algoritmos sería el adecuado.

Visión Artificial Alberto Martínez Montenegro


Página 11 de 38

2) Descriptores de Puntos Característicos (Feature


point descriptors)

a) Las imágenes formulario.png y formularioRelleno2.png corresponden a la


estructura de un formulario de una aplicación de toma de datos (formulario vacío,
patrón) y a un ejemplo de formulario relleno y “fotografiado”. Utilice las
características SIFT (opencv) para encontrar la relación entre ambas imágenes.
Aplique la transformación que considere adecuada para visualizar la imagen
escaneada en la misma escala y con la misma orientación que el patrón.

Para la resolución de este apartado, se han tomado y modificado fragmentos de


código de varios de los tutoriales del enunciado.
Mediante el método SIFT se han detectado los siguientes puntos clave en
formulario.png:

Y los siguientes en formularioRelleno1.png:

Visión Artificial Alberto Martínez Montenegro


Página 12 de 38

Los emparejamientos resultantes de aplicar la función bf.match() han sido los


siguientes:

Como puede observarse, aunque la gran mayoría de los emparejamientos son


correctos, el algoritmo empareja algunos puntos de forma incorrecta por

Visión Artificial Alberto Martínez Montenegro


Página 13 de 38

tratarse de la misma forma, por ejemplo, un carácter punto (.) de la primera


imagen, se empareja con otro punto diferente de otra zona en la segunda
imagen.
Para observarlo mejor, seleccionaremos sólo los 50 primeros elementos de la
matriz de emparejamientos (matches[:50]), puede verse que son todos
correctos:

Rotar y escalar la imagen mediante warpAffine con la información que


tenemos es extremadamente sencillo. Esto se debe a que la función
cv2.warpAffine() nos permite hacer una rotación/redimensión completa
aportando como parámetros tres puntos de la imagen original y sus
correspondientes tres puntos de la imagen rotada/redimensionada.
Simplemente usamos los puntos de la matriz matches[], los tres puntos
originales serán tres puntos de coincidencia de formulario.png y los puntos de
la imagen rotada/redimensionada sus tres puntos de coincidencia
correspondientes de formularioRelleno1.png.
Esta transformación hay que aplicarla a formularioRelleno1.png, para obtener
el resultado requerido (se muestra junto a formulario.png para apreciar los
cambios):

Visión Artificial Alberto Martínez Montenegro


Página 14 de 38

b) Realice la misma operación utilizando características ORB (también en opencv).


Compare y comente los resultados obtenidos.

Usando ORB en lugar de SIFT, puede observarse que el número de


emparejamientos incorrectos es mucho mayor. Esto se nota si mostramos los
50 primeros elementos de la matriz de emparejamientos (matches[:50]):

Visión Artificial Alberto Martínez Montenegro


Página 15 de 38

Con el método SIFT había un 100% de acierto en estas primeras 50 coincidencias,


mientras que con ORB se detectan ya varios errores. Además de esto, si observamos el
resultado final:

Puede verse que con ORB la imagen está ligeramente deformada y la rotación
también es imperfecta, lo que significa que la precisión en la detección de los
puntos de coincidencia no es tan alta como con SIFT.

c) Localice el libro “box.png” en la escena “box_in_scene.png” (indicando posición


y orientación).

Detectamos los puntos coincidentes usando el mismo método que en el


apartado a:

Visión Artificial Alberto Martínez Montenegro


Página 16 de 38

Para eliminar las falsas coincidencias podríamos usar un algoritmo como


kmedias, que separase los puntos detectados que están asilados de los demás.
Como para resolver el ejercicio sólo ha de indicarse la posición y orientación,
me limitaré a comprobar que las tres primeras coincidencias son correctas:

Usando estos tres puntos y su posición en box.png y box_in_scene.png, puede


calcularse la posición y la orientación. Para una mejor visualización se ha
marcado en verde el contorno del libro y se ha dibujado una cruz griega azul
en la portada:

Visión Artificial Alberto Martínez Montenegro


Página 17 de 38

El algoritmo también muestra la posición del libro a través del punto central
de la cruz:

Algo que también podría hacerse, es calcular la rotación en los ejes X, Y y Z


para dibujar un cubo, de una forma similar al ejercicio 3 de la PEC1. Aunque
con las marcas que se han hecho en la resolución de este ejercicio se puede
apreciar la posición y la orientación del objeto, dibujar un cubo en el que se
aprecie la perspectiva podría ser un mejor indicador de la pose del objeto.

d) Stiching: Unir convenientemente dos o más imágenes para obtener una imagen
panorámica. https://docs.opencv.org/3.4.8/d1/d46/group__stitching.html
Implemente el siguiente tutorial ( https://morioh.com/p/bd1b6fc9d9eb ) y aplíquelo
a tres imágenes tomadas con su cámara. Enumere los pasos que ha realizado.

Para resolver este apartado he tomado las siguientes fotografías con mi


smartphone:

Visión Artificial Alberto Martínez Montenegro


Página 18 de 38

He aplicado la implementación del tutorial con el algoritmo SIFT a las dos


primeras imágenes, esta es una muestra de las coincidencias encontradas.

Puede observarse que al igual que en los apartados anteriores se detectan


algunas falsas coincidencias. Para hacer warpPerspective(), hay que

Visión Artificial Alberto Martínez Montenegro


Página 19 de 38

asegurarse de escoger cuatro coincidencias que sean correctas. El resultado


de la unión de las dos imágenes es el siguiente:

El siguiente paso, es recortar la pequeña parte negra de la derecha de la


imagen, aunque se pierda parte de la imagen no importa, ya que esa
información está presente en la tercera fotografía:

Visión Artificial Alberto Martínez Montenegro


Página 20 de 38

Ahora repetimos el proceso entre la fotografía anterior y la tercera fotografía.


Estos son las coincidencias detectadas:

De nuevo, seleccionamos 4 coincidencias correctas para aplicar


warpPerspective de la misma forma que se implementa en el tutorial,
obteniendo el resultado final:

Visión Artificial Alberto Martínez Montenegro


Página 21 de 38

e) Analice el ejercicio 4 de la PEC1 desde el punto de vista de los puntos


característicos utilizados. Detalle el método de selección de los puntos
característicos y el algoritmo utilizado para su seguimiento.

En el ejercicio 4 de la PEC1 se analizó la detección de flujo óptico en vídeos.


Se examinaron dos métodos, Lucas-Kanade y el método de flujo óptico denso:

• Lucas-Kanade: Al usar este método se elige una serie de puntos


característicos en el primer fotograma. El algoritmo va obteniendo el
flujo óptico de estos puntos característicos valiéndose en cada paso de:
• El fotograma previo.
• Los puntos previos.
• El nuevo fotograma.
El algoritmo va devolviendo los nuevos puntos de interés, en caso de
que hayan sido encontrados, y de esa forma es como se consigue una
detección del flujo óptico.
La forma de decidir estos puntos característicos al principio del
algoritmo puede variar dependiendo de la implementación que usemos,
en OpenCV usamos la función cv2.goodFeaturesToTrack() para
localizarlos. El algoritmo que hay detrás de esa función es el detector
de esquinas Shi-Tomasi, que como su nombre indica detecta las
esquinas más relevantes de una determinada imagen. Por lo tanto, lo
que hace el algoritmo Lucas-Kanade es detectar las esquinas más
relevantes de la primera imagen y va rastreando el flujo óptico a
medida que se recorren el resto de fotogramas.

• Flujo óptico denso: A diferencia del método Lucas-Kanade, el método


de flujo óptico denso rastrea todos los píxeles. Con lo cual podríamos
considerarlo como un algoritmo denso cuyo método de selección de
puntos característicos es la fuerza bruta.
En OpenCV se usa la función calcOpticalFlowFarneback() para ir
rastreando todos los puntos. El algoritmo que hay detrás de esta
función es el algoritmo de Gunnar Farneback. El algoritmo obtiene
una matriz de dos canales con los vectores de flujo óptico y se
encuentra su magnitud y dirección, mediante estos vectores se puede
representar el flujo óptico.
El hecho de rastrear todos los píxeles de la imagen hace que el método
de flujo óptico denso sea mucho más lento y requiera mayor capacidad
computacional que el método Lucas-Kanade, pero puede ser más
preciso.

Visión Artificial Alberto Martínez Montenegro


Página 22 de 38

3) Reconocimiento de objetos

a) Análisis básico de blobs.

Se ha implementado la detección de momentos de imagen de la misma forma


que se indica en el tutorial enlazado, únicamente he tenido que ajustar la
umbralización para que se tengan en cuenta las figuras cuyo color es un tono
de gris más claro. Se ha marcado en verde el centroide de cada blob, y se han
numerado mediante cv2.putText() para su identificación:

Visión Artificial Alberto Martínez Montenegro


Página 23 de 38

El programa creado detecta y clasifica todas las formas, también dibuja el


contorno detectado sobre su forma correspondiente, cada color se
corresponde con una forma diferente:

El programa imprime por pantalla información de interés sobre cada uno de


los blobs detectados. Esta información es suficiente para responder a los
apartados a), b), c), y d), ya que al final de la descripción matemática de
cada blob, se incluye una línea de texto con su clasificación.
A continuación, se muestra por pantalla la información imprimida por el
programa:

runfile('C:/Users/alber/.spyder-py3/PEC2/Ejercicio 3a.py', wdir='C:/Users/alber/.spyder-


py3/PEC2')

Visión Artificial Alberto Martínez Montenegro


Página 24 de 38

Blob 1 :
Centroide: ( 382 , 393 )
Perímetro: 218.55129778385162
Área: 3417.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro muy grande
El porcentaje de cuña faltante es: 0%

Blob 2 :
Centroide: ( 290 , 394 )
Perímetro: 259.2792183160782
Área: 3299.0
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un sector circular
El porcentaje de cuña faltante es: 3%

Blob 3 :
Centroide: ( 197 , 396 )
Perímetro: 246.79393792152405
Área: 2965.0
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un sector circular
El porcentaje de cuña faltante es: 13%

Blob 4 :
Centroide: ( 109 , 396 )
Perímetro: 227.09545350074768
Área: 2659.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un sector circular
El porcentaje de cuña faltante es: 22%

Blob 5 :
Centroide: ( 113 , 305 )
Perímetro: 179.9827550649643
Área: 1461.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de una elipse

Blob 6 :

Visión Artificial Alberto Martínez Montenegro


Página 25 de 38

Centroide: ( 377 , 304 )


Perímetro: 218.55129778385162
Área: 3416.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro muy grande

Blob 7 :
Centroide: ( 290 , 303 )
Perímetro: 211.23758840560913
Área: 3123.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de una elipse

Blob 8 :
Centroide: ( 198 , 304 )
Perímetro: 198.6518030166626
Área: 2359.0
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de una elipse

Blob 9 :
Centroide: ( 284 , 229 )
Perímetro: 205.4385986328125
Área: 2805.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un hexágono

Blob 10 :
Centroide: ( 197 , 229 )
Perímetro: 219.3137083053589
Área: 3128.0
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un cuadrado

Blob 11 :
Centroide: ( 103 , 235 )
Perímetro: 208.99494743347168
Área: 2061.0
Color: ( 0 , 0 , 0 )
Clasificación:

Visión Artificial Alberto Martínez Montenegro


Página 26 de 38

Se trata de un triángulo

Blob 12 :
Centroide: ( 377 , 229 )
Perímetro: 219.13708400726318
Área: 3418.0
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro muy grande

Blob 13 :
Centroide: ( 103 , 145 )
Perímetro: 214.65180158615112
Área: 3300.0
Color: ( 204 , 204 , 204 )
Clasificación:
Se trata de un círculo gris claro muy grande

Blob 14 :
Centroide: ( 377 , 145 )
Perímetro: 219.72286927700043
Área: 3417.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro muy grande

Blob 15 :
Centroide: ( 284 , 145 )
Perímetro: 217.13708364963531
Área: 3358.0
Color: ( 102 , 102 , 102 )
Clasificación:
Se trata de un círculo gris oscuro muy grande

Blob 16 :
Centroide: ( 196 , 145 )
Perímetro: 217.13708341121674
Área: 3336.0
Color: ( 153 , 153 , 153 )
Clasificación:
Se trata de un círculo gris muy grande

Blob 17 :
Centroide: ( 103 , 75 )
Perímetro: 120.22539532184601

Visión Artificial Alberto Martínez Montenegro


Página 27 de 38

Área: 1021.0
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro muy pequeño

Blob 18 :
Centroide: ( 189 , 75 )
Perímetro: 146.36753177642822
Área: 1528.0
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro pequeño

Blob 19 :
Centroide: ( 284 , 75 )
Perímetro: 183.58073484897614
Área: 2408.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro grande

Blob 20 :
Centroide: ( 377 , 69 )
Perímetro: 220.55129742622375
Área: 3457.5
Color: ( 0 , 0 , 0 )
Clasificación:
Se trata de un círculo negro muy grande

El modo de funcionamiento del programa es el siguiente:


1. Se toma un blob.
2. Con la función cv2.minEnclosingCircle(cnt) obtenemos su círculo
envolvente mínimo, si la diferencia de áreas entre el blob y el círculo
envolvente es muy pequeña, el blob es un círculo.
3. Si el blob aún no se ha clasificado, se repite la operación del paso
anterior, esta vez usando cv2.fitEllipse(cnt). Si el blob cumple el
requisito del área, será una elipse.
4. Si el blob aún no se ha clasificado, se aplica la función
cv2.approxPolyDP(cnt), en función del número de lados que detecte la
función, será un triángulo, un cuadrado o un hexágono.
5. Si el blob aún no se ha clasificado, se clasifica como sector circular.
6. Se repiten los pasos del 1 al 5 hasta procesar todos los blobs.

Visión Artificial Alberto Martínez Montenegro


Página 28 de 38

El tamaño se clasifica comparando las áreas, el color se clasifica obteniendo


el color del pixel que se encuentra en el centroide, y la proporción de cuñas
dividiendo el área del blob entre el área del círculo envolvente.

b) Características Haar en cascada.


Se ha implementado el tutorial enlazado en el fichero ‘Ejercicio 3b.py’ que se
adjunta a este tutorial.

c) Características HoG + SVM


Se ha implementado el tutorial enlazado en el fichero ‘Ejercicio 3c.py’ que se
adjunta a este tutorial.

d) Comente las características de estos métodos de reconocimiento de objetos,


indicando sus puntos fuertes y sus puntos débiles

Podríamos decir que la detección facial usando el método Haar en Cascada


funciona en dos fases:
1. Se examinan pequeñas partes de la imagen y se descartan si se
concluye que no es posible que contengan total o parcialmente un
rostro.
2. Se procesan las partes de la imagen candidatas a contener total o
parcialmente un rostro. Para hacer esto, debemos poseer la
información de características faciales fruto de un entrenamiento
mediante aprendizaje automático. Este entrenamiento se realiza
procesando imágenes etiquetadas, positivas (se sabe que contienen un
rostro) y negativas (se sabe que no contienen un rostro).
La implementación del tutorial enlazado nos proporciona el fichero
‘haarcascade_frontalface_default.xml’. Este fichero es el fruto del proceso
de aprendizaje automático que se ha comentado en el párrafo anterior, por lo
que, si ha sido creado correctamente, aportará la información necesaria para
reconocer un rostro en una determinada imagen.
El código de Python se limita a ir tomando cada fotograma, procesarlo con
faceCascade.detectMultiScale(), y dibujar un rectángulo verde sobre el rostro
detectado si es que se produce detección.
Las ventajas de este método, es que podemos crear un programa tan bueno
como bueno sea nuestro fichero de entrenamiento. Dependiendo de nuestras
necesidades, debemos planificar bien el proceso de entrenamiento y las
imágenes que se utilizaran en él, para que el programa final detecte lo que
nosotros queramos que detecte.
Con las desventajas ocurre lo mismo, si el fichero de entrenamiento que
hemos creado no es óptimo, pueden que no detecte los rostros en

Visión Artificial Alberto Martínez Montenegro


Página 29 de 38

determinadas situaciones o incluso que produzca falsos positivos.


Haciendo pruebas con la implementación del tutorial enlazado y su fichero de
entrenamiento, he podido comprobar que funciona bien y si exactitud es
bastante buena. Sin embargo, es poco tolerante con la pose del rostro, es
decir, si el rostro no está de frente y está ligeramente inclinado, la
implementación falla.
A continuación, puede verse como girando un poco la cabeza la
implementación ya no detecta el rostro:

A diferencia del método anterior, para el método de detección de peatones,


OpenCV dispone de un modelo HOG + Linear SVM preentrenado, por lo que en
esta implementación no se proporciona ningún fichero extra.
De nuevo, las imágenes se procesan con el objetivo de detectar una serie de
características que vienen descritas por el modelo preentrenado, en esta
ocasión se trata de detectar a personas en imágenes.
La implementación funciona igual que la anterior, se toma cada fotograma, se
procesa en esta ocasión con cv2.HOGDescriptor_getDefaultPeopleDetector() y
se dibuja un rectángulo verde sobre la persona detectada si es que se produce

Visión Artificial Alberto Martínez Montenegro


Página 30 de 38

la detección. La diferencia radica que en que con este método las


descripciones de las características son densas, ya que se deben hacer
cómputos en toda la imagen (Histogramas de Gradientes Orientados).
En este método hay que realizar el cálculo de los gradientes de imagen de
primer orden procesando todas las partes de la imagen, por lo que podría
requerir un alto grado de recursos en algunas aplicaciones.
Haciendo pruebas con la implementación he detectado varias cosas, en
general la detección es correcta para todas las imágenes en las que se ve una
imagen clara de la persona de pie, sin embargo, el algoritmo tenderá a fallar
más cuanto más alejada esté la persona:

El algoritmo detecta correctamente personas cercanas incluso en entornos

Visión Artificial Alberto Martínez Montenegro


Página 31 de 38

que contienen elementos que podrían generar falsos positivos:

Sin embargo, falla en algunas imágenes en las que los elementos del entorno
comprometen la detección de la silueta humana. Por ejemplo, en la siguiente
fotografía se aprecia claramente a la persona, pero el algoritmo no es capaz
de detectarla:

Visión Artificial Alberto Martínez Montenegro


Página 32 de 38

4) Aplicación de reconocimiento de objetos (II).

1.1) Identifique todos los bloques del sistema de visión que considere
inicialmente necesarios para construir el sistema. Justifique su respuesta
adecuadamente.

El sistema estará formado por los siguientes


bloques:
-Adquisición de imágenes: Este primer bloque
se encargará de la carga de imágenes fuente a
la memoria del sistema.
-Preprocesado: Se preprocesará la imagen
eliminando aquellos elementos que aporten
ruido o no sean relevantes para nuestro
objetivo. En vista de las imágenes del
enunciado, habrá que eliminar únicamente
ruido sal y pimienta.
-Segmentación: Habrá que segmentar la
imagen para aislar las zonas que contengan
información relevante para la identificación de
cruces. Dado que se trata de figuras bien
definidas bajo un fondo blanco parece que la
umbralización binaria será la opción más
sencilla para utilizar en este bloque.
-Modelado de objetos: Los fragmentos
individuales (blobs) segmentados en el
apartado anterior han de ser examinados.
Deben evaluarse sus características
geométricas y cualquier otro elemento

matemático que pueda servirnos para obtener características relevantes para


su clasificación.
-Clasificación: Con la información obtenida en la etapa de modelado, se
clasificarán los blobs a examinar según las características calculadas.

A la hora de implementar una solución para este ejercicio, se ha seguido este


esquema. Sin embargo, he acabado por eliminar el bloque de preprocesado,
ya que en la etapa de segmentación se aplica una erosión para separar las
cruces cercanas que tiene como efecto secundario la eliminación completa de
ruido. Este hecho hizo que el preprocesado ya no fuese necesario.

Visión Artificial Alberto Martínez Montenegro


Página 33 de 38

1.2) Implemente el sistema o conjunto de sistemas que localice y


reconozca las cruces griegas y deseche el resto de objetos detectados.

Para la resolución de este apartado se ha codificado un único programa que


localiza las cruces griegas con éxito en las cuatro imágenes.
A continuación, se expone un ejemplo de ejecución del programa con la
imagen ‘O1_cruces.png’, siguiendo cada una de las etapas descritas en el
apartado anterior.

-Adquisición de imágenes:
El programa carga la imagen ‘O1_cruces.png’

-Preprocesado: Como se indicó en el apartado anterior, se eliminó este bloque


por no ser necesario con la implementación desarrollada.

-Segmentación:
En primer lugar, el programa aplica una umbralización binaria sobre la
imagen:

A continuación, se detectan los blobs presentes en la imagen, y se rellenan de


negro con ‘cv2.drawContours()‘:

Visión Artificial Alberto Martínez Montenegro


Página 34 de 38

Después se aplica erosión a la imagen (se usa cv2.dilate() ya que el fondo es


blanco). Esto nos soluciona problemas: separa algunas de las cruces que se
tocan después de ser rellenadas, y elimina por completo el ruido sal y
pimienta.

Después de aplicar la erosión, se vuelven a detectar los contornos. Los blobs


que se detecten serán los que sean modelados y clasificados.

-Modelado de objetos:
Para extraer la información relevante de blob que permita su posterior
clasificación me he basado en el siguiente hecho:
El rectángulo envolvente mínimo de una para un blob cruz se dispone de la
siguiente forma:

Visión Artificial Alberto Martínez Montenegro


Página 35 de 38

Se han marcado en verde los rectángulos envolventes mínimos, en rojo el


centro de dichos rectángulos y en azul el centroide del blob detectado.
En las cruces griegas, se cumplen dos condiciones que pueden utilizarse para
detectarlas:
1. El rectángulo envolvente tiene los lados de la misma longitud (es decir,
es un cuadrado)
2. El centro del rectángulo envolvente coincide con el centroide del blob.
Como puede observarse en la imagen anterior, la primera cruz se descartaría
porque su rectángulo mínimo envolvente no es un cuadrado, la segunda se
descartaría porque su centroide no coincide con el centro de su rectángulo
envolvente, y la tercera sí sería clasificada como cruz griega.
Lo que hago en el programa creado es sumar la diferencia de longitud de
lados y la distancia entre centro y centroide, y los almaceno en la variable
‘deficienciaCruzGriega’.
Por lo tanto, y volviendo a la ejecución del programa, se calcula la variable
‘deficienciaCruzGriega’ para cada uno de los blobs, está será la característica
principal que los defina.

-Clasificación:
Para clasificar los blobs detectados como cruces griegas o desecharlos,
simplemente examinaremos su variable ‘deficienciaCruzGriega’ que se ha
calculado en la etapa anterior. Si esta variable está por debajo de cierto valor
umbral, el blob será una cruz griega. El resultado de la clasificación es el
siguiente:

Visión Artificial Alberto Martínez Montenegro


Página 36 de 38

A continuación, se muestra la ejecución del programa al procesar la imagen


‘O4_cruces_contornosIncompletosyConRuido.png’. Para procesar las cruces
con contorno incompleto, he usado cv2.convexHull(cnt), que devuelve el
contorno convexo de un blob, aunque esto nos devuelve una forma diferente a
la forma de la cruz, se puede detectar si se corresponde con una cruz griega
de la misma forma que se ha descrito antes:

Visión Artificial Alberto Martínez Montenegro


Página 37 de 38

Visión Artificial Alberto Martínez Montenegro


Página 38 de 38

Con las otras dos imágenes también se detectan correctamente las cruces
griegas:

Visión Artificial Alberto Martínez Montenegro

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy