Baixe o app para aproveitar ainda mais
Prévia do material em texto
RECONHECIMENTO AUTOMÁTICO DE PLACAS AUTOMOBILÍSTICAS Alexandre Santos Lima Paes Projeto de Graduação apresentado ao Curso de Engenharia Eletrônica e de Computação da Escola Politécnica, Universidade Federal do Rio de Janeiro, como parte dos requisitos necessários à obtenção do título de Engenheiro. Orientador: Eduardo Antônio Barros da Silva Rio de Janeiro Dezembro de 2017 RECONHECIMENTO AUTOMÁTICO DE PLACAS AUTOMOBILÍSTICAS Alexandre Santos Lima Paes PROJETO DE GRADUAÇÃO SUBMETIDO AO CORPO DOCENTE DO CURSO DE ENGENHARIA ELETRÔNICA E DE COMPUTAÇÃO DA ESCOLA POLITÉCNICA DA UNIVERSIDADE FEDERAL DO RIO DE JANEIRO COMO PARTE DOS REQUISITOS NECESSÁRIOS PARA A OBTENÇÃO DO GRAU DE ENGENHEIRO ELETRÔNICO E DE COMPUTAÇÃO. Examinado por: Prof. Eduardo Antônio Barros da Silva, Ph.D. Prof. José Gabriel Rodriguez Carneiro Gomes, Ph.D. Prof. Sergio Lima Netto, Ph.D. RIO DE JANEIRO, RJ – BRASIL DEZEMBRO DE 2017 Santos Lima Paes, Alexandre Reconhecimento Automático de placas automobilísticas/Alexandre Santos Lima Paes. – Rio de Janeiro: UFRJ/ Escola Politécnica, 2017. XII, 47 p.: il.; 29,7cm. Orientador: Eduardo Antônio Barros da Silva Projeto de Graduação – UFRJ/ Escola Politécnica/ Curso de Engenharia Eletrônica e de Computação, 2017. Referências Bibliográficas: p. 45 – 47. 1. RAPA. 2. Visão Computacional. 3. Classificadores Haar. 4. Tesseract. 5. Python. 6. OpenCV. 7. Placa Automobilística. 8. Inteligência Artificial. 9. Viola Jones. 10. ALPR. 11. Computer Vision. 12. Haar classifiers. 13. Tesseract. 14. Python. 15. OpenCV. 16. License Plate. 17. Artificial Inteligence. 18. Viola Jones. I. Antônio Barros da Silva, Eduardo. II. Universidade Federal do Rio de Janeiro, Escola Politécnica, Curso de Engenharia Eletrônica e de Computação. III. Título. iii Dedico esse projeto ao meu filho Leandro Paes. iv Agradecimentos Agradeço a Deus e a toda minha família, especialmente a minha mãe e meu pai, pois sem eles nada disso seria possível. Agradeço ao meu filho Leandro, que sempre me inspirou e deu motivos para que nunca desistisse e seguisse em frente. Agradeço a minha namorada, que teve paciência nos meus momentos de ausência e me apoiou nos difíceis. Agradeço aos meus amigos, que tornaram todos os dias ruins em maravilhosos! Agradeço ao meu orientador pela paciência em esclarecer minhas dúvidas e pelos conselhos em relação ao projeto. Agradeço aos membros da banca examinadora que aceitaram o meu convite de imediato e numa data (19/12/2017) tão próxima do fim das atividades letivas. Agradeço também a todos que me ajudaram diretamente ou indiretamente para chegar até esse momento. Muito Obrigado. v Resumo do Projeto de Graduação apresentado à Escola Politécnica/ UFRJ como parte dos requisitos necessários para a obtenção do grau de Engenheiro Eletrônico e de Computação. Reconhecimento Automático de placas automobilísticas Alexandre Santos Lima Paes Dezembro/2017 Orientador: Eduardo Antônio Barros da Silva Curso: Engenharia Eletrônica e de Computação Este trabalho descreve uma forma de se realizar o Reconhecimento Automático de Pla- cas Automobilísticas (RAPA) em vídeos. Está dividido em 4 etapas: obtenção do vídeo, detecção da placa, pré-processamento e reconhecimento dos caracteres. Foram utilizados classificadores Haar em cascata para detecção da placa, funções da biblioteca OpenCV para manipulação do vídeo e das imagens, e Tesseract para o reconhecimento dos carac- teres. Resultados obtidos mas que ainda podem melhorar: • 98,4% de detecções durante o dia e 59,7% à noite. • 0,029% de falsos positivos. • 91,7% de caracteres corretamente segmentados. • 88,3% de caracteres corretamente reconhecidos. Palavras-chave: RAPA, Visão Computacional, Classificadores Haar, Tesseract, Python, OpenCV, Placa Automobilística, Inteligência Artificial, Viola Jones. vi Abstract of Undergraduate Project presented to POLI/UFRJ as a partial fulfillment of the requirements for the degree of Engineer. AUTOMATIC LICENSE PLATE RECOGNITION USING HAAR CLASSIFIERS IN CASCADE Alexandre Santos Lima Paes December/2017 Advisor: Eduardo Antônio Barros da Silva Course: Electronic Engineering This work describes an alternative of implementing automatic license plate recognition (ALPR) in videos. It is divided in 4 stages: video acquire, plate detection, preprocess and character recognition. Haar cascade of classifiers were utilized for plate detection, func- tions of OpenCV library for video and image manipulation, and Tesseract for character recognition. Obtained results which can still be improved: • 98,4% of detection during day and 59,7% during night. • 0,029% of false positives. • 91,7% of correctly separated characters. • 88,3% of correctly recognized characters. Keywords: ALPR, Computer Vision, Haar classifiers, Tesseract, Python, OpenCV, Li- cense Plate, Artificial Inteligence, Viola Jones. vii Sumário Lista de Figuras x Lista de Tabelas xii 1 Introdução 1 2 Teoria e Ferramentas 3 2.1 Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.2 OpenCV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.3 Tesseract . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.4 Imagem Integral (Integral Images) . . . . . . . . . . . . . . . . . . . . . 4 2.5 Atributos de Haar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.6 AdaBoost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.7 Classificadores Haar em cascata . . . . . . . . . . . . . . . . . . . . . . 8 2.8 Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.9 Binarização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.10 Operações Morfológicas . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.10.1 Erosão (Erosion) . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.10.2 Dilatação (Dilation) . . . . . . . . . . . . . . . . . . . . . . . . 14 2.10.3 Abertura (Opening) . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.10.4 Fechamento (Closing) . . . . . . . . . . . . . . . . . . . . . . . 15 2.10.5 Top hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.10.6 Bottom hat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2.11 Extrator de Contornos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3 Construção e Funcionamento do Sistema 18 3.0.1 Etapa 1: obtenção do vídeo . . . . . . . . . . . . . . . . . . . . . 19 3.0.2 Etapa 2: detecção da placa . . . . . . . . . . . . . . . . . . . . . 19 3.0.3 Etapa 3: pré-processamento da placa . . . . . . . . . . . . . . . . 28 3.0.4 Etapa 4: reconhecimento dos caracteres . . . . . . . . . . . . . . 32 viii 4 Resultados 34 4.0.1 Detecção da placa . . . . . . . . . . . . . . . . . . . . . . . . . 34 4.0.2 Pré-processamento da placa . . . . . . . . . . . . . . . . . . . . 37 4.0.3 Reconhecimento dos caracteres . . . . . . . . . . . . . . . . . . 38 5 Trabalhos Futuros 40 6 Conclusões 43 Referências Bibliográficas 45 ix Lista de Figuras 1.1 Visão macro das etapas do projeto. . . . . . . . . . . . . . . . . . . . . . 2 2.1 Exemplo de Integral Image. . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.2 Formas de Haar. A soma dos pixels dentro de retângulos brancos é sub- traída pela soma dos escuros. . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3 Pseudo código do AdaBoost. . . . . . . . . . . . . . . . . . . . . . . . . 7 2.4 Configuração de classificadores em cascata. . . . . . . . . . . . . . . . . 8 2.5 Combinação dos canais de cores para formar a imagem colorida. . . . . . 9 2.6 Histograma de 3 canais. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.7 Histograma de 1 canal. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.8 Imagem antes da binarização. . . . . . . . . . . . . . . . . . . . . . . . . 11 2.9 Imagem binária. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 2.10 Imagem binária invertida. . . . . . . . . . . . .. . . . . . . . . . . . . . 11 2.11 Em cima, a imagem colorida e sua versão em escala de cinza. Em baixo, a imagem binarizada por média e por média gaussiana. . . . . . . . . . . 12 2.12 Imagem original e binarizada por Otsu. Exemplo de histograma bimodal . 13 2.13 Imagem original e após erosão. . . . . . . . . . . . . . . . . . . . . . . . 14 2.14 Imagem original e após dilatação. . . . . . . . . . . . . . . . . . . . . . 15 2.15 Imagem original e após abertura. . . . . . . . . . . . . . . . . . . . . . . 15 2.16 Imagem original e após fechamento. . . . . . . . . . . . . . . . . . . . . 16 2.17 Imagem original e seu Top Hat. . . . . . . . . . . . . . . . . . . . . . . . 16 2.18 Imagem original e seu Bottom Hat. . . . . . . . . . . . . . . . . . . . . . 17 2.19 Contorno simples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.20 Retângulos mínimos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.1 Visão macro das etapas do projeto. . . . . . . . . . . . . . . . . . . . . . 18 3.2 Exemplo de comando para o treinamento dos classificadores. . . . . . . . 20 3.3 Visualização do sistema de coordenadas. . . . . . . . . . . . . . . . . . . 21 3.4 Exemplo de arquivo "info-neg-full.txt". . . . . . . . . . . . . . . . 22 3.5 Exemplo de arquivo "info-pos.txt". . . . . . . . . . . . . . . . . . . . 22 3.6 Exemplo de comando para gerar o arquivo "positives.vec". . . . . . . 23 x 3.7 Exemplo de comando para geração de novas imagens positivas. . . . . . . 24 3.8 Fotos tiradas com a câmera do celular. . . . . . . . . . . . . . . . . . . . 24 3.9 ROI’s após o tratamento com tinta preta. . . . . . . . . . . . . . . . . . . 25 3.10 Exemplos de imagens negativas baixadas. . . . . . . . . . . . . . . . . . 26 3.11 Exemplos de imagens positivas criadas. . . . . . . . . . . . . . . . . . . 26 3.12 Pseudo código do programa principal. . . . . . . . . . . . . . . . . . . . 27 3.13 Quadro em que a placa foi detectada e a placa. O retângulo vermelho representa a região em que o classificador atua. . . . . . . . . . . . . . . 28 3.14 Pseudo código do programa de pré-processamento. . . . . . . . . . . . . 29 3.15 Etapas 1 a 6 do pré-processamento. . . . . . . . . . . . . . . . . . . . . . 30 3.16 Etapas 7 a 12 do pré-processamento. . . . . . . . . . . . . . . . . . . . . 31 3.17 Caracteres selecionados. . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.1 Exemplo de interferência causada pelos faróis. . . . . . . . . . . . . . . . 35 4.2 Exemplo de falsas detecções. . . . . . . . . . . . . . . . . . . . . . . . . 36 4.3 Exemplos de placas detectadas pelo classificador. . . . . . . . . . . . . . 37 4.4 Exemplos de falhas na segmentação dos caracteres. . . . . . . . . . . . . 37 4.5 Exemplo de segmentação bem sucedida. . . . . . . . . . . . . . . . . . . 38 4.6 Exemplos de placas reconhecidas pelo Tesseract. . . . . . . . . . . . . . 39 xi Lista de Tabelas 4.1 Comparativo de detecção correta. . . . . . . . . . . . . . . . . . . . . . . 34 4.2 Comparativo de falsas detecções. . . . . . . . . . . . . . . . . . . . . . . 35 4.3 Classificadores e suas especificações. . . . . . . . . . . . . . . . . . . . . 36 4.4 Desempenho da etapa de pré-processamento. . . . . . . . . . . . . . . . 37 4.5 Desempenho do Tesseract. . . . . . . . . . . . . . . . . . . . . . . . . . 38 xii Capítulo 1 Introdução Segurança é um tema muito importante devido aos altos índices de violência que são registrados no Brasil. Para a prevenção, coibição dos criminosos e detecção de compor- tamentos fora do padrão, câmeras de segurança vêm sendo empregadas em larga escala tanto em ambientes públicos quanto privados. Controlar a entrada e saída de veículos em condomínios, prédios, estacionamentos etc. é um dos principais objetivos das câmeras de segurança. Ter o controle de quais veículos entram e saem de um prédio é essencial para inibir a atuação de criminosos. A tecnologia vem se mostrando uma grande aliada no aumento da segurança com as câmeras, mas ela trouxe algo mais: a Inteligência Artificial. A Inteligência Artificial pode auxiliar na tomada de decisões, predição de falhas, clas- sificação de grupos, detecção de padrões complexos ou até mesmo automatizar tarefas por completo. Devido ao avanço tecnológico, diversos tipos de hardware mais potentes surgiram, possibilitando automatizar tarefas mais complexas. Uma linha de pesquisa que está ganhando cada vez mais força se chama Visão Com- putacional. Ela objetiva desenvolver teorias e meios para que máquinas possam "enxer- gar", extrair informações inteligentes a partir de dados brutos como imagens ou vídeos. Seja identificando, rastreando ou detectando um objeto sem qualquer tipo de intervenção humana. Uma aplicação que une Segurança, Visão Computacional e Inteligência Artificial é o Reconhecimento Automático de Placas Automobilísticas (RAPA), o termo é mais co- nhecido em inglês: Automatic License Plate Recognition (ALPR). Essa aplicação visa au- mentar a segurança, utilizando algoritmos de visão computacional e inteligência artificial 1 para reconhecer de forma automática a placa de todos os veículos que estejam presentes nas imagens ou vídeos analisados. Este trabalho foca no reconhecimento em tempo-real de placas automobilísticas bra- sileiras, gravadas em vídeos produzidos por câmeras de segurança. Classificadores Haar em cascata foram empregados na detecção destas placas. Posteriormente, algoritmos pre- sentes na biblioteca Open Source Computer Vision Library (OpenCV) [1] foram utilizados para o aprimoramento e recorte dos caracteres presentes na placa e por fim, enviados para o Tesseract [2], um programa de código aberto para aplicação de Reconhecimento Óptico de Caracteres (ROC) ou em inglês: Optical Character Recognition (OCR). O diagrama de blocos facilita a visualização das etapas do projeto. Vídeo Detecção da Placa Pré-processamento da placa Reconhecimento dos caracteres Caracteres da Placa Figura 1.1: Visão macro das etapas do projeto. No capítulo 2 será abordada toda a teoria, um pouco do histórico e as ferramentas utilizadas no projeto. 2 Capítulo 2 Teoria e Ferramentas 2.1 Python É uma linguagem de programação criada por Guido van Rossum em 1991, é de alto nível, interpretada e multiplataforma. Ela pode ser utilizada de algumas formas sendo que as principais são: orientada a objetos e procedural. Devido a clareza e objetividade da sua sintaxe, ela se difundiu por todo o mundo e é amplamente utilizada até os dias atuais. A versão 2.7.13 foi adotada no trabalho por questões de familiaridade, mas as versões 3.6.X poderiam ter sido utilizadas com apenas algumas modificações de sintaxe. Mais informações sobre Python e seu download podem ser encontrados em [3]. 2.2 OpenCV Open Source Computer Vision Library é uma biblioteca de código aberto, desenvolvida nos anos de 1999 e 2000 pelo time da Intel. Objetiva aplicações em tempo-real de visão computacional. Foi escrita em C/C++ mas provê interfaceamento com outras linguagens, dentre elas, Python. A versão 3.3.0 foi utilizada no trabalho. Mais informações sobre OpenCV e seu download podem ser encontrados em [1]. 3 2.3 Tesseract É um programa que aplica Reconhecimento Óptico de Caracteres (ROC), em inglês: Opti- cal Character Recognition (OCR), mecanismo para reconhecimento de caracteres a partir de uma imagem. Foi criado pela Hewlett Packard (HP) entre 1984 e 1994. Em 2005 tor- naram o código aberto e desde 2006, o desenvolvimento do Tesseract é patrocinado pelo Google. Foi escrito em C/C++ e possui interfaceamento com Python e outras linguagens. Essas informações podem ser encontradas em [2] e [4]. O algoritmo é bastante robusto e pode ser usado para identificar caracteres sozinhos ou para o reconhecimento de textos in- teiros como identificação de linha, segmentação de caracteres e palavras, conseguindo até identificar quando a frase é escrita inclinada. O seu algoritmo de treinamento é baseado na maximização da similaridadeentre o caractere a ser descoberto e o testado. Foram uti- lizados 20 amostras de 94 caracteres de 8 tipos de fontes em 4 modos diferentes (Normal, Negrito, Itálico, Negrito e Itálico), totalizando 60160 amostras para o treino. O Tesseract também conta com um classificador adaptativo, em que ele "aprende"características do próprio texto que está "lendo" e ao terminá-lo, volta aos caracteres os quais não conse- guiu identificar e aplica o classificador. Informações obtidas de [5]. A versão 3.05 foi utilizada no trabalho. 2.4 Imagem Integral (Integral Images) Imagem Integral (Integral Images) ou Tabela de Área Somada (Summed-area Table) é uma matriz gerada pela aplicação da fórmula 2.1 em outra imagem. ii(x, y) = ∑ x′≤x, y′≤y i(x ′ , y ′ ) (2.1) Onde ii(x, y) é a Integral de Imagem e i(x ′ , y ′ ) é a imagem original. O que a fórmula faz é criar uma matriz com a mesma dimensão que a imagem original e cada célula da matriz corresponde a soma de todos os pixels acima e a esquerda do vértice em questão na imagem original. O exemplo abaixo facilita a compreensão: 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 1 2 3 4 5 2 4 6 8 10 3 6 9 12 15 4 8 12 16 20 5 10 15 20 25 Imagem original Integral Image Figura 2.1: Exemplo de Integral Image. A figura 2.1 representa o cálculo da Imagem Integral sobre uma imagem 5x5. A intensidade de seus pixels é igual a 1 apenas para facilitar os cálculos. Com a Imagem Integral calculada, a soma dos pixels na região laranja pode ser obtida somando as regiões Rosa com Amarela e subtraindo as áreas Azul e Verde (25+9−15−15= 4). A vantagem de se trabalhar com um sistema de Imagens Integrais, em vez de utilizar o valor dos pixels diretamente, está na velocidade. Como as operações serão realizadas várias vezes sobre a mesma imagem, o custo computacional para acessar repetidas vezes o valor dos pixels é superior se comparado ao cálculo utilizando Imagens Integrais. Essas informações e outras mais, podem ser encontradas no paper [6]. 2.5 Atributos de Haar Atributos de Haar (Haar features) são baseados na utilização de formas retangulares sim- ples, previamente escolhidas. As formas utilizadas quando se deseja realçar característi- cas presentes em rostos, são: 5 A B C D Figura 2.2: Formas de Haar. A soma dos pixels dentro de retângulos brancos é subtraída pela soma dos escuros. Cada uma delas visa explorar características presentes em rostos como: simetria, dife- rença de tonalidade entre a região dos olhos, nariz e bochechas, dentre outras peculiarida- des [6]. O nome Haar foi dado em homenagem ao matemático húngaro Alfréd Haar, que criou um sistema de bases semelhante ao de Fourier mas com a particularidade de ser bom em representar mudanças bruscas dos sinais [7]. Essa capacidade se mostrou muito boa para ser aplicada em imagens, pois geralmente ocorrem mudanças bruscas entre pixels vizinhos quando há objetos de cores distintas por exemplo. 2.6 AdaBoost Classificadores são algoritmos de Inteligência Artificial que têm por objetivo separar um conjunto de dados em dois ou mais grupos. A separação pode ser feita por retas, curvas, hiperplanos, ou funções tão complexas quanto forem necessárias para alcançarem seu objetivo. Classificadores são ditos "fracos" quando sua performance é um pouco melhor que 50% de acerto. Uma visão abrangente e objetiva sobre classificadores pode ser lida em [8]. 6 AdaBoost [9] é um algoritmo criado por Robert E. Schapire e Yoav Freund com o objetivo de criar uma regra de predição forte e precisa (classificador forte) a partir de regras fracas e imprecisas (classificadores fracos). Dado: (x1,y1), .... , (xm,ym) onde xi ∈X , yi ∈ {−1,+1}. Inicializa: D1(i) = 1/m for i = 1 , .... , m. Para t = 1, .... , T : • Treina classificador fraco utilizando a distribuição Dt . • Pega a hipótese fraca ht : X −→ {−1,+1}. • Objetivo: Selecionar ht com o menor erro ponderado: εt = Pri∼Dt [ht(xi 6= yi)]. (2.2) • Escolher αt = 1 2 ln ( 1− εt εt ) . • Atualiza, para i = 1, .... , m : Dt+1(i) = Dt(i)exp(−αtyiht(xi)) Zt (2.3) onde Zt é um fator normalizador (Dt+1 será a distribuição). Retorna a hipótese final: H(x) = sign ( T ∑ t=1 αtht(x) ) . (2.4) Figura 2.3: Pseudo código do AdaBoost. O pseudo código pode ser visto na figura 2.3. É dado um conjunto com m exemplos previamente classificados para o treinamento (x1,y1), .... , (xm,ym) , onde cada xi está no domínio X , e cada yi ∈ {−1,+1}. A cada iteração t = 1, .... , T , a distribuição 7 Dt é calculada sobre os m exemplos de acordo com a equação 2.3, e uma hipótese fraca ht : X −→ {−1,+1} é calculada por um algoritmo de aprendizado fraco. O objetivo do classificador fraco é encontrar uma hipótese fraca com um baixo erro ponderado εt relativo a Dt . Ao final, as hipóteses fracas ht são utilizadas para calcular a soma ponderada da função sinal 2.4, formando o conjunto H. 2.7 Classificadores Haar em cascata Paul Viola e Michael Jones propuseram utilizar classificadores Haar em cascata no paper [6], com o objetivo de detectar em tempo-real rostos presentes em imagens e vídeos. Os classificadores Haar podem ser utilizados para detectar qualquer objeto, tais como placas, e priorizam a minimização de falsos negativos, por exemplo: se o objetivo for separar bolas brancas de outras cores, um falso negativo seria classificar uma bola branca como sendo de outra cor. Estágio 1 Estágio 2 Aprovados! Não são mais processados Rejeitados Rejeitados Figura 2.4: Configuração de classificadores em cascata. O AdaBoost combina diversos classificadores fracos e transforma-os em um "forte", mas como o foco é a minimização de falsos negativos, muitos candidatos são classifi- cados como positivos de forma incorreta. A configuração em cascata é utilizada para resolver esse problema. O classificador forte é colocado como primeiro estágio da cas- cata. No segundo, o AdaBoost combina os classificadores fracos, considerando apenas os candidatos "aprovados" pelo primeiro estágio, e assim sucessivamente nos próximos estágios. A consequência desse procedimento é que o classificador do estágio seguinte precisa atuar somente sobre as características "positivas" do estágio anterior, dessa forma, a característica de minimizar falsos negativos é mantida, porém os falsos positivos são 8 reduzidos a cada estágio. Quanto mais estágios a cascata possuir, menos falsos positivos serão encontrados. Utilizando o mesmo exemplo anterior: a cada estágio as bolas que o classificador tivesse certeza de que não fossem brancas são eliminadas, as que não tivesse certeza, delegaria ao próximo estágio avalia-las. Ao final do processo restariam somente as brancas. Algumas vantagens podem ser destacadas dessa abordagem: baixo índice de falsos negativos, a quantidade de falsos positivos é reduzida a cada estágio da cascata e a otimização de processamento, já que os demais estágios só precisam analisar as bolas aprovadas pelo seu antecessor. 2.8 Histograma Imagens são representadas por matrizes nos computadores. Se for uma imagem colorida no sistema RGB, são necessários 3 valores para representar cada pixel da imagem. Se for em escala de cinza, apenas um valor é necessário. RGB vem do inglês: Red, Green and Blue que significa: Vermelho, Verde e Azul. Essas são as cores base deste sistema, são utilizadas para formarem todas. Diz-se que imagens coloridas possuem 3 canais de cor, um para cada cor base, isto é, possuem 3 matrizes associadas a ela (ver figura 2.5). Cada uma das posições representam a intensidade necessária da respectiva cor para que quando combinadas resultem na cor do pixel na tela. Imagens em escala de cinza possuem apenas 1 canal, somente uma matriz associada a imagem, sendo a intensidade 0 e 255 correspondente ao preto e branco respectivamente. (0) (255) (115) (171) (113) (110) (88) (184) (215) (92) (1) (225) (195) (12) (200) (111) (255) (0) (98) (117)(234) (110) (88) (184) (200) (92) (1) (225) (151) (12) (200) (255) (125) (32) (25) (191) (130) (110) (88) (184) (253) (92) (1) (225) (28) (12) (200) (111) Red Green Blue Figura 2.5: Combinação dos canais de cores para formar a imagem colorida. 9 Uma das formas de se analisar uma imagem é pelo seu histograma. É gerado um gráfico em que o eixo X representa todas as intensidades (0 a 255), e no eixo Y representa a quantidade de pixels que possuem aquele valor. Em imagens com 3 canais serão exibidas três quantidades por intensidade devido a cada canal ser analisado separadamente, ver figura 2.6. Em imagens de 1 canal existirá apenas uma quantidade por intensidade, ver figura 2.7. Figura 2.6: Histograma de 3 canais. Figura 2.7: Histograma de 1 canal. Mais informações sobre histogramas podem ser encontradas em [10]. 2.9 Binarização Binarização é o processo de limitar os possíveis valores dos pixels de uma imagem em escala de cinza, em apenas dois valores, 0 ou 255 por exemplo. O valor a ser assumido depende do critério escolhido. Existem algumas técnicas para realizar o processo de binarização, dentre elas: 10 Binarização Simples ou Absoluta: Escolhe-se um valor absoluto para o limiar e todos os pixels que estiverem a baixo, irão para 0 e aqueles acima irão para 255. Figura 2.8: Imagem antes da binarização. Figura 2.9: Imagem binária. Figura 2.10: Imagem binária invertida. Binarização Adaptativa: O limiar não é escolhido de forma absoluta e aplicado em toda a imagem, ele é escolhido dinamicamente, levando em consideração somente os valores dos pixels que estão no bloco. O processo é feito da seguinte maneira: escolhe-se o tamanho do bloco a ser analisado, que é chamado de núcleo (kernel). Depois é escolhido o cálculo que será realizado para definir o limiar. Por exemplo: • Média, onde o valor médio dos pixels no bloco é escolhido como limiar; • Média gaussiana, o resultado da média ponderada dos pixels do bloco, em que os pesos são dados por uma distribuição gaussiana, é escolhido como limiar. O bloco irá percorrer toda a imagem, e a cada deslocamento o limiar será calcu- lado de acordo com a opção escolhida. Essa técnica é bastante útil quando existe diferença de iluminação ou sombra na imagem. 11 Figura 2.11: Em cima, a imagem colorida e sua versão em escala de cinza. Em baixo, a imagem binarizada por média e por média gaussiana. Binarização de Otsu: A técnica apresenta melhores resultados em histogramas bimo- dais, que possuem dois picos, pois seu princípio de funcionamento consiste em aproximar os picos do histograma por duas funções Gaussianas, e minimizar a va- riância intraclasse. Cada classe é uma gaussiana que possui uma média e desvio padrão. 12 σ 2 w = q1(t)σ 2 1 (t)+q2(t)σ 2 2 (t) (2.5) onde q1(t) = t ∑ i=1 P(i) & q2(t) = I ∑ i=t+1 P(i) (2.6) µ1(t) = t ∑ i=1 i P(i) q1(t) & µ2(t) = I ∑ i=t+1 i P(i) q2(t) (2.7) σ 2 1 (t) = t ∑ i=1 [i−µ1(t)]2 P(i) q1(t) & σ22 (t) = I ∑ i=t+1 [i−µ2(t)]2 P(i) q2(t) (2.8) O peso de cada classe é dado por 2.6, que corresponde à probabilidade de um pixel da imagem pertencer àquela classe. Como são funções gaussianas, as médias são dadas pelas equações 2.7. As variâncias são dadas pelas equações 2.8. Por fim, a variância intraclasse é dada pela equação 2.5 que deve ser minimizada. Mais informações podem ser encontradas em: [11], [12], [13], [14] e [10]. Figura 2.12: Imagem original e binarizada por Otsu. Exemplo de histograma bimodal 13 Mais exemplos de binarizações podem ser encontrados em [10]. 2.10 Operações Morfológicas Operações morfológicas são algoritmos aplicados na imagem, a fim de alterar a sua forma de alguma maneira. As imagens devem ser binárias para que seu resultado seja conforme esperado. Serão apresentados todos os algoritmos utilizados no trabalho, eles podem ser encontrados no site [10]. 2.10.1 Erosão (Erosion) O nome do processo dá uma boa ideia do que ele faz, "corrói" os pixels brancos da ima- gem. Escolhe-se um tamanho de núcleo e o mesmo irá "deslizar" sobre toda a figura. Quando um pixel branco estiver sendo analisado, se todos os pixels dentro do núcleo forem brancos ele permanecerá branco, caso contrário, ele é alterado para preto. Figura 2.13: Imagem original e após erosão. 2.10.2 Dilatação (Dilation) Dilatação é o processo inverso ao de erosão, os pixels brancos da imagem serão "incha- dos". Escolhe-se um tamanho de núcleo e o mesmo irá percorrer toda a figura. Quando um pixel preto estiver sendo analisado, se todos os pixels dentro do núcleo forem pretos ele permanecerá preto, caso contrário, ele é alterado para branco. 14 Figura 2.14: Imagem original e após dilatação. 2.10.3 Abertura (Opening) O processo de Abertura é a aplicação em série da Erosão e Dilatação na respectiva ordem. Esse processo é muito útil para remoção de ruídos da imagem e separação de objetos que estejam "grudados". Figura 2.15: Imagem original e após abertura. 2.10.4 Fechamento (Closing) O processo de Fechamento é a aplicação dos processos de Erosão e Dilatação em ordem inversa ao processo de Abertura. Primeiro aplica-se a Dilatação e depois a Erosão. Esse processo é muito útil para "preencher" objetos que estejam com "buracos", devido a algum ruído ter atrapalhado o processo de binarização. 15 Figura 2.16: Imagem original e após fechamento. 2.10.5 Top hat O processo de Top Hat é a diferença entre a imagem original e o resultado do processo de Abertura. Ele pode ser utilizado para selecionar as regiões mais claras da imagem e aumentar o contraste. Figura 2.17: Imagem original e seu Top Hat. 2.10.6 Bottom hat O processo de Bottom Hat é a diferença entre a imagem original e o resultado do processo de Fechamento. Ele pode ser utilizado para selecionar as regiões mais escuras da imagem e para aumentar o contraste. 16 Figura 2.18: Imagem original e seu Bottom Hat. 2.11 Extrator de Contornos É uma função que procura a fronteira dos objetos presentes na imagem por similaridade de cor ou intensidade dos pixels. Seu desempenho é superior se aplicado em imagens biná- rias. O contorno pode ser retornado de forma completa ou simplificada. No primeiro caso, todos os pontos da fronteira são retornados. No segundo, apenas os que quando interli- gados envolvam o objeto. A função cv2.boundingRect(cnt) da biblioteca OpenCV, recebe como parâmetro os pontos de contorno, e retorna o retângulo de tamanho mínimo necessário para envolver completamente o objeto. Figura 2.19: Contorno simples. Figura 2.20: Retângulos mínimos. No capítulo 3 será abordado como cada uma das etapas do projeto foram construídas e seus respectivos funcionamentos. 17 Capítulo 3 Construção e Funcionamento do Sistema Nesse capítulo serão explicadas cada uma das etapas presentes na figura 3.1. Vídeo Detecção da Placa Pré-processamento da placa Reconhecimento dos caracteres Caracteres da Placa Figura 3.1: Visão macro das etapas do projeto. Para uma boa clareza do que foi feito, cada etapa foi explicada em um subcapítulo. 18 3.0.1 Etapa 1: obtenção do vídeo A primeira etapa do projeto consiste na obtenção do vídeo para processamento. Foi utili- zada uma gravação que registrou a entrada/saída do condomínio, de 15h até 21h do mesmo dia. Esse intervalo foi escolhido para poder contemplar diversas variações de iluminação e clima (choveu durante um período do vídeo). As câmeras de segurança do condomínio geram imagens coloridas, de tamanho 352x240 (Largura x Altura) no formato ".dav", que é comum nos sistemas de CFTV (Circuito Fechado de Televisão). O OpenCV consegue lidar com esse formato de vídeo (codec) nativamente, caso algum codec não venha automaticamente com a sua instalação, é possível baixa-los em [15]. Foi utilizada uma gravação por questões burocráticas na obtenção do vídeo. Para ter acesso em tempo-real às imagens da câmera seria necessário uma autorização do responsável e as senhas envolvidas no processo. Com a gravação disponívelpara ser utilizada, a primeira etapa foi concluída. 3.0.2 Etapa 2: detecção da placa Para a conclusão da segunda etapa, foi utilizada a técnica de Haar Cascades (cascata de classificadores Haar). O próprio OpenCV conta com a função opencv_traincascade [16] que realiza o treinamento dos classificadores com o AdaBoost. Para a sua execução são necessários alguns parâmetros: -data Caminho absoluto até o local em que o classificador será salvo. -vec Caminho absoluto até o local em que o arquivo "positives.vec" está salvo. -bg Caminho absoluto até o local em que o arquivo "info-neg-full.vec" está salvo. -numPos Número de imagens positivas que serão utilizadas. numNeg Número de imagens negativas que serão utilizadas. -numStages Quantidade de estágios que a cascata terá. 19 -acceptanceRatioBreakValue Limite de precisão que o classificador final terá para não ocorrer treino excessivo (overtraining), e acabar perdendo a capacidade de gene- ralização. Quando o limite é atingido o treinamento é interrompido, mesmo se a quantidade de estágios desejados não tiver sido atingida. -featureType Método utilizado no treino dos classificadores. -w Largura (width) que o objeto a ser detectado possui. -h Altura (height) que o objeto a ser detectado possui. -bt Método de utilização do AdaBoost. -minhitrate Taxa mínima de acerto em cada estágio da cascata. Uma estimativa para a taxa de acerto total é: (Rp)N onde Rp é a taxa mínima de acerto e N é o número de estágios da cascata. -maxfalsealarm Taxa máxima de falsos positivos desejada por estágio da cascata. Uma estimativa para a taxa de falso positivo é: (R f p)N onde R f p é a taxa máxima de falso positivo e N é o número de estágios da cascata. -mode Seleciona o tipo de imagem Haar a ser utilizada. .\opencv_traincascade -data "C:\caminho\para\destino" -vec "C:\caminho\para\positives.vec" -bg "C:\caminho\para\info-neg-full.txt" -numPos 8000 -numNeg 4000 -numStages 20 -acceptanceRatioBreakValue 0.00001 -featureType HAAR -w 44 -h 20 -bt GAB -minhitrate 0.999 -maxfalsealarm 0.5 -mode ALL Figura 3.2: Exemplo de comando para o treinamento dos classificadores. Observação: A largura e a altura passadas nos parâmetros -w e -h devem ser as mesmas utilizadas na criação do arquivo "positives.vec". 20 Todas as terminologias serão explicadas, e em seguida como foram obtidas: Imagens Positivas: São imagens que contenham o objeto a ser detectado. Imagens Negativas: São imagens que não contenham o objeto a ser detectado. Arquivo "info.txt": É um arquivo de texto que possui a listagem de todas as imagens que serão utilizadas para o treinamento. Arquivo "positives.vec": É um arquivo que contém todas as imagens positivas, que fo- ram listadas no "info-pos.txt", em formato de vetor. O arquivo "info-pos.txt" é para imagens positivas, e é diferente do "info-neg-full.txt" para negativas. Existe uma pequena diferença na construção des- ses arquivos. Para imagens negativas, o arquivo "info-neg-full.txt" conterá apenas o caminho absoluto de cada imagem por linha, isto é, o caminho da raiz até a imagem em questão. No caso das positivas, o arquivo "info-pos.txt" conterá: o caminho de cada imagem relativo ao diretório que se encontra o arquivo "info-pos.txt", a quantidade de objetos positivos que estejam presentes na imagem, a localização e o tamanho dos mesmos, sendo passada na seguinte ordem: X, Y, W, H. Como a imagem é manipulada como uma matriz, a posição (0,0) fica localizada no canto superior esquerdo da imagem. W representa a largura (width) e H a altura (height). (0,0) (x,y) w hObjeto Figura Figura 3.3: Visualização do sistema de coordenadas. 21 C:\caminho\para\imagem1.png C:\caminho\para\imagem2.png C:\caminho\para\imagem3.png Figura 3.4: Exemplo de arquivo "info-neg-full.txt". C:\caminho\relativo\imagem1.png 1 32 54 11 5 C:\caminho\relativo\imagem2.png 3 57 98 17 13 85 5 12 6 47 58 13 9 C:\caminho\relativo\imagem3.png 2 13 25 10 4 65 78 21 15 Figura 3.5: Exemplo de arquivo "info-pos.txt". Na figura 3.5 o arquivo de exemplo possui na primeira linha uma imagem que contém 1 objeto com, X: 32, Y: 54,W: 11, H: 5. Na segunda linha a imagem contém 3 objetos, o primeiro deles com X: 57, Y: 98, W: 17, H: 13, o segundo com X: 85, Y: 5, W: 12, H: 6, o terceiro com X: 47, Y: 58, W: 13, H: 9, e assim por diante. Para a criação do arquivo "positives.vec" é necessário utilizar a função opencv_createsamples [16] passando alguns parâmetros: -info Caminho absoluto até o arquivo "info-pos.txt". -num Quantidade de imagens que serão lidas do "info-pos.txt" e adicionadas ao "po- sitives.vec". -w Largura que cada imagem terá no "positives.vec". -h Altura que cada imagem terá no "positives.vec". 22 -vec Caminho absoluto em que será salvo o "positives.vec". .\opencv_createsamples -info "C:\caminho\para\info-pos.txt" -num 8300 -w 44 -h 20 -vec "C:\caminho\para\positives.vec" Figura 3.6: Exemplo de comando para gerar o arquivo "positives.vec". Observação: A largura e a altura passadas nos parâmetros -w e -h devem respeitar a proporção (aspect ratio) do objeto. As detecções feitas pelo classificador terão essa proporção. Essas informações foram obtidas de [17], [18], [19], [20], [21], [16], [22] e [23]. A parte crucial do projeto está nas imagens utilizadas no treinamento do classi- ficador. Se não forem escolhidas com cuidado ou não receberem o devido tratamento, o classificador não funcionará conforme esperado. Foram necessárias muitas imagens positivas e negativas para poder realizar o treinamento e obter um resultado satisfatório. Foram utilizadas 5000 imagens positivas e 2500 negativas. Obtê-las manualmente se- ria um trabalho muito árduo e exigiria muito tempo. Para contornar esse problema, foi utilizada a função opencv_createsamples com a finalidade de criar imagens positivas. Através desta função, foi possível criar muitas novas imagens a partir de poucas. Foram utilizados os seguintes parâmetros: -img Caminho absoluto até a imagem que será usada como base para a criação das de- mais. -bg Caminho absoluto até "info-neg.txt". Essas imagens serão utilizadas como "fundo" para a imagem positiva modificada. -info Caminho absoluto em que será salvo o arquivo "info-pos.txt", com as informa- ções de localização das imagens criadas. -pngoutput Indica que as imagens criadas serão no formato ".png". -maxxangle Angulo máximo de rotação em torno do eixo X. 23 -maxyangle Angulo máximo de rotação em torno do eixo Y. -maxzangle Angulo máximo de rotação em torno do eixo Z. -w Largura da imagem criada. -h Altura da imagem criada. -num Quantidade de imagens que serão criadas. Essa função recebe uma imagem como base para a criação de novas imagens. Aplica transformações como: redimensionamento, rotação e efeitos de luminosidade. Após as modificações, ela é sobreposta em alguma imagem de fundo. Todas as modificações são aleatórias, desde os valores de cada modificação até a localização em que ela será "colada" na imagem de fundo. .\opencv_createsamples -img "C:\caminho\para\imagem-base.png" -bg "C:\caminho\para\info-neg.txt" -info "C:\caminho\para\info-pos.txt" -pngoutput -maxxangle 0.2 -maxyangle 0.2 -maxzangle 0.35 -w 44 -h 20 -num 100 Figura 3.7: Exemplo de comando para geração de novas imagens positivas. Parte das imagens base foram adquiridas com a câmera de um celular e parte pela internet. As fotos eram coloridas com dimensões de 5312x2988. Foram tiradas 3 fotos de 16 placas diferentes totalizando 48 fotos, sendo que em cada foto foi alterado o ângulo de captura, como pode ser visto na figura 3.8. As imagens da internet também eram coloridas mas tinham dimensões variadas. Ao todo foram utilizadas 83 imagens. Figura 3.8: Fotos tiradas com a câmera do celular. 24 Para serem utilizadas pela função, as imagens base, devem atender a três requisitos: conter apenas o objeto de interesse, estar em escala de cinza e um tamanho menor que as imagens de fundo. Inicialmente, todas foram redimensionadaspara 352x198. Depois foi utilizado um programa auxiliar que lia e exibia todas as imagens, uma a uma. Era possível marcar, sobre a figura, uma região de interesse (Region of Interest - ROI). A região mar- cada era a placa e salva em escala cinza. Posteriormente, as regiões selecionadas em que a placa estava "inclinada", recebiam um tratamento a mais pois parte da região selecionada não fazia parte da placa. Para adequar essas imagens foi necessário pintar manualmente de preto todas as regiões que não faziam parte da placa, como pode ser visto na figura 3.9. A cor preta foi escolhida pois a função considera o preto como "transparente"no momento da sobreposição com a imagem de fundo. Figura 3.9: ROI’s após o tratamento com tinta preta. Após a adequação das 83 imagens, foram criadas 100 a partir de cada uma delas, tota- lizando 8300 imagens. As negativas foram utilizadas como fundo e foram obtidas a partir do site Image-Net [24]. Esse site foi escolhido devido a possibilidade da pesquisa ser feita por tópicos como: pessoas, atletas, prédios, casas, apartamentos. Era possível baixar um arquivo texto, que continha o endereço de cada uma das imagens. Com essa informação, foi possível criar um código que baixasse todas as imagens de todos os endereços que estivessem no arquivo texto. Foram baixadas 4000 imagens negativas, convertidas para escala de cinza e redimensionadas para 352x240. 25 Figura 3.10: Exemplos de imagens negativas baixadas. Figura 3.11: Exemplos de imagens positivas criadas. Com todos os dados necessários em mãos a função opencv_traincascade pode ser rodada. O tempo de treinamento é diretamente proporcional à quantidade de imagens po- sitivas e negativas, por isso que foram utilizadas apenas 5000 das 8300 positivas e 2500 de 4000 negativas. Mesmo com esse número reduzido, o treinamento levou 7 dias ininter- ruptos. Cada estágio completo da cascata era salvo em um arquivo "stageXX.xml", onde o "XX" era substituído pelo número do estágio correspondente. Isso é feito para os dados não serem perdidos em caso de interrupção do treinamento. Caso fosse interrompido, seria possível retomá-lo a partir do último estágio completo. Quando o treinamento termina, o arquivo "cascade.xml" é criado e ocupa pouquís- simo espaço em disco. Para um classificador de 20 estágios, são necessários 553 KB. A 26 função cv2.CascadeClassifier é responsável pela inicialização do objeto classifica- dor e o método detectMultiScale é responsável pela busca de placas no vídeo, ambas podem ser encontradas em [10]. Os vídeos são tratados como uma sequência de imagens, onde cada "imagem" é cha- mada de quadro ou frame. No caso das câmeras em questão, os vídeos produzidos eram de 25 qps (quadros por segundo) ou fps (frames per second). 1. Inicializa o classificador com cascade.xml. 2. Abre o arquivo de vídeo. 3. Enquanto houver frames para serem lidos do: • Define uma roi. • Aplica o classificador na roi. • Se encontrar placa, salve. Figura 3.12: Pseudo código do programa principal. Como pode ser visto no pseudo código (figura 3.12) o classificador é inicializado com o arquivo proveniente do treino, o vídeo é aberto e os frames são lidos em ordem. A cada leitura é delimitada a região em que as placas dos carros aparecem e aplica-se a função detectMultiScale, para que o classificador encontre as placas na região e possam ser salvas. A roi é definida apenas por questões de desempenho, todo o frame poderia ser passado para a função mas haveria um custo computacional maior. As placas salvas possuem dimensões de 44x20. 27 Figura 3.13: Quadro em que a placa foi detectada e a placa. O retângulo vermelho repre- senta a região em que o classificador atua. Com a detecção da placa e seu salvamento é iniciada a penúltima etapa do projeto, o pré-processamento da placa. 3.0.3 Etapa 3: pré-processamento da placa O Tesseract é responsável pelo reconhecimento dos caracteres, mas se for aplicado na imagem sem um tratamento prévio, ele não funciona, nada é reconhecido. Para o seu correto funcionamento é primordial que seja realizado um pré-processamento na ima- gem. A terceira etapa é encarregada de segmentar os caracteres, permitindo a atuação do Tesseract. 28 1. Conversão da imagem colorida em escala de cinza. 2. Inversão das cores da placa. 3. Cáculo do top hat. 4. Cáculo do bottom hat. 5. Soma o resultado do top hat com a placa obtida na etapa 2. 6. Subtrai o bottom hat do resultado anterior. 7. Aplica a binarização adaptativa por médias gaussianas. 8. Borra a imagem. 9. Aplica a binarização de Otsu. 10. Aplica a técnica de fechamento. 11. Aplica a técnica de abertura. 12. Encontra e salva os contornos que tiverem o formato especificado. Figura 3.14: Pseudo código do programa de pré-processamento. O pseudo código de pré-processamento pode ser visto na figura 3.14. Todas as ope- rações devem ser realizadas sobre imagens em escala de cinza, por isso que a primeira etapa deve ser a conversão. Depois foi feita a inversão das cores para que os caracteres fiquem brancos e o fundo preto. A adição do top hat à imagem convertida e subtração do bottom hat em seguida, serve para maximizar o contraste entre os caracteres brancos e o fundo preto. Aplica-se então a binarização por média gaussiana, mas algumas manchas ainda ficam presentes. Borra-se a imagem e é aplicado a binarização de Otsu como uma segunda etapa. A função cv2.findContours encontra o contorno dos caracteres bran- cos, que são passados para função cv2.boundingRect que retorna a posição e o tamanho do retângulo necessário para envolver o caractere. 29 Etapa 1: Imagem convertida para escala de cinza. Etapa 2: Imagem com inversão de cores. Etapa 3: Top hat sobre a imagem invertida (etapa 2). Etapa 4: Bottom hat sobre a imagem inver- tida (etapa 2). Etapa 5: Soma da imagem invertida (etapa 2) e Top hat (etapa 3). Etapa 6: Subtração do resultado anterior (etapa 5) com o Bottom hat (etapa 4). Figura 3.15: Etapas 1 a 6 do pré-processamento. 30 Etapa 7: Imagem obtida após a aplicação da binarização por médias gaussianas. Etapa 8: Imagem borrada para aplicação da binarização de Otsu. Etapa 9: Resultado da binarização de Otsu. Etapa 10: Imagem após a aplicação da téc- nica de fechamento. Etapa 11: Imagem após a aplicação da téc- nica de abertura. Etapa 12: Imagem com todos os contornos desenhados. Serão selecionados os que tive- rem um tamanho próximo de 160x218. Figura 3.16: Etapas 7 a 12 do pré-processamento. Com o tamanho dos retângulos, é possível filtrar os que forem muito grandes ou me- nores que os demais. Um retângulo necessário para envolver um caractere tem em média 31 160x218 e é adicionada uma tolerância de 50% devido a variação do tamanho dos carac- teres, por exemplo: A letra "M" ocupa um espaço maior que o "I", o mesmo vale para o número "8" e o "1". Com isso, foi possível realizar a extração dos caracteres e passá-los um a um ao Tesseract para o reconhecimento. Figura 3.17: Caracteres selecionados. 3.0.4 Etapa 4: reconhecimento dos caracteres Com a conclusão do pré-processamento, os caracteres já foram segmentados, e a quarta etapa do projeto pode ser iniciada. O comando utilizado para que o reconhecimento fosse realizado pelo Tesseract foi o seguinte: pytesseract.image_to_string(img_array, config=config), onde "img_array" era o caractere em questão e "config" eram diretrizes de configuração para "ajudar" o Tesseract. Será exibida a diretriz e em qual caso foi utilizada: • config = ’–psm 10 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ’ Foi utilizada quando o caractere em questão estava na posição de uma letra da placa. • config = ’–psm 10 -c tessedit_char_whitelist=0123456789’ Foi utilizada quando o caractere em questão estava na posição de um número da placa. • config = ’–psm 10’ Essa diretriz apenas sinaliza que será passado um único caractere ao Tesseract e não uma palavra, por exemplo. Ela foi utilizada quando a funçãode contornos retornava uma quantidade inferior ao número de caracteres presentes em uma placa brasileira. 32 Informações sobre como treinar o Tesseract com um conjunto específico de imagens, bem como a lista completa de diretrizes e funções, podem ser encontrados em [2]. No próximo capítulo, serão analisados os resultados obtidos pelo projeto. 33 Capítulo 4 Resultados Será abordado o desempenho do projeto neste capítulo. Os resultados e suas análises serão divididos nas mesmas etapas do projeto, mas se iniciando a partir da segunda. A obtenção do vídeo foi concluída com sucesso e não se faz necessária uma análise detalhada. 4.0.1 Detecção da placa Na etapa de detecção da placa foi utilizada a seguinte métrica: quantidade de placas detectadas versus quantas estavam presentes no vídeo. Também foi feita a contabilização de falsas detecções versus quadros analisados. Essa avaliação foi dividida no período de dia, com boa luminosidade natural, e a noite com iluminação artificial. Período Placas Percentual de detecçãoDetectadas Total Diurno (15h00m - 17h30m) 61 62 98,4% Noturno (17h31m - 21h00m) 77 129 59,7% Integral 138 191 72,2% Tabela 4.1: Comparativo de detecção correta. Pode ser constatado que a luminosidade é um fator de extrema importância na detec- ção das placas. Durante o período diurno a iluminação natural é suficiente para que o per- centual de acerto do classificador atinja 98.4%. Durante o período noturno a iluminação 34 artificial não é adequada para uma boa visibilidade da placa, formando sombras. Outro fator que prejudicou a detecção, foi a interferência dos faróis. A câmera fica posicionada em um ângulo que sofre a incidência direta dos faróis, quando os veículos estão entrando no condomínio, isso ofusca a placa, que acaba não sendo detectada. A câmera possui visão infravermelha automática, é ativada quando a mesma detecta baixa luminosidade no ambiente, porém nunca é ativada. Isso ocorre devido ao posicionamento inadequado da iluminação local, e da câmera. A luz incide na lente e não para onde a câmera está voltada. Pode ser observado uma característica comum entre as placas não detectadas: os carros eram de cores claras, como brancos e pratas. Isso pode ser explicado como o classificador tendo dificuldade de distinguir o limite entre a placa e o veículo. Figura 4.1: Exemplo de interferência causada pelos faróis. Período Quadros Percentual de falsa detecçãoFalso positivo Total Diurno (15h00m - 17h30m) 55 225000 0,024% Noturno (17h31m - 21h00m) 102 313500 0,033% Integral 157 540000 0,029% Tabela 4.2: Comparativo de falsas detecções. Um baixo índice de falsas detecções foi obtido. Apenas 0,024% no período diurno e 0,033% no noturno. Os principais fatores que influenciam esse quesito são: quantidade de estágios presentes na cascata e muitas imagens tratadas com grande diversidade de fundos. Observe a tabela 4.3: 35 Classificadores Imagens Quantidade de estágiosPositivas Negativas Antigo (v1) 1000 2000 12 Atual (v2) 5000 2500 20 Futuro (v3) 8000 4000 40 Tabela 4.3: Classificadores e suas especificações. Na primeira versão do classificador foram utilizadas apenas 1000 imagens positivas para 2000 negativas, e a cascata possuía 12 estágios. O treinamento foi "rápido", teve duração de aproximadamente 24h, mas o resultado foi muito aquém do esperado. Eram de 5 a 20 falsas detecções por quadro. Figura 4.2: Exemplo de falsas detecções. Para obtenção de melhores resultados, algumas modificações no treinamento foram feitas: utilizou-se 5000 imagens positivas, 2500 negativas, uma cascata com 20 estágios e a proporção de imagens (positivas:negativas) foi invertida. Além de um número mais expressivo de imagens positivas, adicionou-se um tratamento às mesmas para que não fosse introduzida qualquer interferência no treinamento. Aumentou-se a quantidade de estágios para que os falsos positivos fossem reduzidos. A mudança de proporção (1:2 para 2:1) foi adotada devido à necessidade de mais exemplos positivos do que negativos. O treinamento do classificador durou 7 dias ininterruptos até que ficasse pronto. 36 Figura 4.3: Exemplos de placas detectadas pelo classificador. Os resultados da próxima etapa serão apresentados a seguir. 4.0.2 Pré-processamento da placa Na etapa de pré-processamento a métrica utilizada foi a seguinte: quantidade de caracteres segmentados corretamente versus quantos foram analisados. Infelizmente, a resolução da imagem e a distância entre câmera e placa, não permitiram que as técnicas de pré- processamento fossem aplicadas com sucesso. As imagens em alta resolução obtidas com o celular foram utilizadas para ilustrar o funcionamento do pré-processamento e Tesseract. Caracteres Segmentados Total Percentual 77 84 91,7% Tabela 4.4: Desempenho da etapa de pré-processamento. Figura 4.4: Exemplos de falhas na segmentação dos caracteres. O grande desafio desta etapa foi a eliminação de interferências causadas pela ilumina- 37 ção precária, como por exemplo: sombras e caracteres que ficaram "grudados" em alguma "mancha" no processo de binarização. Outro fator complicador foi a diferença de tama- nho entre as imagens utilizadas. Três fatores contribuíram para essa diferença: as fotos provenientes do celular tiveram diferentes distâncias entre câmera e placa; o segundo motivo foi o redimensionamento manual das fotos e o terceiro foi o recorte das placas. O OpenCV não conseguiu trabalhar de forma adequada com o tamanho original da foto (5312x2988). Após as modificações os tamanhos variaram entre 1018x380 e 1363x491. Figura 4.5: Exemplo de segmentação bem sucedida. Os caracteres da placa eram organizados pela sua posição no eixo X . Caso os 7 carac- teres da placa fossem segmentados, seria possível restringir o universo de possibilidades do Tesseract. Esse tema será abordado na próxima etapa. 4.0.3 Reconhecimento dos caracteres Na etapa de reconhecimento a métrica utilizada foi: quantidade de caracteres reconheci- dos versus quantos foram analisados. Caracteres Placas Corretos Analisados Percentual Corretas Total Percentual 68 77 88,3% 2 12 16,7% Tabela 4.5: Desempenho do Tesseract. O Tesseract foi utilizado com o treinamento básico que já vem com ele (out of the box). Os erros mais comuns envolviam as letras "Q" e "O", e o número "6". O percentual de acerto foi calculado sobre os caracteres corretamente segmentados pela etapa de pré- processamento. 38 Figura 4.6: Exemplos de placas reconhecidas pelo Tesseract. No próximo capítulo serão apresentadas sugestões para um melhor desempenho do projeto. 39 Capítulo 5 Trabalhos Futuros Com base nos resultados obtidos, algumas medidas podem ser tomadas para que melho- res resultados sejam alcançados. Essas medidas foram divididas nas mesmas etapas do projeto. 1. Detecção de placas: Alterar o posicionamento da câmera: Se a mesma for colocada em um patamar ligeiramente mais elevado que os faróis dos veículos, a interferência deles seria mitigada ou completamente removida. Ajustar o ângulo de gravação da câmera: Se focalizasse a entrada dos veículos de cima para baixo, algumas vantagens surgiriam: o sistema de gravação por movimento da câmera, seria ativado somente quando algum veículo entrasse ou saísse do condomínio, e um fundo escuro dificilmente seria detectado como um falso positivo. Com o ângulo atual, toda a movimentação do porteiro, da rua, do portão de pedestres e da entrada de veículos é detectada, sendo que o fundo é de cor clara. Isso resulta em horas de gravações desnecessárias, e com grandes chances de falsos positivos surgirem. Ajustar a iluminação artificial: Se o posicionamento das lâmpadas fosse ajus- tado para que a luz incidisse, em sua maior parte, no veículo que estivesse saindo ou entrando do condomínio, ajudaria ao classificador a distinguir com mais clareza os limites das placas e não haveria sombras sobre as mesmas. 40 2. Pré-processamento: Substituição da câmera: Utilizar umacâmera de alta resolução e de preferência infravermelha. Quando a placa é extraída do vídeo, ela precisa de uma quali- dade melhor para que as técnicas de pré-processamento possam ser aplicadas com sucesso. Essa etapa é vital para que o Tesseract possa atuar. O infraver- melho é indicado para esse tipo de aplicação, pois a sua saída ja é em escala de cinza e o contraste entre os caracteres e o restante da placa é mais acentuado que em câmeras convencionais. Padronização das imagens: Se todas as imagens possuíssem tamanhos com pou- cas variações, não seria necessária uma filtragem dos contornos com 50% erro. A partir da padronização do tamanho das imagens, é possível definir ajustes finos do algorítimo. Por exemplo: utilizar um kernel ótimo para as operações morfológicas, valores de constantes utilizados nas binarizações, para que a realização das etapas de pré-processamento sejam aplicadas em imagens "pa- dronizadas". Quanto mais similaridades existirem, melhor será o desempenho do pré-processamento. 3. Reconhecimento com Tesseract: Treinamento específico: O Tesseract possui um módulo de treinamento, em que é possível treina-lo com caracteres próprios. O seu desempenho pode ser melhor se for treinado com os caracteres de saída do pré-processamento, dessa forma, as chances de acerto seriam ampliadas. Inferir o tipo do caractere: Se o tamanho da placa for padronizado, é possível saber se ele é uma letra ou um número apenas se baseando pela sua localiza- ção na placa. Essa inferência somente é realizada quando os 7 caracteres são segmentados com sucesso. Com essas melhorias, o projeto alcançaria resultados que viabilizariam a sua imple- mentação no condomínio. Uma etapa futura seria a integração desse sistema com um 41 banco de dados e a rápida disponibilização desses dados quando fossem necessários. No próximo capítulo as conclusões serão apresentadas. 42 Capítulo 6 Conclusões Com base nos resultados observados, pôde ser constatado que a etapa de detecção e ex- tração da placa, foi executada de forma satisfatória durante o período diurno, algumas medidas ainda precisam ser tomadas para que o percentual de acerto, durante o período noturno, seja acima de 90%. Ainda há a possibilidade de realizar um treinamento utili- zando 8000 imagens positivas, e 4000 negativas para melhorar o desempenho do classifi- cador. Mesmo com uma resolução abaixo da desejada, a técnica de classificadores Haar se mostrou muito eficiente. Quando a iluminação é adequada o objetivo consegue ser alcan- çado 98,4% das vezes, com apenas 0,024% de falsos positivos. A detecção das placas foi feita em tempo-real com um o seguinte hardware: processador Intel(R) Core(TM) i7-7500U CPU 2.70GHz, 16 GB de memória RAM e S.O. Windows 10 64-bit. O desempenho da etapa de pré-processamento foi acima de 90%, mas ajustes finos no algorítimo podem ser feitos para que a segmentação dos caracteres e filtragem de contornos, sejam realizadas de forma mais eficiente. A etapa de reconhecimento não obteve um resultado tão positivo quanto as suas ante- cessoras. O Tesseract precisa de um treinamento específico para o tipo de letra em que irá atuar. Isso evitaria erros comuns entre as letras "Q" e "O" e o número "6". A sua aplica- ção out of the box é prática porém ineficiente quando os caracteres analisados fogem dos padrões de fontes clássicas como "Times New Roman"dentre outras. As letras que foram submetidas à sua análise possuíam um formato mais arredondado por conta da etapa de 43 pré-processamento, e a diferença entre as letras "D", "O", "Q" e "W"ficaram muito sutis para serem detectadas pelo treinamento genérico. Para que a etapa de reconhecimento seja aplicada diretamente à imagem extraída do vídeo, é necessária a substituição da câmera por uma com maior resolução. A chuva nem foi detectada pela câmera atual. Se todas melhorias propostas no capítulo anterior forem realizadas, o algorítimo de pré-processamento poderá ser executado diretamente à imagem extraída do vídeo e os caracteres poderão ser segmentados com sucesso. O Tesseract estaria treinado para esse tipo de caractere e isto impulsionaria seus resultados para um patamar superior. 44 Referências Bibliográficas [1] TEAM, O. “OpenCV”. Última visita - 15/12/2017. Disponível em: <https:// opencv.org/>. [2] “Tesseract Open Source OCR Engine (main repository)”. Última visita - 14/12/2017. Disponível em: <https://github.com/tesseract-ocr/tesseract>. [3] TEAM, P. “Python”. Última visita - 15/12/2017. Disponível em: <https://www. python.org/>. Python is a programming language that lets you work quickly and integrate systems more effectively. [4] “Tesseract”. Última visita - 15/12/2017. Disponível em: <https://en.wikipedia. org/wiki/Tesseract_(software)>. [5] SMITH, R. “An Overview of the Tesseract OCR Engine”, p. 5, 2007. Disponível em: <theraysmith@gmail.com>. [6] VIOLA, P., JONES, M. “Rapid object detection using a boosted cascade of simple features”. In: Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision and Pattern Recognition. CVPR 2001, v. 1, pp. I–511–I–518 vol.1, 2001. [7] “Haar wavelet”. Última visita - 14/12/2017. Disponível em: <https://en. wikipedia.org/wiki/Haar_wavelet>. [8] ABU-MOSTAFA, Y. S., MAGDON-ISMAIL, M., LIN, H.-T. Learning From Data. AMLBook, 2012. ISBN: 1600490069, 9781600490064. [9] SCHAPIRE, R. E., FREUND, Y. “Using AdaBoost to Minimize Training Error”. In: Boosting:Foundations and Algorithms, pp. 53–73, MIT Press, 2012. ISBN: 9780262301183. Disponível em: <http://ieeexplore.ieee.org/xpl/ articleDetails.jsp?arnumber=6282244>. [10] MORDVINTSEV, A., K., A. “OpenCV-Python Tutorials”. Última visita - 14/12/2017. Disponível em: <http://opencv-python-tutroals. readthedocs.io/en/latest/py_tutorials/py_tutorials.html>. 45 https://opencv.org/ https://opencv.org/ https://github.com/tesseract-ocr/tesseract https://www.python.org/ https://www.python.org/ https://en.wikipedia.org/wiki/Tesseract_(software) https://en.wikipedia.org/wiki/Tesseract_(software) theraysmith@gmail.com https://en.wikipedia.org/wiki/Haar_wavelet https://en.wikipedia.org/wiki/Haar_wavelet http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6282244 http://ieeexplore.ieee.org/xpl/articleDetails.jsp?arnumber=6282244 http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html http://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutorials.html [11] MONTEIRO, L. H. “Binarização por Otsu e outras técnicas usadas na Detecção de Placas”, p. 21. [12] PROF. DR. MARIO GAZZIRO, V. R. P. B. “Quadro Segmentação de Imagens”, p. 6, 2013. [13] TOROK, L. “Método de Otsu”, p. 5. Disponível em: <ltorok@ic.uff.br>. [14] GREENTED, D. A. “Otsu Thresholding”. Última visita - 14/12/2017. Dis- ponível em: <http://www.labbookpages.co.uk/software/imgProc/ otsuThreshold.html>. [15] “Video Codecs by FOURCC”. Última visita - 14/12/2017. Disponível em: <http: //www.fourcc.org/codecs.php>. [16] “Cascade Classifier Training”. Última visita - 15/12/2017. Disponível em: <https://docs.opencv.org/2.4.13.4/doc/user_guide/ug_ traincascade.html>. [17] HARRISON. “Creating your own Haar Cascade OpenCV Python Tutorial”. Última visita - 14/12/2017. Disponível em: <https://pythonprogramming.net/ haar-cascade-object-detection-python-opencv-tutorial/>. [18] SEO, N. “Tutorial: OpenCV haartraining (Rapid Object Detection With A Cas- cade of Boosted Classifiers Based on Haar-like Features)”. Última visita - 14/12/2017. Disponível em: <http://note.sonots.com/SciSoftware/ haartraining.html>. [19] BALL, T. “TRAIN YOUR OWN OPENCV HAAR CLASSIFIER”. Última visita - 14/12/2017. Disponível em: <http://coding-robin.de/2013/07/22/ train-your-own-opencv-haar-classifier.html>. [20] “Training Haar Cascades”. Última visita - 14/12/2017. Disponível em: <https: //memememememememe.me/post/training-haar-cascades/>. [21] THOMPSON, J. “Teaching computers to recognize other computers, funded by Impakt.nl”. Últimavisita - 14/12/2017. Disponível em: <https://github. com/jeffThompson/MirrorTest>. [22] MAKES, D. “Make your own Haar Cascade on Windows | Quick & Simple”. Última visita - 14/12/2017. Disponível em: <https://www.youtube.com/watch? v=Dg-4MoABv4I>. [23] PELL, J. “Haar Cascade Tutorial You Tube”. Última visita - 14/12/2017. Disponível em: <https://www.youtube.com/watch?v=KFC6jxBKtBQ>. 46 ltorok@ic.uff.br http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html http://www.labbookpages.co.uk/software/imgProc/otsuThreshold.html http://www.fourcc.org/codecs.php http://www.fourcc.org/codecs.php https://docs.opencv.org/2.4.13.4/doc/user_guide/ug_traincascade.html https://docs.opencv.org/2.4.13.4/doc/user_guide/ug_traincascade.html https://pythonprogramming.net/haar-cascade-object-detection-python-opencv-tutorial/ https://pythonprogramming.net/haar-cascade-object-detection-python-opencv-tutorial/ http://note.sonots.com/SciSoftware/haartraining.html http://note.sonots.com/SciSoftware/haartraining.html http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html http://coding-robin.de/2013/07/22/train-your-own-opencv-haar-classifier.html https://memememememememe.me/post/training-haar-cascades/ https://memememememememe.me/post/training-haar-cascades/ https://github.com/jeffThompson/MirrorTest https://github.com/jeffThompson/MirrorTest https://www.youtube.com/watch?v=Dg-4MoABv4I https://www.youtube.com/watch?v=Dg-4MoABv4I https://www.youtube.com/watch?v=KFC6jxBKtBQ [24] Última visita - 14/12/2017. Disponível em: <http://www.image-net.org/>. ImageNet is an image database organized according to the WordNet hierarchy (currently only the nouns), in which each node of the hierarchy is depicted by hundreds and thousands of images. Currently we have an average of over five hundred images per node. We hope ImageNet will become a useful resource for researchers, educators, students and all of you who share our passion for pictures. 47 http://www.image-net.org/ Lista de Figuras Lista de Tabelas 1 Introdução 2 Teoria e Ferramentas 2.1 Python 2.2 OpenCV 2.3 Tesseract 2.4 Imagem Integral (Integral Images) 2.5 Atributos de Haar 2.6 AdaBoost 2.7 Classificadores Haar em cascata 2.8 Histograma 2.9 Binarização 2.10 Operações Morfológicas 2.10.1 Erosão (Erosion) 2.10.2 Dilatação (Dilation) 2.10.3 Abertura (Opening) 2.10.4 Fechamento (Closing) 2.10.5 Top hat 2.10.6 Bottom hat 2.11 Extrator de Contornos 3 Construção e Funcionamento do Sistema 3.0.1 Etapa 1: obtenção do vídeo 3.0.2 Etapa 2: detecção da placa 3.0.3 Etapa 3: pré-processamento da placa 3.0.4 Etapa 4: reconhecimento dos caracteres 4 Resultados 4.0.1 Detecção da placa 4.0.2 Pré-processamento da placa 4.0.3 Reconhecimento dos caracteres 5 Trabalhos Futuros 6 Conclusões Referências Bibliográficas
Compartilhar