Escolar Documentos
Profissional Documentos
Cultura Documentos
Aprendizagem e
Processamento de
imagem
Para reconhecimento facial, detecção de
objetos,
e reconhecimento de padrões usando
Python
-
Himanshu Singh
Máquina Prática
Aprendizagem e
Imagem
Em
processamento
Para reconhecimento facial,
objeto
Detecção e padrão
Reconhecimento usando
Python
Índice
Sobre o autor \ ix
Agradecimentos \ xiii
Introdução \ xv
Instale o Anaconda 1 Windows \ 2 macOS \ 4 Ubuntu \ 4 Instalar OpenCV 4 Instalar Keras \ 5 Teste as instalações \ 5 Ambientes
Virtuais 6
Imagens \ 8
Pixels \ 8
Resolução da imagem \ 9
PPI e DPI 10
I bit \ 10
Imagens bitmap \ 10
iii
Índice
Formatos de arquivo de imagem \ 12
Espaços de cores \ 13
RGB 14
XYZ \ 15
HSV / HSL \ 17
LAB \ 18
LCH \ 18
YPbPr \ 19
YUV \ 20
YIQ \ 21
Curva de Bezier \ 22
Elipsóide \ 23
Correção gama 24
Deconvolução 25
Homografia \ 26
Convolução 27
Estruturas de dados \ 33
Declarações condicionais \ 37
Funções 38
Imagem Scikit \ 40
iv
Índice
Olhando para os valores de pixel 43
C t d E d C \ 43
Convertendo Espaço de Cores \ 43
Combinando duas imagens \ 64 Mudança de contraste e brilho \ 66 Adicionando Texto às Imagens 68 Suavização de imagens \
71 Filtro de mediana \ 71 Filtro Gaussiano 71 Filtro Bilateral \ 72 Mudando o formato das imagens \ 75 Efetuando a limitação da
Índice
105
residual_lengths
Processando as Imagens \
106
O Código Completo \
106
Regressão Logística \
127
127
Código \
Adaboost \ 151
XGBoost 152
AdaDelta 156
vi
Índice
Transformação Sobel \ 157
Índice 165
vii
Sobre o autor
Himanshu Singh tem mais de 6 anos
de experiência como profissional de
ciência de dados. Atualmente, ele é um
cientista de dados sênior no V-Soft
Labs. Ele oferece treinamento
corporativo em ciência de dados,
aprendizado de máquina e
aprendizado profundo. Ele também é
um membro do corpo docente
visitante em análises no Narsee
Monjee Institute of Management
Studies, considerado um dos
institutos de gestão de prêmios na Índia. Ele é o fundador da
Black Feathers Analytics e Rise of Literati Clubs.
ix
Sobre o Revisor Técnico
Santanu Pattanayak atualmente
trabalha na GE, Digital, como cientista
de dados da equipe e é autor de Pro Deep
Learning with TensorFlow: A
Mathematical Approach to Advanced
Artificial Intelligence in Python . Ele tem
aproximadamente
12 anos de experiência geral de
trabalho, com oito anos de experiência
no campo de análise de dados / ciência
de dados, e também tem experiência em
desenvolvimento e tecnologias de banco
de dados. Antes de ingressar na GE,
Santanu trabalhou em empresas como
RBS, Capgemini e IBM. Ele se formou em
engenharia elétrica pela Universidade
de Jadavpur, Calcutá,
e é um ávido entusiasta da matemática. Santanu está atualmente
cursando um mestrado em ciência de dados no Instituto Indiano
de Tecnologia de Hyderabad. Ele também dedica seu tempo a
hackathons de ciência de dados e competições Kaggle, nas quais
está entre os 500 melhores do mundo. Santanu nasceu e foi
criado em West Bengal, Índia, e atualmente reside em Bangalore,
Índia, com sua esposa.
XI
Agradecimentos
Em primeiro lugar, agradeço à Equipe Apress, Celestian John e
Aditee Mirashi, por me fornecerem uma plataforma para
contribuir com meu conhecimento de processamento de
imagens e compartilhá-lo com os leitores. Em segundo lugar,
agradeço a meus colegas, sem os quais este livro não teria sido
possível: Aravind Kota, Yamuna e meu chefe e mentor, Yunis
Ahmad Lone. Agradeço também aos meus alunos. Eles me
ajudaram a ver quais questões são desafiadoras para eles e me
possibilitaram criar um meio específico de explicar os conceitos
a eles de uma maneira que facilite seu aprendizado.
xiii
Introdução
Aprendizado de máquina prático e processamento de imagem
oferece aos leitores uma visão profunda dos fundamentos do
processamento de imagem e várias metodologias e algoritmos
de processamento de imagem, aplicativos que usam várias
bibliotecas Python e implementação de caso de uso em
tempo real usando abordagens de aprendizado de máquina.
xv
CAPÍTULO 1
Ambiente de
Configuração
Neste capítulo, preparamos nosso sistema para executar o
código incluído neste livro. Vejamos como instalar o
seguinte:
• \ Anaconda
• \ OpenCV
• \ Keras
Instale o Anaconda
A página de instalação do Anaconda proclama que é “A
plataforma de ciência de dados mais popular do Python”. Usar o
Anaconda, instalar software de suporte, configurar ambientes
virtuais e assim por diante, são todos muito fáceis, e o pacote
vem com um dos melhores ambientes de desenvolvimento
integrado (IDEs) para ciência de dados Python: Jupyter
Notebook. O Jupyter não apenas ajuda você a escrever código
Python, mas também torna seu código bonito e apresentável.
Então, vamos começar com a instalação do Anaconda.
janelas
Se você estiver usando o Windows, este é o processo:
\ 1. \ Vá para www.anaconda.com .
Mac OS
Se você estiver usando macOS, aqui está o processo de instalação do
Anaconda:
Ubuntu
O processo de download do Anaconda no Ubuntu é o seguinte:
Instale OpenCV
Agora que instalamos o Anaconda e o Jupyter Notebook. A
próxima coisa a fazer é instalar o software de suporte. Para
OpenCV, faça o seguinte:
\ 1. \ Abra o prompt do Anaconda.
\ 2. \ Digite conda install -c conda-forge opencv.
Instale Keras
Para instalar o Keras, siga estes procedimentos:
\ 1. \ Abra o prompt do Anaconda.
Teste as instalações
Antes de prosseguir, você precisa testar as instalações da seguinte
maneira:
\ 1. \ Abra o Jupyter Notebook.
\ 2. \ Abra um novo bloco de notas Python 3.
CAPÍTULO 2
Introdução ao
processamento de
imagens
Neste capítulo, examinamos exatamente o que é uma imagem e
suas propriedades relacionadas. Ao final do capítulo, você deve
ter uma compreensão dos seguintes conceitos:
• \Imagens
• \Píxeis
• \Resolução de imagem
• \Pixels por polegada (PPI) e pontos por polegada (DPI)
• \Imagens bitmap
• \Compressão sem perdas e compressão com perdas
• \Diferentes formatos de arquivo de imagem
• \Diferentes tipos de espaços de cores
Imagens
A representação visual de um objeto da vida real (uma pessoa
ou qualquer outro objeto) em uma forma bidimensional é
chamada de imagem . Uma imagem nada mais é que uma
coleção de pixels em diferentes espaços de cores. A Figura 2-1 é
um exemplo de imagem normal.
Resolução de imagem
A resolução da imagem é o número de pixels presentes em
uma imagem. Quanto maior o número de pixels, melhor será a
qualidade. As resoluções de imagem são descritas, por
exemplo, como 320 × 240, 640 × 480, 800 × 600, 1024 × 768 e
assim por diante.
Isso significa, por exemplo, que existem 1024 colunas de pixels e
768 linhas de pixels. O número total de pixels é obtido
multiplicando os dois números, o que nos dá 786.432 pixels. A
Figura 2-3 mostra representações comparativas de diferentes
resoluções de imagem.
1920 x 1080
1280 x 720
640x480
PPI e DPI
Conforme observado no início do capítulo, PPI significa
"pixels por polegada", enquanto DPI significa "pontos por
polegada". Eles são as unidades para medir a resolução da
imagem.
Se considerarmos uma polegada de uma imagem, o número
de pixels quadrados que podemos ver no seu interior é
representado por PPI. O DPI, por outro lado, está relacionado à
impressão. Quando imprimimos uma imagem e olhamos para
uma polegada da impressão, o número de pontos de tinta usados
é representado por DPI.
Conforme mostrado na Figura 2-4 , o PPI parece mais suave, enquanto o
DPI é mais nítido.
Imagens bitmap
Em geral, quando olhamos para os valores dos pixels, eles são
um intervalo de inteiros. Mas, quando convertemos o intervalo
de inteiros em bytes, temos uma imagem bitmap.
Um tipo de bitmap é uma imagem binária em que cada pixel
tem um de dois números: zero ou um. Eles representam preto
ou branco e costumam ser usados para armazenar imagens de
maneira eficiente. A Figura 2-5 mostra uma imagem de bitmap
binário.
10
11
Capítulo 2 Introdução ao processamento de imagens
parcialmente
Original compactado
Restaurado
12
recuperado sem perder informação
Espaços de cores
A organização das cores de uma imagem em um formato
específico é chamada de espaço de cores . A maneira como uma
cor é representada é chamada de modelo de cores . Cada imagem
usa um dos seguintes espaços de cores para uma representação
de imagem eficaz:
• \ RGB : vermelho, verde, azul
• \ XYZ : cor nas dimensões x, y e z
13
RGB
Usando o espaço de cores RGB, vermelho, verde e azul são
misturados de maneiras diferentes para fazer combinações de
cores diferentes. Por que usamos RGB? Porque nossos olhos têm
receptores de cores que podem perceber essas três cores e suas
combinações de forma bastante eficaz.
Podemos formar qualquer cor, teoricamente, a partir
dessas três cores. A intensidade de cada cor é definida em um
intervalo de 0 a 255. Esse intervalo é chamado de
profundidade de cor .
O espaço de cores RGB tem mais dois componentes:
14
XYZ
As cores RGB têm um limite de saturação. Eles não podem ir
além do que podemos ver. O espaço de cores XYZ nos ajuda a ir
além desse limite. Agora, você pode se perguntar por que
gostaríamos de ir além do limite. Bem, pode não ser possível
para nossos olhos humanos perceberem certas cores, mas no
mundo digital, você pode precisar que essas cores sejam
usadas. Por exemplo, XYZ pode ser usado para correspondência
de cores; podemos inserir um código de cor e depois reproduzi-
lo em diferentes aplicações, como impressão. Usando XYZ,
podemos codificar todas as cores que existem no mundo real.
Esse espaço de cores é denominado XYZ porque extrapola as
cores RGB em três dimensões: x, y e z. A Figura 2-9 apresenta
uma representação XYZ de uma imagem.
15
HSV / HSL
HSV / HSL é uma representação alternativa do espaço de
cores RGB. Consiste nos seguintes componentes:
• \ Hue
• \ Saturação
•\ Valor
• \ Leveza
17
LAB
O espaço de cores LAB tem três componentes:
\ 1. \ Luminância
\ 2. \ a *, que é o componente de cor verde e vermelho
\ 3. \ b *, que é o componente de cor azul e amarelo
LCH
O LCH é semelhante ao espaço de cores LAB, mas em vez de
usar coordenadas cilíndricas, ele usa coordenadas
retangulares. Isso torna as coordenadas semelhantes a como
nosso olho humano vê, ou seja, descrevendo um ponto com
base
18
YPbPr
O espaço de cores YPbPr é usado em eletrônicos de vídeo, como
DVD players. Consiste nos três componentes a seguir:
\ 1. \ Y : o cabo verde
\ 2. \ Pb : o cabo azul
\ 3. \ Pr : o cabo vermelho
19
YUV
O espaço de cores YUV é um pouco semelhante ao YPbPr,
porque ambos são usados em eletrônicos de vídeo. A diferença
é que o YUV também suporta televisão em preto e branco .
• \ Y : o brilho presente em uma imagem. Seu
valor pode variar de 0 a 255.
20
YIQ
O espaço de cor YIQ (Figura 2-14 ) é usado em televisões em
cores (o modo NTSC: National Television System Committee).
Consiste nos três componentes a seguir:
\ 1. \ Y : a luminância em uma imagem
\ 2. \ I : o parâmetro em fase
\ 3. \ Q : a quadratura que representa as informações de cor
21
Capítulo 2 Introdução ao processamento de imagens
• \ Convolução
Curva de Bézier
A curva de Bézier é uma curva que possui vários pontos de
controle. Os pontos de controle são alguns pontos selecionados
em uma tela que podemos usar para ajustar a curva. À medida
que mudamos a posição dos pontos de controle, a forma da
curva muda e é usada para manipular quadros e movimento.
Também pode ser usado para aplicar zoom, selecionar a
posição de uma imagem, alterar ou transformar parte de uma
imagem e muito mais. A Figura 2-15 mostra uma curva Bezier
normal.
P1
P2
P0 P3
Figura 2-15. Curva de Bézier e pontos de controle
22
Elipsóide
Um círculo é uma figura bidimensional com diâmetro ou raio
constante. Uma esfera é um círculo tridimensional que também
possui um raio ou diâmetro constante. Mas, se pegarmos uma
esfera e a esmagarmos dos dois lados, ela se tornará um
elipsóide.
Os elipsóides não têm diâmetros constantes. Um lado tem
um diâmetro maior e é chamado de eixo principal ; o lado
menor é chamado de eixo menor . A Figura 2-16 mostra uma
esfera e dois elipsóides.
23
Correção de gama
A correção de gama, que é usada para exibir uma imagem com
precisão na tela, controla o brilho de uma imagem e pode ser
usada para alterar a proporção de
vermelho para verde para azul .
Se houver um pixel que desejamos exibir em uma
intensidade específica (por exemplo, x), e a tela do computador
tiver um valor de gama de 2,5, a intensidade do pixel em um
monitor de computador será x 2,5 . Como a intensidade é sempre
medida entre zero e um, a imagem no monitor, neste caso, fica
confusa.
Para eliminar esse problema, o valor de entrada deve ter o
gama corrigido. A conexão Gama é feita de forma que a saída
seja quase semelhante à entrada. Por exemplo, se o valor de
entrada for elevado à potência de 1 / 2,5, esse processo é
conhecido como correção de gama de 2,5. A Figura 2-17 mostra
a aparência de uma imagem com diferentes valores gama.
24
Deconvolução
Em geral, a deconvolução é usada para corrigir imagens
borradas, o que ajuda a restaurar o contraste. Com imagens
borradas, é difícil determinar a intensidade do pixel. Para
fazer essa correção, usamos o que é chamado de função de
dispersão de pontos (PSF). Selecionamos um ponto dentro de
uma imagem e, usando o PSF, podemos representar esse ponto
com um padrão de luz (emitida a partir daquele ponto) de
forma tridimensional, o que ajuda a tornar a imagem mais
clara. A Figura 2-18 mostra uma imagem lunar deconvolvida.
25
26
( x ' , y'
(x,y
Convolução
A convolução é um processo simples durante o qual aplicamos
uma matriz (também chamada de kernel ou filtro ) a uma
imagem para que possamos reduzi-la ou adicionar várias
camadas de preenchimento para manter o mesmo tamanho. A
convolução também é usada para extrair recursos específicos
de uma imagem, como uma forma, uma aresta e assim por
diante. A convolução é muito usada no processamento de
imagens, especialmente em redes neurais convolucionais e
detecção facial. Falaremos sobre Convolução em detalhes no
Capítulo 6 .
A seguir, no Capítulo 3 , examinamos os conceitos básicos do
Python e implementamos alguns dos conceitos discutidos neste
capítulo escrevendo scripts Python.
27
CAPÍTULO 3
Noções básicas
de Python e Scikit
Image
Fazer o processamento de imagens sem usar uma linguagem de
programação é como contar o número de estrelas enquanto você
olha para o céu noturno. Existem tantas metodologias complexas
que, mesmo que tentemos fazer manualmente, não é de todo
possível. Mas, se usarmos linguagens de programação como
Python, R, C ++, MATLAB e assim por diante, o mesmo trabalho
pode ser feito em um instante.
A questão é que devemos conhecer a linguagem antes de
começar a aplicar qualquer um dos métodos de processamento
de imagem. Este capítulo visa ajudá-lo a atingir os dois objetivos.
A primeira metade do capítulo trata dos conceitos básicos do
Python que são úteis na aplicação de técnicas de processamento
de imagens. A segunda metade do capítulo examina a biblioteca
de processamento de imagens do Python: Scikit Learn. Todos os
conceitos que estudamos no capítulo anterior, junto com alguns
outros, podem ser aplicados em Python usando Scikit Learn. Ao
final deste capítulo, você deve se sentir confortável com os
conceitos Python e os aplicativos básicos de processamento de
imagem.
• \Declarações Condicionais
• \Funções
nome =
'Saurav' idade
= 20 altura =
6,5
30
Saída: 20,6,5
ou como
nome =
'Saurav' idade
= 20 altura =
6,5 imprimir
(nome)
imprimir
(idade)
imprimir
(altura)
Produto:
Saurav
20 6.5
ou como
nome =
'Saurav' idade
= 20 altura =
6,5
imprimir ("o nome é", nome)
31
Resultado:
o nome é Saurav 'a
idade é 20
a altura é 6,5
nome =
'Saurav' idade
= 20 altura =
6,5
print ("Meu nome é% s. Minha idade e altura são% d,% f"%
(nome, idade, altura))
Resultado:
Meu nome é Saurav '. Minha idade e altura são 20, 6,5
print (“Meu nome é% s. Minha idade e altura são% d,% f“% (nome, idade, altura))
32
Estruturas de dados
Na seção anterior, vimos como salvar um valor dentro de uma
variável. Mas, se quisermos salvar mais de um valor, devemos
usar as estruturas de dados Python, que incluem o seguinte:
• \ Listas
• \ Dicionários
• \ Tuplas
Essas estruturas são as mais utilizadas no processamento de
imagens.
Listas
Podemos usar listas para armazenar vários valores dentro de uma
única variável. Por exemplo,
Idade = [24,35,26,42]
Nomes = ["Sachin", "Saurav", "Rahul"]
Dicionários
Os dicionários são combinações de chaves e valores. Assim
como um dicionário comum tem palavras e significados, você
pode pensar em chaves e valores como palavras e
significados. Por exemplo,
33
Tuplas
As tuplas também armazenam valores de maneira semelhante às
listas. A diferença é que as tuplas são imutáveis - ou seja, uma
vez que uma tupla é definida, os valores não podem ser
modificados. As tuplas começam e terminam com parênteses.
Por exemplo,
Altura = (6,5, 5,4, 5,11)
2
4
6
8
10
12
14
16
18
20
34
enquanto (condição):
Se a condição se tornar
falsa, saímos do loop e ele
para
para i no intervalo
(10): table = 2 * (i +
1) print (table)
Output:
2
4
6
35
8
10
12
14
16
18
20
Quando o valor de i se
torna maior do que o
intervalo, o loop para.
36
Declarações Condicionais
As instruções condicionais são usadas para fornecer um
resultado binário com base em uma condição fornecida por
você. Todas as condições discutidas na Tabela 3-1 podem ser
usadas no exemplo a seguir. Se o resultado for verdadeiro ou
1, o bloco de código dentro da instrução condicional será
executado; caso contrário, não. As declarações condicionais
podem ser dos seguintes tipos:
•\ E se
• \ if-else
• \ if-elif-else
Doença Significado
a == b Verifica se a é igual a b
a! = b Verifica se a não é igual a b
a <b Verifica se a é menor que b
a <= b Verifica se a é menor e igual a b
marcas = 45
se marcas> = 80: print ("Você
obteve uma nota") marcas
elif> = 60 e marcas <80:
37
Funções
As funções são usadas quando você deseja encerrar códigos
complexos dentro de um único invólucro e, em seguida, usar
esse invólucro várias vezes sem escrever o código
repetidamente. É como se dedicássemos um pote para conter
açúcar, e sempre que quisermos tirar o açúcar, usamos apenas
esse pote, não a sacola em que você tem açúcar junto com sal,
vegetais e salgadinhos.
A Figura 3-4 descreve as funções em poucas palavras. Uma
função pode receber um ou mais valores como entradas - I1, I2,
I3 e assim por diante (In) - e fornecer um ou mais resultados
como saída (O).
38
tabela (10)
Resultado:
10
20
30
40
50
39
60
70
80
90
100
tabela (17)
Resultado:
17
34
51
68
85
102
119
136
153
170
Imagem Scikit
Scikit Image é um módulo usado para fazer o processamento
básico de imagens. Antes de começar, vamos dar uma olhada
na definição de um módulo. Um módulo é uma coleção de
arquivos, classes ou funções Python. Podemos salvar códigos
complexos e longos dentro de arquivos diferentes. Para fazer
isso, precisamos importar os arquivos e usá-los em nosso
ambiente. Primeiro, precisamos importar Scikit Image em
nosso ambiente, assim:
40
41
da importação de skimage
img = io.imread ('filhote.jpg')
io.imshow (img)
Resultado:
42
43
#Mostrar ambos
os valores figura
(0)
44
io.imshow
(img_hsv) figura
(1) io.imshow
(img_rgb)
Resultado:
45
#Mostrar ambas
as figuras figura
(0) io.imshow
(img_xyz) figura
(1) io.imshow
(img_rgb)
Resultado:
46
#Mostrar ambas
as figuras figura
(0) io.imshow
(img_lab) figura
(1) io.imshow
(img_rgb)
Resultado:
47
48
#Mostrar ambas
as figuras figura
(0) io.imshow
(img_yuv) figura
(1) io.imshow
(img_rgb)
Resultado:
49
#Mostrar ambas
as figuras figura
(0) io.imshow
(img_yiq) figura
(1) io.imshow
(img_rgb)
Resultado:
50
51
#Mostrar ambas as
figuras figura (0)
io.imshow
(img_ypbpr) figura
(1) io.imshow
(img_rgb)
Resultado:
52
Linhas
A função de linha é usada para desenhar uma linha simples em
uma imagem. No código a seguir, os primeiros dois parâmetros
indicam o primeiro ponto; os dois últimos parâmetros indicam o
segundo ponto. Uma linha é então desenhada usando esses
pontos. Podemos então alterar os valores de pixel da linha para
que possamos ver a linha na imagem.
53
Resultado:
Retângulos
Para desenhar retângulos, usamos a função polígono. Podemos
desenhar não apenas retângulo, mas qualquer tipo de polígono
que quisermos. Tudo o que precisamos fazer é fornecer as
coordenadas xey e, em seguida, definir a largura e a altura.
No código a seguir, uso o retângulo de função. Ele retorna
uma forma com valores de pixel que alteramos, como no
exemplo anterior de uma linha.
de skimage import io de
skimage import draw
54
io.imshow (img)
Resultado:
Círculos
A função de círculo é usada para desenhar um círculo. No
código a seguir, os dois primeiros argumentos indicam a posição
do círculo dentro da imagem; o último argumento indica o raio.
#Importar bibliotecas
de skimage import io de
skimage import draw
#Load image
img = io.imread ('filhote.jpg')
#Desenhar
círculo img
[x, y] = 1
55
#Show image
io.imshow
(img)
Resultado:
Curva de Bézier
Para desenhar uma curva de Bezier, usamos a função
bezier_curve. Precisamos indicar a posição de três ou mais
pontos de controle que então moldam a curva. Os primeiros seis
argumentos no código a seguir definem três pontos; o último
argumento define a tensão presente na linha. Jogue com valores
diferentes para alterar a curva.
#Importar bibliotecas
de skimage import io de
skimage import draw
#Load image
img = io.imread ('filhote.jpg')
56
#Show image
io.imshow
(img)
Resultado:
de exposição de importação
de skimage de importação
de skimage de importação
de pylab *
img = io.imread ('filhote.jpg')
gamma_corrected1 = exposição.adjust_gamma
(img, 0,5) gamma_corrected2 =
exposição.adjust_gamma (img, 5) figura (0)
io.imshow
(gamma_corrected1) figura
(1)
57
io.imshow (gamma_corrected2)
Resultado:
58
da importação de skimage
de skimage.transform import rotate
img = io.imread ('puppy.jpg') img_rot
= rotate (img, 20) io.imshow
(img_rot)
Resultado:
da importação de skimage
from skimage.transform import
resize img = io.imread ('puppy.jpg')
img_res = resize (img, (100,100))
io.imshow (img_res) io.imsave
("ss.jpg", img_res)
59
Resultado:
Determinando Similaridade Estrutural
Como expliquei anteriormente, a similaridade estrutural é usada
para encontrar o índice que indica o quanto duas imagens são
semelhantes. Um valor mais próximo de um significa que as
imagens são muito semelhantes; um valor mais próximo de zero
significa que eles são menos semelhantes. No código a seguir,
para a primeira comparação de imagens semelhantes, obtemos
uma saída SSIM de 1.0. No segundo bit de código, no qual
comparamos a imagem com sua contraparte YPbPr, obtemos
um SSIM de 0,43, o que indica menos similaridade.
da importação de skimage
de skimage.measure import compare_ssim as
ssim img_original = io.imread ('puppy.jpg')
img_modified = io.imread ('puppy_ypbpr.jpg')
60
Resultado:
1,0 0,4348875243670361
CAPÍTULO 4
Imagem Avançada
Em processamento
Usando OpenCV
Agora que examinamos as técnicas básicas de processamento
de imagem usando a biblioteca de imagens Scikit, podemos
passar para seus aspectos mais avançados. Neste capítulo,
usamos uma das bibliotecas de visão computacional mais
abrangentes: OpenCV e examinamos os seguintes conceitos:
• \Combinando duas imagens
• \Alterar o contraste e o brilho de uma imagem
• \Adicionar texto a imagens
• \Suavizando imagens
#import pacotes
necessários import cv2
#Read image 1
img1 = cv2.imread ('cat_1.jpg')
#Leia a imagem 2
img2 = cv2.imread ('cat_2.jpg')
#Blend images
imagem_final = cv2.addWeighted (img1, alfa, img2, beta, 0,0)
#Show image
io.imshow
(final_image)
64
65
#import pacotes
necessários import cv2
importar numpy como np
#Read image
image = cv2.imread ("cat_1.jpg")
66
figura (0)
io.imshow (imagem)
figura (1) io.imshow
(nova_imagem)
67
68
• \Tipo de fonte
• \Escala de fonte
• \Cor do texto
• \Espessura do texto
•\
FONT_HERSHEY_SCRIPT_COMPLEX
• \ FONT_ITALIC
#import pacotes
necessários import cv2
importar numpy como np
#Read image
image = cv2.imread ("cat_1.jpg")
#Define fonte
font = cv2.FONT_HERSHEY_SIMPLEX
#Escreva na imagem
cv2.putText (imagem, "Eu sou um gato", (230, 50), fonte, 0,8, (0,
255, 0), 2, cv2.LINE_AA)
io.imshow (imagem)
Resultado:
70
Suavizando Imagens
Nesta seção, daremos uma olhada em três filtros usados para
suavizar imagens. Esses filtros são os seguintes:
• \ O filtro mediano (cv2.medianBlur)
Filtro Mediano
O filtro de mediana é um dos filtros de suavização de imagem
mais básicos . É um filtro não linear que remove o ruído
preto e branco presente em uma imagem ao encontrar a
mediana usando pixels vizinhos.
Para suavizar uma imagem usando o filtro mediano, olhamos para o
primeiro
Matriz 3 × 3, encontre a mediana dessa matriz e remova o valor
central dessa mediana. Em seguida, movemos um passo para a
direita e repetimos este processo até que todos os pixels tenham
sido cobertos. A imagem final é uma imagem suavizada. Se você
deseja preservar as bordas da imagem enquanto desfoca, o filtro
mediano é sua melhor opção.
cv2.medianBlur é a função usada para obter o desfoque
médio. Possui dois parâmetros:
\ 1. \ A imagem que queremos suavizar
\ 2. \ O tamanho do kernel, que deve ser estranho. Portanto, um valor
de 9 significa uma matriz 9 × 9.
Filtro Gaussiano
O filtro gaussiano depende do desvio padrão da imagem
(distribuição) e assume que a média é zero (podemos definir
uma média diferente de zero também). Os filtros gaussianos
não cuidam das bordas.
71
\ 3. \ O desvio padrão
Filtro Bilateral
Se quisermos suavizar uma imagem e manter as bordas intactas,
usamos um filtro bilateral. Sua implementação é simples:
substituímos o valor do pixel pela média de seus vizinhos. Esta é
uma abordagem de suavização não linear que obtém a média
ponderada dos pixels vizinhos. “Vizinhos” são definidos das
seguintes maneiras:
72
#import pacotes
necessários import cv2
importar numpy como np
#Blur images
image_MedianBlur = cv2.medianBlur (image_MedianBlur, 9)
image_GaussianBlur = cv2.GaussianBlur (image_GaussianBlur,
(9,9), 10) image_BilateralBlur = cv2.bilateralFilter
(image_BilateralBlur, 9, 100,75)
73
io.imshow
(image_GaussianBlur) figure
(3) io.imshow
(image_BilateralBlur)
Resultado:
74
75
240 21 98
240 21 98
240 240 98
76
# CÓDIGO DE DILAÇÃO:
#Import
package
import cv2
#Read image
image = cv2.imread ("cat_1.jpg")
#Defina o tamanho
da erosão s1 = 0
s2 = 10
s3 = 10
#Defina o tipo de
erosão t1 =
cv2.MORPH_RECT
t2 = cv2.MORPH_CROSS
t3 = cv2.MORPH_ELLIPSE
io.imshow (final1)
77
figura 1)
io.imshow (final2)
Figura 2)
io.imshow (final3)
# CÓDIGO DE EROSÃO:
#Import
packages
import cv2
#Read images
image = cv2.imread ("cat_1.jpg")
#Defina o tamanho
da dilatação d1 = 0
d2 = 10
d3 = 20
#Defina o tipo de
dilatação t1 =
cv2.MORPH_RECT
t2 = cv2.MORPH_CROSS
t3 = cv2.MORPH_ELLIPSE
#Mostrar a figura
das imagens (0)
io.imshow
(final1)
78
figura 1)
io.imshow (final2)
Figura 2)
io.imshow (final3)
Resultado:
79
80
• \O valor limite
• \O valor máximo do pixel
#Import
packages
import cv2
#Read image
image = cv2.imread ("cat_1.jpg")
#Defina os tipos de
limite "'
0 - binário
1 - Binário Invertido
81
2 - truncado
3 - Limiar para zero
4 - Limiar para zero invertido
"'
82
Resultado:
83
Calculando gradientes
Nesta seção, veremos a detecção de bordas usando derivados de
Sobel. As arestas são encontradas em duas direções: a direção
vertical e a direção horizontal. Com este algoritmo, enfatizamos
apenas as regiões que possuem uma frequência espacial muito
alta, que pode corresponder a arestas. A frequência espacial é o
nível de detalhe presente em uma área de importância.
No código a seguir, lemos a imagem, aplicamos desfoque
gaussiano para que o ruído seja removido e, em seguida,
convertemos a imagem em tons de cinza. Usamos a função
cv2.cvtColor () para converter a imagem em tons de cinza.
Também podemos usar as funções de imagem de esqui para
fazer o mesmo. Por último, fornecemos a saída da escala de
cinza para a função cv2.Sobel (). Vejamos os parâmetros da
função Sobel:
• \Imagem de entrada
• \Profundidade da imagem de saída. Quanto maior for a profundidade
imagem, menores são as chances de você perder alguma fronteira. V
pode experimentar todos os parâmetros listados abaixo,
para ver se eles capturam as fronteiras de forma eficaz, por
seus requerimentos. A profundidade pode ser dos seguintes tipos:
84
• \cv2.CV_32F
• \cv2.CV_64F
• \Ordem da derivada x (define o ordem derivada para
encontrando bordas horizontais)
• \Tamanho do kernel
#Import
packages
import cv2
#Read image
src = cv2.imread ("cat_1.jpg")
85
Resultado:
86
#Import
packages
import cv2
#Read image
src = cv2.imread ("cat_1.jpg")
#Converter para escala de cinza
src = cv2.cvtColor (src, cv2.COLOR_BGR2GRAY)
#Mostrar as duas
imagens figura (0)
io.imshow (src)
figura (1) io.imshow
(src_eqlzd) figura (2)
io.imshow
(src_eqlzd)
87
Resultado:
Agora conhecemos os algoritmos básicos de processamento
de imagem usando skimage e algumas das operações
avançadas usando OpenCV. No próximo capítulo, avançamos e
aplicamos algoritmos de aprendizado de máquina para fazer o
processamento de imagens.
88
CAPÍTULO 5
Processamento de
imagem
Usando Máquina
Aprendendo
Começamos este capítulo examinando alguns dos algoritmos de
processamento de imagem mais amplamente usados e, em
seguida, passamos para a implementação de aprendizado de
máquina no processamento de imagens. O capítulo em resumo é
o seguinte:
• \Mapeamento de recursos usando o recurso invariável de escala
algoritmo de transformação (SIFT)
• \ Iluminação
• \ Perspectiva
90
91
92
import cv2
importar numpy como np
import matplotlib.pyplot as plt
de Sift_Operations import *
norma = cv2.NORM_L2
bruteForce = cv2.BFMatcher (norma)
93
matched_img = cv2.drawMatches
(Image1, Image1_key_points,
Image2, Image2_key_points,
corresponde a [: 100],
Image2.copy ())
import cv2
importar numpy como np
import matplotlib.pyplot as plt
94
sift_initialize = cv2.xfeatures2d.SIFT_create ()
\ a. \ A linha de código anterior armazena
todo o SIFT dentro da variável
sift_initialize.
95
96
Manhattan
matched_img = cv2.drawMatches (
Image1, Image1_key_points,
Image2, Image2_key_points,
97
plt.imshow (matched_img)
98
\ 2. \ Correspondência de recursos
\ 3. \ Ajuste da função de transformação
\ 4. \ Transformação de imagem e reamostragem de imagem
import numpy
como np Import
cv2
da importação
Ransac * da
importação Affine *
da importação Align
*
99
img_source = cv2.imread
("source.jpg") img_target =
cv2.imread ("target.jpg")
bf = cv2.BFMatcher ()
corresponde = bf.knnMatch (descriptor_source, descriptor_target, k = 2)
100
retorno pos
101
Capítulo 5 Processamento de imagens usando aprendizado de máquina
inliers_num =
0 A = Nenhum
t = Nenhum
inliers =
Nenhum
102
103
cv2.imshow ('img',
merge) cv2.waitKey (0)
cv2.destroyAllWindows
()
104
estimativa_afina
A função estimativa_afina leva o número total de pontos-chave
da imagem de origem e da imagem de destino como uma
entrada e retorna as matrizes de transformação afins como uma
saída. Com base na dimensão dos pontos-chave de origem,
inicializamos uma matriz fictícia e, em seguida, a preenchemos
com os pontos-chave de origem para serem usados como um
loop. Em seguida, pegamos os pontos-chave de destino,
remodelamos a dimensão para 2.000 × 1, após encontrar sua
transposição. Finalmente, fazemos uma regressão linear em
ambas as matrizes e obtemos a inclinação e a interceptação da
linha. Usando isso, calculamos as matrizes finais X e Y. Aqui está
o código:
residual_lengths
A função residual_lengths é usada para determinar os erros
presentes em nosso modelo e para garantir que as matrizes
afins que geramos, ou os descritores que combinamos, tenham
o mínimo de erros possível. Primeiro, fazemos um modelo
linear entre as matrizes afins e os pontos-chave da fonte, que
nos dá os pontos estimados para a imagem de destino. Nós os
comparamos com os pontos de destino reais para determinar os
erros finais. Em seguida, subtraímos o
105
Processando as imagens
Vejamos nossa imagem de destino (Figura 5-4 ):
Figura 5-4. Imagem alvo
O Código Completo
Aqui está o código completo para registro de imagem:
Código principal:
import numpy
como np import
cv2
da importação Ransac *
106
da importação
Affine * da
importação Align *
Ransac.py:
importar numpy
como np de
importação afim * K
=3
limiar = 1
ITER_NUM =
2000
def comprimentos_resíduos (X, Y, s,
t): e = np.dot (X, s) + Y
diff_square = np.power (e - t, 2)
residual = np.sqrt (np.sum (diff_square, axis =
0)) residual de retorno
def ransac_fit (pts_s, pts_t):
inliers_num = 0
A = Nenhum
t = nenhum
107
inliers = Nenhum
para i no intervalo (ITER_NUM):
idx = np.random.randint (0, pts_s.shape [1], (K, 1))
A_tmp, t_tmp = estimativa_afino (pts_s [:, idx], pts_t [:,
idx]) residual = comprimentos_de_ residual (A_tmp,
t_tmp, pts_s, pts_t) se não (residual é Nenhum):
return A, t, inliers
Affine.py:
Align.py:
109
A, t = estimativa_afino (s, t)
M = np.hstack ((A, t)) return
M
Soma
Axon Synapse
Dendrites
110
Escondido
Entrada
Resultado
111
112
Dados de pré-processamento
Encontre treinamento e
Conjuntos de teste
Teste o modelo
Prever
113
114
y = pd.get_dummies (y)
classificador = Sequencial ()
classifier.add (Dense (unidades = 600, kernel_initializer
= 'uniforme', ativação = 'relu', input_dim = 784))
classifier.add (Denso (unidades = 400, kernel_initializer
= 'uniforme', ativação = 'relu')) classifier.add (Dense
(unidades = 200, kernel_initializer = 'uniforme',
ativação = 'relu')) classifier.add (Denso (unidades = 10,
kernel_initializer = 'uniforme', ativação = 'sigmóide'))
115
Capítulo 5 Processamento de imagens usando aprendizado de máquina
Sigmóide
Ativação
Função
116
import pandas as
pd import keras
from keras.models import
Sequential from keras.layers
import Dense
y = input_data ['rótulo']
input_data.drop ('label', axis = 1, inplace =
True) X = input_data
y = pd.get_dummies (y)
classificador = Sequencial ()
117
118
119
r, c = 28, 28
num_classes = 10
120
x_train / = 255
x_test / = 255
def load_and_preprocess
(): r, c = 28, 28
121
num_classes = 10
x_train, y_train, x_test, y_test = mnist.load_data ()
x_train = x_train.reshape (x_train.shape [0], r, c, 1)
x_test = x_test.reshape (x_test.shape [0], r, c, 1 )
input_shape = (r, c, 1)
x_train / = 255
x_test / = 255
modelo = Sequencial ()
model.add (Conv2D (32, kernel_size = (3, 3), activation =
'relu', input_shape = input_shape))
model.add (Conv2D (64, (3, 3), activation = 'relu'))
model.add (MaxPooling2D (pool_size = (2, 2)))
model.add (Dropout (0,25)) model.add (Flatten ())
importar keras
de keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
de Load_and_Preprocess import *
123
model.compile (loss =
keras.losses.categorical_crossentropy,
optimizer = keras.optimizers.Adadelta (),
metrics = ['precisão'])
Load_and_Preprocess
def load_and_preprocess
(): r, c = 28, 28
num_classes = 10
124
x_train / = 255
x_test / = 255
y_train = keras.utils.to_categorical (y_train, num_classes)
y_test = keras.utils.to_categorical (y_test, num_classes)
return (x_train, x_test, y_train, y_test, input_shape)
Resultado
Classificação de imagens
usando abordagens de
aprendizado de máquina
Nesta seção, veremos a aplicação de três algoritmos de
aprendizado de máquina famosos:
• \Árvores de decisão
• \Máquinas de vetor de suporte (SVMs)
• \Regressão logística
125
Árvores de decisão
Quando queremos tomar uma grande decisão em nossas vidas,
fazemos uma análise de prós e contras. As árvores de decisão são
semelhantes a este método. Com base em um certo limite
estatístico, determinamos se uma determinada coisa pertence a
uma classe ou a outra. Suponha que desejemos descobrir se uma
pessoa é indiana ou estrangeira. O primeiro limite pode ser olhar
para a cor da pele. O próximo limite pode ser o tom de voz. Outro
limite pode ser físico. Depois de aplicar todos esses limites,
fazemos uma árvore que nos ajuda a determinar a categoria a
que essa pessoa pertence. Não estudamos os detalhes estatísticos,
mas alguns dos termos importantes relacionados às árvores de
decisão são os seguintes:
• \ Nó : Um bloco na árvore
126
Regressão Logística
A regressão logística é um dos algoritmos mais famosos em
aprendizado de máquina. É uma forma modificada de
regressão linear em que usamos logits para determinar a
probabilidade de um elemento pertencer a uma classe
particular. Isso nos dá uma saída entre zero e um. Se a saída for
maior que 0,5, diz-se que o elemento pertence a uma classe;
caso contrário, pertence ao outro. Também podemos desenhar
uma curva para testar a eficiência do nosso modelo.
Código
Agora que sabemos o básico de todos os três algoritmos, vamos
aplicá-los ao nosso conjunto de dados. A primeira etapa é ler o
conjunto de dados usando a biblioteca pandas e armazená-lo nos
dados variáveis:
importar pandas como pd
data = pd.read_csv ("train.csv")
127
y = pd.Categorical (y)
logreg = LogisticRegression ()
dt = DecisionTreeClassifier ()
svc = LinearSVC ()
128
y = pd.Categorical (y)
de sklearn.linear_model import LogisticRegression
de sklearn.tree import DecisionTreeClassifier de
sklearn.svm import LinearSVC
logreg = LogisticRegression ()
dt = DecisionTreeClassifier ()
svc = LinearSVC ()
model_logreg = logreg.fit (X, y)
model_dt = dt.fit (X, y)
model_svc = svc.fit (X, y)
129
Resultado:
Termos importantes
O algoritmo AdaDelta é uma alternativa
ao algoritmo de descida gradiente; o
modelo aprende com o conjunto de dados
automaticamente sem predefinir a taxa de
aprendizado (obrigatório no algoritmo de
descida de gradiente); ajuda a eliminar os
problemas de overfitting e underfitting
130
131
132
CAPÍTULO 6
Casos de uso em
tempo real
Agora que examinamos os conceitos básicos e avançados do
processamento de imagens, é hora de examinar alguns casos
de uso em tempo real . Neste capítulo, examinamos cinco POCs
diferentes, que podem ser ajustados com base em seus
próprios requisitos:
\ 1. \ Encontrando linhas de palmeira
\ 2. \ Detectando Faces
\ 3. \ Reconhecendo Faces
\ 4. \ Movimentos de rastreamento
\ 5. \ Faixas de detecção
import cv2
image = cv2.imread ("palm.jpg") cv2.imshow ("palm",
imagem) #para visualizar a palma em python
cv2.waitKey (0)
Resultado:
134
Resultado final:
Podemos alterar os parâmetros para obter uma saída mais eficaz.
Detectando rostos
Nesta seção, aplicamos o código de reconhecimento facial a
uma imagem que contém um rosto e, em seguida, aplicamos o
mesmo código a uma imagem com vários rostos. A primeira
coisa que devemos fazer é importar as bibliotecas
importantes:
import cv2
import matplotlib.pyplot as plt
135
• \ haarcascade_eye.xml
• \ haarcascade_eye_tree_eyeglasses.xml
• \ haarcascade_frontalcatface.xml
• \ haarcascade_frontalface_alt.xml
• \ haarcascade_frontalface_alt2.xml
• \ haarcascade_frontalface_alt_tree.xml
• \ haarcascade_frontalface_default.xml
• \ haarcascade_fullbody.xml
• \ haarcascade_lefteye_2splits.xml
• \ haarcascade_lowerbody.xml
• \ haarcascade_profileface.xml
• \ haarcascade_reciationye_2splits.xml
• \ haarcascade_smile.xml
• \ haarcascade_upperbody.xml
Em nosso caso, usaremos haarcascade_frontalface_alt.xml:
haar_face_cascade = cv2.CascadeClassifier
('haarcascade_ frontalface_alt.xml')
faces = haar_face_cascade.detectMultiScale
(gray_img, scaleFactor = 1.1, minNeighbors = 5)
para (x, y, w, h) nas faces:
cv2.rectângulo (img1, (x, y), (x + w, y + h), (0, 255, 0), 2)
136
Reconhecendo rostos
Detectamos com sucesso os rostos presentes na imagem, mas
como reconhecemos qual rosto pertence a quem? Para
descobrir isso, usaremos métodos OpenCV avançados.
O primeiro passo é detectar o rosto. Incorporamos
exatamente o mesmo código da seção anterior dentro do
método detect_face ():
138
def prepare_training_data
(data_folder_path): dirs = os.listdir
(data_folder_path) faces = []
rótulos = []
para dir_name em dirs:
se não dir_name.startswith ("s"):
continue
139
face_recognizer = cv2.face.LBPHFaceRecognizer_create
() face_recognizer.train (faces, np.array (rótulos))
140
Movimentos de rastreamento
Suponha que você tenha uma caneta, mas em vez de escrever
em um pedaço de papel, você escreve no ar e as coisas são
escritas automaticamente. Parece mágica? Bem, é possível
fazer isso usando métodos avançados de processamento de
imagem.
Suponha que eu tenha um fabricante com uma ponta azul.
Quero movê-lo no ar e ter uma câmera rastreando a ponta azul e
desenhando exatamente os mesmos movimentos na tela. Vamos
ver como podemos fazer isso acontecer.
Primeiro, temos que capturar apenas a ponta azul. Isso
significa que todas as outras coisas - a mão, o fundo e assim
por diante - não passam de ruído. Temos que remover o
ruído, e fazemos isso usando erosão e dilatação para.
Vejamos o código:
141
se len (cnts)> 0:
c = max (cnts, key = cv2.contourArea)
((x, y), raio) = cv2.minEnclosingCircle © M
= cv2.moments ©
center = (int (M ["m10"] / M ["m00"]), int (M ["m01"]
/ M ["m00"]))
se raio> 5:
cv2.circle (img, (int (x), int (y)), int (raio), (0, 255,
255), 2)
cv2.imshow ("Frame",
img) cv2.imshow
("mask", mask)
cv2.imshow ("res", res)
142
Detecção de pistas
Todos nós sabemos que os carros autônomos são uma das
maiores novidades na indústria automotiva atualmente. Os
carros sabem quando virar à esquerda, quando parar, como ler
os sinais de trânsito e assim por diante. Nesta seção,
aprendemos como um carro olha para uma pista em uma
rodovia e entende seu significado, definindo assim seus
limites - em outras palavras, não saindo da pista. Se você quiser
se tornar um especialista em programação de carros autônomos
, existe um programa de nanodegree da Udacity que você pode
assistir.
Para começar, primeiro precisamos calibrar nossa câmera.
Como todo o conceito de carro autônomo depende da precisão
da câmera, devemos calibrá-la. Para fazer isso, usamos uma
função no OpenCV chamada findChessboardCorners (), que
(como você pode imaginar) encontra os cantos internos de
uma determinada imagem de um tabuleiro de xadrez.
def convert3D_to_2D (caminho, x, y):
rwp = np.zeros ((y * x, 3), np.float32)
tmp = np.mgrid [0: x, 0: y] .T.reshape (-1,
2) rwp [:,: 2] = tmp
rwpoints = []
143
imgpoints = []
images = glob.glob
(path) para fname em
imagens:
img = cv2.imread (fname)
cinza = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)
corner_found, corners = cv2.findChessboardCorners
(cinza, (x, y), Nenhum)
if corner_found == True: rwpoints.append (rwp)
imgpoints.append (corners)
cv2.drawChessboardCorners (img, (x, y), corners,
corner_ found)
144
145
Capítulo 6 Casos de uso em tempo real
146
ax1.imshow (i)
ax2.set_title ("Imagem distorcida
distorcida") ax2.imshow (distorcida)
147
148
149
APÊNDICE
Conceitos e
terminologia
importantes
Adaboost
Adaboost é uma técnica que usa vários algoritmos de
classificação em todos os dados de treinamento. Primeiro,
pegamos uma amostra aleatória do conjunto de dados e a
chamamos de conjunto de treinamento . Adaboost atribui pesos a
cada um dos exemplos no conjunto de treinamento. Depois
disso, o primeiro classificador é executado. Quando a
classificação é concluída, o Adaboost analisa os exemplos
classificados incorretamente no conjunto de treinamento. Em
seguida, são atribuídos pesos maiores, assim como os exemplos
classificados corretamente. Isso ocorre para que, ao rodar o
segundo classificador, leve em consideração exemplos com pesos
maiores.
Além disso, os pesos também são atribuídos aos
classificadores. Quando o classificador dá uma saída, seu erro é
calculado. Com base na intensidade do erro, são atribuídos
pesos. Se o erro for inferior a 50% de precisão, o classificador
recebe um peso negativo; caso contrário, recebe um peso
positivo. A precisão de cinquenta por cento equivale a um peso
zero.
© Himanshu Singh 2019 151
H. Singh, Practical Machine Learning and Image
Processing , https://doi.org/10.1007/978-1-4842-4149-3
XGBoost
XGBoost significa Extreme Gradient Boosting. É um dos
algoritmos de classificação e regressão mais usados. Você
descobrirá que os vencedores de quase todas as competições de
análise, como kaggle, KDNuggets, Hackerearth e assim por
diante, usam esse conceito. O XGBoost usa a abordagem de
gradiente descendente para encontrar a melhor solução para
um problema. Seu poder computacional, bem como a precisão
de seus resultados, o tornam tão poderoso. Ele usa vários
núcleos de CPU para fornecer cálculos mais rápidos.
Em vez de atribuir pesos (como feito com Adaboost), o
XGBoost analisa os erros incompatíveis (também chamados de
resíduos ) para cada exemplo de treinamento e tenta criar um
modelo de regressão sobre eles. Assim, para cada iteração, um
novo modelo é criado, que nada mais é do que gradientes. Sua
saída minimiza o erro tanto quanto possível.
152
153
Gradiente descendente
O gradiente descendente é uma das melhores abordagens
usadas para otimização. Quando falamos sobre aprendizado de
máquina, sempre há alguns erros de previsão. Esse erro é
denotado pela função de custo. Se o valor da função de custo for
zero, nossa precisão de previsão é 100%. Para manter o valor da
função de elenco baixo, usamos uma abordagem de gradiente
descendente.
Por exemplo, vamos definir a função de custo como f (x) =
ax + b. a e b são os parâmetros. Imagine que a curva desta
função é semelhante
para uma tigela. Primeiro, fornecemos alguns valores aleatórios
para aeb, o que coloca nossa função de custo em uma posição
particular na curva. Nosso objetivo é alterar os valores de aeb de
forma que a função de custo alcance a parte inferior da tigela /
curva. Para fazer isso, usamos uma taxa de aprendizado. No
final da descida do gradiente, obtemos valores para a e b que são
zero ou muito, muito próximos disso.
154
155
AdaDelta
AdaDelta pertence à família das abordagens de descida
gradiente estocástica. Usando este método, além de seus
recursos de descida gradiente estocástico, é dada importância
especial ao valor dos coeficientes. Isso é chamado de ajuste de
parâmetro . Além disso, a taxa de aprendizado não é inicializada
com nenhum tipo de valor padrão; ele é atualizado
automaticamente. Portanto, envolve o mínimo de intervenção
manual e, portanto, melhor precisão.
156
Apêndice Conceitos e terminologia importantes
Transformação Sobel
Um dos principais usos da transformação de Sobel é detectar bordas.
Uma matriz 3 × 3 é usada para percorrer os pixels de uma
imagem horizontal e verticalmente. É semelhante aos kernels
em CNSNs. A saída de Sobel inclui derivadas.
Você pode estar se perguntando: Por que usamos gradientes?
Suponha que selecionamos o retrato de uma menina. Se um
pouco de seu cabelo está em seu rosto, a cor
157
Haar Cascade
Reconhecimento facial LBPH
Momentos de imagem
Os momentos da imagem são pesos especiais atribuídos a
pixels específicos com base nas propriedades que exigimos. Em
geral, determinamos os momentos da imagem após termos
concluído a segmentação da imagem.
158
159
160
161
163
Índice
UMA
AdaBoost, 151-152
Algoritmo AdaDelta, 123,
130, 156 Adjust_gamma, 57
Imagem bitmap
Instalação do
binária, 11
Anaconda
neurônios
Jupyter biológicos, 110
Notebook, 1 imagens bitmap,
macOS, 4 10-11
Ubuntu, 4
Windows, 2–3
C
Redes neurais artificiais
Calibre a função da
(ANN) neurônios
câmera, 161 Canny Edge
artificiais, 111
Detector, 156–157 cantos
quadros de dados, do tabuleiro de xadrez
criação, 114-115 camada função, 160-161
oculta, 112, 115
Função de círculo,
processamento de conversão de 55
imagem, banco de dados cores
112 MNIST, fluxograma de RGB para HSV, 44
processo 114 , descida RGB para LAB, 47
gradiente estocástica 113 RGB para XYZ,
algoritmo *, estrutura 45-46 RGB para
116 , conjunto de dados de YIQ, 50 RGB para
treinamento 111 , conjunto YPbPr, 51-52 RGB
de treinamento 112 , 114 para YUV, 48-49
predições, variável y_pred, Espaços de
117 cores, 13
HSV / HSL,
Pooling médio, 119
17 LAB, 18
LCH, 18
B RGB, 14–15
Curva de Bezier, 22, 56 XYZ, 15–16
Filtro bilateral , 72-73 YIQ, 21
YPbPr, 19
YUV, 20
Declarações condicionais, 37
© Himanshu Singh 2019 165
H. Singh, Practical Machine Learning and Image
Processing , https://doi.org/10.1007/978-1-4842-4149-3
Índice
166
Índice
H pixels, 8-9
PPI e DPI,
Haar Cascade, 158
resolução 10
Hessian matrix, 92
, 9 SSIM, 25
técnicas, 29
Histogram equalization, Resolução de imagem,
87-88 Homography, 26-27 9 Limite de imagem,
matriz, 99, 101, 104, 80-82
131 espaço de cor HSV,
17
K
Keras, 5
EU J Kernel, 119
Classificação de imagem
ANN ( consulte Redes eu
neurais artificiais
(ANN)) Espaço de cor LAB,
CNNs ( consulte Redes detecção de 18 pistas,
neurais reconhecimento de
convolucionais face 143 LBPH, espaço
(CNNs)) de cor 158 LCH, 18
algoritmos de classificação linear, 127
aprendizado função de linha, 53
de máquina, regressão logística, 127
125 compressão sem
Contornos de perdas, 11 compressão
imagem, com perdas, 12
159 formatos de
arquivo de imagem
, 12–13 momentos de
M
imagem, 158 Codificação de
processamento de algoritmos de
imagem aprendizado de
Curva de máquina, 127, 129-130
Bezier, 22 árvores de decisão,
bitmap, 10-11 126 regressão
espaços de cores ( ver logística, 127 SVMs,
espaços de cores) 127
convolução, 27
deconvolução, 25-26 Pooling
elipsóides, 23 máximo, 119
filtro
formatos de arquivo mediano, 71
, 12–13 correção
gama, 24
homografia, 26–27
compressão sem
perdas, 11
compressão com
perdas, 12 imagem
normal, 8
167
Índice
Instituto Nacional de Padrões
e Tecnologia
Modificado (MNIST), Limiar de pixel, 16
112 polígonos, 54 redes
neurais acopladas a pulso
(PCNNs), 153
N Pitão
Redes neurais, declarações condicionais,
110 imagem 37-38 declarações de fluxo
normal, 8 matriz de controle, 34-36
numpy, 42 estruturas de dados, 33-34
funções, 38-40
variáveis e tipos de dados, 30-32
O
OpenCV, 61 R
combinação de duas
Algoritmo de consenso
imagens, contraste e
de amostra
brilho de 64-65 , cálculo
aleatória
de gradientes de 66-67 ,
(RANSAC), registro
equalização de
de imagem
histograma 84-86 , limiar
Affine.py, 99, 108
de imagem 87-88 ,
instalação de 80 , 4-5 Align.py, 99, 109 módulos
forma das imagens ( personalizados, função
consulte Forma das 99 estimativa_afino,
imagens) detecção de 105 recursos
suavizando imagens e
( consulte extração, 99
Suavização de correspondência de
imagens) recursos, 99
texto para imagens, 68-70 homografia
(similaridade)
entre imagens, 99
P, Q codificação Python,
Preenchimento, 75 99, 106 Ransac.py, 107
Linhas da palma, função
achado, 133-135 função residual_lengths,
Pandas, 43 Ajuste de 105-106
parâmetro, 156 imagem de satélite, 98
Transformação de imagem alvo, 106
perspectiva função de
função, transformação, 99
162 pixels, 8-9 Casos de uso em
Pixels por polegada (PPI), 10 tempo real
detectando faces,
detecção de 135-138
pistas, 143
168
linhas da palma, encontrar, 133-135 Descida do gradiente est
reconhecendo rostos, 138-140 Similaridade estrutural,
movimentos de rastreamento, 141-143Índice de similaridade e
função residual_lengths, 105-106 (SSIM), 25
Espaço de cor RGB, 14-15 Máquinas de vetor de su
Girar e dimensionar imagem, 59 (SVMs), 127
S T
Algoritmo de transformação Expansão Taylor,
de característica 92 to_excel, 43
invariante de escala Movimentos de
(SIFT), 89-90 rastreamento, 141-143
Imagem Scikit Conjunto de treinamento,
conversão de espaço de 114
cor ( consulte
Conversão de espaço
de cor) você
criação de desenho ( ver Ubuntu, 4
criação de desenho)
correção de gama,
resolução de 57 V, W
imagens, economia de Ambientes virtuais, 6
42 imagens, valor de
53 pixels, envio e
visualização de 43 X
XGBoost, 152-153
imagem, 41 espaço de cor XYZ,
Forma de 15-16
dilatação das
imagens,
erosão 76-77 , Y, Z
76, 78-79 Espaço de cor YIQ, 21
preenchimento, Cabos YPbPr, 19
75 Espaço de cor YPbPr, 19
Função sigmoide, Espaço de cor YUV, 20
módulo 115
Skimage, 59
imagens de
suavização
filtro bilateral
, filtro gaussiano
72-73 , filtro
mediano 71-72 ,
71
Transformação de Sobel, 157-158
169