Mudanças entre as edições de "Reconhecimento de Placas de Sinalização Via Processamento Digital de Imagem e Aprendizado de Máquina"
(186 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 1: | Linha 1: | ||
− | |||
− | |||
* '''Aluno''': Mathias Silva da Rosa | * '''Aluno''': Mathias Silva da Rosa | ||
* '''Orientador''': [[Diego da Silva de Medeiros]] | * '''Orientador''': [[Diego da Silva de Medeiros]] | ||
− | === | + | === Monografia === |
− | + | [https://wiki.sj.ifsc.edu.br/images/5/58/Monografia_Mathias_Silva_da_Rosa.pdf Monografia de TCC - Mathias Silva da Rosa - Engenharia de Telecomunicações] | |
− | ===== | + | === Revisão bibliográfica === |
− | |||
− | :{{collapse top | | + | :{{collapse top | Trabalhos Analisados }} |
− | |||
− | + | '''Trabalhos Estrangeiros''' | |
− | : | + | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=7550772 Romdhane - An improved traffic signs recognition and tracking method for driver assistance system]''' |
− | + | - Usa segmentação via cor e HOG (Histogram of Oriented Gradients) | |
− | + | :{{collapse top | Anotações do artigo }} | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | Este trabalho propõe um algoritmo para detecção e reconhecimento de placas de sinalização de trânsito dividido principalmente em quatro etapas: segmentação da imagem para detectar a região da placa utilizando técnicas baseadas em cor, descrição utilizando descritores HOG, classificação utilizando SVM e o rastreamento da placa baseado no fluxo óptico. A figura 1 apresenta o fluxo do algoritmo proposto. | |
− | + | <center>[[Imagem: Romdhane_algorithm.png]]</center> | |
− | + | <center>'''Figura 1 - Algoritmo Proposto'''</center> | |
− | + | <center>'''Fonte: Próprio Artigo'''</center> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | <center>[[Imagem: | ||
− | <center>'''Figura 1 - | ||
− | <center>'''Fonte: Próprio | ||
:{{collapse top | Detecção }} | :{{collapse top | Detecção }} | ||
− | + | A etapa de detecção pode ser subdividida em 3 etapas: '''delimitação da região onde se encontra a placa, segmentação da placa e detecção da placa.''' | |
− | + | '''Delimitação da ROI<sub>ts</sub> | |
− | |||
− | |||
− | + | Para delimitar a região da imagem da qual possui uma placa de sinalização e aumentar a performance do sistema reduzindo o esforço para detectar a região sobre o tamanho total da imagem, foi utilizado um algoritmo proposto pelo próprio autor em trabalhos anteriores para detectar os limites da via e a linha do horizonte. Através deste algoritmo foi possível definir uma cerca quadrilateral no canto direito da imagens capturadas como é apresentado pela figura 2 abaixo. | |
− | + | <center>[[Imagem: Romdhane_ROIdelimitation.png]]</center> | |
+ | <center>'''Figura 2 - Delimitação da ROI<sub>ts</sub>'''</center> | ||
+ | <center>'''Fonte: Próprio Artigo'''</center> | ||
− | + | '''Segmentação da Placa''' | |
− | + | Nesta etapa, foi realizada a segmentação da placa baseada em método de cor. A escala HSV(''Hue, Saturation and Value'') foi utilizada por possuir maior proximidade com a percepção do olho humano e seus parâmetros possuírem uma maior invariância à alterações de iluminação e sombras. Aplicando uma limiarização em cada componente desta escala foi possível segmentar a placa da ROI<sub>ts</sub> como é apresentado pelo figura 3. Adicionalmente, para obter áreas mais compactas e com menos interrupções, foi aplicado uma operação de morfologia de proximidade. | |
− | + | <center>[[Imagem: Romdhane_segmentation.png]]</center> | |
+ | <center>'''Figura 3 - Segmentação'''</center> | ||
+ | <center>'''Fonte: Próprio Artigo'''</center> | ||
− | + | '''Detecção da Placa''' | |
− | + | Esta etapa é responsável por determinar a localização precisa da placa de sinalização. Para isso toda a ROI<sub>ts</sub> é analisada e subdividida(utilizando os 8 pixels vizinhos) em potenciais regiões e para cada região é calculada uma estrutura de características (altura,largura,área). Para cada região é aplicado um conjunto de regras que definirão se a região em questão é ou não uma placa de sinalização utilizando as características anteriormente calculadas. As três regras utilizadas são: | |
+ | *A altura e a largura de uma potencial região devem ser maiores que 14 e menores que 100; | ||
+ | *A área de uma potencial região deve ser maior que 30% e menor que 80% que a ROI<sub>ts</sub>; | ||
+ | *A taxa de altura e largura de uma potencial região deve estar no intervalo de [0.5,1.5]; | ||
− | + | Portanto, estas três regras permitem reduzir o número de região negativas e ajudar a aumentar a precisão do sistema. A figura 4 apresenta uma amostra da capacidade desta etapa. | |
− | + | <center>[[Imagem: Romdhane_detectiontest.png]]</center> | |
+ | <center>'''Figura 4 - Teste da etapa de Detecção'''</center> | ||
+ | <center>'''Fonte: Próprio Artigo'''</center> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | :{{collapse top | | + | :{{collapse top | Descrição }} |
− | + | Para descrever adequadamente a placa de sinalização obtida pela etapa anterior, foi utilizado o Histograma de Gradientes Orientados (HOG) para extrair um vetor de característica desta placa em análise. O HOG é um dos mais conhecidos descritores para o reconhecimento de objetos devido ao fato deste imitar o processamento da informação visual feita pelo cérebro humano e ser relativamente invariante a mudanças de iluminação e posição. | |
− | + | Neste trabalho os descritores HOG são calculados através dos histogramas de orientação da intensidade das bordas, uma vez que a maioria da placas são formadas por símbolos geométricos (formato) e possuem contraste característico, o que faz com que essa técnica seja empregada no contexto do trabalho. | |
− | + | Antes de obter os descritores HOG, toda a região extraída da etapa anterior é redimensionada para uma área de 32x32 pixel para limitar o processamento envolvido neste processo. Em seguida, cada uma destas regiões é divida em células de 4x4 pixels das quais irão gerar os Histogramas e, consequentemente, 9 gradientes. Por fim, as células células são divididas em blocos de 12x12 para normalização dos gradientes obtidos. Os conjunto destas região formam o descritor HOG da região. | |
− | + | {{collapse bottom}} | |
− | + | :{{collapse top | Classificação }} | |
− | < | + | Para desenvolver a classificação de 25 classes de placas de sinalização de perigo e proibição, foi utilizado a técnica denominada Máquina de Vetores de Support (SVM) sendo uma das técnicas com maior relevância na teoria estatística de aprendizagem. Dado um conjunto de treinamento rotulado <math>A= \{(x_i,y_i),i=1...n\}</math> onde <math> x_i \in R_n</math> e <math> y_i \in \{1,-1\}</math>. Um novo conjunto será classificado de acordo com a equação <math>f(x)</math> definida por (1): |
− | < | ||
− | < | ||
− | |||
− | |||
− | <center> | + | <center><math>f(x) = sgn(\sum_{i=1}a_i y_y K(x_i,x) + b) \qquad (1)</math></center> |
− | |||
− | |||
+ | Onde, <math>a_i</math> são os multiplicadores de Lagrange e <math>K(x_i,x)</math> é a função kernel. Dado um mapeamento não linear <math>\phi</math> que incorpora o conjunto de dado em um determinado espaço, o função kernel é definida por (2): | ||
− | + | <center><math>K(x_i,x_j) = (\phi(x_i),\phi(x_j)) \qquad (2) </math></center> | |
− | + | O objetivo da SVM é encontrar um hiperplano linear de separação com uma máxima margem para separar os dados no espaço. Um vez que uma SVM é feita para classificações binárias, é necessário realizar um cascateamento para desenvolver uma classificação multi-classes. Em nosso caso a SVM foi utilizada para obter os hiperplanos que maximizam a distância entre os descritores HOG no conjuto de dados de entrada. A figura 5 abaixo apresentar um teste da etapa de reconhecimento. | |
− | + | <center>[[Imagem: Romdhane_recognition.png]]</center> | |
+ | <center>'''Figura 5 - Reconhecimento de uma placa'''</center> | ||
+ | <center>'''Fonte: Próprio Artigo'''</center> | ||
− | + | {{collapse bottom}} | |
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=7564923 Mammeri - Traffic Signs Localisation and Recognition Using A Client-Server Architecture]''' | |
+ | - Usa um sistema centralizado, semelhante ao GPS | ||
− | :{{collapse top | Anotações do | + | :{{collapse top | Anotações do artigo }} |
+ | O trabalho prroposto segue uma linha bem diferente dos demais trabalhos feitos anteriormente para o mesmo intuito. Foi um dos primeiros trabalhos a não utilizar técnicas baseadas na visão, ou seja, técnicas que utilizam o processamento de imagens provenientes de câmeras acopladas ao sistema. Por isso, o presente trabalho não está sujeito aos obstáculos enfrentados por estas técnicas como problemas relacionados às condições de tempo, luminosidade, ângulo, etc, que devem ser contornados na detecção e reconhecimento de placas de sinalização. | ||
− | + | A técnica utilizada envolve o uso de uma arquitetura Cliente-Servidor da qual o veículo (cliente) envia requisições periódicas contendo informações de posição geográfica através de um sistema de posição global(GPS) para uma base de dados (servidor). A base de dados que contém armazenada toda a informação referente as placas de sinalização em uma determinada região (posição geográfica, nome das ruas e uma breve descrição do conteúdo de cada placa) responde a requisição indicando qual placa de sinalização possui maior proximidade no ângulo de deslocamento do veículo. | |
− | + | :{{collapse top | Vantagens e Desvantagens }} | |
− | + | ''' Vantagens ''' | |
− | + | Se comparado à outros sistemas que utilizam técnicas de detecção de regiões de interesse como o Histograma de Gradientes Orientados (HOG) ou Regiões de Máxima Estabilidade (MSER), o trabalho proposto possui uma latência muito pequena, como é possível observar no gráfico abaixo, do qual apresenta a relação entre os sistemas e o tempo de latência. | |
− | : | + | <center>[[Imagem:Latencia_TSDR.png|Fonte: Próprio Artigo]]</center> |
+ | <center> Fonte: Próprio Artigo </center> | ||
− | + | ''' Desvantagens ''' | |
− | + | Apesar de possuir baixa latência, a taxa de acerto do sistema depende totalmente da precisão do GPS utilizado. Caso ocorra o envio de uma posição diferente da posição do veículo, mesmo em dezenas de metros, o sistema pode responder a requisição com uma placa de sinalização incorreta. Outra questão é que para o perfeito funcionamento do sistema, é requerido um link de boa confiabilidade e taxas de transmissão e recepção aceitáveis. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
{{collapse bottom}} | {{collapse bottom}} | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=7053576 Gao - Traffic signs recognition based on PCA-SIFT]''' | |
− | |||
− | |||
− | |||
− | |||
- Traz um apanhado geral sobre vários tipos de técnicas. Usa pré-processamento, SIFT ([https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Scale-Invariant Feature Transform] e SVM(Support Vector Machine) | - Traz um apanhado geral sobre vários tipos de técnicas. Usa pré-processamento, SIFT ([https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Scale-Invariant Feature Transform] e SVM(Support Vector Machine) | ||
Linha 195: | Linha 120: | ||
O seguinte trabalho propõe um sistema de detecção e reconhecimento de placas de sinalização de trânsito, dando foco na extração das características das regiões de interesse, especialmente na otimização desta etapa utilizando o algoritmo ''Scale-Invariant Feature Transform'' (SIFT) em conjunto com o procedimento de análise de componentes principais (''Principal Component Analysis'' - PCA). Na etapa de classificação é utilizada a técnica de Máquinas de Vetores de Suporte (SVM). | O seguinte trabalho propõe um sistema de detecção e reconhecimento de placas de sinalização de trânsito, dando foco na extração das características das regiões de interesse, especialmente na otimização desta etapa utilizando o algoritmo ''Scale-Invariant Feature Transform'' (SIFT) em conjunto com o procedimento de análise de componentes principais (''Principal Component Analysis'' - PCA). Na etapa de classificação é utilizada a técnica de Máquinas de Vetores de Suporte (SVM). | ||
− | |||
:{{collapse top | Scale-Invariant Feature Transform - SIFT }} | :{{collapse top | Scale-Invariant Feature Transform - SIFT }} | ||
Linha 254: | Linha 178: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?tp=&arnumber=6895001 Wahyono - A comparative study of classification methods for traffic signs recognition]''' | |
- Compara diversos métodos: Redes Neurais artificiais (ANN), Vizinhos k-Próximos (kNN), SVM, Random Forest (RF) e HOG (Histogram of Oriented Gradients) | - Compara diversos métodos: Redes Neurais artificiais (ANN), Vizinhos k-Próximos (kNN), SVM, Random Forest (RF) e HOG (Histogram of Oriented Gradients) | ||
Linha 317: | Linha 241: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
+ | |||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=7562938 Jang - Data debiased traffic sign recognition using MSERs and CNN]''' | |
- Usa componentes de cor | - Usa componentes de cor | ||
Linha 345: | Linha 270: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=6043668 Mariut - Detection and recognition of traffic signs using Gabor filters]''' | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
- Usa espaço de cores HSV (matiz, saturação e valor), classificação por correlação e reconhecimento via distância euclidiana e filtro de Gabor | - Usa espaço de cores HSV (matiz, saturação e valor), classificação por correlação e reconhecimento via distância euclidiana e filtro de Gabor | ||
Linha 452: | Linha 337: | ||
O filtro de Gabor dado pela equação 4 possui a capacidade óptica de captura ambas posições de orientação e frequência de uma imagem digital. Neste trabalho os filtros foram configurados utilizando os seguintes parâmetros:<math>\sigma_x = 4</math>, <math>\sigma_y = 2</math>, ''f'' = 1.4 e n = 5, o que significa <math>\theta_k = \{\frac{\pi}{5},\frac{2\pi}{5},\frac{3\pi}{5},\frac{4\pi}{5},\pi\}</math>. Portanto, é criado um banco de filtros de Gabor composto por 5 canais com diferentes orientações. Cada filtro do banco é aplicado sobre as imagens obtidas na etapa de classificação através de um convolução, resultando em 5 novas imagens que formam um vetor de características da imagem original. | O filtro de Gabor dado pela equação 4 possui a capacidade óptica de captura ambas posições de orientação e frequência de uma imagem digital. Neste trabalho os filtros foram configurados utilizando os seguintes parâmetros:<math>\sigma_x = 4</math>, <math>\sigma_y = 2</math>, ''f'' = 1.4 e n = 5, o que significa <math>\theta_k = \{\frac{\pi}{5},\frac{2\pi}{5},\frac{3\pi}{5},\frac{4\pi}{5},\pi\}</math>. Portanto, é criado um banco de filtros de Gabor composto por 5 canais com diferentes orientações. Cada filtro do banco é aplicado sobre as imagens obtidas na etapa de classificação através de um convolução, resultando em 5 novas imagens que formam um vetor de características da imagem original. | ||
− | |||
Além das imagens de análise, o banco de filtros de Gabor também é aplicado sobre imagens de um banco composto por 10 imagens referentes à placas de sinalização e de cada placa também é extraído um vetor de características. A figura 5 abaixo apresenta as placas utilizadas no experimento. | Além das imagens de análise, o banco de filtros de Gabor também é aplicado sobre imagens de um banco composto por 10 imagens referentes à placas de sinalização e de cada placa também é extraído um vetor de características. A figura 5 abaixo apresenta as placas utilizadas no experimento. | ||
Linha 484: | Linha 368: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=6005978 Chen - A Robust Traffic Sign Recognition System for Intelligent Vehicles]''' | |
- Classificação via Filtro Vetorial Simples, Transformada Hough e Curve Fitting, e classificação via Momentos Pseudo-Zernike | - Classificação via Filtro Vetorial Simples, Transformada Hough e Curve Fitting, e classificação via Momentos Pseudo-Zernike | ||
Linha 511: | Linha 395: | ||
<center>'''Figura 2 - Algoritmo SVF'''</center> | <center>'''Figura 2 - Algoritmo SVF'''</center> | ||
<center>'''Fonte: Matlab'''</center> | <center>'''Fonte: Matlab'''</center> | ||
− | |||
'''Análise do Formato e Normalização''' | '''Análise do Formato e Normalização''' | ||
Linha 557: | Linha 440: | ||
As tabelas 1 e 2 abaixo apresentam os resultados para a etapa de detecção/classificação e para a etapa de reconhecimento respectivamente: | As tabelas 1 e 2 abaixo apresentam os resultados para a etapa de detecção/classificação e para a etapa de reconhecimento respectivamente: | ||
− | |||
<center>[[Imagem:Chen_results1.png |400px]]</center> | <center>[[Imagem:Chen_results1.png |400px]]</center> | ||
<center>'''Tabela 1 - Resultados de Detecção/Classificação'''</center> | <center>'''Tabela 1 - Resultados de Detecção/Classificação'''</center> | ||
Linha 574: | Linha 456: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | =====[http://ieeexplore.ieee.org/abstract/document/7734920/ Lin - A Traffic Sign Recognition Method Based on Deep Visual Feature] | + | '''Trabalhos Brasileiros''' |
+ | |||
+ | ''' [http://docs.computacao.ufcg.edu.br/posgraduacao/dissertacoes/2002/Dissertacao_FabricioAugustoRodrigues.pdf Rodrigues - Localização e Reconhecimento de Placas de Sinalização Utilizando um Mecanismo de Atenção Visual e Redes Neurais Artificiais] ''' | ||
+ | |||
+ | :{{collapse top | Anotações do trabalho }} | ||
+ | |||
+ | O trabalho proposto apresenta uma arquitetura híbrida, que é formada por um mecanismo de atenção visual e uma rede neural, para localizar e reconhecer placas de sinalização. Sendo assim, esta arquitetura é divida em dois módulo: Um módulo para detecção e um para o reconhecimento. A figura 1 abaixo apresenta o fluxograma desta arquitetura. | ||
+ | |||
+ | <center>[[Imagem: arquitetura_rodrigues.png|500px]]</center> | ||
+ | <center>'''Figura 1 - Arquitetura geral do sistema: os retângulos representam os dados e os retângulos arredondados representam os processos'''</center> | ||
+ | <center>'''Fonte: Próprio Trabalho'''</center> | ||
+ | |||
+ | :{{collapse top | Detecção }} | ||
+ | |||
+ | O módulo de detecção foi implementado a partir da adaptação do modelo proposto por Itti e Colegas [Itti et al., 1998] que é apresentado pelo figura 2. | ||
+ | |||
+ | <center>[[Imagem: arq_detec_rodrigues.png|700px]]</center> | ||
+ | <center>'''Figura 2 - Arquitetura do módulo de detecção'''</center> | ||
+ | <center>'''Fonte: Próprio Trabalho'''</center> | ||
+ | |||
+ | As etapas do módulo de detecção estão: | ||
+ | |||
+ | * Filtragem Linear: A etapa de filtragem linear consiste da extração de características como cor, intensidade e orientação. Para cada imagem de entrada são criado 4 canais de cores, obtidos através dos componentes RGB da imagem e através das equações: | ||
+ | |||
+ | <center>[[Imagem: Eq1_rodrigues.png|200px]]</center> | ||
+ | |||
+ | Onde, para cada canal, são geradas Pirâmides Gaussianas de cinco níveis. A intensidade da imagem é definida como <math>I = (r+g+b)/3</math>, ou seja, é a própria imagem em níveis de cinza, onde uma pirâmide Gaussiana de 5 níveis também é gerada. Por último, a orientação é obtida através de I aplicando-se Filtros Direcionais e gerando uma pirâmide Direcional. | ||
+ | |||
+ | * Diferenças Centro-Vizinhança (Center-Surround Differences): é implementada como a diferença entre escalas finas e grossas, ou seja, o centro é um pixel da imagem na escala <math> c \in \left \{ 1,2 \right \}</math> e a vizinhaça é o pixel correspondente em outra imagem na escala <math> v \in \left \{ 3,4 \right \}</math> da representação piramidal. A diferença entre duas imagens, denotada por <math>\Theta</math>, é obtida pela interpolação das imagens para a escala fina e subtração ponto a ponto. A utilização de várias escalas produz extração de características multiescala, resultando em 28 Mapas de Características. O número de mapas é definido pela combinação das escalas c e v e pela orientação. | ||
+ | |||
+ | * Mapa de saliência: constitui-se como a soma dos mapas de características nas diversas escalas obtidas, resultando em três mapas de conspicuidade (Intensidade, Cor e Orientação). O mapa de saliência é utilizando então para determinar a região de interesse, da qual corresponde aos pixels de maior valor do mapa. | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | :{{collapse top | Reconhecimento }} | ||
+ | |||
+ | Para o módulo de reconhecimento foi utiliada uma Rede Neural Multilayer Perceptron com algoritmo de treinamento Back Propagation(MLP-BP), por se tratar de uma técnica de classificação tradicional, de fácil utilização e com inspiração biológica. | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | :{{collapse top | Experimentos e Resultados }} | ||
+ | |||
+ | A construção do banco de imagens foi baseado um vídeo filmado a partir de um veículo em movimento, durante uma viagem com dia claro entre as cidades de João Pessoa e Campina Grande. O ''hardware'' de aquisição consistiu de uma câmera CCD comum em um tripé, montado na frente do assento direito do carro (assento do passageiro). | ||
+ | |||
+ | Os conjuntos de treinamento e teste foram compostos de três classes de imagens: placas pare, placas proibido ultrapassar e imagens sem placas, cada classe contendo 14 imagens. | ||
+ | |||
+ | Para a tarefa de classificação das imagens, foi utilizada uma Rede com a seguinte arquitetura: 400 neurônios na camada de entrada (imagens de entrada de tamanho 20x20), 200 neurônios na camada escondida (empiricamente definida como tendo metade dos neurônios da camada de entrada) e 3 neurônios na camada de saída). | ||
+ | |||
+ | '''Resultados Iniciais''' | ||
+ | |||
+ | * Módulo de Reconhecimento | ||
+ | |||
+ | <center>[[Imagem: results1_rodrigues.png|400px]]</center> | ||
+ | <center>'''Figura 3 - Gráfico de taxa de acerto da Rede Neural'''</center> | ||
+ | <center>'''Fonte: Próprio Trabalho'''</center> | ||
+ | |||
+ | * Módulo de Detecção | ||
+ | |||
+ | <center>[[Imagem: results2_rodrigues.png|400px]]</center> | ||
+ | <center>'''Figura 4 - Taxas percentuais de localização das placas em todas as imagens, quando consideramos um número K de regiões selecionadas'''</center> | ||
+ | <center>'''Fonte: Próprio Trabalho'''</center> | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | :{{collapse top | Trabalhos a serem analisados }} | ||
+ | |||
+ | '''Trabalhos Estrangeiros''' | ||
+ | |||
+ | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=7535410 Romdhane - Combined 2d/3d traffic signs recognition and distance estimation]''' | ||
+ | |||
+ | - Usa uma estrutura parecida, porém acrescenta o SVM | ||
+ | |||
+ | :{{collapse top | Anotações do artigo }} | ||
+ | Inclua aqui suas anotações | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=7065096&tag=1 Feng - Ground traffic signs recognition based on Zernike moments and SVM]''' | ||
+ | |||
+ | - Usa os [https://pt.slideshare.net/SandeepKumar622/zernike-moments Momentos de Zernike] e SVM | ||
+ | |||
+ | :{{collapse top | Anotações do artigo }} | ||
+ | Inclua aqui suas anotações | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=6911250 Elotmani - A light traffic signs recognition system]''' | ||
+ | |||
+ | - Usa detecção de cores e Projeção de Perfil | ||
+ | |||
+ | :{{collapse top | Anotações do artigo }} | ||
+ | Inclua aqui suas anotações | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | '''[http://ieeexplore.ieee.org.ez130.periodicos.capes.gov.br/stamp/stamp.jsp?arnumber=6269599 Wang - Traffic-signs recognition system based on multi-features]''' | ||
+ | |||
+ | - Usa um método de segmentação FCM (Fuzzy c-Means) e classificação CBIR (Content-Based Image Retrieval) | ||
+ | |||
+ | :{{collapse top | Anotações do artigo }} | ||
+ | Inclua aqui suas anotações | ||
+ | {{collapse bottom}} | ||
+ | |||
+ | '''[http://ieeexplore.ieee.org/abstract/document/7734920/ Lin - A Traffic Sign Recognition Method Based on Deep Visual Feature]''' | ||
- Filtro Bilateral, Detector de Bordas Canny, Rede Neural Convolucional(CNN) e Máquina de Vetores de Suporte (SVM) | - Filtro Bilateral, Detector de Bordas Canny, Rede Neural Convolucional(CNN) e Máquina de Vetores de Suporte (SVM) | ||
Linha 582: | Linha 568: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''[http://ieeexplore.ieee.org/abstract/document/7734920/ Greenhalgh - Real-Time Detection and Recognition of Road Traffic Signs]''' | |
- Maximally Stable Extremal Regions (MSER), Histograma de Gradientes Orientados (HOG) e Cascata de SVMs. | - Maximally Stable Extremal Regions (MSER), Histograma de Gradientes Orientados (HOG) e Cascata de SVMs. | ||
Linha 590: | Linha 576: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | '''Trabalhos brasileiros''' | |
+ | |||
+ | ''' [http://dsc.inf.furb.br/arquivos/tccs/monografias/TCC2010-1-13-VF-FernandoPoffo.pdf Poffo - Visual Autonomy - Protótipo para reconhecimento de placas de trânsito] ''' | ||
+ | |||
+ | :{{collapse top | Anotações do trabalho }} | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | ''' [http://www.lbd.dcc.ufmg.br/colecoes/wvc/2012/004.pdf Silva - Uma Metodologia para Detectar e Reconhecer Placas de Sinalização de Trânsito] ''' | ||
+ | |||
+ | :{{collapse top | Anotações do trabalho }} | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | '''[http://link.springer.com/article/10.1007/s00521-016-2388-3 Gomes - Embedded real-time speed limit sign recognition using image processing and machine learning techniques]''' | ||
− | <table border="1" cellpadding=" | + | :{{collapse top | Anotações do trabalho }} |
+ | |||
+ | O seguinte trabalho propõe a detecção e reconhecimento, em tempo real, de placas de sinalização de velocidade através de uma aplicação android utilizando técnicas de processamento de imagem para as etapas de detecção e reconhecimento. Para a etapa de detecção foi utilizado uma cascata de classificadores ''boosted'' baseados em características Haar-like. | ||
+ | |||
+ | :{{collapse top | Detecção }} | ||
+ | |||
+ | Para o entendimento da etapa de detecção, é necessário apresentar alguns conceitos: | ||
+ | |||
+ | :{{collapse top | ''Boosting'' }} | ||
+ | |||
+ | O Boosting é uma técnica de aprendizado de máquina que basicamente consiste em desenvolver um classificador forte a partir de classificadores fracos, em termos de níveis de predição [http://www.ufjf.br/pgcc/files/2014/06/Camila-Campos.pdf]. Mas o que são classificadores fracos? Vamos entender através do exemplo do spam[https://www.analyticsvidhya.com/blog/2015/11/quick-introduction-boosting-algorithms-machine-learning/]. | ||
+ | |||
+ | Podemos definir se um e-mail é um spam ou não através dos seguintes critérios: | ||
+ | |||
+ | *Se o e-mail possui apenas uma imagem(propaganda), então é um spam. | ||
+ | *Se o e-mail possui apenas links, então é um spam. | ||
+ | *Se o e-mail é de uma pessoa conhecida, então não é um spam. | ||
+ | *Se o e-mail possui a palavra "dinheiro" no seu corpo, então é um spam. | ||
+ | *Se o e-mail é da sua empresa, então não é um spam. | ||
+ | |||
+ | Definimos acima um série de classificadores fracos que, individualmente, não são fortes o suficiente para definir se um e-mail é um spam ou não. Para tornar uma classificação fraca em uma classificação forte, devemos então combinar os classificadores fracos em um único classificador forte utilizando esquemas de peso ou votação. | ||
+ | |||
+ | '''Algoritmo Boosting''' | ||
+ | |||
+ | O algoritmo Boosting funciona da seguinte forma: | ||
+ | |||
+ | * Do conjunto total de dados é retirado uma parcela para o treinamento. Na figura 1 abaixo nosso conjunto possui os elementos pertencentes a classe (+) e a classe (-). | ||
+ | |||
+ | <center>[[Imagem: Boosting Image1.png|200px]]</center> | ||
+ | <center>'''Figura 1 - Conjunto para Treinamento'''</center> | ||
+ | <center>'''Fonte: '''[https://www.youtube.com/watch?v=ix6IvwbVpw0]</center> | ||
+ | |||
+ | * Para o primeiro algoritmo base, são destacadas os elementos que foram erroneamente classificados. Estes elementos serão entrada para o próximo algoritmo base que se concentrará na classificação destes. A figura 2 abaixo apresenta três estaǵios de classificação. | ||
+ | |||
+ | <center>[[Imagem: Boosting Image2.png|300px]]</center> | ||
+ | <center>'''Figura 2 - Classificadores Fracos'''</center> | ||
+ | <center>'''Fonte: '''[https://www.youtube.com/watch?v=ix6IvwbVpw0]</center> | ||
+ | |||
+ | * Ao final do processo, os classificadores fracos são ponderados através de pesos referentes à relevância de cada um e combinados para formar o classificador forte capaz de deduzir com alta precisão quais elementos pertencem à qual classe. O processo final é apresentado abaixo pela figura 3. | ||
+ | |||
+ | <center>[[Imagem: Boosting Image3.png|300px]]</center> | ||
+ | <center>'''Figura 3 - Classificador Forte'''</center> | ||
+ | <center>'''Fonte: '''[https://www.youtube.com/watch?v=ix6IvwbVpw0]</center> | ||
+ | |||
+ | '''Adaboost''' | ||
+ | |||
+ | O algoritmo ''Adaboost'' foi o primeiro tipo de técnica ''Boosting'' apresentada por Freund and Schapire [http://www.face-rec.org/algorithms/Boosting-Ensemble/decision-theoretic_generalization.pdf]. O nome é referente à ''Adaptive Boosting Algorithm'', ou seja, o algoritmo ''Adaboost'' é basicamente um método ''boosting'' do qual é executado iterativamente e a cada iteração os pesos do classificadores fracos são reajustados [http://rob.schapire.net/papers/explaining-adaboost.pdf]. O algoritmo ''Adaboost'' é definido pelas seguintes etapas[http://rob.schapire.net/papers/explaining-adaboost.pdf]: | ||
+ | |||
+ | '''Dados de entrada''' | ||
+ | |||
+ | * Dados de treinamento: <math> S = \left \{ x_i,y_i \right \}_i^m, x \in X, y \in \left \{-1,+1\right \}</math> | ||
+ | * Distribuição <math>D_t\left(i \right)</math> com peso <math>w_t = \frac{1}{m}, i = 1..m</math> | ||
+ | * Número de interação T | ||
+ | * Classificador fraco W | ||
+ | |||
+ | '''Saída''' | ||
+ | |||
+ | * Classificador forte H | ||
+ | |||
+ | '''Para cada interação é feito o seguintes passos:''' | ||
+ | |||
+ | * Treinar o classificador fraco com a distribuição D_t | ||
+ | * Obter a hipótese fraca e computar o erro | ||
+ | * Atualizar a distribuição utilizando o erro obtido | ||
+ | |||
+ | Ao final os classificadores são combinados para resultar em H. | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | ===Análise dos Trabalhos=== | ||
+ | |||
+ | <table border="1" cellpadding="1"> | ||
<caption>Tabela de Técnicas Analisadas</caption> | <caption>Tabela de Técnicas Analisadas</caption> | ||
<tr > | <tr > | ||
− | <th>Trabalho</th><th>Ano</th><th>Extração da Região de Interesse</th><th> | + | <th>Trabalho</th><th>Ano</th><th>Extração da Região de Interesse</th><th>Descrição</th><th>Reconhecimento</th> |
</tr> | </tr> | ||
<tr> | <tr> | ||
Linha 624: | Linha 701: | ||
</td><td style="color:orange"> Máquina de Vetores de Suporte(SVM) </td> | </td><td style="color:orange"> Máquina de Vetores de Suporte(SVM) </td> | ||
</tr> | </tr> | ||
− | |||
<tr> | <tr> | ||
Linha 636: | Linha 712: | ||
Legenda: | Legenda: | ||
− | <p style="color:blue">Complexidade Baixa </p> | + | <p style="color:blue">Complexidade Baixa </p> <p style="color:orange">Complexidade Média </p> <p style="color:red">Complexidade Alta </p> |
− | <p style="color:orange">Complexidade Média </p> | + | |
− | <p style="color:red">Complexidade Alta </p> | + | === Proposta === |
+ | <center> | ||
<table border="1" cellpadding="2"> | <table border="1" cellpadding="2"> | ||
− | |||
<tr > | <tr > | ||
− | <th> | + | <th>Pré-processamento</th><th>Segmentação</th><th>Descrição</th><th>Classificação</th> |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</tr> | </tr> | ||
<tr> | <tr> | ||
− | <th> | + | <th>Limiarização através do HSV + Remoção de áreas (Quant. de pixels e centros de massa) + Dilatação e Erosão </th><td>Transformada Hough Generarizada</td><td>Histrograma de Gradientes Orientados(HOG)</td><td>Máquina de Vetores de Suporte(SVM) </td> |
</tr> | </tr> | ||
</table> | </table> | ||
+ | </center> | ||
− | === | + | === Cronograma === |
− | ===== | + | {| class="wikitable" style="margin: auto;" |
+ | ! rowspan="2" style="text-align: center;" | Atividades | ||
+ | ! colspan="20" style="text-align: center;" | 2017 | ||
+ | |- | ||
+ | | colspan="4" style="text-align: center;" | Ago | ||
+ | | colspan="4" style="text-align: center;" | Set | ||
+ | | colspan="4" style="text-align: center;" | Out | ||
+ | | colspan="4" style="text-align: center;" | Nov | ||
+ | | colspan="4" style="text-align: center;" | Dez | ||
+ | |- | ||
+ | | style="text-align: center;" | Estudo e implementação de técnica de descrição | ||
+ | | style="text-align: center;" | - | ||
+ | | - | ||
+ | | - | ||
+ | | style="color: red" | x | ||
+ | | style="text-align: center; color: red" | x | ||
+ | | style="text-align: center; color: red" | x | ||
+ | | style="text-align: center; color: red" | x | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Estudo e implementação de técnica de classificação | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | style="color: red" | x | ||
+ | | style="color: red" | x | ||
+ | | style="text-align: center; color: red" | x | ||
+ | | style="text-align: center; color: red" | x | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Estudo e implementação de técnica de pré-processamento | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | style="color: red" | x | ||
+ | | style="text-align: center; color: red" | x | ||
+ | | style="color: red" | x | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Estudo e implementação de técnica de detecção | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | style="color: red" | x | ||
+ | | style="color: red" | x | ||
+ | | style="text-align: center; color: red" | x | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Estudo e implementação de técnica de segmentação | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | style="color: red" | x | ||
+ | | style="color: red" | x | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Validação do Sistema | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | style="color: red" | x | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Apresentação e Discussão dos Dados | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="text-align: center;" | | ||
+ | | | ||
+ | | | ||
+ | | style="color: red" |x | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Conclusão | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="color: red" | x | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | |- | ||
+ | | style="text-align: center;" | Escrita da Monografia | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="color: red" | x | ||
+ | | style="color: red" | x | ||
+ | | style="color: red" | x | ||
+ | | style="color: red" | x | ||
+ | |- | ||
+ | | style="text-align: center;" | Entrega do TCC | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | style="color: red" | x | ||
+ | |} | ||
− | + | === Estudo das Técnicas === | |
− | + | ==== Histograma de Gradientes Orientados (HOG)==== | |
− | + | =====Gradientes===== | |
− | + | :{{collapse top | Conteúdo }} | |
− | + | Na área da visão computacional, uma imagem digital é considerada como uma representação discreta dos dados presentes nessa imagem, formada pela relação entre o valor espacial (posição) dos dados e a informação de cor que esses dados possuem <ref name=solomon2011>SOLOMON, Chris; BRECKON, Toby. '''Fundamentals of Digital Image Processing: A practical approach with examples in Matlab'''. John Wiley & Sons, 2011.</ref><ref name=p1 group=nota>p.1</ref>, como descrito anteriormente no tópico 2.1 Processamento Digital de Imagens. | |
− | + | As informações de cor de uma imagem digital são definidas através de um ou mais canais de intensidade ou cor em uma particular posição da imagem. | |
− | + | Uma imagem digital contém um ou mais canais que são definidos através da | |
+ | A luz sem cor, chamada de luz monocromática, possui como um de seus mais importantes atributos a intensidade. Pelo fato de a intensidade ser percebida como variações de preto a tons de cinza até chegar ao branco, o termo ''níveis de cinza'' geralmente é utilizado para denotar a intensidade monocromática de uma imagem. Em termos de hardware, a intensidade quantificada resulta na resolução de intensidade, onde os níveis de intensidade são definidos por <math>2^k</math>, sendo k um número inteiro. O número mais comum é 8 bits, resultando em um escala de 256 níveis de intensidade<ref name="gonzalez"/>. | ||
− | A | + | Em uma imagem digital, a resolução de intensidade está bastante relacionada com a resolução espacial, em outras palavras, para cada pixel de uma imagem e definido um nível de intensidade e para este processo é dado o nome de quantização. O processo de quantização nada mais é do que converter dados de uma imagem em elementos discreto e permite que uma imagem possa ser processada computacionalmente. A intensidade ou os níveis de cinza, são comumente representados através de '''gradientes'''. Em um ponto <math>(x,y)</math> de uma imagem f, o gradiente é definido como um vetor: |
<center>[[Imagem: Gradiente_definição.png|200px]]</center> | <center>[[Imagem: Gradiente_definição.png|200px]]</center> | ||
− | Este vetor gradiente tem a importante propriedade geométrica de apontar no sentido de maior taxa de variação de <math>f</math> no ponho <math>(x,y)</math>. A magnitude <math>M(x,y)</math> do vetor <math>\nabla f</math> determina o valor da taxa de variação na direção do vetor gradiente e é | + | Este vetor gradiente tem a importante propriedade geométrica de apontar no sentido de maior taxa de variação de <math>f</math> no ponho <math>(x,y)</math>. A magnitude <math>M(x,y)</math> do vetor <math>\nabla f</math> determina o valor da taxa de variação na direção do vetor gradiente e é definida por: |
<center>[[Imagem: Gradiente_magnitude.png|200px]]</center> | <center>[[Imagem: Gradiente_magnitude.png|200px]]</center> | ||
− | Onde <math>g_x,g_y</math> e <math>M(x,y)</math> são imagens do mesmo tamanho que a imagem original, criadas quando <math>x</math> e <math>y</math> podem variar ao longo de todas as posições de pixels em <math>f</math>. | + | Onde <math>g_x,g_y</math> e <math>M(x,y)</math> são imagens do mesmo tamanho que a imagem original, criadas quando <math>x</math> e <math>y</math> podem variar ao longo de todas as posições de pixels em <math>f</math>. A direção do vetor gradiente, assim como as demais propriedades citadss, também é uma imagem de mesmo tamanho que a original criada pela divisão de <math>gy</math> pela imagem <math>g_x</math>. O ângulo do vetor é definido como: |
− | |||
− | A direção do vetor gradiente, assim como | ||
<center>[[Imagem: Gradiente_angulo.png|150px]]</center> | <center>[[Imagem: Gradiente_angulo.png|150px]]</center> | ||
− | + | Em nosso trabalho, os gradientes podem ser extraídos através dos histogramas das imagens, como serão descritos no próximo tópico. | |
{{collapse bottom}} | {{collapse bottom}} | ||
− | :{{collapse top | | + | ===== Histograma ===== |
+ | |||
+ | :{{collapse top | Conteúdo }} | ||
− | O histograma de uma imagem é um conjunto de números que indica o percentual de pixels que representam um determinado nível de cinza. Estes valores são normalmente representados por um gráfico de barras que fornece para cada nível de cinza o número de pixels correspondentes na imagem<ref name="oge">MARQUES, Ogé F.; VIEIRA Hugo.'''Processamento Digital de Imagens'''. Rio de Janeiro: Brasport. 1999</ref>. | + | O histograma é uma das formas mais comuns de se representar uma distribuição de intensidade de uma imagem, e possivelmente a mais útil no processamento digital de imagens. Um histograma de uma imagem nada mais é que um conjunto de números que indica o percentual de pixels que representam um determinado nível de cinza. Estes valores são normalmente representados por um gráfico de barras que fornece para cada nível de cinza o número de pixels correspondentes na imagem<ref name="oge">MARQUES, Ogé F.; VIEIRA Hugo.'''Processamento Digital de Imagens'''. Rio de Janeiro: Brasport. 1999</ref>. |
Um histograma de uma imagem digital com L possíveis níveis de intensidade dentro de uma faixa <math>[0,L-1]</math> é uma função discreta definida por: | Um histograma de uma imagem digital com L possíveis níveis de intensidade dentro de uma faixa <math>[0,L-1]</math> é uma função discreta definida por: | ||
Linha 707: | Linha 1 008: | ||
<center><math> = \frac{n_k}{n}</math></center> | <center><math> = \frac{n_k}{n}</math></center> | ||
− | Da estatística básica, considera-se <math>p_k</math> como um estimativa da probabilidade da ocorrência do nível de intensidade <math>r_k</math><ref name=" | + | Da estatística básica, considera-se <math>p_k</math> como um estimativa da probabilidade da ocorrência do nível de intensidade <math>r_k</math>, ou seja, um histograma nada mais é que uma função de distribuição de probabilidades de intensidades e como tal deve obedecer aos axiomas e teoremas da teoria da probabilidade<ref name="oge"/>. Para exemplificar, a figura 1 abaixo apresenta o histograma de uma imagem clara. |
+ | |||
+ | <center>[[Imagem: Histograma imagem2.png|500px]]</center> | ||
+ | <center>'''Figura 1 - Histograma de uma imagem'''</center> | ||
+ | <center>'''Fonte: ''' <ref name="oge"/></center> | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | =====Representação e Descritores de Imagem===== | ||
+ | |||
+ | :{{collapse top | Conteúdo }} | ||
+ | |||
+ | Após a segmentação da região de interesse na imagem, é necessário que esta região seja representada adequadamente para o futuro processamento computacional. Esta representação envolve utilizar características externas (bordas) e internas (pixels) da região e descrevê-la com base em fatores diretamente relacionados à representação escolhida<ref name="gonzalez">GONZALEZ, Rafael C.; WOODS, Richard C. '''Processamento digital de imagens, Tradução: Cristina Yamagami e Leonardo Piamonte'''. 3ª Edição. São Paulo: Pearson. 2010</ref>. No caso das bordas, por exemplo, pode-se calcular a distância entre duas bordas adjacentes para determinar o tamanho da região de interesse. | ||
+ | |||
+ | A decisão de qual representação utilizar está relacionada às características da região das quais serão utilizadas para o processamento computacional. Uma representação externa é escolhido quando o foco principal é o formato, enquanto que uma representação interna é escolhida quando o foco principal são cores e texturas<ref name="gonzalez"/>. | ||
+ | |||
+ | Os descritores são formas de converter características relacionadas às representações. Proporcionalmente, existem dois tipos de descritores: para características externas e características internas. Para as bordas de uma região de interesse, um descritor seria seu comprimento, do qual é aproximado pelos pixels ao longo da fronteira <ref name="gonzalez"/>. | ||
+ | |||
+ | '''Descritores Topológicos''' | ||
+ | |||
+ | Os descritores topológicos são descritores que representam adequadamente uma características de imagem e não são afetados por transformações na imagem. Por exemplo, se um descritor topológico é definido como o número de buracos na imagem, esta propriedade, obviamente, não será afetada por transformações de alongamento ou de rotação na imagem. | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | ===== Histrograma de Gradientes Orientados - HOG ===== | ||
+ | |||
+ | :{{collapse top | Conteúdo }} | ||
+ | |||
+ | A ideia inicial do conceito de Histograma de Gradientes Orientados(HOG) relaciona-se ao fato de que características como aparência e forma de objetos em uma imagem pode ser descritos através da distribuição de gradientes de intensidade dos pixels. Para descrever uma região através de um HOG são necessárias cinco etapas:'''(A) computação do gradiente de cada pixel, (B) divisão da imagem em células, (C) obtenção do histograma 1-D da célula, (D) normalização através de blocos e (E) obtenção do descritor'''. | ||
+ | |||
+ | '''Computação dos gradientes de cada pixels''': Existem várias formas de computar os gradientes de cada pixel em uma imagem, porém a forma mais utilizada é aplicando máscaras | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | ==== Máquina de Vetores de Suporte (SVM)==== | ||
+ | |||
+ | '''Máquina de Vetores de Suporte''' (do inglês, Support Vector Machinev - SVM) é um método de aprendizado de máquina supervisionado para reconhecimento binário de padrões baseado na '''teoria de aprendizado estatístico''' criada por (Vapnik, 1998) e colaboradores. As SVM's se tornaram famosas nas últimas décadas por possuírem performance comparável e muitas vezes superior às obtidas por outros algoritmos de aprendizado, como as Redes Neurais Artificiais (RNA's)<ref name=introSVM>LORENA, Ana Carolina; CARVALHO, André. '''Uma introdução às Support Vector machines'''. Revista de Informática Teórica e Aplicada, 2007, 14.2: 43-67.</ref><ref name=p1 group=nota>p.1</ref>. | ||
+ | |||
+ | Alguns dos motivos para isso estão fundamentados no bom desempenho desta técnica na generalização de bases de reais, nos recursos teóricos bastante consolidados, no processo de treinamento que elimina a possibilidade de mínimos locais e na existência de poucos parâmetros livres para ajustá-lo. Por isso, esta técnica vem sendo empregada em diversas áreas como categorização de texto, reconhecimento de escrita e voz, classificação de imagens, análise de biosequências, etc | ||
+ | <ref name=santos2002>SANTOS, Eulanda M.'''Teoria e aplicação de support vector machines à aprendizagem e reconhecimento de objetos baseado na aparência'''. 2002. Tese de Doutorado. Universidade Federal da Paraíba. Disponível em [http://docs.computacao.ufcg.edu.br/posgraduacao/dissertacoes/2002/Dissertacao_EulandaMirandadosSantos.pdf|L].Acessado em 9 de Setembro de 2017.</ref><ref name=p18 group=nota>p.18</ref>. | ||
+ | |||
+ | Para descrever esta técnicas é essencial detalhar conceitos como aprendizado de máquina, teoria do aprendizado estatístico, vetores, etc. O próximo tópico tratará do aprendizado de máquina com o objetivo introduzir a base do desenvolvimento das SVM's. | ||
+ | |||
+ | ===== Aprendizado de Máquina ===== | ||
+ | |||
+ | :{{collapse top | Conteúdo}} | ||
+ | |||
+ | Basicamente, o '''aprendizado de máquina''' busca extrair conhecimento através de dados. Também denominada como análise preditiva ou aprendizado estatístico, este campo de conhecimento converge de uma intersecção entre estatística, inteligência artificial e ciência da computação<ref name=muller17>MÜLLER, Andreas C.; GUIDO, Sarah. '''Introduction to machine learning with Python: a guide for data scientists'''. 2017.</ref><ref name=p1 group=nota>p.1</ref>. Por meio da concepção de técnicas que desenvolvem o aprendizado a partir de sistemas computacionais capazes de adquirir conhecimento de forma automática, o aprendizado de máquina proporciona o nascimento de diversas aplicações em diversas áreas, como no campo da visão, reconhecimento de voz, robótica, medicina, telecomunicações, etc <ref name=alpaydin14>ALPAYDIN, Ethem.'''Introduction to machine learning'''. MIT press, 2014 </ref><ref name=p3 group=nota>p.3</ref>. | ||
+ | |||
+ | Na sua essência, o aprendizado de máquina se baseia principalmente no conceito de indução, em outras palavras, a inferência lógica que permite obter conclusões genéricas sobre um conjunto particular de exemplos. É através da indução que o cérebro humano pode derivar conhecimento novo sobre situações anteriormente apresentadas. Para isso é necessário que se tenha um conjunto de exemplos de treinamento do qual deverá se entrada do algoritmo de aprendizado <ref name=Monard2003/><ref name=p39 group=nota>p.39</ref>. | ||
+ | |||
+ | Entretanto, muitas vezes as hipóteses levantadas através da indução não necessariamente podem preservar a verdade. Um conjunto de exemplos insuficientes ou exemplos que não foram bem escolhidos podem formar hipóteses inválidas, influenciando na eficácia do sistema. Neste contexto, compreender o poder e a limitação de cada algoritmo utilizando uma metodologia que permite avaliar os conceitos induzidos por esses algoritmos em determinadas situações, é a principal atividade a ser realizada antes do desenvolvimento do sistema em si<ref name=Monard2003>MONARD, Maria Carolina; BARANAUSKAS, José Augusto. ''''Conceitos sobre aprendizado de máquina'''. Sistemas Inteligentes-Fundamentos e Aplicações, v. 1, n. 1, 2003. Disponível em [http://dcm.ffclrp.usp.br/~augusto/publications/2003-sistemas-inteligentes-cap4.pdf]. Acessado em 31 de Agosto de 2017.</ref><ref name=p39 group=nota>p.39</ref>. | ||
+ | |||
+ | O aprendizado indutivo pode ser dividido em '''supervisionado''' e não '''supervisionado''' dependendo do modo em que é obtido o conhecimento. | ||
+ | |||
+ | '''Aprendizado Supervisionado''' | ||
+ | |||
+ | No Aprendizado Supervisionado é fornecido ao algoritmo um conjunto de exemplos de treinamento para os quais os atributos que descrevem alguma característica ou aspecto são conhecidos. Um exemplo nada mais é do que um tupla de atributos passado ao algoritmo com o objetivo de construir um ''bom'' classificador que possa determinar corretamente a classe dos novos exemplos que ainda não foram rotulados, ou seja, exemplos dos quais os atributos são desconhecidos <ref name=camastra2008>CAMASTRA, Francesco; VINCIARELLI, Alessandro. '''Machine learning for audio, image and video analysis'''. Advanced Information and Knowledge Processing, p. 83-89, 2008.</ref><ref name=p86 group=nota>p.86</ref>. | ||
+ | |||
+ | Após a concepção do '''classificador''', é possível avaliá-lo em relação ao seu grau de precisão, velocidade de aprendizado, compreensibilidade ou qualquer outro parâmetro que defina a qualidade deste classificador mediante a tarefa em questão <ref name=Monard2003/><ref name=p43 group=nota>p.43</ref>. Um dos principais fatores limitantes da qualidade de um classificador é a sua capacidade de trabalhar com dados imperfeitos, ou o denominado '''ruído'''. O ruído pode ser derivado do próprio processo que gerou os dados, do processo de aquisição, classes rotuladas incorretamente, etc <ref name=alpaydin14/><ref name=p25 group= nota>p.25</ref>. | ||
+ | |||
+ | No aprendizado supervisionado, podemos ainda categorizá-lo em '''classificação''' e '''regressão'''. A classificação tem como objetivo determinar a classe em que um exemplo de entrada pertence. Para isso, o modelo analisa os outros exemplos fornecidos anteriormente e que já possuem indicação de classe, a fim de ''aprender'' como classificar o novo registro. Já a regressão é utilizada quando um exemplo é identificado por um valor numérico e não um valor categórico. Assim, pode-se determinar o valor de uma determinada variável analisando-se os valores das demais<ref name=camilo>CAMILO, Cássio Oliveira; SILVA, João Carlos da. '''Mineração de dados: Conceitos, tarefas, métodos e ferramentas'''. Universidade Federal de Goiás (UFC), 2009, 1-29.Disponível em [http://www.inf.ufg.br/sites/default/files/uploads/relatorios-tecnicos/RT-INF_001-09.pdf]. Acessado em 24 de Agosto de 2017</ref><ref name=p9 group=nota>p.9</ref>. | ||
+ | |||
+ | '''Aprendizado Não-supervisionado''' | ||
+ | |||
+ | No aprendizado não-supervisionado, o indutor analisa os exemplos fornecidos e tenta determinar se alguns deles podem ser agrupados de alguma maneira, formando agrupamentos ou os denominados ''clusters''. Apos a determinação dos agrupamentos, normalmente, é necessária uma análise para determinar o que cada agrupamento significa no contexto do problema que está sendo analisado <ref name=alpaydin14/><ref name=p10 group=nota>p.10</ref>. | ||
+ | |||
+ | A figura abaixo apresenta a hierarquia completa do aprendizado de máquina: | ||
+ | |||
+ | <center>[[Imagem: Aprendizado_maquina.png|400px]]</center> | ||
+ | <center>'''Hierarquia de Aprendizado de Máquina'''</center> | ||
+ | <center>'''Fonte:'''<ref name=Monard2003/><ref name=p41 group=nota>p.41</ref></center> | ||
+ | |||
+ | '''Paradigma de Aprendizado''' | ||
+ | |||
+ | Existem diversos paradigmas de aprendizado que estabelecem a forma em que o conhecimento é adquirido por um sistema baseado em aprendizado de máquina. Entre os paradigmas estão o simbólico, o baseado em eventos, o conexionista, o genético e o estatístico <ref name=Monard2003/><ref name=p41 group=nota>p.41</ref>. No nosso contexto, vamos focar apenas no paradigma de aprendizado estatístico do qual foi a base para o desenvolvimento das SVM's. | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | :{{collapse top | | + | =====Teoria do Aprendizado Estatístico===== |
+ | |||
+ | :{{collapse top | Conteúdo}} | ||
+ | |||
+ | Um mesmo algoritmo de aprendizado, pode ser treinado utilizando diferentes parâmetros e diferentes conjuntos de treinamento, consequentemente, este mesmo algoritmo pode conceber diferentes classificadores para um mesmo cenário. O problema de selecionar o classificador dentro do conjunto de classificadores gerados pelo algoritmo é denominado ''seleção de modelo'' e a solução para este problema é a determinação de performance destes classificadores através da '''Teoria do Aprendizado Estatístico''' <ref name=camastra2008/><ref name=p149 group=nota>p.149</ref>. | ||
+ | |||
+ | Considere um conjunto treinamento <math>T</math> composto por duas classes representadas por círculos e triângulos, onde os elementos de cada classes são definidos através de tuplas de exemplos (<math>x_i,y_i</math>). Através do processo de aprendizagem um algoritmo fornece 3 classificadores <math>f_a</math>, <math>f_b</math> e <math>f_c</math> pertencentes ao conjunto <math>F</math> de todos o possíveis classificadores gerados por estes mesmo algoritmo. Este cenário é apresentado pela figura abaixo <ref name=alpaydin14/><ref name=p17 group=nota>p.17</ref>. | ||
+ | |||
+ | <center>[[Imagem: Classficadores_am.png|500px]]</center> | ||
+ | <center>'''Classificadores segundo três hipóteses'''</center> | ||
+ | <center>'''Fonte:'''<ref name=introSVM/><ref name=p46 group=nota>p.46</ref></center> | ||
− | + | O classificador <math>f_a</math> utilizada uma fronteira de decisão linear sobre o conjunto onde os pontos extremos das duas classes são muito próximos entre si, por isso são considerados não confiáveis <ref name=introSVM/><ref name=p46 group=nota>p.46</ref>. Neste caso, o classificador comete muitos erros, mesmo para casos muito simples. Pode-se considerar que houve um subajuste do classificador, uma vez que este não é capaz de se ajustar às instâncias de treinamento<ref name=santos2002/><ref name=p20 group=nota>p.20</ref>. | |
− | + | Em contra partida, o classificador <math>f_c</math> utiliza fronteiras de decisão complexas e difíceis de serem definidas matematicamente, possuindo a capacidade alta de determinar exemplos do conjunto de treinamento, mas com grandes possibilidades de cometer erros quando confrontado com novos exemplos. Pode-se considerar que houve um sobreajuste, onde considera-se que o classificador ''memorizou'' os dados do conjunto de treinamento <ref name=introSVM/><ref name=p47 group=nota>p.47</ref>. | |
+ | |||
+ | O classificador <math>f_c</math> seria considerado um intermediário entre as duas propostas anteriormente mencionadas. Nesta hipótese, o classificador utiliza uma fronteira não linear com baixa complexidade de definição e por isso consegue determinar com sucesso quase todas as classes do conjunto de treinamento<ref name=introSVM/><ref name=p47 group=nota>p.47</ref>. | ||
+ | |||
+ | Sendo assim, o problema da '''seleção de modelo''' é resolvido quando o melhor desempenho de generalização é atingindo através do equilibro entre a precisão alcançada em um conjunto de treinamento particular e capacidade do sistema de ''aprender'' qualquer conjunto de treinamento sem erro <ref name=santos2002/><ref name=p20 group=nota>p.20</ref>. Para isso, busca-se a aproximação entre uma determinada função alvo <math>f(x)</math> e a saída real do sistema. A entre as duas funções pode ser mensurada através da estimação do erro mínimo (também denominado risco mínimo), do qual mede a capacidade de generalização de <math>f</math> <ref name=haykin2001>HAYKIN, Simon. '''Redes neurais: princípios e prática'''. Bookman Editora, 2001.</ref><ref name=p115 group=nota>p.115</ref>. Assumindo-se que os exemplos apresentados pelo conjunto de treinamento são independentes e identicamente distribuídos de acordo com uma distribuição de probabilidade <math>P(x,y)</math>, o erro esperado é definido por: | ||
+ | |||
+ | <center><math> R(f) = \int c(f(x),y)dP(x,y)</math></center> | ||
+ | |||
+ | Onde, <math>c(f(x),y)</math> é uma função de custo relacionando a previsão <math>f(x)</math> quando a saída desejada é <math>y</math> <ref name=introSVM/><ref name=p47 group=nota>p.47</ref>. No caso de uma classificação binária, uma função comumente usada é a <math>c(f(x),y)=1/2|y-f(x)|</math>, que retorna o valor 0 se <math>x</math> é classificado corretamente e 1 caso contrário.</math>.Entretanto, a minimização do risco esperado não pode ser realizada diretamente com esta equação, uma vez que em geral a distribuição de probabilidade <math>P(x,y)</math> é desconhecida. No processo de aprendizagem, a única informação disponível está contida no conjunto de treinamento que também é amostrado de <math>P(x,y)</math> <ref name=haykin2001/><ref name=p116 group=nota>p.116</ref>. | ||
+ | |||
+ | Para contornar esta dificuldade matemática, é utilizado o princípio indutivo da minimização do risco empírico. O risco empírico, apresentado pela equação abaixo, mede o desempenho do classificador <math>f</math> nos dados de treinamento, por meio da taxa de classificações incorretas obtidas no conjunto de treinamento <math>T</math><ref name=introSVM/><ref name=p48 group=nota>p.48</ref>. | ||
+ | |||
+ | <center><math>R_emp(f) = 1/n \sum_{i=1}^{n} L(y,f(x,\alpha)))</math></center> | ||
+ | |||
+ | Nesta equação, Com <math>n \rightarrow \infty</math>, é possível estabelecer um critério de aceitação para qual a performance do classificador em questão é apropriada para o problema de classificação especifico, ou seja,é possível obter classificadores cujo valores de risco empírico convergem para o risco esperado <ref name=santos2002/><ref name=p23 group=nota>p.23</ref>. Entretanto, para conjunto de treinamento menores, geralmente não é possível determinar esse tipo de garantia. | ||
+ | |||
+ | Neste contexto, dentro de um conjunto amplo de classificadores <math>F</math> é sempre possível encontrar um classificador com risco empírico pequeno <ref name=introSVM/><ref name=p48 group=nota>p.48</ref>. Deve-se então restringir os classificadores através de limites dos risco esperado e com isso a '''Teoria do Aprendizado Estatístico''' fornece ferramentas para mensurar a capacidade de cada classificador. A ferramenta mais utilizada é a Dimensão VC, que é componente importante para o limite de generalização da SVM <ref name=santos2002/><ref name=p24 group=nota>p.24</ref>. | ||
+ | |||
+ | A dimensão VC (Vapnik-Chervonenkis) é uma medida de capacidade de classificação sobre a família de funções geradas por um algoritmo de aprendizado, em outra palavras, é o valor que representa o número de exemplos necessários para se aprender um classe de interesse de maneira confiável <ref name=haykin2001/><ref name=p119 group=nota>p.119</ref>. Quando maior for a dimensão VC, maior será o número de exemplos necessários para aprender a classe. | ||
+ | |||
+ | O '''erro de generalização''', diferentemente do erro de treinamento (risco empírico), é a taxa de erros de um determinado classificador aplicado à um conjunto de exemplos que ainda não foram vistos. Para calcular a capacidade de generalização, é necessário mensurar o limitante da respectiva taxa de erro através da soma dos dois elementos anteriormente mencionados: o risco empírico e a dimensão VC <ref name=santos2002/><ref name=p26 group=nota>p.26</ref>. | ||
+ | |||
+ | As máquinas de aprendizado que buscam minimizar o limitante superior são ditas seguir o princípio estatístico da '''minimização de risco estrutura'''. Entre estas máquinas está a '''Máquina de Vetores de Suporte''' (do inglês, Support Vector Machine - SVM) que objetivam aumentar a capacidade de generalização através da minimização do risco empírico e da dimensão VC <ref name=introSVM/><ref name=p52 group=nota>p.52</ref>. | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | :{{collapse top | | + | =====Support Vector Machine - SVM===== |
+ | |||
+ | :{{collapse top | Conteúdo }} | ||
+ | |||
+ | '''SVM Lineares''' | ||
+ | |||
+ | Na sua forma mais simples, o objetivo de uma SVM é a obtenção de fronteiras lineares para separação dos dados em duas classes (classificação binária). A '''classificação linear''' consegue apenas delimitar classes que pertencem à um conjunto linearmente separável, enquanto que a '''classificação não-linear''' consegue delimitar classes que pertencem à um conjunto não-linearmente separável <ref name=introSVM/><ref name=p52 group=nota>p.52</ref>. Sendo assim, são poucas as aplicações que podem utilizar a classificação linear, uma vez que aplicações reais necessitam de fronteiras de complexa definição aumentando consequentemente a complexidade do sistema classificador <ref name=santos2002/><ref name=p36 group=nota>p.36</ref>. Apesar de sua limitação, a classificação linear apresenta propriedades importantes para o embasamento inicial da SVM's. | ||
+ | |||
+ | No caso da minimização do risco estrutural, uma SVM Linear produz um valor zero para o primeiro termo e minimiza o segundo termo para definir os limites <ref name=haykin2001/><ref name=p349 group=nota>p.349</ref>. A figura abaixo apresenta apresenta em (a) um conjunto de treinamento linearmente separável em um espaço bidimensional, enquanto que (b) apresenta um conjunto não-linearmente separável. A linha apresentada em ambas as situações são denominada de superfície de decisão. No caso da (a), devido a linearidade da superfície de decisão, esta também é denominada de hiperplano <ref name=introSVM/><ref name=p52 group=nota>p.52</ref>. | ||
− | + | <center>[[Imagem:Classifacação.png|400px]]</center> | |
+ | <center>'''(a) Classificação Linear e (b) Classificação Não-Linear'''</center> | ||
+ | <center>'''Fonte:'''<ref name=santos2002/><ref name=p36 group=nota>p.36</ref></center> | ||
− | ''' | + | No contexto de aprendizado de máquina, um hiperplano é um espaço de separação n dimensional. Em um espaço bidimensional, um hiperplano é definido através de um reta, enquanto em um espaço tridimensional, um hiperplano é definido através de um plano <ref name=sloughter2001>SLOUGHTER, Dan. The calculus of functions of several variables. D. Sloughter, 2001.</ref><ref name=p11 group=nota>p.11</ref>. O algotirmo de um SVM tem como principal objetivo encontrar um '''hiperplano de margem máxima''', do qual separa corretamente todas as classes de um determinado conjunto e mantém a maior distância entre os vetores mais próximos à este hiperplano <ref name=santos2002/><ref name=p37 group=nota>p.37</ref>. O hiperplano que que detém destas características é denominado hiperplano ótimo e os vetores que mais se aproximam deste hiperplano são denominados de vetores de suporte <ref name=haykin2001/><ref name=p351 group=nota>p.351</ref>. |
+ | |||
+ | Para a definição de um hiperplano aplicado à classificação linear, utiliza-se a equação da reta no formato como é apresentado abaixo: | ||
+ | |||
+ | <center> | ||
+ | <math>f(x) = \mathbf{w} \cdot \mathbf{x} + b = 0</math> | ||
+ | </center> | ||
+ | |||
+ | Essa equação segmenta o conjunto de dados em duas regiões: <math> \mathbf{w} \cdot \mathbf{x} + b > 0</math> e <math> \mathbf{w} \cdot \mathbf{x} + b < 0</math>. Seja <math>x_1</math> um ponto no hiperplano de forma que <math> \mathbf{w} \cdot \mathbf{x} + b \ge 1</math> e <math>x_2</math> um ponto no hiperplano de forma que <math> \mathbf{w} \cdot \mathbf{x} + b \le -1</math>, conforme a figura abaixo, é possível estabelecer a distância <math>d</math> através dos vetores normais perpendiculares ao hiperplano direcionados aos respectivos pontos, conforme imagem abaixo. | ||
+ | |||
+ | <center>[[Imagem:Hiperplano.png|200px]]</center> | ||
+ | <center>'''Cálculo da Margem Máxima'''</center> | ||
+ | <center>'''Fonte:'''</center> | ||
+ | |||
+ | O comprimento do vetor projetado através da diferenças entre os vetores normais é dados por <math>\frac{2}{||\mathbf{w}||}</math>, onde é possível obter a maximização da margem entre o hiperplano e os vetores de suporte através da minimização de <math>||\mathbf{w}||</math>. | ||
+ | |||
+ | '''SVM's Lineares com Margens Suaves''' | ||
+ | |||
+ | Em aplicações reais, raramente o conjunto de dados é linearmente separável. Isso se deve a diversos fatores como presença de ruídos, '''outliers''' (exemplos fora da curva) ou à própria natureza do problema. Para tentar contornar esta dificuldade, a SVM's lineares são estendidas para lidar com conjuntos de treinamento mais gerais. Para realizar essa tarefa é necessário que alguns dados possam violar a restrição imposta anteriormente (<math> \mathbf{w} \cdot \mathbf{x} + b \ge 1</math> e <math> \mathbf{w} \cdot \mathbf{x} + b \le -1</math>). | ||
+ | |||
+ | Este procedimento suaviza as margens da fronteira de classificação, permitindo que alguns dados permaneçam dentro da margem máxima e também a ocorrência de alguns erros de classificação. O critério de quantas classificações podem ser realizadas de forma errônea é definido através do risco empírico. SVM's com estas características são denominas SVM lineares com margens suaves. | ||
+ | |||
+ | '''SVM's Não Lineares''' | ||
+ | |||
+ | Há casos de conjuntos de dados dos quais não são possíveis de serem separados através de um hiperplano. Exemplos disso são apresentados através da figura abaixo. | ||
+ | |||
+ | <center>[[Imagem:Svm_naolinear.PNG|400px]]</center> | ||
+ | <center>'''Dados não-separáveis por um hiperplano'''</center> | ||
+ | <center>'''Fonte:'''</center> | ||
+ | |||
+ | Para realizar a separação dos dados deste tipo de conjunto, a SVM mapea mapeia este conjunto de treinamento de seu espaço original para um novo espaço de maior dimensão, denotado de espaço de características. Este mapeamento permite que o conjunto seja separada através de uma SVM Linear. | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | ==== OpenCV ==== | ||
+ | |||
+ | '''OpenCV''' é um biblioteca implementada para aplicações no campo de '''Aprendizado de Máquina''' e '''Visão Computacional'''. Desenvolvida seguindo o modelo de software livre (BSD licensed), o OpenCV provê 25000 algoritmos otimizados, dos quais incluem um amplo conjunto de classes e algoritmos capazes de reconhecer faces, identificar objetos, classificar ações em um vídeo, localizar movimentos, etc. OpenCV é utilizada extensivamente por empresas e instituições de pesquisa como Google, Yahoo, Microsoft, Intel, IBM, dos quais também participaram do desenvolvimento desta biblioteca. | ||
+ | Uma das características essenciais é o suporte às linguagens '''C++, C, Python, Java e Matlab''', além de possuir combatibilidade com sistemas '''Windows, Linux, Android e Mac OS'''<ref name=opencv>OpenCV. Disponível em [http://opencv.org/about.html]. Acessado em 16 de Agosto de 2017</ref>. | ||
+ | |||
+ | ===== Instalação ===== | ||
+ | |||
+ | :{{collapse top | Conteúdo}} | ||
+ | |||
+ | Os passos seguintes para a instalação do OpenCV 3.0 foram realizados no sistemas operacional Ubunto 14.04 e utilizando a Python 3.4+. Todos os passos foram feitos baseados em<ref name=install>ROSEBROCK, Adrian. ''Install OpenCV 3.0 and Python 3.4+ on Ubuntu''. Pyimagesearch. 2015. Disponível em [http://www.pyimagesearch.com/2015/07/20/install-opencv-3-0-and-python-3-4-on-ubuntu/]. Acessado em 16 de Agosto de 2017. </ref> | ||
+ | |||
+ | '''Passo 1 - Instalação dos Pré-requisitos''' | ||
+ | |||
+ | Baixar informações e atualizar pacotes já instalados | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ sudo apt-get update | ||
+ | $ sudo apt-get upgrade | ||
+ | </pre> | ||
+ | |||
+ | Instalação de ferramentas de compilação do '''OpenCV 3.0''' | ||
+ | |||
+ | <pre style="color: blue">$ sudo apt-get install build-essential cmake git pkg-config</pre> | ||
+ | |||
+ | Instalação de bibliotecas e pacotes para leitura de imagens | ||
+ | |||
+ | <pre style="color: blue">$ sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev</pre> | ||
+ | |||
+ | Instalação de bibliotecas e pacotes para leitura de vídeos | ||
+ | |||
+ | <pre style="color: blue">$ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev</pre> | ||
+ | |||
+ | Instalação do GTK para uso das interfaces de usuário do '''OpenCV''' | ||
+ | |||
+ | <pre style="color: blue">$ sudo apt-get install libgtk2.0-dev </pre> | ||
+ | |||
+ | Instalação de pacotes utilizados para otimizar funções dentro do '''OpenCV''' | ||
+ | |||
+ | <pre style="color: blue">sudo apt-get install libatlas-base-dev gfortran</pre> | ||
+ | |||
+ | '''Passo 2 - Configurando Pyhton (Parte 1)''' | ||
+ | |||
+ | Instalação do '''pip''', um gerenciador de pacotes para o Python. Note que é necessário o ''python3'' instalado corretamente no sistema. Caso você não forneça o ''python3'', o ''pip'' será instalado para o Python 2.7, do qual não é a nossa intenção. | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ wget https://bootstrap.pypa.io/get-pip.py | ||
+ | $ sudo python3 get-pip.py | ||
+ | </pre> | ||
+ | |||
+ | Para o desenvolvimento em Python é uma boa prática trabalhar em um ambiente de desenvolvimento virtual. Para isso, utilizaremos os pacotes '''virtualenv''' e '''virtualenvwrapper''' que permitem criar um ambiente totalmente separado e independente. Utiize o pip3 para a instalação destes pacotes: | ||
+ | |||
+ | <pre style="color: blue">$ sudo pip3 install virtualenv virtualenvwrapper</pre> | ||
+ | |||
+ | Configurando os caminhos para nosso ambiente virtual. Dentro da pasta $HOME, edite o arquivo '''.bashrc''', adicionando as seguintes linhas: | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 | ||
+ | export WORKON_HOME=$HOME/.virtualenvs | ||
+ | </pre> | ||
+ | |||
+ | Atualizando o bashrc | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ source /usr/local/bin/virtualenvwrapper.sh | ||
+ | $ source ~/.bashrc | ||
+ | </pre> | ||
+ | |||
+ | Criação do ambiente virtual. '''Para os próximos passos é importante que se esteja nesse ambiente virtual'''. | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ mkvirtualenv cv | ||
+ | </pre> | ||
+ | |||
+ | '''Passo 2 - Configurando Pyhton (Parte 2)''' | ||
+ | |||
+ | Instalação dos cabeçalhos e arquivos de desenvolvimento para o Python 3.4+ | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ sudo apt-get install python3.4-dev | ||
+ | </pre> | ||
+ | |||
+ | O OpenCV representa as imagens através do NumPy. Instalação do NumPy no ambiente virtual ''cv''. | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ pip install numpy | ||
+ | </pre> | ||
+ | |||
+ | '''Passo 3 - Compilação e Instalação do OpenCV 3.0 ''' | ||
+ | |||
+ | Download dos arquivos | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ cd ~ | ||
+ | $ git clone https://github.com/Itseez/opencv.git | ||
+ | $ cd opencv | ||
+ | $ git checkout 3.0.0 | ||
+ | </pre> | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ cd ~ | ||
+ | $ git clone https://github.com/Itseez/opencv_contrib.git | ||
+ | $ cd opencv_contrib | ||
+ | $ git checkout 3.0.0 | ||
+ | </pre> | ||
+ | |||
+ | '''Obs: A versão dos arquivos 3.0.0 pode ser alterada para a última para as mais recentes [http://opencv.org/releases.html]. É importante que as versões do opencv e do opencvcontrib sejam as mesmas.''' | ||
+ | |||
+ | Compilação | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ cd ~/opencv | ||
+ | $ mkdir build | ||
+ | $ cd build | ||
+ | $ cmake -D CMAKE_BUILD_TYPE=RELEASE \ | ||
+ | -D CMAKE_INSTALL_PREFIX=/usr/local \ | ||
+ | -D INSTALL_C_EXAMPLES=ON \ | ||
+ | -D INSTALL_PYTHON_EXAMPLES=ON \ | ||
+ | -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ | ||
+ | -D BUILD_EXAMPLES=ON \ | ||
+ | -D INSTALL_C_EXAMPLES=OFF \ | ||
+ | -D BUILD_opencv_xfeatures2d=OFF .. | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ make -j4 | ||
+ | </pre> | ||
+ | |||
+ | '''Obs: onde 4 é o número de cores disponíveis em seu processador.''' | ||
+ | |||
+ | Instalação do '''OpenCV''' | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ sudo make install | ||
+ | $ sudo ldconfig | ||
+ | </pre> | ||
+ | |||
+ | '''Passo 4 - Links para OpenCV 3.0 ''' | ||
+ | |||
+ | Caso tenha alcançado esta etapa sem erros, o '''OpenCV 3.0''' deve estar instalado em '''/usr/local/lib/python3.4/site-packages/'''. Entretanto, para realizar o seu uso dentro de nosso ambiente virtual, é necessário criar um link para o OpenCV. Para isso execute: | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ cd ~/.virtualenvs/cv/lib/python3.4/site-packages/ | ||
+ | $ ln -s /usr/local/lib/python3.4/site-packages/cv2.cpython-34m.so cv2.so | ||
+ | </pre> | ||
+ | |||
+ | '''Passo 5 - Teste ''' | ||
+ | |||
+ | O '''OpenCV''' foi instalado com sucesso! Para confirmar se a instalação está funcionando realize os seguintes passos: | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | $ source /usr/local/bin/virtualenvwrapper.sh | ||
+ | $ workon cv | ||
+ | $ python | ||
+ | >>> import cv2 | ||
+ | >>> cv2.__version__ | ||
+ | </pre> | ||
+ | |||
+ | A resposta do último comando deve retornar a versão da biblioteca OpenCV que instalamos neste tutorial, conforme imagem abaixo: | ||
+ | |||
+ | {{collapse bottom}} | ||
+ | |||
+ | =====HOG===== | ||
+ | |||
+ | :{{collapse top | Conteúdo}} | ||
+ | |||
+ | Importando biblitecas. | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | import numpy as np | ||
+ | import cv2 | ||
+ | </pre> | ||
+ | |||
+ | Lendo imagem do disco | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | im = cv2.imread('40km64x128.jpeg') | ||
+ | im = np.float32(im) / 255.0 | ||
+ | cv2.imshow('image',im) | ||
+ | cv2.waitKey(0) | ||
+ | cv2.destroyAllWindows() | ||
+ | </pre> | ||
+ | |||
+ | Convertendo imagem para escala cinza | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | gray_image = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) | ||
+ | cv2.imshow('image',gray_image) | ||
+ | cv2.waitKey(0) | ||
+ | cv2.destroyAllWindows() | ||
+ | </pre> | ||
+ | |||
+ | Convertendo valores da imagem para inteiros de 8 bits (necessário no hog.compute) | ||
− | + | <pre style="color: blue"> | |
+ | gray_image = np.uint8(gray_image) | ||
+ | </pre> | ||
− | + | Configurações do descritor HOG | |
− | + | <pre style="color: blue"> | |
− | + | winSize = (64,128) # Size of the images in our dataset | |
− | + | blockSize = (4,8) # The size of blocks (Illumination variance) | |
− | + | blockStride = (5,5) # Determine the overlap between neighboring block | |
+ | cellSize = (4,8) # Size of the cells | ||
+ | nbins = 9 # Numbs of positions in the histogram | ||
+ | derivAperture = 1 # | ||
+ | winSigma = -1. # | ||
+ | histogramNormType = 0 # | ||
+ | L2HysThreshold = 0.2 # | ||
+ | gammaCorrection = 1 # | ||
+ | nlevels = 64 # | ||
+ | useSignedGradients = True # Signed (between 0 and 360) or unsigned (between 0 and 180) gradients | ||
+ | |||
+ | hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins,derivAperture,winSigma,histogramNormType,L2HysThreshold,gammaCorrection,nlevels, useSignedGradients) | ||
+ | </pre> | ||
− | + | Obtendo descritor HOG da imagem | |
− | + | <pre style="color: blue"> | |
+ | descriptor = hog.compute(gray_image) | ||
+ | </pre> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
+ | |||
+ | ===== SVM ===== | ||
+ | |||
+ | :{{collapse top | Conteúdo}} | ||
+ | |||
+ | Criação e configuração da SVM | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | |||
+ | svm = cv2.ml.SVM_create() | ||
+ | |||
+ | svm.setType(cv2.ml.SVM_C_SVC) | ||
+ | |||
+ | svm.setKernel(cv2.ml.SVM_RBF) # Set SVM Kernel to Radial Basis Function (RBF) | ||
+ | |||
+ | svm.setC(C) | ||
+ | |||
+ | svm.setGamma(gamma) | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | Treinamento da SVM | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | |||
+ | svm.train(trainData, cv2.ml.ROW_SAMPLE, trainLabels) | ||
+ | |||
+ | svm->save("digits_svm_model.yml"); | ||
+ | |||
+ | </pre> | ||
+ | |||
+ | Testes | ||
+ | |||
+ | <pre style="color: blue"> | ||
+ | |||
+ | testResponse = svm.predict(testData)[1].ravel() | ||
+ | |||
+ | </pre> | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | :{{collapse top | | + | ==== Matlab ==== |
+ | |||
+ | :{{collapse top | Conteúdo }} | ||
'''Objetivo''': extrair o histrograma de gradientes orientados de uma imagem e estudar o procedimento. | '''Objetivo''': extrair o histrograma de gradientes orientados de uma imagem e estudar o procedimento. | ||
Linha 774: | Linha 1 474: | ||
{{collapse bottom}} | {{collapse bottom}} | ||
− | + | {{notas}} | |
{{referências}} | {{referências}} |
Edição atual tal como às 20h21min de 21 de outubro de 2018
- Aluno: Mathias Silva da Rosa
- Orientador: Diego da Silva de Medeiros
Monografia
Monografia de TCC - Mathias Silva da Rosa - Engenharia de Telecomunicações
Revisão bibliográfica
Trabalhos Analisados | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Trabalhos Estrangeiros Romdhane - An improved traffic signs recognition and tracking method for driver assistance system - Usa segmentação via cor e HOG (Histogram of Oriented Gradients) Mammeri - Traffic Signs Localisation and Recognition Using A Client-Server Architecture - Usa um sistema centralizado, semelhante ao GPS
Gao - Traffic signs recognition based on PCA-SIFT - Traz um apanhado geral sobre vários tipos de técnicas. Usa pré-processamento, SIFT (Scale-Invariant Feature Transform e SVM(Support Vector Machine)
Wahyono - A comparative study of classification methods for traffic signs recognition - Compara diversos métodos: Redes Neurais artificiais (ANN), Vizinhos k-Próximos (kNN), SVM, Random Forest (RF) e HOG (Histogram of Oriented Gradients)
Jang - Data debiased traffic sign recognition using MSERs and CNN - Usa componentes de cor
Mariut - Detection and recognition of traffic signs using Gabor filters - Usa espaço de cores HSV (matiz, saturação e valor), classificação por correlação e reconhecimento via distância euclidiana e filtro de Gabor
Chen - A Robust Traffic Sign Recognition System for Intelligent Vehicles - Classificação via Filtro Vetorial Simples, Transformada Hough e Curve Fitting, e classificação via Momentos Pseudo-Zernike
Trabalhos Brasileiros
|
Trabalhos a serem analisados | ||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Trabalhos Estrangeiros Romdhane - Combined 2d/3d traffic signs recognition and distance estimation - Usa uma estrutura parecida, porém acrescenta o SVM
Feng - Ground traffic signs recognition based on Zernike moments and SVM - Usa os Momentos de Zernike e SVM
Elotmani - A light traffic signs recognition system - Usa detecção de cores e Projeção de Perfil
Wang - Traffic-signs recognition system based on multi-features - Usa um método de segmentação FCM (Fuzzy c-Means) e classificação CBIR (Content-Based Image Retrieval)
Lin - A Traffic Sign Recognition Method Based on Deep Visual Feature - Filtro Bilateral, Detector de Bordas Canny, Rede Neural Convolucional(CNN) e Máquina de Vetores de Suporte (SVM)
Greenhalgh - Real-Time Detection and Recognition of Road Traffic Signs - Maximally Stable Extremal Regions (MSER), Histograma de Gradientes Orientados (HOG) e Cascata de SVMs.
Trabalhos brasileiros Poffo - Visual Autonomy - Protótipo para reconhecimento de placas de trânsito
Silva - Uma Metodologia para Detectar e Reconhecer Placas de Sinalização de Trânsito
|
Análise dos Trabalhos
Trabalho | Ano | Extração da Região de Interesse | Descrição | Reconhecimento |
---|---|---|---|---|
Gao | 2014 | N/A | Scale-Invariant Feature Transform (SIFT)+ Análise dos Componentes Principais (PCA) | Máquina de Vetores de Suporte(SVM) |
Wahyono | 2014 | Segmentação das Cores (Binarização de Matiz e Saturação) + Classificação da Forma(Centroid-Based Graph) | Histograma de Gradientes Orientados(HOG) |
Rede Neural Artificial(ANN) K-Vizinhos mais Próximos Máquina de Vetores de Suporte(SVM) Random Forest(RF) |
Jang | 2016 | Normalização das Cores Vermelhas e Azul + Maximally stable extremal regions (MSER) | Bayesian com vetor Distance to Border(DtB) | Rede Neural Convolucional |
Mariut | 2011 | Plano HSV + Binarização de Matiz e Saturação + Size Filter | Correlação com Banco de Imagens | Banco de Filtros de Gabor + Banco de Imagens |
Chen | 2011 | Filtro Simples de Vetores(Segmentação de Cores) |
Transformada de Hough Interpolação Bicúbica Pseudo-Momentos de Zernike | Máquina de Vetores de Suporte(SVM) |
Lin | 2016 | Filtro Bilateral + Detector de Bordas Canny | Rede Neural Convolucional(CNN) | Máquina de Vetores de Suporte(SVM) |
Greenhalgh | 2012 | Maximally Stable Extremal Regions (MSER) | Histograma de Gradientes Orientados (HOG) | Cascata de SVMs |
Legenda:
Complexidade Baixa
Complexidade Média
Complexidade Alta
Proposta
Pré-processamento | Segmentação | Descrição | Classificação |
---|---|---|---|
Limiarização através do HSV + Remoção de áreas (Quant. de pixels e centros de massa) + Dilatação e Erosão | Transformada Hough Generarizada | Histrograma de Gradientes Orientados(HOG) | Máquina de Vetores de Suporte(SVM) |
Cronograma
Atividades | 2017 | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Ago | Set | Out | Nov | Dez | ||||||||||||||||
Estudo e implementação de técnica de descrição | - | - | - | x | x | x | x | |||||||||||||
Estudo e implementação de técnica de classificação | x | x | x | x | ||||||||||||||||
Estudo e implementação de técnica de pré-processamento | x | x | x | |||||||||||||||||
Estudo e implementação de técnica de detecção | x | x | x | |||||||||||||||||
Estudo e implementação de técnica de segmentação | x | x | ||||||||||||||||||
Validação do Sistema | x | |||||||||||||||||||
Apresentação e Discussão dos Dados | x | |||||||||||||||||||
Conclusão | x | |||||||||||||||||||
Escrita da Monografia | x | x | x | x | ||||||||||||||||
Entrega do TCC | x |
Estudo das Técnicas
Histograma de Gradientes Orientados (HOG)
Gradientes
Conteúdo |
---|
Na área da visão computacional, uma imagem digital é considerada como uma representação discreta dos dados presentes nessa imagem, formada pela relação entre o valor espacial (posição) dos dados e a informação de cor que esses dados possuem [4][nota 1], como descrito anteriormente no tópico 2.1 Processamento Digital de Imagens. As informações de cor de uma imagem digital são definidas através de um ou mais canais de intensidade ou cor em uma particular posição da imagem. Uma imagem digital contém um ou mais canais que são definidos através da A luz sem cor, chamada de luz monocromática, possui como um de seus mais importantes atributos a intensidade. Pelo fato de a intensidade ser percebida como variações de preto a tons de cinza até chegar ao branco, o termo níveis de cinza geralmente é utilizado para denotar a intensidade monocromática de uma imagem. Em termos de hardware, a intensidade quantificada resulta na resolução de intensidade, onde os níveis de intensidade são definidos por , sendo k um número inteiro. O número mais comum é 8 bits, resultando em um escala de 256 níveis de intensidade[5]. Em uma imagem digital, a resolução de intensidade está bastante relacionada com a resolução espacial, em outras palavras, para cada pixel de uma imagem e definido um nível de intensidade e para este processo é dado o nome de quantização. O processo de quantização nada mais é do que converter dados de uma imagem em elementos discreto e permite que uma imagem possa ser processada computacionalmente. A intensidade ou os níveis de cinza, são comumente representados através de gradientes. Em um ponto de uma imagem f, o gradiente é definido como um vetor: ![]() Este vetor gradiente tem a importante propriedade geométrica de apontar no sentido de maior taxa de variação de no ponho . A magnitude do vetor determina o valor da taxa de variação na direção do vetor gradiente e é definida por: ![]() Onde e são imagens do mesmo tamanho que a imagem original, criadas quando e podem variar ao longo de todas as posições de pixels em . A direção do vetor gradiente, assim como as demais propriedades citadss, também é uma imagem de mesmo tamanho que a original criada pela divisão de pela imagem . O ângulo do vetor é definido como: ![]() Em nosso trabalho, os gradientes podem ser extraídos através dos histogramas das imagens, como serão descritos no próximo tópico. |
Histograma
Conteúdo |
---|
O histograma é uma das formas mais comuns de se representar uma distribuição de intensidade de uma imagem, e possivelmente a mais útil no processamento digital de imagens. Um histograma de uma imagem nada mais é que um conjunto de números que indica o percentual de pixels que representam um determinado nível de cinza. Estes valores são normalmente representados por um gráfico de barras que fornece para cada nível de cinza o número de pixels correspondentes na imagem[6]. Um histograma de uma imagem digital com L possíveis níveis de intensidade dentro de uma faixa é uma função discreta definida por: Onde é k-nésimo pixel na imagem, do qual possui intensidade [7]. Geralmente, utiliza-se um histograma normalizado, obtido simplesmente dividindo todos os elementos de pelo número total de pixels na imagem, denotado por: Da estatística básica, considera-se como um estimativa da probabilidade da ocorrência do nível de intensidade , ou seja, um histograma nada mais é que uma função de distribuição de probabilidades de intensidades e como tal deve obedecer aos axiomas e teoremas da teoria da probabilidade[6]. Para exemplificar, a figura 1 abaixo apresenta o histograma de uma imagem clara. ![]() |
Representação e Descritores de Imagem
Conteúdo |
---|
Após a segmentação da região de interesse na imagem, é necessário que esta região seja representada adequadamente para o futuro processamento computacional. Esta representação envolve utilizar características externas (bordas) e internas (pixels) da região e descrevê-la com base em fatores diretamente relacionados à representação escolhida[5]. No caso das bordas, por exemplo, pode-se calcular a distância entre duas bordas adjacentes para determinar o tamanho da região de interesse. A decisão de qual representação utilizar está relacionada às características da região das quais serão utilizadas para o processamento computacional. Uma representação externa é escolhido quando o foco principal é o formato, enquanto que uma representação interna é escolhida quando o foco principal são cores e texturas[5]. Os descritores são formas de converter características relacionadas às representações. Proporcionalmente, existem dois tipos de descritores: para características externas e características internas. Para as bordas de uma região de interesse, um descritor seria seu comprimento, do qual é aproximado pelos pixels ao longo da fronteira [5]. Descritores Topológicos Os descritores topológicos são descritores que representam adequadamente uma características de imagem e não são afetados por transformações na imagem. Por exemplo, se um descritor topológico é definido como o número de buracos na imagem, esta propriedade, obviamente, não será afetada por transformações de alongamento ou de rotação na imagem. |
Histrograma de Gradientes Orientados - HOG
Conteúdo |
---|
A ideia inicial do conceito de Histograma de Gradientes Orientados(HOG) relaciona-se ao fato de que características como aparência e forma de objetos em uma imagem pode ser descritos através da distribuição de gradientes de intensidade dos pixels. Para descrever uma região através de um HOG são necessárias cinco etapas:(A) computação do gradiente de cada pixel, (B) divisão da imagem em células, (C) obtenção do histograma 1-D da célula, (D) normalização através de blocos e (E) obtenção do descritor. Computação dos gradientes de cada pixels: Existem várias formas de computar os gradientes de cada pixel em uma imagem, porém a forma mais utilizada é aplicando máscaras |
Máquina de Vetores de Suporte (SVM)
Máquina de Vetores de Suporte (do inglês, Support Vector Machinev - SVM) é um método de aprendizado de máquina supervisionado para reconhecimento binário de padrões baseado na teoria de aprendizado estatístico criada por (Vapnik, 1998) e colaboradores. As SVM's se tornaram famosas nas últimas décadas por possuírem performance comparável e muitas vezes superior às obtidas por outros algoritmos de aprendizado, como as Redes Neurais Artificiais (RNA's)[8][nota 1].
Alguns dos motivos para isso estão fundamentados no bom desempenho desta técnica na generalização de bases de reais, nos recursos teóricos bastante consolidados, no processo de treinamento que elimina a possibilidade de mínimos locais e na existência de poucos parâmetros livres para ajustá-lo. Por isso, esta técnica vem sendo empregada em diversas áreas como categorização de texto, reconhecimento de escrita e voz, classificação de imagens, análise de biosequências, etc [9][nota 2].
Para descrever esta técnicas é essencial detalhar conceitos como aprendizado de máquina, teoria do aprendizado estatístico, vetores, etc. O próximo tópico tratará do aprendizado de máquina com o objetivo introduzir a base do desenvolvimento das SVM's.
Aprendizado de Máquina
Conteúdo |
---|
Basicamente, o aprendizado de máquina busca extrair conhecimento através de dados. Também denominada como análise preditiva ou aprendizado estatístico, este campo de conhecimento converge de uma intersecção entre estatística, inteligência artificial e ciência da computação[10][nota 1]. Por meio da concepção de técnicas que desenvolvem o aprendizado a partir de sistemas computacionais capazes de adquirir conhecimento de forma automática, o aprendizado de máquina proporciona o nascimento de diversas aplicações em diversas áreas, como no campo da visão, reconhecimento de voz, robótica, medicina, telecomunicações, etc [11][nota 3]. Na sua essência, o aprendizado de máquina se baseia principalmente no conceito de indução, em outras palavras, a inferência lógica que permite obter conclusões genéricas sobre um conjunto particular de exemplos. É através da indução que o cérebro humano pode derivar conhecimento novo sobre situações anteriormente apresentadas. Para isso é necessário que se tenha um conjunto de exemplos de treinamento do qual deverá se entrada do algoritmo de aprendizado [12][nota 4]. Entretanto, muitas vezes as hipóteses levantadas através da indução não necessariamente podem preservar a verdade. Um conjunto de exemplos insuficientes ou exemplos que não foram bem escolhidos podem formar hipóteses inválidas, influenciando na eficácia do sistema. Neste contexto, compreender o poder e a limitação de cada algoritmo utilizando uma metodologia que permite avaliar os conceitos induzidos por esses algoritmos em determinadas situações, é a principal atividade a ser realizada antes do desenvolvimento do sistema em si[12][nota 4]. O aprendizado indutivo pode ser dividido em supervisionado e não supervisionado dependendo do modo em que é obtido o conhecimento. Aprendizado Supervisionado No Aprendizado Supervisionado é fornecido ao algoritmo um conjunto de exemplos de treinamento para os quais os atributos que descrevem alguma característica ou aspecto são conhecidos. Um exemplo nada mais é do que um tupla de atributos passado ao algoritmo com o objetivo de construir um bom classificador que possa determinar corretamente a classe dos novos exemplos que ainda não foram rotulados, ou seja, exemplos dos quais os atributos são desconhecidos [13][nota 5]. Após a concepção do classificador, é possível avaliá-lo em relação ao seu grau de precisão, velocidade de aprendizado, compreensibilidade ou qualquer outro parâmetro que defina a qualidade deste classificador mediante a tarefa em questão [12][nota 6]. Um dos principais fatores limitantes da qualidade de um classificador é a sua capacidade de trabalhar com dados imperfeitos, ou o denominado ruído. O ruído pode ser derivado do próprio processo que gerou os dados, do processo de aquisição, classes rotuladas incorretamente, etc [11][nota 7]. No aprendizado supervisionado, podemos ainda categorizá-lo em classificação e regressão. A classificação tem como objetivo determinar a classe em que um exemplo de entrada pertence. Para isso, o modelo analisa os outros exemplos fornecidos anteriormente e que já possuem indicação de classe, a fim de aprender como classificar o novo registro. Já a regressão é utilizada quando um exemplo é identificado por um valor numérico e não um valor categórico. Assim, pode-se determinar o valor de uma determinada variável analisando-se os valores das demais[14][nota 8]. Aprendizado Não-supervisionado No aprendizado não-supervisionado, o indutor analisa os exemplos fornecidos e tenta determinar se alguns deles podem ser agrupados de alguma maneira, formando agrupamentos ou os denominados clusters. Apos a determinação dos agrupamentos, normalmente, é necessária uma análise para determinar o que cada agrupamento significa no contexto do problema que está sendo analisado [11][nota 9]. A figura abaixo apresenta a hierarquia completa do aprendizado de máquina: ![]() Paradigma de Aprendizado Existem diversos paradigmas de aprendizado que estabelecem a forma em que o conhecimento é adquirido por um sistema baseado em aprendizado de máquina. Entre os paradigmas estão o simbólico, o baseado em eventos, o conexionista, o genético e o estatístico [12][nota 10]. No nosso contexto, vamos focar apenas no paradigma de aprendizado estatístico do qual foi a base para o desenvolvimento das SVM's. |
Teoria do Aprendizado Estatístico
Conteúdo |
---|
Um mesmo algoritmo de aprendizado, pode ser treinado utilizando diferentes parâmetros e diferentes conjuntos de treinamento, consequentemente, este mesmo algoritmo pode conceber diferentes classificadores para um mesmo cenário. O problema de selecionar o classificador dentro do conjunto de classificadores gerados pelo algoritmo é denominado seleção de modelo e a solução para este problema é a determinação de performance destes classificadores através da Teoria do Aprendizado Estatístico [13][nota 11]. Considere um conjunto treinamento composto por duas classes representadas por círculos e triângulos, onde os elementos de cada classes são definidos através de tuplas de exemplos (). Através do processo de aprendizagem um algoritmo fornece 3 classificadores , e pertencentes ao conjunto de todos o possíveis classificadores gerados por estes mesmo algoritmo. Este cenário é apresentado pela figura abaixo [11][nota 12]. ![]() O classificador utilizada uma fronteira de decisão linear sobre o conjunto onde os pontos extremos das duas classes são muito próximos entre si, por isso são considerados não confiáveis [8][nota 13]. Neste caso, o classificador comete muitos erros, mesmo para casos muito simples. Pode-se considerar que houve um subajuste do classificador, uma vez que este não é capaz de se ajustar às instâncias de treinamento[9][nota 14]. Em contra partida, o classificador utiliza fronteiras de decisão complexas e difíceis de serem definidas matematicamente, possuindo a capacidade alta de determinar exemplos do conjunto de treinamento, mas com grandes possibilidades de cometer erros quando confrontado com novos exemplos. Pode-se considerar que houve um sobreajuste, onde considera-se que o classificador memorizou os dados do conjunto de treinamento [8][nota 15]. O classificador seria considerado um intermediário entre as duas propostas anteriormente mencionadas. Nesta hipótese, o classificador utiliza uma fronteira não linear com baixa complexidade de definição e por isso consegue determinar com sucesso quase todas as classes do conjunto de treinamento[8][nota 15]. Sendo assim, o problema da seleção de modelo é resolvido quando o melhor desempenho de generalização é atingindo através do equilibro entre a precisão alcançada em um conjunto de treinamento particular e capacidade do sistema de aprender qualquer conjunto de treinamento sem erro [9][nota 14]. Para isso, busca-se a aproximação entre uma determinada função alvo e a saída real do sistema. A entre as duas funções pode ser mensurada através da estimação do erro mínimo (também denominado risco mínimo), do qual mede a capacidade de generalização de [15][nota 16]. Assumindo-se que os exemplos apresentados pelo conjunto de treinamento são independentes e identicamente distribuídos de acordo com uma distribuição de probabilidade , o erro esperado é definido por: Onde, é uma função de custo relacionando a previsão quando a saída desejada é [8][nota 15]. No caso de uma classificação binária, uma função comumente usada é a , que retorna o valor 0 se é classificado corretamente e 1 caso contrário.</math>.Entretanto, a minimização do risco esperado não pode ser realizada diretamente com esta equação, uma vez que em geral a distribuição de probabilidade é desconhecida. No processo de aprendizagem, a única informação disponível está contida no conjunto de treinamento que também é amostrado de [15][nota 17]. Para contornar esta dificuldade matemática, é utilizado o princípio indutivo da minimização do risco empírico. O risco empírico, apresentado pela equação abaixo, mede o desempenho do classificador nos dados de treinamento, por meio da taxa de classificações incorretas obtidas no conjunto de treinamento [8][nota 18]. Nesta equação, Com , é possível estabelecer um critério de aceitação para qual a performance do classificador em questão é apropriada para o problema de classificação especifico, ou seja,é possível obter classificadores cujo valores de risco empírico convergem para o risco esperado [9][nota 19]. Entretanto, para conjunto de treinamento menores, geralmente não é possível determinar esse tipo de garantia. Neste contexto, dentro de um conjunto amplo de classificadores é sempre possível encontrar um classificador com risco empírico pequeno [8][nota 18]. Deve-se então restringir os classificadores através de limites dos risco esperado e com isso a Teoria do Aprendizado Estatístico fornece ferramentas para mensurar a capacidade de cada classificador. A ferramenta mais utilizada é a Dimensão VC, que é componente importante para o limite de generalização da SVM [9][nota 20]. A dimensão VC (Vapnik-Chervonenkis) é uma medida de capacidade de classificação sobre a família de funções geradas por um algoritmo de aprendizado, em outra palavras, é o valor que representa o número de exemplos necessários para se aprender um classe de interesse de maneira confiável [15][nota 21]. Quando maior for a dimensão VC, maior será o número de exemplos necessários para aprender a classe. O erro de generalização, diferentemente do erro de treinamento (risco empírico), é a taxa de erros de um determinado classificador aplicado à um conjunto de exemplos que ainda não foram vistos. Para calcular a capacidade de generalização, é necessário mensurar o limitante da respectiva taxa de erro através da soma dos dois elementos anteriormente mencionados: o risco empírico e a dimensão VC [9][nota 22]. As máquinas de aprendizado que buscam minimizar o limitante superior são ditas seguir o princípio estatístico da minimização de risco estrutura. Entre estas máquinas está a Máquina de Vetores de Suporte (do inglês, Support Vector Machine - SVM) que objetivam aumentar a capacidade de generalização através da minimização do risco empírico e da dimensão VC [8][nota 23]. |
Support Vector Machine - SVM
Conteúdo |
---|
SVM Lineares Na sua forma mais simples, o objetivo de uma SVM é a obtenção de fronteiras lineares para separação dos dados em duas classes (classificação binária). A classificação linear consegue apenas delimitar classes que pertencem à um conjunto linearmente separável, enquanto que a classificação não-linear consegue delimitar classes que pertencem à um conjunto não-linearmente separável [8][nota 23]. Sendo assim, são poucas as aplicações que podem utilizar a classificação linear, uma vez que aplicações reais necessitam de fronteiras de complexa definição aumentando consequentemente a complexidade do sistema classificador [9][nota 24]. Apesar de sua limitação, a classificação linear apresenta propriedades importantes para o embasamento inicial da SVM's. No caso da minimização do risco estrutural, uma SVM Linear produz um valor zero para o primeiro termo e minimiza o segundo termo para definir os limites [15][nota 25]. A figura abaixo apresenta apresenta em (a) um conjunto de treinamento linearmente separável em um espaço bidimensional, enquanto que (b) apresenta um conjunto não-linearmente separável. A linha apresentada em ambas as situações são denominada de superfície de decisão. No caso da (a), devido a linearidade da superfície de decisão, esta também é denominada de hiperplano [8][nota 23]. ![]() No contexto de aprendizado de máquina, um hiperplano é um espaço de separação n dimensional. Em um espaço bidimensional, um hiperplano é definido através de um reta, enquanto em um espaço tridimensional, um hiperplano é definido através de um plano [16][nota 26]. O algotirmo de um SVM tem como principal objetivo encontrar um hiperplano de margem máxima, do qual separa corretamente todas as classes de um determinado conjunto e mantém a maior distância entre os vetores mais próximos à este hiperplano [9][nota 27]. O hiperplano que que detém destas características é denominado hiperplano ótimo e os vetores que mais se aproximam deste hiperplano são denominados de vetores de suporte [15][nota 28]. Para a definição de um hiperplano aplicado à classificação linear, utiliza-se a equação da reta no formato como é apresentado abaixo:
Essa equação segmenta o conjunto de dados em duas regiões: e . Seja um ponto no hiperplano de forma que e um ponto no hiperplano de forma que , conforme a figura abaixo, é possível estabelecer a distância através dos vetores normais perpendiculares ao hiperplano direcionados aos respectivos pontos, conforme imagem abaixo. ![]() O comprimento do vetor projetado através da diferenças entre os vetores normais é dados por , onde é possível obter a maximização da margem entre o hiperplano e os vetores de suporte através da minimização de . SVM's Lineares com Margens Suaves Em aplicações reais, raramente o conjunto de dados é linearmente separável. Isso se deve a diversos fatores como presença de ruídos, outliers (exemplos fora da curva) ou à própria natureza do problema. Para tentar contornar esta dificuldade, a SVM's lineares são estendidas para lidar com conjuntos de treinamento mais gerais. Para realizar essa tarefa é necessário que alguns dados possam violar a restrição imposta anteriormente ( e ). Este procedimento suaviza as margens da fronteira de classificação, permitindo que alguns dados permaneçam dentro da margem máxima e também a ocorrência de alguns erros de classificação. O critério de quantas classificações podem ser realizadas de forma errônea é definido através do risco empírico. SVM's com estas características são denominas SVM lineares com margens suaves. SVM's Não Lineares Há casos de conjuntos de dados dos quais não são possíveis de serem separados através de um hiperplano. Exemplos disso são apresentados através da figura abaixo. Para realizar a separação dos dados deste tipo de conjunto, a SVM mapea mapeia este conjunto de treinamento de seu espaço original para um novo espaço de maior dimensão, denotado de espaço de características. Este mapeamento permite que o conjunto seja separada através de uma SVM Linear. |
OpenCV
OpenCV é um biblioteca implementada para aplicações no campo de Aprendizado de Máquina e Visão Computacional. Desenvolvida seguindo o modelo de software livre (BSD licensed), o OpenCV provê 25000 algoritmos otimizados, dos quais incluem um amplo conjunto de classes e algoritmos capazes de reconhecer faces, identificar objetos, classificar ações em um vídeo, localizar movimentos, etc. OpenCV é utilizada extensivamente por empresas e instituições de pesquisa como Google, Yahoo, Microsoft, Intel, IBM, dos quais também participaram do desenvolvimento desta biblioteca. Uma das características essenciais é o suporte às linguagens C++, C, Python, Java e Matlab, além de possuir combatibilidade com sistemas Windows, Linux, Android e Mac OS[17].
Instalação
Conteúdo |
---|
Os passos seguintes para a instalação do OpenCV 3.0 foram realizados no sistemas operacional Ubunto 14.04 e utilizando a Python 3.4+. Todos os passos foram feitos baseados em[18] Passo 1 - Instalação dos Pré-requisitos Baixar informações e atualizar pacotes já instalados $ sudo apt-get update $ sudo apt-get upgrade Instalação de ferramentas de compilação do OpenCV 3.0 $ sudo apt-get install build-essential cmake git pkg-config Instalação de bibliotecas e pacotes para leitura de imagens $ sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev Instalação de bibliotecas e pacotes para leitura de vídeos $ sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev Instalação do GTK para uso das interfaces de usuário do OpenCV $ sudo apt-get install libgtk2.0-dev Instalação de pacotes utilizados para otimizar funções dentro do OpenCV sudo apt-get install libatlas-base-dev gfortran Passo 2 - Configurando Pyhton (Parte 1) Instalação do pip, um gerenciador de pacotes para o Python. Note que é necessário o python3 instalado corretamente no sistema. Caso você não forneça o python3, o pip será instalado para o Python 2.7, do qual não é a nossa intenção. $ wget https://bootstrap.pypa.io/get-pip.py $ sudo python3 get-pip.py Para o desenvolvimento em Python é uma boa prática trabalhar em um ambiente de desenvolvimento virtual. Para isso, utilizaremos os pacotes virtualenv e virtualenvwrapper que permitem criar um ambiente totalmente separado e independente. Utiize o pip3 para a instalação destes pacotes: $ sudo pip3 install virtualenv virtualenvwrapper Configurando os caminhos para nosso ambiente virtual. Dentro da pasta $HOME, edite o arquivo .bashrc, adicionando as seguintes linhas: export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 export WORKON_HOME=$HOME/.virtualenvs Atualizando o bashrc $ source /usr/local/bin/virtualenvwrapper.sh $ source ~/.bashrc Criação do ambiente virtual. Para os próximos passos é importante que se esteja nesse ambiente virtual. $ mkvirtualenv cv Passo 2 - Configurando Pyhton (Parte 2) Instalação dos cabeçalhos e arquivos de desenvolvimento para o Python 3.4+ $ sudo apt-get install python3.4-dev O OpenCV representa as imagens através do NumPy. Instalação do NumPy no ambiente virtual cv. $ pip install numpy Passo 3 - Compilação e Instalação do OpenCV 3.0 Download dos arquivos $ cd ~ $ git clone https://github.com/Itseez/opencv.git $ cd opencv $ git checkout 3.0.0 $ cd ~ $ git clone https://github.com/Itseez/opencv_contrib.git $ cd opencv_contrib $ git checkout 3.0.0 Obs: A versão dos arquivos 3.0.0 pode ser alterada para a última para as mais recentes [14]. É importante que as versões do opencv e do opencvcontrib sejam as mesmas. Compilação $ cd ~/opencv $ mkdir build $ cd build $ cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules \ -D BUILD_EXAMPLES=ON \ -D INSTALL_C_EXAMPLES=OFF \ -D BUILD_opencv_xfeatures2d=OFF .. $ make -j4 Obs: onde 4 é o número de cores disponíveis em seu processador. Instalação do OpenCV $ sudo make install $ sudo ldconfig Passo 4 - Links para OpenCV 3.0 Caso tenha alcançado esta etapa sem erros, o OpenCV 3.0 deve estar instalado em /usr/local/lib/python3.4/site-packages/. Entretanto, para realizar o seu uso dentro de nosso ambiente virtual, é necessário criar um link para o OpenCV. Para isso execute: $ cd ~/.virtualenvs/cv/lib/python3.4/site-packages/ $ ln -s /usr/local/lib/python3.4/site-packages/cv2.cpython-34m.so cv2.so Passo 5 - Teste O OpenCV foi instalado com sucesso! Para confirmar se a instalação está funcionando realize os seguintes passos: $ source /usr/local/bin/virtualenvwrapper.sh $ workon cv $ python >>> import cv2 >>> cv2.__version__ A resposta do último comando deve retornar a versão da biblioteca OpenCV que instalamos neste tutorial, conforme imagem abaixo: |
HOG
Conteúdo |
---|
Importando biblitecas. import numpy as np import cv2 Lendo imagem do disco im = cv2.imread('40km64x128.jpeg') im = np.float32(im) / 255.0 cv2.imshow('image',im) cv2.waitKey(0) cv2.destroyAllWindows() Convertendo imagem para escala cinza gray_image = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) cv2.imshow('image',gray_image) cv2.waitKey(0) cv2.destroyAllWindows() Convertendo valores da imagem para inteiros de 8 bits (necessário no hog.compute) gray_image = np.uint8(gray_image) Configurações do descritor HOG winSize = (64,128) # Size of the images in our dataset blockSize = (4,8) # The size of blocks (Illumination variance) blockStride = (5,5) # Determine the overlap between neighboring block cellSize = (4,8) # Size of the cells nbins = 9 # Numbs of positions in the histogram derivAperture = 1 # winSigma = -1. # histogramNormType = 0 # L2HysThreshold = 0.2 # gammaCorrection = 1 # nlevels = 64 # useSignedGradients = True # Signed (between 0 and 360) or unsigned (between 0 and 180) gradients hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nbins,derivAperture,winSigma,histogramNormType,L2HysThreshold,gammaCorrection,nlevels, useSignedGradients) Obtendo descritor HOG da imagem descriptor = hog.compute(gray_image) |
SVM
Conteúdo |
---|
Criação e configuração da SVM svm = cv2.ml.SVM_create() svm.setType(cv2.ml.SVM_C_SVC) svm.setKernel(cv2.ml.SVM_RBF) # Set SVM Kernel to Radial Basis Function (RBF) svm.setC(C) svm.setGamma(gamma) Treinamento da SVM svm.train(trainData, cv2.ml.ROW_SAMPLE, trainLabels) svm->save("digits_svm_model.yml"); Testes testResponse = svm.predict(testData)[1].ravel() |
Matlab
Conteúdo |
---|
Objetivo: extrair o histrograma de gradientes orientados de uma imagem e estudar o procedimento. x = imread('imagem1.jpeg'); figure(1); imshow(x); ![]() %% Binarização da imagem x = x(:,:,1) >= 175; figure(2); imshow(x); ![]() %% Extração HOG's [featureVector,hogVisualization] = extractHOGFeatures(x); figure(3); subplot(1,2,1); imshow(x); subplot(1,2,2); plot(hogVisualization); ![]() |
Notas
Referências
- ↑ 1,0 1,1 COUTINHO, D.P.; MARROQUIM R. SIFT - Scale Invariant Feature Transform. LCG Computer Graphics Lab, Universidade Federal do Rio de Janeiro, 2013
- ↑ 2,0 2,1 2,2 BELO, F. A. Desenvolvimento de Algoritmos de Exploração e Mapeamento Visual para Robôs Móveis de Baixo Custo. Diss. PUC-Rio, 2006.
- ↑ VARELLA, C. A. Análise de componentes principais. Universidade Federal Rural do Rio de Janeiro, Seropédica, 2008
- ↑ SOLOMON, Chris; BRECKON, Toby. Fundamentals of Digital Image Processing: A practical approach with examples in Matlab. John Wiley & Sons, 2011.
- ↑ 5,0 5,1 5,2 5,3 GONZALEZ, Rafael C.; WOODS, Richard C. Processamento digital de imagens, Tradução: Cristina Yamagami e Leonardo Piamonte. 3ª Edição. São Paulo: Pearson. 2010
- ↑ 6,0 6,1 6,2 MARQUES, Ogé F.; VIEIRA Hugo.Processamento Digital de Imagens. Rio de Janeiro: Brasport. 1999
- ↑ GONZALEZ, Rafael C.; WOODS, Richard E.; EDDINS, Steven L.Digital image processing using MATLAB. 2º Edition. India: McGraw. 2010.
- ↑ 8,00 8,01 8,02 8,03 8,04 8,05 8,06 8,07 8,08 8,09 8,10 LORENA, Ana Carolina; CARVALHO, André. Uma introdução às Support Vector machines. Revista de Informática Teórica e Aplicada, 2007, 14.2: 43-67.
- ↑ 9,0 9,1 9,2 9,3 9,4 9,5 9,6 9,7 9,8 SANTOS, Eulanda M.Teoria e aplicação de support vector machines à aprendizagem e reconhecimento de objetos baseado na aparência. 2002. Tese de Doutorado. Universidade Federal da Paraíba. Disponível em [1].Acessado em 9 de Setembro de 2017.
- ↑ MÜLLER, Andreas C.; GUIDO, Sarah. Introduction to machine learning with Python: a guide for data scientists. 2017.
- ↑ 11,0 11,1 11,2 11,3 ALPAYDIN, Ethem.Introduction to machine learning. MIT press, 2014
- ↑ 12,0 12,1 12,2 12,3 12,4 MONARD, Maria Carolina; BARANAUSKAS, José Augusto. 'Conceitos sobre aprendizado de máquina. Sistemas Inteligentes-Fundamentos e Aplicações, v. 1, n. 1, 2003. Disponível em [2]. Acessado em 31 de Agosto de 2017.
- ↑ 13,0 13,1 CAMASTRA, Francesco; VINCIARELLI, Alessandro. Machine learning for audio, image and video analysis. Advanced Information and Knowledge Processing, p. 83-89, 2008.
- ↑ CAMILO, Cássio Oliveira; SILVA, João Carlos da. Mineração de dados: Conceitos, tarefas, métodos e ferramentas. Universidade Federal de Goiás (UFC), 2009, 1-29.Disponível em [3]. Acessado em 24 de Agosto de 2017
- ↑ 15,0 15,1 15,2 15,3 15,4 HAYKIN, Simon. Redes neurais: princípios e prática. Bookman Editora, 2001.
- ↑ SLOUGHTER, Dan. The calculus of functions of several variables. D. Sloughter, 2001.
- ↑ OpenCV. Disponível em [4]. Acessado em 16 de Agosto de 2017
- ↑ ROSEBROCK, Adrian. Install OpenCV 3.0 and Python 3.4+ on Ubuntu. Pyimagesearch. 2015. Disponível em [5]. Acessado em 16 de Agosto de 2017.