Skip to content

Jovinull/EigenHand

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EigenHand — Extração Matemática de Landmarks de Mãos do Zero

Reconstrução fundamentada do pipeline de extração de pontos-chave de mãos usando exclusivamente Álgebra Linear, Geometria Analítica e NumPy — sem OpenCV, sem MediaPipe, sem scikit-* nem qualquer caixa-preta de Visão Computacional ou Aprendizado de Máquina.


Motivação

Este projeto nasceu como pesquisa de mestrado em Ciência da Computação sob orientação do Prof. Jugurta. Ferramentas como MediaPipe e OpenCV oferecem APIs de uma única linha (hands.process(img)) que escondem décadas de matemática elegante por trás de pesos pré-treinados e binários compilados. Para um aluno de mestrado, usar essas ferramentas é trivial; entender o que elas fazem exige reconstruir as ideias.

O EigenHand assume essa tarefa de forma deliberadamente austera: cada operação do pipeline corresponde a uma identidade da álgebra linear ou da geometria computacional, escrita explicitamente em NumPy. As únicas bibliotecas externas permitidas são:

  • numpy — operações matriciais e decomposições;
  • Pillow — leitura do arquivo de imagem;
  • matplotlib — visualização.

Toda a lógica de visão — segmentação, contorno, classificação, detecção de bordas — é implementada do zero.


Fundamentação Matemática

O pipeline é composto por quatro etapas, cada uma evidenciando um aspecto diferente do mesmo arcabouço algébrico.

1. Segmentação Invariante à Iluminação

Cada pixel é tratado como um vetor $v = (R, G, B) \in \mathbb{R}^3$. Sob o modelo Lambertiano simplificado, mudanças de iluminação atuam como um escalar multiplicativo $k > 0$ sobre $v$. Comparar $v$ com um vetor de pele de referência $s$ pelo ângulo entre eles cancela exatamente esse fator:

$$ \cos(\theta) ;=; \frac{v \cdot s}{\lVert v \rVert , \lVert s \rVert} $$

A invariância é algébrica e exata, não heurística. Uma máscara binária $M$ resulta da conjunção dos critérios $\cos(\theta) \geq \cos(\theta_{\max})$ e $\lVert v \rVert \geq m_{\min}$, sendo o segundo um piso de magnitude que descarta pixels muito escuros, onde a direção do vetor é numericamente instável.

A nuvem de pixels classificados como pele admite duas estatísticas fundamentais. O centróide:

$$ c ;=; \frac{1}{N} \sum_{i=1}^{N} p_i $$

e a matriz de covariância:

$$ \Sigma ;=; \frac{1}{N - 1} X^{\top} X, \qquad X = P - c. $$

$\Sigma$ é simétrica e positiva semidefinida; pelo Teorema Espectral, existe uma base ortonormal de autovetores tal que

$$ \Sigma, v_k ;=; \lambda_k , v_k, \qquad \lambda_1 \geq \lambda_2 \geq 0. $$

O autovetor $v_1$ é o eixo principal de orientação da mão.

2. Topologia — Fecho Convexo via Graham Scan

A silhueta da mão é caracterizada pelo seu fecho convexo, calculado pelo algoritmo de Graham (1972) implementado integralmente. O teste de orientação substitui qualquer cálculo trigonométrico: dada uma tripla $A, B, C \in \mathbb{R}^2$, o sinal do determinante

$$ \det \begin{pmatrix} B_x - A_x & C_x - A_x \\ B_y - A_y & C_y - A_y \end{pmatrix} ;=; (B_x - A_x)(C_y - A_y) - (B_y - A_y)(C_x - A_x) $$

é exatamente a componente $z$ do produto vetorial $(B - A) \times (C - A)$ embutido em $\mathbb{R}^3$. O sinal classifica a tripla como anti-horária ($> 0$), horária ($< 0$) ou colinear ($= 0$). É um escalar puramente algébrico, exato sobre coordenadas inteiras e numericamente estável onde funções como arctan perdem precisão.

Os vértices do hull são em seguida filtrados por aglutinação de vizinhos próximos em $\ell^2$, isolando os picos reais que correspondem a pontas de dedo e à base da mão. A escolha de $\ell^2$ não é arbitrária: é a única norma invariante por rotação ($\lVert R u \rVert = \lVert u \rVert$ para $R$ ortogonal), o que mantém o critério de fusão isotrópico independentemente da orientação da mão na imagem.

3. Classificação dos Dedos por Mudança de Base

Os autovetores ${v_1, v_2}$ formam uma base ortonormal. Empilhando-os como colunas em $V = [,v_1 \mid v_2,]$, vale $V^{\top} V = I$, e portanto $V^{-1} = V^{\top}$ — a inversa é a transposta.

Para cada pico $P_i$, o vetor deslocado $u_i = P_i - c$ é projetado no referencial da mão por:

$$ u^{\text{local}}_i ;=; V^{\top} u_i, \qquad \bigl(u^{\text{local}}_i\bigr)_k ;=; v_k \cdot u_i. $$

Cada componente é, simultaneamente, uma mudança de coordenadas, uma projeção ortogonal e um produto escalar com um vetor unitário.

Invariância à rotação da câmera. Sob uma rotação $R$ ($R^{\top} R = I$), os pixels rotacionam ($u \mapsto R u$); a covariância conjuga ($\Sigma \mapsto R, \Sigma, R^{\top}$); e os autovetores giram junto ($v_k \mapsto R v_k$). O produto interno é preservado por matrizes ortogonais:

$$ (R u) \cdot (R v_k) ;=; u^{\top} R^{\top} R, v_k ;=; u \cdot v_k. $$

As coordenadas locais são, portanto, invariantes à rotação por construção — não por aproximação. Sobre elas aplica-se uma heurística geométrica simples: o polegar é o pico de maior $|x_{\text{local}}|$ (afastamento transversal extremo); os demais quatro dedos são ordenados pela proximidade transversal ao polegar e rotulados Indicador, Médio, Anelar e Mínimo.

4. Imagem Integral — Base para Viola-Jones

A última etapa estabelece a infraestrutura matemática para a detecção tipo Viola-Jones (2001), preparando a próxima fase do projeto, na qual classificadores Haar mitigarão falsos positivos da segmentação cromática (situações em que o fundo possui cor próxima à da pele).

A Imagem Integral

$$ I(y, x) ;=; \sum_{y' \leq y} \sum_{x' \leq x} L(y', x') $$

é construída por dupla aplicação de cumsum em $\mathcal{O}(HW)$ e é a discretização exata da integral iterada $F(y, x) = \int_0^y \int_0^x f(u, v), du, dv$ — uma antiderivada discreta 2D.

Pelo Princípio da Inclusão-Exclusão, a soma de qualquer retângulo com cantos $A$ (sup-esq), $B$ (sup-dir), $C$ (inf-esq) e $D$ (inf-dir) satisfaz:

$$ \mathrm{soma}(\mathrm{ROI}) ;=; I(D) + I(A) - I(B) - I(C), $$

em $\mathcal{O}(1)$, independente da área da ROI. Essa identidade é o análogo discreto exato do Teorema Fundamental do Cálculo aplicado à integral iterada de duas variáveis.

A característica de Haar de borda vertical (dois retângulos contíguos, um claro e um escuro) é então computada simultaneamente em todas as posições válidas da imagem por meio de seis fatias da imagem integral, sem nenhum laço Python sobre pixels.


Estrutura do Repositório

EigenHand/
├── README.md
├── requirements.txt
├── main.py                    # ponto de entrada CLI
├── src/
│   ├── __init__.py
│   ├── core_math.py           # primitivas algébricas compartilhadas
│   ├── segmentation.py        # F1 -- segmentação por cosseno em R^3
│   ├── geometry.py            # F2 -- PCA, contorno, Graham Scan, picos
│   ├── classification.py      # F3 -- mudança de base, classificação
│   ├── integral_image.py      # F4 -- imagem integral, característica de Haar
│   └── visualization.py       # plotagem do painel de inspeção
├── assets/                    # imagens RGB de entrada (.jpg)
└── results/                   # painéis gerados pelo pipeline (.png)

Como Executar

Instalação das dependências

pip install -r requirements.txt

Execução em uma única imagem

python main.py assets/11.jpg

Salvando o painel em arquivo

python main.py assets/11.jpg --save results/11_pipeline.png

Parâmetros opcionais

Flag Padrão Descrição
--theta 8.0 ângulo máximo (graus) na similaridade de cosseno
--mag-min 0.30 magnitude mínima do vetor RGB para aceitar como pele
--dist-pico 22.0 distância mínima L2 entre picos do hull, em pixels
--save - se fornecido, salva o painel em PNG no caminho indicado

Processamento em lote (PowerShell)

Get-ChildItem assets/*.jpg | ForEach-Object {
    python main.py $_.FullName --save "results/$($_.BaseName)_pipeline.png"
}

Resultados

Em testes sobre cinco imagens com gestos e fundos variados, o pipeline produziu:

  • segmentação cromática funcional em 5/5 casos com fundos não-pele;
  • hulls coerentes com a silhueta da mão em 4/5 casos;
  • classificação correta dos cinco dedos em 3/5 casos (todos com mão aberta e sem pele no fundo);
  • mapas de Haar evidenciando bordas verticais em 5/5 casos.

Exemplo bem-sucedido — gesto com mão aberta

A imagem assets/11.jpg (anisotropia $\lambda_1 / \lambda_2 = 4{,}20$, 93 323 px de pele segmentados, 8 picos no hull) ilustra o pipeline operando em condições ideais: mão aberta, fundo claro homogêneo, dedos distintamente separados. Os cinco rótulos foram atribuídos corretamente.

Pipeline completo sobre assets/11.jpg

Métricas agregadas sobre assets/

Imagem Pixels pele $\lambda_1 / \lambda_2$ Vértices do hull Picos Dedos rotulados
1.jpg 161 469 2,18 29 12 4
11.jpg 93 323 4,20 19 8 5
14.jpg 117 510 3,38 22 11 5
81.jpg 89 316 2,52 25 10 5
136.jpg 147 095 1,71 16 10 4

Limitações

Duas classes de falha foram observadas, ambas previstas pelo próprio modelo:

  1. Mãos fechadas. A heurística da Fase 3 pressupõe mão aberta com cinco pontas distintas. Em punhos fechados, o convex hull encontra picos nas articulações dos nós dos dedos e a classificação atribui rótulos a pontos que não correspondem a pontas de dedo verdadeiras. Não é um defeito de implementação: é a hipótese explícita do modelo sendo violada pela imagem de entrada.

  2. Pele no fundo. A similaridade de cosseno em $\mathbb{R}^3$ não distingue mãos de rostos ou outras regiões com cromaticidade similar. A imagem assets/136.jpg ilustra exatamente esse caso adversarial — o rosto presente no canto da fotografia é erroneamente segmentado como pele e contamina o hull, deslocando o centróide e reduzindo a anisotropia.

    Caso adversarial: pele no fundo

    Esta é a limitação que motiva a próxima fase do projeto: a fusão da segmentação cromática com classificadores Haar treinados para o padrão visual da mão, cuja infraestrutura matemática já está estabelecida na Fase 4.

A discussão explícita dessas limitações, com a indicação de quais hipóteses do modelo são violadas em cada caso, é parte essencial do rigor exigido pela natureza acadêmica do projeto.


Referências

  • Crow, F. C. (1984). Summed-Area Tables for Texture Mapping. SIGGRAPH.
  • Graham, R. L. (1972). An Efficient Algorithm for Determining the Convex Hull of a Finite Planar Set. Information Processing Letters, 1(4), 132–133.
  • Pearson, K. (1901). On Lines and Planes of Closest Fit to Systems of Points in Space. Philosophical Magazine, 2(11), 559–572.
  • Viola, P., & Jones, M. (2001). Rapid Object Detection using a Boosted Cascade of Simple Features. CVPR.

Projeto desenvolvido em pesquisa de mestrado em Ciência da Computação sob orientação do Prof. Jugurta.

About

Pipeline de extração de landmarks de mãos construído do zero com Álgebra Linear pura, segmentação por cosseno em R³, PCA, Graham Scan, mudança de base ortogonal e imagem integral. Apenas NumPy. Projeto de mestrado em CC.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages