Extracción de características de imágenes en Python

18

En mi clase, tengo que crear una aplicación usando dos clasificadores para decidir si un objeto en una imagen es un ejemplo de phylum porifera (seasponge) o algún otro objeto.

Sin embargo, estoy completamente perdido cuando se trata de técnicas de extracción de características en Python. Mi asesor me convenció de usar imágenes que no se han cubierto en clase.

¿Alguien puede dirigirme hacia documentación significativa o leer o sugerir métodos a considerar?

Jeremy Barnes
fuente
Usted mencionó al asesor, ¿así que supongo que esto es parte de una tarea de la Escuela de Graduados? ¿Tiene acceso a algún software comercial o se espera que lo haga solo con Python y paquetes de código abierto? ¿Qué estás aprendiendo en clase en este momento y cuál es el nombre de la clase? Además, ¿hay un requisito de rendimiento en términos de tiempo que debería tomar para dar una respuesta?
MLowry
Se espera que solo use Python y paquetes de código abierto. Incluso se desaconseja escribir mi propio código fuente. Este es un curso de maestría. La clase es un curso introductorio de ciencia de datos. Lo último que cubrimos es la selección de funciones, aunque casi toda la discusión es sobre datos de texto. No hay requisitos de rendimiento fuera de una precisión ~ 70%
Jeremy Barnes

Respuestas:

11

En las imágenes, algunas técnicas utilizadas con frecuencia para la extracción de características son binarizar y difuminar

Binarizing: convierte la matriz de imágenes en 1s y 0s. Esto se realiza al convertir la imagen en una imagen 2D. Incluso la escala de grises también se puede utilizar. Te da una matriz numérica de la imagen. La escala de grises ocupa mucho menos espacio cuando se almacena en el disco.

Así es como lo haces en Python:

from PIL import Image

%matplotlib inline  

#Import an image
image = Image.open("xyz.jpg")

image

Imagen de ejemplo:

ingrese la descripción de la imagen aquí

Ahora, conviértalo a escala de grises:

im = image.convert('L')

im

te devolveré esta imagen:

ingrese la descripción de la imagen aquí

Y la matriz se puede ver ejecutando esto:

array(im)

La matriz se vería así:

array([[213, 213, 213, ..., 176, 176, 176],
       [213, 213, 213, ..., 176, 176, 176],
       [213, 213, 213, ..., 175, 175, 175],
       ..., 
       [173, 173, 173, ..., 204, 204, 204],
       [173, 173, 173, ..., 205, 205, 204],
       [173, 173, 173, ..., 205, 205, 205]], dtype=uint8)

Ahora, use un diagrama de histograma y / o un diagrama de contorno para ver las características de la imagen:

from pylab import *

# create a new figure
figure()
gray()
# show contours with origin upper left corner
contour(im, origin='image')
axis('equal')
axis('off')


figure()


hist(im_array.flatten(), 128)

show()

Esto te devolvería una trama, que se parece a esto:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Desenfoque: el algoritmo de desenfoque toma el promedio ponderado de los píxeles vecinos para incorporar el color del entorno en cada píxel. Mejora mejor los contornos y ayuda a comprender mejor las características y su importancia.

Y así es como lo haces en Python:

from PIL import *


figure()
p = image.convert("L").filter(ImageFilter.GaussianBlur(radius = 2))
p.show()

Y la imagen borrosa es:

ingrese la descripción de la imagen aquí

Por lo tanto, estas son algunas formas en que puede hacer ingeniería de características. Y para los métodos avanzados, debe comprender los conceptos básicos de la visión por computadora y las redes neuronales, y también los diferentes tipos de filtros y su importancia y las matemáticas detrás de ellos.

Dawny33
fuente
1
Muchas gracias. Publiqué sobre esto en algunos lugares y la suya fue, con mucho, la respuesta más informativa. Me di cuenta de que estaba malentendiendo cómo funciona la extracción de imágenes de características conceptualmente.
Jeremy Barnes
Me alegra que mi respuesta te haya ayudado :)
Dawny33
8

Este gran tutorial cubre los conceptos básicos de las redes neuronales convolucionales, que actualmente están logrando el rendimiento más avanzado en la mayoría de las tareas de visión:

http://deeplearning.net/tutorial/lenet.html

Hay una serie de opciones para CNN en Python, incluidos Theano y las bibliotecas integradas (encontré que los keras son fáciles de usar).

Si prefiere evitar el aprendizaje profundo, puede consultar OpenCV, que puede aprender muchos otros tipos de funciones, cascadas de Haar de línea y funciones SIFT.

http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_feature2d/py_table_of_contents_feature2d/py_table_of_contents_feature2d.html

jamesmf
fuente
1

Como dijeron Jeremy Barnes y Jamesmf, puede usar cualquier algoritmo de aprendizaje automático para resolver el problema. Son potentes y pueden identificar las características automáticamente. Solo necesita alimentar el algoritmo con los datos de entrenamiento correctos. Dado que es necesario trabajar en imágenes, las redes neuronales de convolución serán una mejor opción para usted.

Este es un buen tutorial para aprender sobre la red neuronal de convolución. También puede descargar el código y puede cambiar según la definición de su problema. Pero necesita aprender python y theano library para el procesamiento y también obtendrá buenos tutoriales para eso.

http://deeplearning.net/tutorial/lenet.html

Arun Sooraj
fuente