Extração de recursos de imagens em Python

18

Na minha classe, eu tenho que criar um aplicativo usando dois classificadores para decidir se um objeto em uma imagem é um exemplo de phylum porifera (seasponge) ou algum outro objeto.

No entanto, estou completamente perdido quando se trata de técnicas de extração de recursos em python. Meu orientador me convenceu a usar imagens que não foram abordadas na aula.

Alguém pode me direcionar para documentação ou leitura significativa ou sugerir métodos a considerar?

Jeremy Barnes
fonte
Você mencionou conselheiro, então eu presumo que isso faça parte de uma tarefa da Escola de Pós-Graduação? Você tem acesso a algum software comercial ou deve fazê-lo apenas com pacotes Python e de código aberto? O que você está aprendendo na aula no momento e qual é o nome da classe? Além disso, existe um requisito de desempenho em termos de tempo necessário para dar uma resposta?
MLowry
É esperado que eu use apenas Python e pacotes de código aberto. Escrever meu próprio código-fonte é desencorajado, até. Este é um curso de nível de mestrado. A aula é um curso introdutório de Ciência de Dados. A última coisa que abordamos é a seleção de recursos, embora quase toda a discussão seja sobre dados de texto. Não há requisitos de desempenho além de uma precisão ~ 70% #
Jeremy Barnes

Respostas:

11

Nas imagens, algumas técnicas freqüentemente usadas para extração de recursos são binarização e desfoque

Binarização: converte a matriz de imagens em 1s e 0s. Isso é feito durante a conversão da imagem em uma imagem 2D. Também pode ser usada a escala de cinza. Fornece uma matriz numérica da imagem. A escala de cinza ocupa muito menos espaço quando armazenada no disco.

É assim que você faz em Python:

from PIL import Image

%matplotlib inline  

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

image

Imagem de exemplo:

insira a descrição da imagem aqui

Agora, converta em escala de cinza:

im = image.convert('L')

im

retornará esta imagem:

insira a descrição da imagem aqui

E a matriz pode ser vista executando este:

array(im)

A matriz ficaria assim:

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)

Agora, use um gráfico de histograma e / ou um gráfico de contorno para dar uma olhada nos recursos da imagem:

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()

Isso retornaria uma plotagem, mais ou menos assim:

insira a descrição da imagem aqui insira a descrição da imagem aqui

Desfocagem: o algoritmo de desfocagem leva a média ponderada de pixels vizinhos para incorporar a cor do ambiente em cada pixel. Aprimora melhor os contornos e ajuda a entender melhor os recursos e sua importância.

E é assim que você faz em Python:

from PIL import *


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

E a imagem borrada é:

insira a descrição da imagem aqui

Portanto, estas são algumas maneiras pelas quais você pode fazer a engenharia de recursos. E para métodos avançados, você precisa entender os conceitos básicos de Visão Computacional e redes neurais, e também os diferentes tipos de filtros, seu significado e a matemática por trás deles.

Dawny33
fonte
1
Muito obrigado. Postei sobre isso em alguns lugares e a sua foi de longe a resposta mais informativa. Percebi que estava entendendo mal como a extração de imagens por recursos funciona conceitualmente.
Jeremy Barnes
Fico feliz que minha resposta tenha ajudado :)
Dawny33
8

Este ótimo tutorial aborda os conceitos básicos de trabalhos neurais convolucionais, que atualmente alcançam o desempenho de última geração na maioria das tarefas de visão:

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

Existem várias opções para CNNs em python, incluindo Theano e as bibliotecas criadas por cima (achei as keras fáceis de usar).

Se você preferir evitar o aprendizado profundo, pode procurar no OpenCV, que pode aprender muitos outros tipos de recursos, cascatas Haar da linha e recursos 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
fonte
1

Como Jeremy Barnes e Jamesmf disseram, você pode usar qualquer algoritmo de aprendizado de máquina para lidar com o problema. Eles são poderosos e podem identificar os recursos automaticamente. Você só precisa alimentar o algoritmo com os dados de treinamento corretos. Como é necessário trabalhar com imagens, as redes neurais de convolução serão uma opção melhor para você.

Este é um bom tutorial para aprender sobre a rede neural de convolução. Você também pode fazer o download do código e mudar de acordo com a definição do seu problema. Mas você precisa aprender as bibliotecas python e theano para o processamento e também receberá bons tutoriais para isso

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

Arun Sooraj
fonte