Classificando imagens para aprendizado de máquina
Você pode aplicar um algoritmo de aprendizado de máquina a um complexo conjunto de imagens, chamado de Faces marcados no conjunto de dados selvagem
Conteúdo
avisos de importação
warnings.filterwarnings ("ignorar")
de sklearn.datasets fetch_lfw_people importação
lfw_people = fetch_lfw_people (min_faces_per_person = 60,
redimensionar = 0,4)
X = lfw_people.data
y = lfw_people.target
target_names = [lfw_people.target_names [A] durante um em Y]
N_SAMPLES, H, W = lfw_people.images.shape
a partir de coleções importar Contador
para o nome, a contagem no contador (target_names) .items ():
impressão ("%% 20s eu" % (Nome, contagem))
Ariel Sharon 77
Junichiro Koizumi 60
Colin Powell 236
Gerhard Schroeder 109
Tony Blair 144
Hugo Chavez 71
George W Bush 530
Donald Rumsfeld 121
Como um exemplo de variedade de conjunto de dados, depois de dividir os exemplos em treinamento e teste conjuntos, você pode exibir uma amostra de fotos de ambos os conjuntos representando Jun`ichiro Koizumi, primeiro-ministro do Japão de 2001 a 2006.
de importação sklearn.cross_validation
StratifiedShuffleSplit
trem, test = lista (StratifiedShuffleSplit (target_names,
n_iter = 1, test_size = 0,1, random_state = 101)) [0]
plt.subplot (1, 4, 1)
plt.axis ( `off`)
para K, m, em enumerar (X [trem] [Y [trem] == 6] [: 4]):
plt.subplot (1, 4, 1 + k)
se k == 0:
plt.title ( `set Train`)
plt.axis ( `off`)
plt.imshow (m.reshape (50,37),
cmap = plt.cm.gray, interpolação = `mais próximo`)
plt.show ()
para K, m, em enumerar (X [teste] [Y [teste] == 6] [: 4]):
plt.subplot (1, 4, 1 + k)
se k == 0:
plt.title ( `conjunto de teste`)
plt.axis ( `off`)
Video: Como ensinar um computador a classificar galáxias? -- Walter dos Santos Jr
plt.imshow (m.reshape (50,37),
cmap = plt.cm.gray, interpolação = `mais próximo`)
plt.show ()
Como você pode ver, as fotos têm algumas variações, mesmo entre fotos da mesma pessoa, o que torna a tarefa desafiadora: expressão, pose, luz diferente, e a qualidade da foto. Por esse motivo, o exemplo que se segue aplica-se o método eigenfaces, usando diferentes tipos de decomposições e reduzir o grande vector inicial de características de pixel (1.850) para um conjunto mais simples dos 150 dispositivos.
O exemplo usa PCA, a decomposição da variância technique- Non-Negative Matrix Factorization (NMF), uma técnica de decomposição imagens em única características-positivo e FastICA, um algoritmo para análise de componentes independentes, uma análise que extrai os sinais de ruído e outros sinais separados (o algoritmo é bem sucedido em lidar com problemas como o problema coquetel).
a partir da decomposição importação sklearn
n_components = 50
PCA = decomposition.RandomizedPCA (
n_components = n_components,
branquear = True) .fit (X [trem ,:])
NMF = decomposition.NMF (n_components = n_components,
Init = `nndsvda`,
tol = 5e-3) .fit (X [trem ,:])
FastICA = decomposition.FastICA (n_components = n_components,
branquear = True) .fit (X [trem ,:])
eigenfaces = pca.components_.reshape ((n_components, H, W))
X_dec = np.column_stack ((pca.transform (X [trem ,:]),
nmf.transform (X [trem ,:]),
fastica.transform (X [trem ,:])))
Xt_dec = np.column_stack ((pca.transform (X [teste ,:]),
nmf.transform (X [teste ,:]),
fastica.transform (X [teste ,:])))
y_dec = y [trem]
Video: Segmentação de Imagem no Spring - Primeiros passos para Classificação Supervisionada por Regiões
yt_dec = y [teste]
Depois de extrair e concatenando as decomposições de imagem em um novo treinamento e teste conjunto de exemplos de dados, o código se aplica uma pesquisa grid para as melhores combinações de parâmetros para uma máquina de vetores de suporte classificação para executar uma classificação problema correta.
de GridSearchCV importação sklearn.grid_search
de importação sklearn.svm SVC
param_grid = { `C`: [0,1, 1,0, 10,0, 100,0, 1000,0],
`Gama`: [0,0001, 0,001, 0,01, 0,1],}
clf = GridSearchCV (SVC (kernel = `RBF), param_grid)
clf = clf.fit (X_dec, y_dec)
impressão ("Melhores parâmetros:% s" % Clf.best_params_)
Os melhores parâmetros: { `gama`: 0,01, `C`: 100,0}
Depois de encontrar os melhores parâmetros, o código verifica para precisão - a percentagem de respostas corretas no conjunto de teste - e obtém uma estimativa de cerca de 0,82 (a medida pode mudar quando você executar o código no seu computador).
de sklearn.metrics accuracy_score importação
solução = clf.predict (Xt_dec)
impressão("precisão alcançada:% 0.3f"
% Accuracy_score (yt_dec, solução))
precisão alcançada: 0,815
Mais interessante, você pode pedir uma matriz de confusão que mostra as classes corretas ao longo das linhas e as previsões nas colunas. Quando um personagem em uma linha tem contagens em colunas diferentes de seu número da linha, o código foi erroneamente atribuída uma das fotos para outra pessoa. No caso do ex-primeiro-ministro do Japão, o exemplo na verdade recebe uma pontuação perfeita (aviso de que o resultado mostra um 6 em linha 6, coluna 6, e zeros no restante das entradas para essa linha).
de sklearn.metrics confusion_matrix importação
confusão = str (confusion_matrix (yt_dec, solução))
print ( ` `* 26 +`` .join (mapa (str, gama (8))))
print (` `* 26 + `-` * 22)
para n, (etiqueta, linha) em enumerar (
zip (lfw_people.target_names,
confusion.split ( ` n`))):
print ( `% s% 18s gt; % S`% (n, etiqueta, fila))
0 1 2 3 4 5 6 7
----------------------
0Ariel Sharon gt; [[6 0 1 0 1 0 0 0]
1Colin Powell gt; [0 22 0 2 0 0 0 0]
2 Donald Rumsfeld gt; [0 0 8 2 1 0 0 1]
3 George W Bush gt; [1 1 46 2 1 0 0 2]
4 Gerhard Schroeder gt; [0 0 2 1 1 0 1 6]
5Hugo Chavez gt; [0 0 0 0 1 5 0 1]
6 Junichiro Koizumi gt; [0 0 0 0 0 0 0 6]
7 Tony Blair gt; [0 0 0 1 2 0 0 11]]