reconhecimento de impressões digitais

Propaganda
UNIVERSIDADE FEDERAL DA BAHIA
FACULDADE DE CIÊNCIAS DA COMPUTAÇÃO
BRUNO ARGOLO BITTENCOURT DE OLIVEIRA
RECONHECIMENTO DE IMPRESSÕES DIGITAIS:
UMA APLICAÇÃO UTILIZANDO CAMPOS BLOB
Salvador
2006
BRUNO ARGOLO BITTENCOURT DE OLIVEIRA
RECONHECIMENTO DE IMPRESSÕES DIGITAIS:
UMA APLICAÇÃO UTILIZANDO CAMPOS BLOB
Monografia apresentada ao Curso de graduação em Ciências da
Computação, Faculdade de Ciências da Computação,
Universidade Federal da Bahia, como requisito parcial para
obtenção do grau de Bacharel em Ciências da Computação.
Orientador: Prof. Leopoldo Souza
Salvador
2006
AGRADECIMENTOS
Muitos foram aqueles que contribuíram para este trabalho. É a eles que me dirijo nas
breves palavras abaixo:
À Professora. Fabíola Greve e todos os participantes do GAUDI (Grupo de
Algoritmos e Computação Distribuída), especialmente Amadeu Júnior, que me
cederam materiais, indicaram fontes e me permitiram participar de seminários, que
muito contribuíram para elaboração deste trabalho.
Ao Professor Orientador Leopoldo Souza, pela dedicação e tempo gasto no processo
de orientação, e também por permitir a realização deste trabalho.
Aos meus amigos e família pela ajuda e compreensão nos momentos de que tive que
me ausentar.
À Jane minha namorada que me apoiou com paciência durante todo o processo de
desenvolvimento deste trabalho.
Muito obrigado por possibilitarem esta experiência única, que é de grande
importância para mim.
SUMÁRIO
1. INTRODUÇÃO .......................................................................................................................... 3
2. OBJETIVO ................................................................................................................................. 3
3. EMBASAMENTO TEÓRICO .................................................................................................... 4
3.1 BLOB (Binary Large Objects)............................................................................................... 4
3.2 Impressões digitais ................................................................................................................ 5
3.2.1 FM (False Match) e FNM (False Non Match) ................................................................. 5
3.2.2 Linhas Dactilares ............................................................................................................ 6
3.2.3 Núcleos e Deltas............................................................................................................. 7
3.2.4 Sistema de Henry............................................................................................................ 8
3.2.5 Minúcias (Detalhes de Galton)........................................................................................ 9
3.3 UDF (User Defined Function) ............................................................................................... 9
3.4 PostgreSQL ......................................................................................................................... 10
3.5 CYGWIN............................................................................................................................ 10
3.6 NFIS2 (NIST Fingerprint Image Software 2)....................................................................... 11
3.6.1 PCASYS ...................................................................................................................... 12
3.6.2 MINDTCT ................................................................................................................... 12
3.6.3 NFIQ ............................................................................................................................ 20
3.6.4 BOZORTH3................................................................................................................. 21
3.7 FVC 2004(Fingerprint Verification Competition): ............................................................... 22
4. PROJETO ................................................................................................................................. 23
4.1 UDFs no Postgres................................................................................................................ 24
4.1.1 UDFs em C no Postgres................................................................................................ 24
4.1.2 UDFs em Java no Postgres............................................................................................ 27
5 ESTATÍSTICAS ........................................................................................................................ 30
6. CONCLUSÕES E PERSPECTIVAS FUTURAS ...................................................................... 34
7. REFERÊNCIAS........................................................................................................................ 36
LISTA DE FIGURAS
Figura 1: FM, FNM e taxa de cruzamento.......................................................................................... 6
Figura 2: Linhas dactilares...................................................................................................................7
Figura 3: Delta e núcleo de uma impressão digital..............................................................................7
Figura 4: Sistema de linhas...................................................................................................................8
Figura 5: As cinco classes propostas por Henry, em destaque os núcleos e deltas..............................9
Figura 6: Movimentação das janelas..................................................................................................13
Figura 7: Formas de onda...................................................................................................................14
Figura 8: Mapa direcional..................................................................................................................15
Figura 9: Mapa de baixo fluxo...........................................................................................................16
Figura 10: Mapa de qualidade............................................................................................................17
Figura 11: Impressão digital antes e depois da binarização...............................................................18
Figura 12: Padrões para detecção de finais de cristas........................................................................18
Figura 13. Padrões usados para detectar minúcias.............................................................................19
Figura 14: Minúcias detectadas..........................................................................................................20
Figura 15: Gráfico das incidências de FM para os quatro bancos de dados da FVC2004.................32
Figura 16: Gráfico das incidências de FNM para os quatro bancos de dados da FVC2004..............33
Figura 16: gráfico da qualidade das impressões dos quatro bancos de dados da FVC2004..............34
LISTA DE TABELAS
Tabela 1: As quatro bases de dados da FVC 2004.............................................................................22
Tabela 2: Tipos em C equivalentes a tipos SQL para o PostgreSQL.................................................25
Tabela 3: Incidências de FM..............................................................................................................31
Tabela 4: Incidências de FNM para os quatro bancos de dados da FVC2004...................................32
Tabela 5: qualidade das impressões nos quatro bancos de dados da FVC2004.................................34
LISTA DE CÓDIGOS
Código 1: Convenção de chamada versão 1.......................................................................................25
Código 2: Exemplo de UDF versão 1.................................................................................................26
Código 3: Exemplo de como registrar uma função............................................................................26
Código 4: Definição do domain lo.....................................................................................................26
Código 5: Método run da classe RunComand....................................................................................27
Código 6: Registrando a UDF runcomand(varchar, varchar)............................................................27
Código 7: Registrando a UDF ID_extrairMinucias(oid)....................................................................28
Código 8: Extraindo as minúcias........................................................................................................28
Código 9: Registrando a UDF ID_compararMinuciasINT(oid, oid, integer)....................................29
Código 10: Comparando impressões digitais.....................................................................................30
Código 11: Buscando impressões do mesmo dedo............................................................................30
Código 12: registrando a UDF ID_qualidade(oid).............................................................................31
Código 13: Comparando os 8 primeiros dedos com todos os outros de um banco da FVC..............31
Código 14: Obtendo a taxa de FM.....................................................................................................32
Código 15: Obtendo a taxa de FNM...................................................................................................33
Código 17: obtendo a qualidade das impressões dos quatro bancos de dados da FVC2004.............34
RESUMO
O foco deste trabalho é o estudo de maneiras para incorporar o reconhecimento de
impressões digitais em um banco de dados popular e de código aberto, de modo a simplificar esse
processo para os usuários de bancos de dados, estimulando o uso desta tecnologia, visando o
aprimoramento das técnicas existentes e propondo alternativas simples e seguras para se trabalhar
com a datiloscopia.
São estudadas duas aproximações para extender o SGBD, para que seja possível fazer
todo o controle, armazenamento e comparação das impressões apenas através do mesmo.
A proposta geral é contribuir com um passo inicial para que tanto a comunidade
desenvolvedora de software livre quanto a comunidade privada possam construir aplicações de
reconhecimento de impressões digitais eficientes, seguras e integradas.
1
ABSTRACT
This paper focuses in the study of alternatives to incorporate the fingerprint recognition
technology in a popular yet open source database, in a way to simplify the fingerprint recognition
process to database users. Stimulating the use of this technology, aiming the improvement of the
existent techniques, proposing simple and safe alternatives to work with dactiloscopy.
Two different approaches are proposed to extend the DBMS (Database Management
System), in order to make it possible to control, store and compare fingerprints only throughout it.
The general proposal is to contribute with an initial push so both the free software
community and the private one may build efficient, safe and integrated fingerprint recognition
applications.
2
1. INTRODUÇÃO
Num mundo cada vez mais interconectado, a necessidade de validar a identidade de um
indivíduo de maneira rápida e segura se torna cada vez mais evidente. O reconhecimento de
impressões digitais, abordado na biometria, vem se mostrando uma alternativa promissora no que se
refere aos meios automáticos de identificação pessoal.
A biometria aborda diversos meios de identificação pessoal, reconhecimento pela face,
retina, íris, voz, entre outros. A datiloscopia é a parte da biometria que estuda o reconhecimento de
impressões digitais. Esta ciência vem sendo usada desde 1893 quando o Home Ministry Office, do
Reino Unido, concordou que dois indivíduos distintos não podem ter as mesmas impressões digitais
(Maio et al., 2003). Logo após isto, grandes departamentos criminais adotaram a idéia de registrar
as impressões digitais de todos os criminosos capturados.
Apesar da improvisação de métodos para aumentar a eficiência do reconhecimento
manual das impressões, o crescimento excessivo da demanda e a lentidão da realização de todo o
processo de reconhecimento levou os departamentos da lei a depreender esforços consideráveis em
pesquisas sobre a automação do reconhecimento de impressões digitais. Estes esforços culminaram
com surgimento dos AFISs (Automatic Fingerprint Identification Systems) (Maio et al.,2003).
Primeiramente usados pelas agências de manutenção da lei, os AFIS logo se revelaram
como uma boa tática para redução do número de fraudes em aplicações comerciais, seja em catracas
eletrônicas, gerenciamento de informações de cunho confidencial ou simplesmente para destravar o
teclado de um celular.
2. OBJETIVO
Tornar a tecnologia de reconhecimento de impressões digitais mais segura e acessível à
comunidade por meio do encapsulamento das funções de reconhecimento e classificação de
impressões digitais em banco de dados livre e do armazenamento das impressões propriamente ditas
também no banco de dados através de campos BLOB (Binary Large Objects), possibilitando, ainda,
uma maior visibilidade da tecnologia pelos desenvolvedores de software livre e por empresas
privadas. Aumentando, possivelmente, o interesse destas nesta tecnologia, o que traria grandes
benefícios ao desenvolvimento da área.
3
3. EMBASAMENTO TEÓRICO
3.1 BLOB (Binary Large Objects)
Muitos dos antigos sistemas de bancos de dados foram desenvolvidos para manipular
dados pequenos, representados em campos de 255 bytes ou menos. Campos grandes constantemente
apresentavam problemas para os SGBDs (Sistema de Gerenciamento de Banco de Dados) (Shapiro
et al., 1999).
SGBDs mais recentes apresentam suporte a campos LOBs (Large Objects), nos quais é
possível armazenar grandes quantidades de dados. Os campos BLOB são nada mais do que campos
LOB, porém com conteúdo binário, uma vez que campos LOB podem conter texto em ASCII, por
exemplo.
Muitas das pesquisas feitas sobre o desenvolvimento de mecanismos para gerenciar
sistemas de dados com campos LOB têm como foco os seguintes objetivos (Shapiro et al., 1999):
•
Alocação e desalocação devem ser eficientes;
•
O gerenciador de campos LOB deve ter boa performance de I/O (Input / Output), sendo que
as operações de leitura e escrita devem alcançar taxas próximas às de transferência de disco;
•
Campos LOB devem ser recuperáveis, mas o processo de recuperação não deve tornar as
operações no campo mais lentas.
Pesquisas em sistemas de bancos de dados e de sistemas de arquivos resultaram em
mecanismos de armazenamento rápidos e eficientes, o que faz os usuários de bancos de dados se
perguntarem cada vez mais sobre as vantagens de se utilizar armazenamento em BLOB (Shapiro et
al., 1999).
Kurt (Löwnertz, 1998) comenta no livro Change and Exchange que os sistemas de
gerenciamento eletrônico de documentos mais integrados e seguros são aqueles que usam campos
BLOB. O argumento utilizado é que os documentos devem ser acessados somente pelo sistema de
gerenciamento para que uma integração total do processo possa ser assegurada. Ninguém pode criar
editar ou apagar um documento sem passar pelo SGBD. Além disso, existe a possibilidade de
utilização dos mecanismos de controle de integridade, transação e controle de concorrência,
eliminando possíveis problemas de inconsistência. Por outro lado, essa idéia esbarra no problema
do pouco conhecimento que o SGBD possui sobre o dado armazenado como BLOB (na verdade o
BLOB é considerado uma "caixa preta") (Queiroz, 2002). O SGBD não fornece mecanismo para
4
possibilitar a criação de índices ou criação de operações sobre estes campos, sendo necessário o
desenvolvimento de "extensões" do SGBD para poder trabalhar com estes campos (Queiroz, 2002).
A armazenagem em campos BLOB tem seu preço. Os arquivos podem ocupar mais
espaço e a leitura e escrita se tornarem mais lentas. Porém, neste projeto não entraremos no mérito
sobre qual sistema de armazenamento é mais eficiente, mas simplesmente construiremos uma
aplicação que utilize armazenamento em campos BLOB aplicado no reconhecimento de impressões
digitais.
3.2 Impressões digitais
No que se refere à aquisição, existem duas maneiras mais utilizadas: uma é a impressão
tintada, onde o individuo mela o dedo com tinta e rola o mesmo sobre um papel, na intenção de não
ocorrerem borrões e manchas, mas, ainda assim, os mesmos ocorrem rotineiramente, seja por falta
ou excesso de tinta ou ainda pela execução errada do movimento de rolagem do dedo (Chong et al.,
1992), (Hong et al., 1996). Se a qualidade não corresponder a um padrão aceitável torna-se
extremamente difícil a verificação da impressão (Coetze et al., 1993), (Eleccion, 1973); o outro
método consiste na utilização de um sensor biométrico, onde a impressão é lida diretamente do
dedo da pessoa através de um scanner.
Dependendo do domínio da aplicação um sistema biométrico pode operar on-line ou
off-line. Um sistema on-line tem fortes restrições quanto ao tempo de resposta e é, em geral,
completamente automático. Sistemas off-line podem ter menor restrição de tempo e a atividade
pode ser supervisionada por um técnico. Por exemplo, em um sistema prisional um expert forense
pode guiar a coleta das impressões podendo garantir um maior nível de qualidade das impressões.
3.2.1 FM (False Match) e FNM (False Non Match)
Um sistema biométrico típico comete dois tipos de erros: falsa aceitação (FM - FALSE
MATCH) e falsa rejeição (FNM - FALSE NON MATCH) (Maio et al., 2003). A falsa aceitação
ocorre quando o sistema verifica erroneamente a legitimidade de um impostor. Já na falsa rejeição o
individuo legitimo não é reconhecido quando duas de suas impressões são verificadas.
As taxas de FM e FNM são dependentes uma da outra. Uma baixa taxa de FM conduz a
uma alta taxa de FNM e vice-versa. O número de minúcias que serão comparadas é dependente do
nível de segurança especificado. Quanto maior a segurança, maior é o número de minúcias
verificadas, mas isso aumenta a taxa de falsa rejeição (Costa, 2001), podendo gerar transtornos para
os usuários do sistema. A relação entre as taxas de FM e FNM é mostrada na figura 1.
5
Figura 1: FM, FNM e taxa de cruzamento.
Taxas de FM e FNM não foram levantadas para este projeto já que isso é uma preocupação
específica do tipo de aplicação no qual o sistema será utilizado.
3.2.2 Linhas Dactilares
Na literatura, a caracterização de aspectos de impressões digitais tem sido apresentada
por Galton (Karu et al., 1996), Henry (Henry, 1905) e pelo FBI (FBI, 1984). Galton foi o primeiro a
fazer um estudo dos aspectos das impressões digitais (Costa, 2001).
Galton constatou que a impressão digital é formada por linhas, chamadas de linhas
dactilares. Essas linhas se dividem em cristas e vales, onde as cristas são formadas pela parte em
relevo das linhas, e os vales situam-se entre duas cristas. Em uma imagem, tanto em papel, como
em meio magnético, as cristas são representadas pela parte escura da imagem, e os vales pela parte
clara (Oliveira, 2002).
6
Figura 2: Linhas dactilares.
3.2.3 Núcleos e Deltas
Henry foi o primeiro a dividir as impressões em diferentes classes, definindo um
sistema de classificação designado de o sistema de Henry (Rao et al., 1978).
Para se classificar as impressões são utilizados pontos singulares chamados núcleos e
deltas (figura 3)
Figura 3: Delta e núcleo de uma impressão digital.
O núcleo fica localizado na área central da impressão digital (Costa, 2001). O delta é
um ângulo ou triângulo formado pelas cristas e pode ser formado pela bifurcação de uma linha
simples ou pela brusca divergência de duas linhas paralelas. Os deltas representam o ponto de
divergência das linhas dactilares mais internas que tendem a envolver a região nuclear de uma
impressão digital. Em impressões digitais isentas de pontos delta, verifica-se somente os sistemas
de linhas basilar e marginal, caso dos arcos planos. As impressões que apresentam um ou dois
deltas, possuem três sistemas de linhas denominados: nuclear (região central de impressão), basilar
(linha que serve de base, abaixo da região nuclear) e marginal (região das características situadas
nas margens de impressão) como mostrado na figura 4.
7
Figura 4: Sistema de linhas.
3.2.4 Sistema de Henry
Este sistema classifica as impressões digitais em cinco classes. São elas:
•
Arco Plano: Não apresentam delta, as linhas são levemente curvas, atravessando o dado de
um lado ou outro.
•
Arco Angular: Apresentam acentuada elevação das linhas no centro, em forma de tenda.
Pode apresentar um delta, mas sem linha ou fragmento de linha entre o delta e o núcleo.
•
Presilha Interna (Direita): Apresenta um delta à direita do observador, as linhas dactilares
correm para a esquerda em forma de laçadas, ou seja, as linhas formam-se à esquerda do
observador, curvam-se e tendem a voltar para o mesmo lado.
•
Presilha Externa (Esquerda): Apresentam um delta à esquerda do observador, as linhas
dactilares correm para a direita do observador, ou seja, as linhas formam-se na direita do
observador, curvam-se no centro da impressão e tendem a voltar para o mesmo lado.
•
Verticilo: Apresentam dois deltas, sendo um à direita e outro à esquerda o observador; as
linhas nucleares ficam encerradas entre os dois deltas, assumindo configurações variadas.
8
Figura 5: As cinco classes propostas por Henry, em destaque os núcleos e deltas.
Segundo O FBI (Federal Bureau of Investigation), foi constatado que 65% dos padrões
são presilhas, 30% são verticilos e 5% são arcos (Moayer et al., 1975).
3.2.5 Minúcias (Detalhes de Galton)
As minúcias são acidentes que se encontram nas cristas, quando estas terminam
abruptamente ou se bifurcam. O conjunto de acidentes (minúcias) em uma impressão digital é único
e pode ser usado para distinguir um ser humano de outro. Segundo Costa (2001), doze minúcias
encontradas em uma impressão digital são suficientes para que seja feita a identificação de uma
pessoa.
O retorno de um programa comparador de minúcias é geralmente um score ou
pontuação, que indica o grau de similaridade entre as impressões ou simplesmente a quantidade de
minúcias em comum. Para tomar a decisão se as impressões são de um mesmo dedo utiliza-se um
ponto de corte t. Se a quantidade de minúcias em comum nas duas impressões ultrapassar o valor de
t então temos um casamento, do contrário dizemos que as duas impressões não puderam ser
verificadas como pertencendo ao mesmo dedo.
3.3 UDF (User Defined Function)
Em bancos de dados SQL (Structured Query Language) uma UDF é um mecanismo
para estender as funcionalidades do SGBD ao se criar funções que podem ser usadas nos comandos
9
SQL. UDFs podem ser invocadas do mesmo modo que as funções intrínsecas do SGBD, como a
função replace (varchar, varchar, varchar), por exemplo.
Conceitualmente a UDF é executada uma vez por linha da consulta, por exemplo, numa
tabela de elementos químicos, chamada “ELEMENTOS”, onde cada elemento tem seu ponto de
fusão em Farenheights, poderíamos construir uma UDF chamada FarenheightToCelsius (float) onde
ao rodar o comando SQL: SELECT elemento, FarenheightToCelsius( pontoFusao ) as pontoFusao FROM
ELEMENTOS
será retornado o nome do elemento e o ponto de fusão em Celsius para cada linha da
tabela.
UDFs não devem ser confundidas com Stored Procedures. Esta última permite apenas
que o usuário agrupe comandos SQL ou de outra linguagem. Ela pode aceitar parâmetros e executar
comandos mas não é uma expressão e portanto não pode ser usada como uma UDF.
3.4 PostgreSQL
PostgreSQL é um sistema de gerenciamento de dados objeto-relacional, baseado no
Postgres 4.2, desenvolvido na Universidade da Califórnia no departamento de Ciências da
Computação. O Postgres foi pioneiro em diversos conceitos que apenas se tornaram disponíveis em
bancos de dados comerciais muito tempo depois.
O PostgreSQL suporta grande parte dos padrões SQL e devido a seu tipo de licença
BSD (Berkeley Software Distribution), pode ser modificado e distribuído por qualquer um
gratuitamente e para qualquer propósito, seja privado, comercial ou acadêmico, de código aberto ou
fechado.
Este foi o SGBD escolhido, pois além de ser um sistema aberto com licença flexível o
PostgreSQL é um banco altamente flexível onde UDFs e Procedures podem ser construídas em
mais de uma dúzia de linguagens diferentes.
3.5 CYGWIN
O CYGWIN é um ambiente LINUX para Windows, que consiste de duas partes: uma
DLL dygwin1.dll que age como uma camada de emulação de API provendo grande parte das
funcionalidades das APIs do LINUX e um conjunto de ferramentas que provêm acesso as estas
funcionalidades, entre estas ferramentas está um SHELL LINUX.
10
O CYGWIN não roda aplicativos nativos do Linux. É necessário recompilar a aplicação
para que a mesma possa rodar. O mesmo também não serve para tornar aplicativos linux cientes das
funcionalidades UNIX.
3.6 NFIS2 (NIST Fingerprint Image Software 2)
Em conjunto com o GAUDI (Grupo de Algoritmos e Computação Distribuída) da
UFBA (Universidade Federal da Bahia), com o qual foi obtida maior parte da bibliografia sobre
impressões digitais, foi obtido ainda o pacote de softwares NFIS2, pertencente ao NIST (National
Institute of Standards and Technology) e ao FBI (Federal Bureal of Investigation).
O FBI vem utilizando tecnologia digital para ajudar a colher, guardar e localizar
impressões desde 1970. No começo dos anos noventa, a agência começou a desenvolver uma
sistema para permitir o compartilhamento de impressões digitais entre diferentes agências. Este
sistema é chamado de IAFIS (Integrated Automated Fingerprint Identification System).
Ao longo dos anos o FBI acumulou mais de quarenta milhões de impressões e chegam a
lidar com mais de sessenta mil requisições diárias relacionadas às mesmas. A demanda, originada
inicialmente para dar suporte a investigações criminais, começaram também a abranger pedidos
para condução de checagem de civis, a carga de trabalho que era antes 80% criminal e 20% civil
está rapidamente se aproximando de 50% criminal e 50% civil.
Devido à necessidade de um grande melhoramento na velocidade, a qualidade da
verificação automática de impressões digitais o FBI em conjunto com o NIST criou o NFIS. Este
pacote, agora na versão 2, contém código fonte em C e roda na plataforma Unix, mas pode ser
compilado no Windows usando o CYGWIN. O NFIS2 é dividido em sete pacotes dos quais apenas
cinco serão usados neste projeto, são eles:
o PCASYS: Classificador impressões digitais
o MINDTCT: Detector de minúcias.
o NFIQ: Rede neural para detecção da qualidade da imagem
o BOZORTH3: um sistema de comparação de minúcias
o IMGTOOLS: pacote de softwares manipuladores de imagens.
Destes pacotes merecem destaque o MINDTCT e o BOZORTH3, que juntos são
responsáveis pela identificação de uma impressão digital. O PCASYS e o NFIQ podem ser
11
utilizados meramente como forma de aumentar performance do sistema ao possibilitar a criação de
índices.
3.6.1 PCASYS
Possibilita a classificação das impressões em um dos seguintes tipos: arco, arco angular,
presilha esquerda, presilha direita, verticilo e cicatriz. Não será usado neste projeto pelo fato de só
trabalhar com impressões pertencentes ao SD14 (NIST special database 14).
3.6.2 MINDTCT
Os algoritmos usados no MINDTCT foram inspirados pelo "Home Office's Automatic
Fingerprint Recognition System" especialmente o conjunto de algoritmos comumente referidos
como "HO39".
O MINDTCTD foi desenvolvido para receber uma imagem scaneada a 19,9 ppmm e
com 256 níveis de cinza. O programa pode ler arquivos nos formatos: ANSI/NIST, WSQ (Wavelet
Scalar Quantization), JPEGL (JPEG Loss Less), e formatos IHEAD.
a. Geração de mapas de qualidade de imagem
Devido ao fato de que a qualidade da imagem de uma impressão digital poder variar,
especialmente no caso de impressões latentes (impressões deixadas em cenas de crime), torna-se
crítica a possibilidade de analisar a imagem e determinar áreas degradadas. Diversas características
podem ser medidas para se obter uma representação da qualidade da área. O que inclui determinar o
fluxo direcional das cristas, regiões de baixo contraste, pequeno fluxo de cristas e grandes
curvaturas. Estas três últimas condições representam áreas instáveis na imagem onde a detecção das
minúcias não é confiável.
a.1 Mapa Direcional
Este é um mapa de fluxo das cristas, que tem como propósito representar áreas da
imagem com estrutura de cristas suficientes para a detecção de minúcias. Cristas visíveis e bem
formadas são essenciais para que se possa haver confiança na detecção das minúcias. O mapa
direcional guarda ainda a orientação geral das cristas.
A técnica usada pelo MINDTCT para fazer o mapa direcional consiste em dividir a
imagem em blocos de 8x8 pixels, onde todos os pixels de cada bloco recebem os mesmos
resultados. Ao usar a estratégia de blocos deve-se escolher a área necessária para extrair as
informações. O MINDTCT utiliza uma janela de 24 pixels de onde são extraídas as informações
para determinar a direção do fluxo das cristas de um bloco. O centro da janela é posicionado no
12
centro do bloco como mostrado na figura 01. Este processo ajuda a diminuir a descontinuidade da
direção dos fluxos das cristas.
Figura 6: movimentação das janelas.
A última linha da figura 06 ilustra o funcionamento do esquema de janelas. Na figura os
blocos estão representados pela linha e coluna, ou seja, o bloco 1,1 é o bloco na linha 1 coluna 1. A
imagem mais à esquerda mostra o bloco 1,1 sendo computado, em seguida a janela se move um
bloco para a direita; estamos agora na segunda imagem onde o bloco 1,2 é computado; em seguida
vem o bloco 2,1 e o 2,2.
Uma vez descrito o modus operandi do esquema de janelas e blocos, podemos explicar
como se dá o processamento em cada bloco. Para cada bloco, a janela é rotacionada
incrementalmente em ângulos de 11,25º e para cada rotação uma transformada de Fourier discreta é
feita e armazenada para cada bloco.
Para determinar a direção do fluxo das cristas em cada bloco cada uma das orientações
da janela é analisada. Dentro de cada orientação as linhas da janela são somadas formando um vetor
de 24 somatórios de linhas. As 16 orientações geram um vetor com 16 vetores de somatórios de
linhas. Cada vetor deste é sobreposto a quatro tipos de onda de freqüências crescentes. Isto é
13
mostrado na figura 7. A primeira forma de onda tem um único período, a segunda tem dois
períodos, a terceira tem quatro períodos e a quarta tem oito períodos. Os valores de seno e co-seno
são calculados para cada unidade do vetor. O quadrado do seno é somado ao quadrado do co-seno
produzindo um coeficiente de ressonância que representa quão bem o vetor se encaixa na forma de
onda.
Figura 7: formas de onda.
A primeira forma de onda representa as cristas e vales com largura de cerca de 12
pixels. A segunda forma de onda representa cristas e vales com 6 pixels de largura. A terceira forma
de onda representa cristas e vales com 3 pixels de largura. Finalmente a quarta forma de onda
representa cristas e vales com 1,5 pixel de largura. Dadas imagens de 19,69 ppmm este
procedimento cobre cristas e vales com valores que vão de 0,6mm a 0,075mm.
14
Figura 8: mapa direcional.
a.2 Mapa de baixo contraste
Em alguns casos é difícil ou até impossível determinar a direção dominante em certas
partes da imagem, principalmente em áreas de baixo contraste ou com manchas e borrões. É
desejável realizar a detecção destas áreas e prevenir que sejam associadas direções de fluxo de
cristas artificialmente às mesmas. Minúcias não são detectadas em áreas de baixo contraste.
Uma maneira de distinguir blocos com baixo contraste de blocos, com cristas bem
definidas é comparar a distribuição das intensidades dos pixels. Numa área com baixo contraste a
intensidade varia pouco entre os pixels. Já quando as intensidades dos pixels variam de muito alto
para muito baixo isto quer dizer que a área apresenta cristas bem definidas.
a.3 Mapa de baixo fluxo
É possível que ao derivar o mapa direcional alguns blocos fiquem sem direção
dominante. Estes blocos geralmente são áreas de baixa qualidade. Então, alguns destes blocos terão
direção definida com base nos seus vizinhos. Porém, é gerado um mapa que guarda quais blocos
não tiveram a direção definida no primeiro momento. Estes blocos ganham graus de
confiabilidade/qualidade menores do que outros. O mesmo ocorre em áreas com grandes curvaturas,
principalmente com os deltas. No caso de uma minúcia ser identificada numa área de grande
curvatura esta minúcia ganha um grau de confiabilidade/qualidade baixo. A figura 9 mostra
marcadas com cruzes brancas as áreas de grande curvatura.
15
Figura 9: mapa de baixo fluxo.
a.4 Mapa de qualidade
Como vimos, os blocos de baixo contraste, grandes curvaturas ou aqueles a que não
foram atribuídas direções numa primeira análise apontam para blocos de baixa qualidade, que
culminam na formação de um mapa de qualidade como mostrado na figura 10, onde cada número
representa um fator de qualidade do bloco de mesma posição:
16
0000000000000000000000000000000000000000000000000
0111111122222222112222222222222222222222211000000
0112222233333333333444444444444444444444333211100
0122222223233444444444444444444444444444433321110
0122222223333444444444444444444444444444443332210
0122233233333444444444444444444444444444444333210
0122333333344444444444444444444444444444444444210
0123333333444444444444444444444443333344444444210
0123334444444444444444444444444443333344444444210
0124444444444444444444444444444443323344444444210
0124444444444444444444444444444433333333444444210
0124444444444444444444444444444433333333344444210
0124444444444444444444444444444433233233333344210
0124444444444444444444444444444433333323333344210
0124444444444444444444444444444433333333323344210
0124444444444444444444444444444444443333333344210
0124444444444444433333444444444444444443333344210
0124444444444444333333444444444444444444444444210
0124444444444444332233444444444444444444444444210
0124444444444444332233444444444444444444444444210
0124444444444444333333444444444444444444444444210
0124444444444444333333444444444444444444444444210
0124444444444444444444444444444444444433333444210
0114444444444444444444444444444444444433333444210
0114444444444444444444444444444444444433233444210
0114444444444444444444444444444444444433333444210
0113444444444333333333343333334444444433333444210
0113444444444333333333333333334444444444444444210
0014444443333334333323332333333444444444444444210
0001111111111111111111111111111111111111111111110
0000000000000000000000000000000000000000000000000
Figura 10: mapa de qualidade.
b. Binarização da imagem
O algoritmo de detecção de minúcias foi desenvolvido para trabalhar com imagens
binárias (pretas e brancas). Uma técnica para binarizar imagens é o algoritmo de Threshold.
Threshold é uma palavra da língua inglesa que significa limiar, limite. O algoritmo do threshold
baseia-se em escolher um ponto limite para o nível de cinza (no caso de 0 a 255) e transformar
todos os pixels abaixo ou neste limite em 0 e todos acima deste limite em 1. Desta forma temos a
binarização da imagem que deixará de ser em níveis de cinza para se tornar preta e branca. É
importante notar que devido aos diferentes níveis de contraste e qualidade das diferentes áreas de
uma mesma impressão digital, o ideal é dividir a imagem em pequenos blocos de 8x8 ou 10x10
pixels, e então calcular um ponto limite diferente para cada um desses blocos, isso se chama
threshold adaptativo. A figura 11 mostra uma imagem antes e depois da binarização.
17
Figura 11: impressão digital antes e depois da binarização.
c. Detecção de minúcias:
Este passo consiste em scanear a imagem binária em busca de padrões que indiquem o
fim ou a bifurcação de cristas. Um destes padrões pode ser verificado na figura 12. O padrão mais à
esquerda contém 6 pixels binários em uma configuração 2x3. Este padrão representa o fim de uma
crista que veio da direita. O mesmo ocorre com o próximo padrão e o depois deste, na verdade o
este conjunto de padrão podem ser representados como mostrado no padrão mais à direita.
Figura 12: padrões para detecção de finais de cristas.
Candidatos à minúcia são detectados ao se scanear consecutivos pares de pixels em uma
imagem procurando seqüências que casem com os padrões. Os scaneamentos são feitos vertical e
horizontalmente, para fazer a varredura horizontal basta rotacionar os padrões no sentido horário.
Usando esta representação uma série de padrões de minúcias é descrito como mostrado
na figura 13. São dois padrões representando finais de cristas e o resto representa diferentes
18
bifurcações de cristas. Os padrões recebem ainda o atributo apearing/disapearing que serve para
representar a direção da qual a crista veio.
Figura 13. Padrões usados para detectar minúcias.
d. Remoção de minúcias falsas:
Com a utilização destes padrões minúcias são detectadas usando apenas seis pixels. Isso
minimiza as chances de não se detectar uma minúcia mas em compensação muitas falsas minúcias
são detectadas, sendo necessário removê-las.
Neste passo, fragmentos de finais de cristas e marcas de tinta indesejáveis (ilhas) e
possíveis pontos vazios dentro das cristas são removidos. Também são removidas as minúcias
detectadas sobre áreas nas quais não foram detectados a direção do fluxo das cristas, ou localizadas
em áreas marcadas como de baixa qualidade.
e. Atribuição de qualidade às minúcias
Mesmo com a remoção de minúcias falsas, muitas destas minúcias persistem, e um
sistema para medir a qualidade da minúcia pode ajudar a diminuir o impacto das minúcias falsas na
medida que podemos dar preferência a comparação das minúcias de mais alta qualidade.
Dois fatores são combinados para se produzir uma pontuação de qualidade para cada
minúcia detectada. O primeiro fator é pego diretamente do mapa de qualidade, com quatro sendo a
maior e zero a menor qualidade. O segundo fator é baseado em estatísticas simples dos pixel (média
e desvio padrão) imediatamente vizinhos num raio de 11 pixels. Uma região de alto contraste na
impressão terá um nível de contraste significativo que deve cobrir toda a escala cinza (de 0 a 255).
Conseqüentemente, a média da intensidade dos pixels nas vizinhanças deve estar bastante perto de
19
127. Por razões similares a intensidade de pixel de uma vizinhança ideal deve apresentar um desvio
padrão maior que sessenta e quatro.
f. Saída
O MINDTCT gera como saída originalmente os quatro mapas supracitados e um
arquivo contendo as minúcias extraídas contendo as informações: condenadas x e y, a direção ou
orientação do bloco onde a minúcia se encontra t, e um nível de qualidade gerado como descrito
acima. Na figura 14 pode-se ver uma representação gráfica do arquivo de saída.
Figura 14: minúcias detectadas.
As saídas referentes aos mapas existem apenas com o fim de se estudar o algoritmo, e
como já foram usadas para computar o arquivo contendo as minúcias elas não são necessárias.
Portanto para os objetivos deste projeto foi alterado o código fonte em C do MINDTCT para que a
saída do programa seja apenas as minúcias detectadas.
3.6.3 NFIQ
O NFIQ é o software que determina a qualidade de uma impressão utilizando-se de uma
rede neural. Ele atribui um nível de qualidade de 1 a 5, onde 1 representa o nível mais alto de
qualidade e 5 o nível mais baixo. Deve-se ter em mente que o NFIQ não distingue imagens que são
impressões de imagens que não são impressões. Ou seja, não se deve esperar que ao executar o
NFIQ numa imagem que não seja uma impressão digital, seja atribuído necessariamente um valor
baixo de qualidade.
20
3.6.4 BOZORTH3
O BOZORTH3 é o programa que faz o casamento entre as impressões digitais, sua
entrada é a saída do MINDTCT. Este algoritmo é insensível a rotações e translações e tem três
passos principais:
•
Construir duas tabelas de comparação de minúcias, uma para cada impressão.
•
Construir uma tabela de compatibilidade entre as impressões
•
Percorrer a tabela de compatibilidade e acumular o número de minúcias em comum.
a. Construção das tabelas de comparação
O primeiro passo do algoritmo é computar medidas relativas de cada minúcia de uma
impressão em relação a todas as outras minúcias do mesmo dedo. Estas medidas relativas são
guardadas numa tabela de comparação de minúcias e é o que provê a insensibilidade do algoritmo
às rotações e translações.
Para o caso de translações são acumuladas as distâncias entre as minúcias, que são
relativamente invariantes apesar da elasticidade da pele forçar com que trabalhemos com uma
margem de complacência.
Para resolver o problema das rotações são extraídas medidas dos ângulos entre a linha
que liga duas minúcias e a orientação das minúcias, o que torna as medidas invariantes à rotação.
b. Construção das tabelas de compatibilidade
Neste passo pegam-se as duas tabelas de comparação e procuram-se entradas
compatíveis entre as duas tabelas gravando-as da tabela de compatibilidade. Para saber se as
entradas são compatíveis testa-se se as distancias estão dentro de uma tolerância Td. Depois testamse se os ângulos formados entre as orientações das minúcias e a linha que as liga está dentro de uma
tolerância TӨ.
Se a distância relativa e os ângulos das minúcias estiverem dentro das tolerâncias
aceitáveis será gravada a relação entre os dois pares de minúcias na tabela de compatibilidade.
c. Percorrer a tabela de compatibilidade
Após construir as tabelas de compatibilidade, pode-se notar que esta é apenas uma lista
de links separados entre duas minúcias que forma um grafo de compatibilidade. Para determinar
quão bem duas impressões batem deve-se percorrer o grafo achando o maior caminho de
associações de minúcias. A pontuação será então o tamanho do maior caminho do grafo.
21
d. Resultado
Idealmente a pontuação deve ser alta se as duas impressões forem do mesmo dedo e
baixa se não forem. A construção da tabela de compatibilidade dificilmente consegue representar
todas as minúcias compatíveis sendo que a pontuação final do programa não é ótima. A pontuação
representa de forma imprecisa o número de minúcias em comum entre as duas impressões. Como
regra geral um escore maior do que 40 indica um casamento com boa margem de segurança, porém
dependendo da aplicação podem ser usados escores menores ou maiores aferindo diretamente as
taxas de FM e FNM.
Por padrão apenas as 150 melhores minúcias são reconhecidas pelo MINDTCT para
cada dedo, apesar de uma impressão ter tipicamente menos do que 80 minúcias. Isso quer dizer que
o BOZORTH3 pode ser usado mesmo quando o extrator de minúcias é muito sensível e gera muitas
minúcias falsas. Pode-se ainda definir no BOZORTH3 quantas minúcias serão levadas em
consideração para o casamento.
3.7 FVC 2004(Fingerprint Verification Competition):
A FVC é uma competição internacional de algoritmos de reconhecimento de impressão
digital. Os algoritmos não são disponibilizados, mas as bases de dados nas quais os mesmos
trabalham sim. São quatro bases de dados, três de impressões reais e um de impressões sintéticas
criadas com o software SfinGe v3.0.
DB1
DB2
DB3
DB4
Tipo do sensor
Sensor ótico
Sensor ótico
Sensor termal de varredura
SFinGe v3.0
Tamanho da imagem
640x480 (307 Kpixels)
328x364 (119 Kpixels)
300x480 (144 Kpixels)
288x384 (108 Kpixels)
Dedos X IDs
100x8
100x8
100x8
100x8
Resolução
500 dpi
500 dpi
512 dpi
500 dpi
Tabela 1: as quatro bases de dados da FVC 2004.
Seguem algumas informações sobre a aquisição das impressões:
Estudantes de Ciências da computação da Universidade de Bologna foram voluntários
na extração das impressões. Os voluntários foram divididos em 3 grupos de 30 pessoas, cada um
associado a uma das três bases de dados e consequentemente com diferentes scanners de impressão
digital cada.
Impressões do indicador e dedo médio de cada voluntário foram adquiridas de modo
que nenhum esforço foi feito para controlar a qualidade da imagem e os scanners não foram
limpados sistematicamente.
22
As aquisições foram feitas em três sessões, entre cada sessão havia um espaçamento de
duas semanas. Em cada sessão quatro impressões foram adquiridas de cada um dos quatro dedos de
um voluntário. Diferentes pedidos foram feitos aos usuários como aumentar ou diminuir a pressão
contra o scanner, ou rotacionar o dedo levemente entre scaneamentos para que a base de dados
ficasse mais próxima da realidade.
Ao fim cada base de dados tinha um total de 120 dedos e 12 impressões de cada dedo
(foram 1440 impressões). Mas apenas as impressões de 100 dedos, 8 para cada dedo foram
disponibilizadas aos participantes da FCV e público em geral.
Estas serão as impressões usadas no projeto. Cada base de dados vem com as
impressões no formato tif. Como o pacote da NFIS trabalha apenas com WSQ (Wavelet Scalar
Quantization, criado pelo FBI para compactação de impressões digitais), JPEG Loss-Less ou
formato RAW, foi feito uso do WSQ viewer 1.1 um freeware da Cognaxon Software para visualizar
e transformar as impressões no formato WSQ.
4. PROJETO
Para realizar o projeto, instalamos o SGBD PostgreSQL. Este pode ser baixado da
pagina oficial www.postgresql.org. A instalação para Windows já oferece uma série de extensões,
uma delas é o suporte a lo (Large Objects). Esta extensão é constituída apenas por um domain, que
é um tipo de dados que pode ser definido pelo usuário, chamado lo, e um conjunto de funções para
manipular os campos lo. Este domain lo é o equivalente aos campos BLOB de outros SGBDs
O objetivo deste projeto é integrar todas as ferramentas necessárias para o
reconhecimento de impressões em um SGBD, integrando inclusive as impressões que não serão
armazenadas no sistema de arquivos, mas sim em campos lo.
Para tanto foram estudadas duas aproximações, uma utilizando UDFs em C, onde os
algoritmos de reconhecimento de impressões digitais poderiam ler diretamente dos campos BLOB,
onde não haveria a necessidade de exportar o arquivo para o sistema de arquivos, rodar os
algoritmos retornar os resultados e apagar os arquivos.
A outra aproximação estudada foi a de criar uma UDF em pl/Java para executar
comandos do sistema operacional, e utilizar esta UDF encapsulada em outras UDFs escritas em
plpg/SQL, de modo a extrair os arquivos do campo blob, rodar os algoritmos, obter os resultados e
apagar os arquivos. O que na verdade geraria uma falha de segurança.
23
Sem a menor dúvida a aproximação envolvendo UDFs em C é mais segura e mais
rápida e poderia ser a escolhida. Porém devido à complexidade e ao pouco conhecimento na
linguagem C, somado ainda ao curto tempo para a realização deste estudo, nos levou a utilizar a
segunda aproximação, não como uma solução definitiva do problema mas apenas para que
possamos continuar o estudo. As duas aproximações serão descritas nas seções abaixo.
4.1 UDFs no Postgres
Para poder utilizar uma linguagem, o PostgreSQL tem que ser compilado com suporte a
esta. Depois deve ser utilizado o comando CREATE LANGUAGE para disponibilizar esta
linguagem para cada banco de dados ou para todos. Existem diversas linguagens oficialmente
suportadas pelo PostgresQL como: PLpg/SQL, PL/Java, PL/Tcl, PL/Perl, PL/Python entre outras,
além de poder fazer chamadas para rotinas compiladas em C ou compiladas dinamicamente em C
ou C++. As linguagens também podem ser criadas no modo TRUST (sem acesso a recursos que
possam comprometer a segurança do sistema) ou UNTRUSTED (com acesso irrestrito aos recursos
da linguagem).
4.1.1 UDFs em C no Postgres
Para fazer uma UDF em C as funções são compiladas para objetos dinamicamente
carregáveis também chamados shared libraries. Depois de compiladas as shared libraries são
registradas no SGBD usando-se o comando CREATE FUNCTION.
Duas convenções de chamadas diferentes são utilizadas para funções em C para o
PostgreSQL, versão 0 e versão 1. A versão 0 deve deixar de ser usada e é mantida por questões
apenas de compatibilidade devido a isso não será aqui apresentada. A versão 1 requer que seja
escrita uma macro PG_FUNCTION_INFO_V1() para cada função criada, entre outra convenções.
A primeira vez que uma UDF em uma shared library é chamada, o SGBD carrega o
arquivo objeto na memória para que a função seja chamada. O comando CREATE FUNCTION
deve então especificar duas informações: o caminho do arquivo e a função dentro do arquivo.
a. Convenção de chamada versão 1
Esta convenção é baseada em macros para suprimir muito da complexidade de se passar
argumentos e resultados. A declaração de uma função C na versão 1 é sempre:
24
PG_FUNCTION_INFO_V1(funcname);
Datum funcname(PG_FUNCTION_ARGS)
Código 1: convenção de chamada versão 1.
Este modo de declaração das funções não é necessário para funções internas, mas
apenas para aquelas que são carregadas dinamicamente.
Numa função escrita na versão 1 cada argumento é pegado usando a macro
PG_GETARG_xxx(), onde xxx corresponde ao tipo do argumento em C, ver tabela 2 para
equivalências entre os tipos SQL e C, o resultado é retornado usando PG_RETURN_xxx().
PG_GETARG_xxx() recebe como argumento o numero do argumento da função começando do 0.
Ou seja PG_GETARG_INT32(0) pega o primeiro argumento de uma função. PG_RETURN_xxx()
recebe como argumento o valor ou objeto a retornar.
Tipo em SQL
Tipo em C
Definido em
abstime
AbsoluteTime
utils/nabstime.h
boolean
bool
postgres.h
bytea
bytea*
postgres.h
"char"
char
(nativo)
character
BpChar*
postgres.h
cid
CommandId
postgres.h
Date
DateADT
utils/date.h
smallint (int2)
int2
or int16
postgres.h
integer (int4)
int4
or int32
postgres.h
real (float4)
float4*
postgres.h
double precision (float8) float8*
postgres.h
name
Name
postgres.h
oid
Oid
postgres.h
oidvector
oidvector*
postgres.h
path
PATH*
utils/geo_decls.h
point
POINT*
utils/geo_decls.h
reltime
RelativeTime
utils/nabstime.h
text
text*
postgres.h
tid
ItemPointer
storage/itemptr.h
time
TimeADT
utils/date.h
time with time zone
TimeTzADT
utils/date.h
timestamp
Timestamp*
utils/timestamp.h
varchar
VarChar*
postgres.h
xid
TransactionId postgres.h
Tabela 2: Tipos em C equivalentes a tipos SQL para o PostgreSQL.
25
Um exemplo de uma UDF em C versão 1 é mostrada no código 2:
/*
Arquivo teste.c
*/
#include "postgres.h"
#include <string.h>
PG_FUNCTION_INFO_V1(incrementar);
Datum incrementar(PG_FUNCTION_ARGS)
{
int32 arg = PG_GETARG_INT32(0);
PG_RETURN_INT32(arg + 1);
}
Código 2: exemplo de UDF versão 1.
b. Compilando e registrando uma UDF no PostgreSQL
Para compilar uma UDF para a função descrita na seção anterior, contida do arquivo
teste.c, devemos compilar o arquivo teste.c para um arquivo objeto e depois transformá-lo em um
objeto compartilhado. Para tanto podemos usar os comandos no Shell do CYGWIN ou em qualquer
sistema operacional compatível com Unix.
cc -fpic -c teste.c
cc -shared -o teste.so teste.o
Após ter criado o arquivo teste.so, deve-se ter certeza de que o mesmo se encontra em
uma pasta na qual o postgreSQL tenha permissão de acesso. Finalmente devemos registrar a UDF
no SGBD. O que pode ser feito ao se executar o comando:
CREATE FUNCTION incrementar(integer) RETURNS integer
AS 'DIRETÓRIO/teste', 'incrementar'
LANGUAGE C STRICT;
Código 3: exemplo de como registrar uma função.
c. Acessando campos lo
Existem também tipos de dados que não são mapeados na linguagem C, um exemplo
desses tipos é o campo lo. Como descrito na seção 3.5.6 o campo lo é um domain. Sua definição é
como segue:
CREATE DOMAIN lo AS oid;
Código 4: definição do domain lo.
O que significa que todo campo lo é na verdade um campo oid (Object ID), devemos
estar atentos para o fato de que nem todo campo oid é um lo. Sabendo disso e com a tabela de
mapeamento de tipos de PostgreSQL para C (tabela 2), podemos usar o tipo Oid definido em
26
postgres.h para fazer referência a campos lo. No arquivo be-fsstubs.c que acompanha a extensão lo
do Postgres podem ser encontradas diversas funções em C, estas funções servem para abrir, fechar,
ler, escrever, importar e exportar objetos lo. Baseado nestas funcionalidades, concluímos que é
possível adaptar o código em C dos algoritmos do NFIS2 para que estes aceitem não apenas
arquivos mas também campos lo como entrada e como saída.
4.1.2 UDFs em Java no Postgres
Para efeito deste projeto teremos apenas uma UDF em Java e esta servirá apenas para
executar comandos no sistema operacional retornando resultados. Para tanto criou-se uma classe
Java chamada RunComand, que ao contrário dos códigos em C não precisam de nenhuma
convenção de escrita, apenas que os métodos a serem registrados no SGBD sejam estáticos. A
classe RunComand contém apenas um método estático descrito a abaixo. Este método recebe dois
parâmetros, o comando e a pasta na qual o mesmo será executado.
public static String run(String comando, String pasta){
String s = null;
String ret = new String("");
try{
File f = new File(pasta);
Process p = Runtime.getRuntime().exec(comando, null, f);
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
while ((s = stdInput.readLine()) != null) { ret += s; } // Lê a saída do comando
while ((s = stdError.readLine()) != null) { ret += s; } // Lê qualquer erro gerado pelo comando
return ret;
} catch (IOException e) {
ret = "Ocorreu uma exceção:\n";
return ret + e.getStackTrace();
}
}
Código 5: método run da classe RunComand
A classe RunComand foi então compilada em um arquivo JAR, o qual teve o endereço
adicionado ao arquivo de configuração postgreSQL.conf, na linha referente ao classpath do
PL/Java. Após reiniciado o serviço do PostgreSQL a função foi registrada no SGBD com o
comando SQL descrito no código 6:
CREATE OR REPLACE FUNCTION runcomand(varchar, varchar)
RETURNS varchar AS 'RunComand.run'
LANGUAGE 'javau' VOLATILE;
Código 6: registrando a UDF runcomand(varchar, varchar).
27
a. Extração das minúcias
Em seguida foi criada a UDF ID_ExtrairMinucias(oid) na linguagem plpg/SQL. Esta
UDF recebe como parâmetro um campo oid, onde deve ser passado o oid do campo lo que guarda
uma impressão digital. Este parâmetro é usado para se exportar a impressão para o sistema de
arquivos, onde o MINDTCT vai ser executado, gerando um outro arquivo contendo as minúcias.
Este último é então importado para o banco, e após apagarmos todos os arquivos gerados no sistema
de arquivos o oid do arquivo importado é retornado pela função. O código fonte de
ID_extrairMinucias(oid) segue abaixo:
CREATE OR REPLACE FUNCTION ID_extrairMinucias(oid) RETURNS OID AS '
DECLARE
transID integer;
vArquivo varchar;
vRetorno oid;
BEGIN
SELECT transactionid INTO transID FROM pg_locks WHERE pid = pg_backend_pid() AND
transactionId is not null;
vArquivo := transID || ''_'' || $1;
PERFORM lo_export($1, ''C:/util/arquivos/''|| vArquivo || ''.wsq'' );
PERFORM runComand(''C:/util/arquivos/MINDTCT '' || vArquivo || ''.wsq ''|| vArquivo,
''C:/util/arquivos'');
vRetorno := lo_import(''C:/util/arquivos/'' || vArquivo || ''.xyt'');
PERFORM runComand(''cmd /c del '' || vArquivo || ''.*'', ''C:/util/arquivos'');
RETURN vRetorno;
END; '
LANGUAGE 'plpgsql' VOLATILE;
Código 7: registrando a UDF ID_extrairMinucias(oid).
Foi utilizada ainda a variável transID, que guarda o ID da transação. Este ID é usado ao
se exportar os arquivos para que transações diferentes não tentem ler ou gravar um arquivo de
mesmo nome.
Esta função foi desenvolvida para aumentar a velocidade do sistema visto que na
primeira versão para cada comparação de impressões as minúcias eram extraídas. Ocasionando em
um tempo de resposta muito grande por parte da função de comparação. Como as minúcias só
precisam ser extraídas uma vez para cada impressão, decidimos extrair as minúcias de todos os
dedos e guardá-las também no banco. Isso pode ser feito via trigger ou simplesmente rodando o
comando mostrado no código 8.
UPDATE <tabela> SET <xyt> = ID_extrairMinucias( <wsq> )
Código 8: extraindo as minúcias.
28
Onde <tabela> é o nome da tabela, <xyt> o nome do campo lo que vai receber as
minúcias e <wsq> o nome do campo que contém as impressões. Uma vez este comando executado,
contanto que as impressões não sofram alterações, não será mais necessário extrair minúcias para
esta tabela.
Em comparação com a primeira versão que extraia as minúcias a cada comparação, esta
nova apresentou performance 10 vezes mais rápida, utilizando um espaço extra muito pequeno,
visto que um arquivo de minúcias tem em média 700 bytes.
b. Comparação das minúcias
Uma vez com as minúcias guardadas no banco de dados, criamos a UDF
ID_compararMinuciasINT (oid, oid, integer) como descrito no código 9.
CREATE FUNCTION ID_compararMinuciasINT(oid, oid, integer) RETURNS integer AS '
DECLARE
min1 ALIAS FOR $1; min2 ALIAS FOR $2; qtd_minucias ALIAS FOR $3;
transID integer; vMatch integer; vArquivo1 varchar; vArquivo2 varchar;
BEGIN
SELECT transactionid INTO transID FROM pg_locks WHERE pid = pg_backend_pid() AND
transactionId is not null;
vArquivo1 := transID ||''_''|| min1;
vArquivo2 := transID ||''_''|| min2;
PERFORM lo_export(min1, ''C:/util/arquivos/''|| vArquivo1);
PERFORM lo_export(min2, ''C:/util/arquivos/''|| vArquivo2);
vMatch := parseInt(runComand(''C:/util/arquivos/BOZORTH3 -t ''|| qtd_minucias ||'' || vArquivo1 || '' '' ||
vArquivo2, ''C:/util/arquivos''));
PERFORM runComand(''cmd /c del '' || vArquivo1 ||'' ''|| vArquivo2, ''C:/util/arquivos'');
RETURN vMatch;
END; '
LANGUAGE 'plpgsql' VOLATILE;
Código 9: registrando a UDF ID_compararMinuciasINT (oid, oid, integer).
Esta função também se utiliza do ID da transação para assegurar concorrência. São
passados três argumentos, os dois primeiros são campos oid e devem receber os oids das minúcias
já extraídas. O terceiro argumento informa quantas minúcias serão comparadas pelo BOZORTH3.
Quanto ao funcionamento, esta UDF exporta os dois arquivos de minúcias, executa o BOZORTH3
gravando o resultado em uma variável e exclui os arquivo exportados, retornando então a
quantidade de minúcias em comum entre as duas impressões.
Foi criada ainda outra UDF ID_compararMinucias (oid, oid, integer, integer), que
apenas encapsula a UDF ID_compararMinuciasINT (oid, oid, integer), passando um threshold no
último parâmetro. Se o valor do comparador de minúcias atingir este threshold o valor retornado é
true, do contrario é false.
29
Apesar das otimizações descritas na seção anterior o sistema ainda leva cerca de 100
segundos para comparar uma impressão com oitocentas outras num celeron 2.2Gz. com 512 de ram
e HD de 5400 RPM, ou seja, cerca de 125 milisegundos por comparação.
Para comparar uma impressão com todas as restantes no banco de dados podemos usar o
seguinte comando SQL:
SELECT T.nome as nome1, P.nome as nome2, ID_compararMinuciasINT(T.xyt, P.xyt, 150) as qtd FROM
db4 P INNER JOIN db4 T ON T.nome ='1_1'
Código 10: comparando impressões digitais.
Com este comando obteremos o número de minúcias em comum entre a impressão 1_1 e
todas as outras da tabela DB4. Já se quisermos apenas as impressões que pertencem ao dedo 1
podemos executar o comando:
SELECT T.nome as nome1, P.nome as nome2 as qtd FROM db4 P INNER JOIN db4 T ON T.nome ='1_1'
WHERE ID_compararMinucias (T.xyt, P.xyt, 150, 40)
Código 11: buscando impressões do mesmo dedo.
Onde 40 é o número mínimo de minúcias entre as duas impressões para que estas
possam ser consideradas como sendo pertencentes ao mesmo dedo. Este número é chamado de
threshold e pode variar dependendo do tipo da aplicação devendo-se observar que ao aumentá-lo
aumentamos também a taxa de FNM, diminuindo a taxa de FM. Ao diminuí-lo aumentamos a taxa
de FM e diminuímos a taxa FNM.
c. Qualidade das impressões utilizadas
Como descrito em 3.6.3 o NFIQ é um software que retorna um valor de 1 a 5 indicando
a qualidade de uma imagem contendo uma impressão digital. Para integrar o NFIQ ao SGBD foi
criada a UDF descrita no código 12:
30
CREATE OR REPLACE FUNCTION ID_qualidade(oid) RETURNS int4 AS '
DECLARE
qualidade integer;
transID integer;
BEGIN
SELECT transactionid INTO transID FROM pg_locks WHERE pid = pg_backend_pid() AND
transactionId is not null;
PERFORM lo_export($1, ''C:/util/arquivos/''|| transID || ''_'' || $1 || ''.wsq'');
qualidade := parseInt(runComand(''C:/util/arquivos/Nfiq '' || transID || ''_'' || $1 || ''.wsq'',
''C:/util/arquivos''));
PERFORM runComand(''cmd /c del '' || transID || ''_'' || $1 || ''.wsq'', ''C:/util/arquivos'');
RETURN qualidade;
END;'
LANGUAGE 'plpgsql' VOLATILE;
Código 12: registrando a UDF ID_qualidade(oid).
5. RESULTADOS
Para ter uma idéia das taxas de FM e FNM dos algoritmos de detecção e comparação de
minúcias, comparamos os oito primeiros dedos dos 4 bancos de dados de impressões da FVC com
todos os oitocentos dedos de cada banco. O seguinte INSERT foi usado uma vez para cada banco.
INSERT INTO dados (db, id1, id2, match)
SELECT 'db1', nome1, nome2, qtd FROM (
SELECT T.nome as nome1, P.nome as nome2, ID_compararMinuciasINT(T.xyt, P.xyt, 150) as
FROM db1 P INNER JOIN db1 T ON T.nome ='1_1'
UNION
qtd
UNION
SELECT T.nome as nome1, P.nome as nome2, ID_compararMinuciasINT(T.xyt, P.xyt, 150) as qtd
FROM db1 P INNER JOIN db1 T ON T.nome ='8_1'
) tmp WHERE qtd >= 20
Código 13: comparando os 8 primeiros dedos com todos os outros de um banco da FVC
Deste modo inserimos os dados de comparação das minúcias na tabela “dados” criando
um pequeno datawarehouse para prosseguirmos com nossa análise de forma mais rápida. Vamos
usar nesta análise só as comparações em que vinte ou mais minúcias em comum foram encontradas,
por isso a cláusula WHERE qtd >= 20.
Para saber a taxa de FM para cada threshold de 20 a 40 foi utilizado o comando descrito
no código 14:
31
SELECT db, CASE WHEN match < 40 THEN match ELSE 40 END, count(*)
FROM dados WHERE dedo(id1) <> dedo(id2)
GROUP BY db, case when match < 40 then match else 40 end
ORDER BY 1, 2
Código 14: obtendo a taxa de FM.
Com o resultado do SELECT pôde ser montada a seguinte tabela e gráfico, o que nos
permite avaliar a taxa de FM para cada threshold escolhido.
Tabela 3: incidências de FM para os quatro bancos de dados da FVC2004.
Figura 15: gráfico das incidências de FM para os quatro bancos de dados da FVC2004.
Como pode ser observado, não houve falsa aceitação com nenhum threshold acima de
35, confirmando o que é dito no guia do usuário do BOZORTH3 (Watson et al., 2004), de que um
threshold de 40 é geralmente suficiente para podermos afirmar que duas impressões pertencem ao
mesmo dedo.
Para analisarmos a taxa de FNM foram criadas uma tabela chamada FNM e a função:
32
CREATE OR REPLACE FUNCTION preenchefnm() RETURNS int4 AS '
DECLARE
i INTEGER := 20;
BEGIN
LOOP
EXIT WHEN i > 40;
INSERT INTO "FNM" (db, threshold , FNM)
SELECT db, i, 64 - count(*) FROM dados
WHERE dedo(id1) = dedo(id2) AND match >= i GROUP BY db;
END LOOP;
RETURN 1;
END; '
LANGUAGE 'plpgsql' VOLATILE;
Código 15: obtendo a taxa de FNM.
Apos rodar a função acima temos os seguintes valores na tabela FNM, tendo em mente
que o valor máximo de FNM para cada banco neste caso é de 64, uma vez que para cada um 8
dedos testados em cada banco deveriam ser encontrados 8 casamentos:
Tabela 4: incidências de FNM para os quatro bancos de dados da FVC2004.
Figura 16: gráfico das incidências de FNM para os quatro bancos de dados da FVC2004.
Também foram analisadas as qualidades de todas as impressões de cada um dos bancos
de dados da FVC2004 utilizando a função ID_qualidade(oid) como descrito no código 16.
33
SELECT * FROM (
select 'db1', qualidade(wsq) from db1
union all
select 'db2', qualidade(wsq) from db2
union all
select 'db3', qualidade(wsq) from db3
union all
select 'db4', qualidade(wsq) from db4
) tmp order by 1,2 desc;
Código 17: obtendo a qualidade das impressões dos quatro bancos de dados da FVC2004
Compilando-se os resultados do SELECT do código 16 apresentamos tabela e gráfico
referentes às qualidades das impressões:
Tabela 5: qualidade das impressões nos quatro bancos de dados da FVC2004.
Figura 16: gráfico da qualidade das impressões dos quatro bancos de dados da FVC2004.
34
6. CONCLUSÕES E PERSPECTIVAS FUTURAS
Neste trabalho foi apresentado um estudo sobre o reconhecimento de impressões digitais
e métodos para incorporar alguns destes algoritmos em bancos de dados. Para tanto usamos o
PostgreSQL e o software NFIS2.
Os dois métodos de integração partem do mesmo princípio, porém com aproximações
diferentes. Ambos utilizam UDFs para estender as funcionalidades do SGBD PostgreSQL. Estas
UDFs são responsáveis por todo o processo de reconhecimento de impressões digitais.
Observamos que as quatro bases de dados da FVC2004 possuem em sua maioria uma
qualidade boa ou ótima, mesmo com os condições de aquisição descritas no item 3.7. São 3200
impressões e um total de 300 dedos reais e 100 dedos virtuais (criadas utilizando o software SFinGe
v3.0), 8 impressões de cada dedo. Esta base de dados foi, portanto, considera suficiente para a
realização dos nossos estudos.
Apesar de dois métodos terem sido apresentados, apenas um deles foi implementado.
Para este foram feitos testes de reconhecimento para cada uma nas bases de dados da FVC2004 e
medidas as taxas de FM e FNM para todos os thresholds de 20 a 40. Estas estatísticas podem ser
usadas para definir um threshold mais adequado para um tipo de aplicação específica.
Concluímos que o objetivo deste estudo foi concluído, no sentido de que foram
propostos e implementados métodos para integrar o reconhecimento de impressões digitais ao
PostgreSQL, um SGBD de código aberto e bastante popular. No que se refere à segurança o método
implementado não alcançou o objetivo pretendido pelo fato de exportar as impressões e minúcias
para o sistema de arquivos. Porém um outro método foi proposto usando UDFs em C para ler os
arquivos diretamente do campo lo. Este método elimina a necessidade de haver qualquer tipo de
armazenamento de impressões digitais no sistema de arquivos, satisfazendo a questão referente à
segurança.
Como resultado desta pesquisa, propõe-se os seguintes desenvolvimentos futuros:
•
Implementação do método utilizando UDFs em C. Pois estes seriam, mais seguros e mais
rápidos.
•
Realização de estudos sobre a influência da resolução das imagens nos algoritmos de
extração de minúcias.
•
Adaptação do PCASYS para que este possa reconhecer impressões que são estejam
necessariamente formatadas no como no banco de dados especial do NIST chamado de
SD14. Isto feito, extender o PostgreSQL para utilizar o PCASYS.
35
7. REFERÊNCIAS
CHONG, Michael M. S.; GAY, Robert K. L.; TAN, H. N.; LIU, J.. Automatic Representation of
Fingerprints for Data Compression by B Spline Functions. Pattern Recognition, vol. 25, n 10, pp.
1199 1210, 1992.
COETZEE, Louis; BOTHA, Elizabeth C.. "Fingerprint Recognition in Low Quality Images".
Pattern Recognition, vol. 26, n 10, pp. 1441 1460, 1993.
COSTA, Silvia. Classificação e Verificação de Impressões Digitais. 2001.
ELECCION, Marce. Pattern Recognition Automatic Fingerprint Identification. IEEE Spectrum, pp.
36 45, 1973.
FBI: Federal Bureau of Investigation. The Science of Fingerprints: Classification and Uses. U.S.
Government Printing Office, Washington, DC (1984).
FVC2004, Finger Print Verification Competition of 2004. Disponível em:
<http://bias.csr.unibo.it/fvc2004/databases.asp>. Acesso em: 10 out. 2006.
HENRY, E. R.. Classification and Uses of Fingerprints. Wyman and Sons Ltda, 1905.
HONG, Lin; JAIN, Anil; PANKANTI, Sharath; BOLLE, Ruud. Fingerprint Enhancement. Proc.
Third IEEE Workshop on Applications of Computer Vision, pp. 202 207, 1996.
KARU, Kalle; JAIN, Anil J.. Fingerprint Classification. Pattern Recognition, vol. 29, n 3, pp. 389
404, 1996.
LÖWNERTZ, Kurt. Change and Exchange. Electronic document management in building design,
pp 53 53. 1998.
MAIO; MALTONI; JAIN, A.K.; PRABHAKAR, S. Handbook of Fingerprint Recognition. . pp. 2
50. 2003.
MOAYER, Bijan; FU, King Sun. A Syntactic Approach to Fingerprint Pattern Recognition. Pattern
Recognition, vol. 7, pp. 1 23, 1975.
POSTGRESQL. Disponível em: http://www.postgresql.org/docs/8.1/interactive/preface.html e
http://www.postgresql.org/about/. Acesso em 20 nov. 2006.
OLIVEIRA, Adriano. Sistema Biométrico de Controle de Acesso SisBioaccess. Universidade do
Sul de Santa Catarina. Araranguára. 2002.
QUEIROZ, Gilberto. Extensão do SGBD PostgreSQL com operadores espaciais. pp. 6 7. 2002.
RAO, Kameswara; BALCK, Kenneth. Finding the Core Point in a Fingerprint. IEEE Transactions
on Computers, vol. C 27, n 1, 1978.
SHAPIRO, Michael ; MILLER, Ethan. IEEE Managing Databases with Binary Large Objects.
1999.
WATSON, Craig I.; GARRIS, Michael D.; TABASSI, Elham; WILSON, Charles L.; MCCABE, R.
Michael; JANET, Stanley. User's Guide to NIST Fingerprint Image Software 2(NFIS2). 2004
36
Download