Mostrando postagens com marcador Resumos de Artigos. Mostrar todas as postagens
Mostrando postagens com marcador Resumos de Artigos. Mostrar todas as postagens

quarta-feira, 18 de março de 2015

Lema de Farkas

Lema de Farkas

Author: Igor dos Santos Montagner
Date: 25/02/2015

O lema de Farkas é parte importante da Teoria de Otimização Convexa pois apresenta uma "alternativa": dados um cone convexo e um ponto \(g \in R^n\), ou \(g\) pertence ao cone ou existe um hiperplano que os separa. Construindo um cone adequado podemos usar este resultado para provar as condições de otimalidade de primeira ordem KKT (que serão alvo do próximo texto).

Definição:

Sejam \(B \in R^{n\times m}, C \in R^{n \times p}\) duas matrizes que contém vetores de \(R^n\) em suas colunas e \(y \in R^m, w \in R^p\). O conjunto \(K\) definido abaixo é um cone convexo.

\[ K = \{ By + Cw | y \geq 0 \} \]

Lema:

Dado um ponto \(g \in R^n\) e um cone convexo \(K\), então somente uma das alternativas abaixo é verdadeira:

  1. \(g \in K\)
  2. Existe \(d \in R^n\) tal que:
    1. \(d^T g < 0\)
    2. \(B^T d \geq 0\)
    3. \(C^T d = 0\)

O interessante da prova do lema é que ela mostra como construir a direção \(d\) que satisfaz estas condições.

Prova:

Primeiro iremos provar que as duas alternativas não podem ocorrer juntas.

Suponha que as duas alternativas valham, ou seja, que \(g \in K\) e existe \(d \in R^n\) que satisfaz as condições acima.

Primeiramente, \(g = By + Cw\) para algum \(y \in R^m, y \geq 0\) e \(w \in R^n\). Logo, \(0 > g^T d = (By + Cw)^T d = y^T B^T d + w^T C^T d\). Porém, como \(C^T d = 0\), isto é igual a

\[ 0 > g^T d = (By + Cw)^T d = y^T B^T d \geq 0, \]

pois \(B^T d \geq 0\) e \(y \geq 0\). Logo, chegamos em uma contradição e as duas condições são disjuntas.

Vamos mostrar agora como construir a direção \(d\) no caso em que \(g \notin K\). Primeiramente, seja \(\hat{s} \in K\) o elemento do cone com menor distância euclidiana até \(g\). Logo, \(\hat{s}\) é a solução do seguinte problema de minimização:

\[ min_{s \in K} ||s - g||_2^2 \]

Definimos então \(d = \hat{s}-g\) e, consequentemente, \(g=\hat{s}-d\).

A direção d em relação a g e s
Figura: A direção d em relação a \(g\) e \(s\).

Condição 1:

Como o valor mínimo da função acima encontra-se em \(\hat{s}\), sabemos que a função \(|| t \hat{s} - g||_2^2\) possui mínimo em \(t=1\), pois \(t \hat{s} \in K, \forall t \geq 0\). Logo,

\[ \frac{||t\hat{s} - g||_2^2}{dt} |_{t=1} = 0 \\ \frac{t^2 \hat{s}^T \hat{s} - 2t\hat{s}^Tg + ||g||_2^2}{dt} |_{t=1} = 0 \\ 2t\hat{s}^T \hat{s} - 2\hat{s}^Tg |_{t=1} = 0 \\ 2\hat{s}^T(t\hat{s} - g)|_{t=1} = 0 \\ \hat{s}^T(\hat{s} - g) = 0 \]

Logo,

\[ d^Tg = d^T(\hat{s}-d) = d^T\hat{s} - d^T d = \\ \hat{s}^T(s - d) - ||d||_2^2 = -||d||_2^2 < 0 \]

Condições 2 e 3:

Para mostrar que \(d\) satisfaz as condições 2 e 3 vamos primeiramente analisar o que acontece quando consideramos, em vez de \(\hat{s}\), \(\hat{s} + \theta(\hat{s} - s), s \in K\).

\[ ||\hat{s} + \theta(\hat{s} - s) - g ||_2^2 \geq ||\hat{s} - g||_2^2 \\ ||\hat{s} - g||_2^2 +2\theta(\hat{s} - g)^T(\hat{s} - s) + \theta^2||\hat{s} - s||_2^2 \geq ||\hat{s} - g||_2^2 \\ 2\theta(\hat{s} - g)^T(\hat{s} - s) + \theta^2||\hat{s} - s||_2^2 \geq 0 \\ 2(\hat{s} - g)^T(\hat{s} - s) + \theta||\hat{s} - s||_2^2 \geq 0 \\ \theta \rightarrow 0 \\ 2(\hat{s} - g)^T(\hat{s} - s) \geq 0 \\ 2(\hat{s} - s)^T(\hat{s} - g) = \hat{s}^T(\hat{s} - g) - s^T(\hat{s} - g) \geq 0 \\ s^T(\hat{s} - g) = d^Ts \geq 0 \forall s \in K \\ \]

Logo, \(d^Ts = d^T(By + Cw) \geq 0, y \geq 0\). Isto vale para todos os \(s \in K\) e, em especial para os casos abaixo:

  1. \(y = 0\), \(d^TCw \geq 0 \rightarrow d^TC = C^T d = 0\)
  2. \(w = 0\), \(d^TBy \geq 0 \rightarrow B^Td \geq 0\), pois \(y \geq 0\).

Portanto, a direção \(d = \hat{s} - g\) satisfaz as propriedades do lema se \(g \notin K\) e tudo está provado :)


quarta-feira, 11 de março de 2015

Teoria de W-operadores - Operações entre imagens

Teoria de W-operadores - Operações entre imagens

\[ \newcommand{\E}[0]{\mathbb{E}} \newcommand{\Z}[0]{\mathbb{Z}} \newcommand{\L}[0]{\mathcal{L}} \newcommand{\P}[0]{\mathcal{P}} \]

Imagens podem ser interpretadas como reticulados e operações entre imagens como operações entre reticulados. Neste texto procuro apresentar a relação os diversos aspectos de teoria de reticulados apresentados anteriormente e o processamento de imagens digitais. Em especial, mostrarei que o operador intervalo produz resultados visualmente intuitivos e como ele pode ser composto para produzir resultados mais complexos.

Imagens como elementos de reticulados

Dados um domínio \(\E \subset \Z^2\) e um intervalo \(K = [0, \dots, k]\), uma imagem em \(k+1\) níveis de cinza pode ser interpretada como um elemento \( I \in Fun[\E, K]\). Em outras palavras, \(I\) atribui para cada ponto do domínio um nível de cinza.

O conjunto \(Fun[\E, K]\) é um reticulado com a operação \(\preccurlyeq\) definida abaixo.

\[ f \preccurlyeq g \Leftrightarrow f(x) \leq g(x) \forall x \in \E \]

De maneira equivalente, uma imagem binária \(B \in Fun[\E, [0,1]]\) também pode ser interpretada como um subconjunto de \(B' \subseteq \E\), onde \(p \in B' \Leftrightarrow B(p) = 1\). Seguindo a interpretação de conjuntos, o reticulado \((\P(\E), \subseteq)\) das imagens binárias é formado pelo conjunto de todos subconjuntos de \(\E\), \(\P(\E)\), e pela relação de inclusão usual em conjuntos \(\subseteq\).

Note que a noção de ordem (parcial) entre imagens é fundamental para a interpretação de imagens como reticulados.

Muitas vezes é interessante selecionar um pequeno recorte da imagem, selecionando os pixels que pertencem à vizinhança, chamada de janela, de um pixel. Estas imagens são chamadas de imagens-janela e são elementos em \(Fun[W, K]\), onde \(W \subset \Z^2\) é um conjunto de pontos que define a vizinhança considerada. A imagem janela \(I_z^{(W)}\) obtida ao centralizar a janela \(W\) no pixel \(z \in \Z^2\) na imagem \(I\) é dada por

\[ I^{(W)}_z(p) = I(z + p) \forall p \in W.\]

Processamento de imagens como uma operação de reticulados

Um operador de imagens é uma função que transforma uma imagem em outra imagem diferente. Logo, um operador \(\Psi\) é um elemento de \(Fun[ Fun[\E, K], Fun[\E, K] ]\) e é tanto uma função entre reticulados quanto um elemento no reticulado dos operadores. Um classe de especial interesse entre os operadores de imagens é a classe dos \(W-\)operadores.

Um operador \(\Psi\) é u \(W-\)operador se ele possui as duas seguintes propriedades:

  1. invariante à translação: \(\Psi(t(I, p)) = t(\Psi(I), p)\), onde \(t(I, p)\) representa a translação da imagem \(I\) por \(p \in \Z^2\);
  2. localmente definido: existe uma janela \(W \in \Z^2\) tal que \(\Psi(I)(p) = \Psi(I_p^{(W)}), \forall I \in Fun[\E, K], p \in \Z^2\).

Todo \(W-\)operador \(\Psi\) pode ser unicamente caracterizado por uma função \(\psi \in Fun[ Fun[W, K], K]\), de maneira que

\[ \Psi(I)(p) = \psi(I_z^{(W)}) \forall I \in Fun[\E, L], p \in \Z^2.\]

Como \(\psi\) é um operador entre um reticulado (\(Fun[W, K]\)) e uma cadeia (\(K\)), \(\psi\) pode ser expresso utilizando a decomposição canônica:

\[\psi(I)(p) = \sum_{y=0}^m \vee \{ \lambda[A,B](I_p^{(W)} : [A,B] \in \textbf{B}_\psi(k) \}.\]

Lembrando que o operador \(\lambda[A,B] \in Fun[ Fun[W, K], \{0, 1\}]\) tem a seguinte forma:

\[ \lambda_{A,B}(I) = \begin{cases} 1 \textrm{, if } I \in [A,B] \\ 0 \textrm{, otherwise. } \end{cases} \]

Por um lado, o operador de imagens \(\Psi\), não importa tão complexo ele seja, pode ser decomposto em uma série de operadores de imagens fundamentais. Por outro lado, qualquer operação de imagens pode ser desenvolvida ou aprendida se for possível determinar quais intervalos devem ser usados para representar o operador.

O operador intervalo em imagens

Nesta seção mostrarei como utilizar operadores intervalo para construir um operador que detecta bordas em imagens binárias como a imagem abaixo.

O operador intervalo é parametrizado por dois extremos \(A\) e \(B\). Todos os pontos cuja imagem janela contem o primeiro e está contida no segundo extremo terão como saída um pixel branco. Para identificar os cantos superiores direitos podemos utilizar os seguintes intervalos:

De maneira similar, os seguintes intervalos podem ser utilizados para detectar os extremos verticais esquerdos das formas:

O mesmo raciocínio pode ser aplicado para os outros cantos e extremos verticais e horizontais, resultando no seguinte conjunto de intervalos:

Veja abaixo o resultado da união dos operadores intervalo acima na imagem de exemplo.

Note que este conjunto de intervalos não é capaz de detectar todas as bordas diagonais, pois elas possuem uma variação maior que as bordas em 90 graus.


segunda-feira, 2 de março de 2015

Teoria de W-operadores - Reticulados e Operadores entre reticulados

\[ \newcommand{\L}[0]{\mathcal{L}} \newcommand{\P}[0]{\mathcal{P}} \]
A revisão de teoria continua, desta vez com aspectos fundamentais do treinamento de \(W-\)operadores. Neste documento irei apresentar algumas definições importantes de reticulados e operadores entre reticulados.

Conjuntos parcialmente ordenados e Reticulados completos

Seja \(\mathcal{L}\) um conjunto e \(\leq\) uma relação binária entre elementos de \(\mathcal{L}\). Se a relação \(\leq\) for:
  1. reflexiva (\(x\leq x \forall x \in \mathcal{L}\));
  2. anti-simétrica (\(x \leq y\) e \(y \leq x\) implica \(x = y\));
  3. transitiva (\(x \leq y\) e \(y \leq z\) implica \(x \leq x\)),
então \((\mathcal{L}, \leq)\) é chamado de conjunto parcialmente ordenado ou poset (de partially ordered set). A relação \(\leq\) é chamada de relação de ordem parcial (pois não requer que todos elementos estejam relacionados).
Sejam \(L, U \in \mathcal{L}\) e \(\Xi \subseteq \mathcal{L}\), então \(L\) e \(U\) são chamados de limite superior e limite inferior de \(\Xi\) se \(X \leq U \forall X \in \Xi\) e \(L \leq X, \forall X \in \Xi\), respectivamente. O menor limitante superior de \(\Xi\), se ele existir, é chamado de supremo. Da mesma maneira, o maior limitante inferior de \(\Xi\) é chamado de ínfimo. Tanto o ínfimo quanto o supremo são únicos, se existirem. O ínfimo e o supremo entre dois elementos \(X\) e \(Y\) são denotados \(X \wedge Y\) e \(X \vee Y\).
Um subconjunto \(\Xi \subseteq \mathcal{L}\) é um intervalo se e somente se existem dois elementos \(A,B \in \mathcal{L}\) tal que
\[ A \leq X \leq B \Leftrightarrow X \in \Xi, \forall X \in \mathcal{L}.\]
Intervalos são denotados por \([A,B]\), sendo que \(A\) é a extremidade esquerda e \(B\) a extremidade direita do intervalo. O conjunto de intervalors \(\{[A,B] : A,B \in \L, A \leq B\}\) junto com a operação \(\preccurlyeq\) é um reticulado completo.
\[ [A,B] \preccurlyeq [A',B'] \Leftrightarrow A \leq A' \textrm{ e } B \leq B' \]
O conjunto \(Max(\{[A,B]\})\) contém todos os intervalos maximais.
Um poset \(\mathcal{L}\) é um reticulado completo se todo subconjunto de \(\L\) possui um ínfimo e um supremo. Reticulados completos sempre possuem um máximo \(I\) e um mínimo \(O\). Quando todos os elementos de um reticulado completo são comparáveis ele é chamado de cadeia.

Operadores entre reticulados

Dados reticulados \(\L_1\) e \(\L_2\), o conjunto \(Fun[\L_1,\L_2]\) contém todas as funções de \(\L_1\) a \(\L_2\). Elementos deste conjunto são chamados de operadores ou mapeamentos. Elementos de \(\L_1\) serão denotados \(A, B\) e \(X\) e elementos de \(\L_2\) serão denotados \(V\) e \(Y\). Operadores serão denotados por letras gregas minúsculas \(\alpha, \beta, \dots\).
Defina \(\lambda_{A,B}\) um operador (chamado de sup-gerador) de \(\L_1\) para \(\{0, 1\}\) da seguinte maneira:
\[ \lambda_{A,B}(X) = \begin{cases} 1 \textrm{, if } X \in [A,B] \\ 0 \textrm{, otherwise } \end{cases} \]
O kernel \(K_\psi \in Fun[L_2, \P(L_1)]\) de um operador \(\psi \in Fun[\L_1, \L_2]\) é dado por
\[ K_\psi(Y) = \{X \in \L_1 : Y \leq \psi(X) \}. \]
Essencialmente, \(K_\psi\) contém, para cada elemento \(Y\) todos os elementos de \(L_1\) que são maiores ou iguais a \(Y\) após a aplicação de \(\psi\).

Teorema (Decomposição Canônica):

Todo operador \(\psi \in Fun[\L_1, \L_2]\) pode ser decomposto em função de operadores sup-geradores:
\[ \psi(X) = \vee \{ Y \in \L_2 : \vee\{\lambda_{A,B}(X) : [A,B] \in K_\psi(Y) \} = 1\}, \forall X \in \L_1 \]
A representação de um operador utilizando a decomposição acima é redundante, pois se \(X \in [A,B]\) e \(X \in [A',B']\) tal que \(A\leq A'\) e \(B\leq B'\) então o intervalo \([A,B]\) é redundante. Desta forma, definimos
\[ \textbf{B}_\psi(Y) = Max(K_\psi(Y)) = \{[A,B] : \nexists [A',B'] \textrm { s.t. } [A,B] \preccurlyeq [A', B']\} \]
e o teorema acima se torna
\[ \psi(X) = \vee \{ Y \in \L_2 : \vee\{\lambda_{A,B}(X) : [A,B] \in \textbf{B}_\psi(Y) \} = 1\}, \forall X \in \L_1 \]
e a representação de \(\psi\) em termos de \(\textbf{B}_\psi\) é chamada de decomposição por um conjunto de operadores sup-geradores.

Caso específico: Operadores entre reticulados e cadeias

Suponha que \(\L_2 = M = [0, m]\). Então o conjunto \(K = \{K_\psi(y) : y \in M\}\) também é uma cadeia em \((\P(\L_1), \subseteq)\) para todo \(\psi \in Fun[\L_1, M]\). Logo, o teorema da decomposição canônica se torna:
\[ \psi(X) = \sum_{y=1}^m \vee \{\lambda_{A,B}(X) : [A,B] \in \textbf{B}_\psi(y)\} \]
Se \(m=1\), o teorema se torna:
\[ \psi(X) = \vee \{\lambda_{A,B}(X) : [A,B] \in \textbf{B}_\psi(1)\} \]

Caso específico II: Imagens

Este outro texto explica o caso específico que interpreta imagens como reticulados e contextualiza a decomposição canônica como uma composição de operações de imagens.

sábado, 7 de fevereiro de 2015

Estudos de otimização: Programação linear

Um dos tópicos de revisão de otimização que estou estudando é o de Programação Linear. Neste tipo de problema de otimização tanto a função objetivo quanto as restrições são funções lineares das variáveis.

Apesar de problemas deste tipo poderem ser expressos de diversas maneiras, a maneira abaixo, chamada de forma canônica, é frequentemente utilizada por materiais da área (e também por pacotes computacionais).

\[ \begin{cases} \textrm{minimize} f(x) = c^Tx \textrm{ s.a.}\\ Ax = b\\ x \geq 0 \end{cases} \]

Conversão para a forma canônica

Seguem abaixo alguns ajustes que podem ser feitos para converter um problema linear qualquer para sua forma canônica:

  1. Se problema for \(maximize c^Tx\), converta-o para \(minimize -c^Tx\);
  2. Se houverem restrições de \(\geq\) ou \(\leq\), adicione uma variável \(s_i\) para cada restrição e converta-as em restrições de igualdade da seguinte maneira: se \(A_ix \geq b\), então \(A_ix -s_i = b\); se \(A_ix \leq b\), então \(A_ix + s_i = b\).
  3. Se houverem variáveis que podem ser negativas (sem restrição \(x_i \geq 0\)), faça a substituição \(x_i = x_i^{(+)} - x_i^{(-)}, x_i^{(+)} \geq 0, x_i^{(-)} \geq 0\).

As transformações (1) e (3) são relativamente fáceis de serem entendidas. No caso da transformação (2), é possível atribuir a \(s_i\) qualquer valor (pois s_i não faz parte da função objetivo). Desta maneira, se durante o proceso de otimização \(A_ix = b\), então basta que \(s_i = 0\).

O problema Dual

Todo problema de minimização (primal) em PL possui um problema de maximização (dual) relacionado de modo que ambos possuem o mesmo valor de função objetivo e é trivial encontrar a resposta de um a partir do outro.

Dado o problema linear na forma canônica acima, o problema dual consiste em:

\[ \begin{cases} \textrm{maximize} f(y) = b^Ty \textrm{ s.a.}\\ A^Ty \leq c\\ \end{cases} \]

A partir da solução ótima \(y^*\) do problema dual, é possível obter a solução ótima \(x^*\) do problema primal.

Seja \(u = c - A^Ty\). O vetor \(u\) contem a "distância" que cada restrição dual está da igualdade. Uma restrição somente restringe a função objetivo se está "saturada", ou seja, \(u_i = 0\). Desta maneira, podemos ignorar toda coluna de \(A\) tal que \(u_j \neq 0\), pois esta restrição não está ativa na solução do dual.Se o problem dual tiver solução única o número de componentes não zero de \(u\) será igual ao número de linhas de \(A\) (número de restrições primais). Logo, podemos obter \(x\) resolvendo o seguinte sistema linear:

\[ A[:,u_i = 0]x^* = b \].

As posições de x^* tal que \(u_i \neq 0\) são completadas com \(x^*_i = 0\), pois todas as restrições de \(A\) já são satisfeitas com igualdade pelas outras componentes de \(x^*_i\).

Exercício exemplo

Como exemplo, resolveremos um exercício simples de programação linear que ilustra os conceitos revistos.

Enunciado:

Uma startup busca fabricar máquinas de lavar falantes ao menor custo possível. Existem três maneiras de produzí-las: manualmente, semi automaticamente e automaticamente. A produção manual de uma máquina de lavar requer 1 minuto de trabalho qualificado, 40 minutos de trabalho não qualificado e 3 minutos de montagem. Para a produção semi automáticas os valores são, respectivamente, 4, 30 e 2 minutos e para a produção automática os valores são 8, 20 e 4 minutos. A startup dispões de 4500 minutos de trabalho qualificado, 36000 de trabalho não qualificado e 2700 minutos de montagem. Os custos de produção manual, semi automático e automático são, respectivamente, 70, 80 e 85 euros.

1. Formule o problema como um PL e dê uma solução.

No problema acima, as variáveis são o número \(x_1, x_2 e x_3\) de máquinas feitas por cada tipo de produção (manual, semi-automática e automática). O custo a ser minimizado é, portanto \(70x_1 + 80x_2 +85x_3\). Existem restrições quanto ao número de máquinas a serem produzidas e à capacidade de produção da fábrica (número de minutos para cada tipo de trabalho).

Abaixo o problema completo:

\[ \begin{cases} \textrm{minimize} f(x) = 70x_1 + 80x_2 +85x_3 \textrm{ s.a.}\\ x_1 + x_2 + x_3 = 999\\ x_1 + 4x_2 + 8x_3 \leq 4500\\ 40x_1 + 30x_2 + 20x_3 \leq 36000\\ 3x_1 + 2x_2 + 4x_3 \leq 2700\\ x \geq 0 \end{cases} \]

Solução usando scipy:

import numpy as np
from scipy.optimize import linprog
from numpy.linalg import solve

A_eq = np.array([[1,1,1]])
b_eq = np.array([999])

A_ub = np.array([
[1, 4, 8],
[40,30,20],
[3,2,4]])

b_ub = np.array([4500, 36000,2700])

c = np.array([70, 80, 85])

res = linprog(c, A_eq=A_eq, b_eq=b_eq, A_ub=A_ub, b_ub=b_ub,
bounds=(0, None))
print('Valor otimo:', res.values()[3], '\nX:', res.values()[4])
Valor otimo: 73725.0
X: [ 636.  330.   33.]

2. Converta o problema para sua forma canônica

Para converter o problema acima para a forma canônica é necessário adicionar variáveis de folga para as restrições de desigualdade. Desta forma, o problema se torna:

\[ \begin{cases} \textrm{minimize} f(x) = 70x_1 + 80x_2 +85x_3 \textrm{ s.a.}\\ x_1 + x_2 + x_3 = 999\\ x_1 + 4x_2 + 8x_3 + s_1 = 4500\\ 40x_1 + 30x_2 + 20x_3 + s_2 = 36000\\ 3x_1 + 2x_2 + 4x_3 + s_3 = 2700\\ x \geq 0, s \geq 0 \end{cases} \]

Solução usando scipy:

A = np.array([
[1, 1, 1, 0, 0, 0],
[1, 4, 8, 1, 0, 0],
[40, 30, 20, 0, 1, 0],
[3, 2, 4, 0, 0, 1]])

b = np.array([999, 4500, 36000, 2700])
c = np.array([70, 80, 85, 0, 0, 0])

res = linprog(c, A_eq=A, b_eq=b, bounds=(0, None))
print('Valor otimo:', res.values()[3], '\nX:', res.values()[4])
Valor otimo: 73725.0
X: [  636.   330.    33.  2280.     0.     0.]

Note que \(s_1 = 2280\) implica que \(x_1 + 4x_2 + 8x_3 \leq 4500\).

3. Apresente o dual do problema e mostre que ambas formulações obtem os mesmos resultados.

O problema dual correspondente é dado por:

\[ \begin{cases} \textrm{maximize} f(y) = 999y_1 + 4500y_2 + 360000y_3 + 2700y_4 \textrm{ s.a.} \\ y_1 + y_2 + 40y_3 + 3y_4 \leq 70 \\ y_1 + 4y_2 + 30y_3 + 2y_4 \leq 80 \\ y_1 + 8y_2 + 20y_3 + 4y_4 \leq 85 \\ y_2 \leq 0 \\ y_3 \leq 0 \\ y_4 \leq 0 \end{cases} \]

Solução usando scipy: Para a solução usando \(scipy\) podemos utilizar as variáveis declaradas anteriormente. Note que como linprog resolve problemas de minimização, o sinal da função objetivo está trocado.

res = linprog(-b, A_ub=A.T, b_ub=c, bounds=[(None,None), (None,None),
(None,None), (None,None)])
y = res.values()[4]
print('Valor otimo:', -res.values()[3], '\nY:', y)

u = c - A.T.dot(y)
Ar = A[:, np.abs(u)< 1e-10]
x_1 = solve(Ar, b)
print(x_1)
x = np.array([0.0] * len(c))
x[np.abs(u)< 1e-10] = x_1
x[np.abs(u)> 1e-10] = 0
print('Solucao X a partir de Y:', x)
Valor otimo: 73725.0
Y: [ 108.33333333    0.           -0.83333333   -1.66666667]
[  636.   330.    33.  2280.]
Solucao X a partir de Y: [  636.   330.    33.  2280.     0.     0.]

sexta-feira, 9 de janeiro de 2015

Resumo do Artigo "A Comparative Study of Staff Removal Algorithms"

O artigo "A Comparative Study of Staff Removal Algorithms" de Dalitz et al. apresenta um novo método para remoção de compasso em imagens de partituras e faz um estudo comparativo de diversos algoritmos da literatura. O estudo é baseado na deformação de um conjunto de imagens sintéticas usando diversos modelos que simulam condições reais de digitalização. Os autores buscam avaliar se existe um algoritmo que é mais robusto em todos os contextos.

Primeiramente, o artigo apresenta um esquema genérico de detecção de compasso (sem o objetivo de remoção) que resulta em uma aproximação poligonal das linhas. Para permitir o uso desta técnica com algoritmos de remoção de compasso o algoritmo genérico é modificado para estimar um "esqueleto" de cada linha do compasso. Este algoritmo é utilizado no restante do artigo como detector de linhas de compasso (para os algoritmos que necessitam de uma etapa de detecção).

Em seguida os autores fazem uma categorizam diversos algoritmos da área em quatro categorias:
  1. Line Tracking: algoritmos que primeiro detectam as linhas do compasso e depois removem os pixeis em torno de cada uma das linhas. O critério usado para remoção muda conforme o método; Refs [3][16] e [19] do artigo.
  2. Vector Fields: algoritmos deste tipo calculam, para cada pixel preto da imagem, um vetor cujo ângulo e comprimento é baseado no maior segmento de reta que contém somente pontos pretos; Ref [15] do artigo.
  3. Runlength Analysis: estes algoritmos consideram somente as sequências de pontos verticais e/ou horizontais de mesma cor (runlengths) e analisam a vizinhança de cada runlength para decidir se ela pertence ou não a uma linha do compasso; Refs [14] e [17] do artigo.
  4. Skeletonization: algoritmos que utilizam o esqueleto da imagem de partitura para decidir se um pixel é ou não parte de uma linha. O método apresentado pelos autores se encaixa nesta categoria. Ref [18] do artigo.

A última parte do artigo consiste na comparação entre os diversos algoritmos apresentados. As imagens foram geradas em programas de notação musical e posteriormente deformadas usando 10 modelos diferentes (Figura 1). Como as imagens foram geradas sinteticamente, é possível extrair o compasso delas a partir do arquivo gerado. Desta maneira, os datasets deformados são criados deformando simultaneamente a imagem de entrada (com as linhas) e a imagem de saída (sem as linhas).


A avaliação dos métodos é feita utilizando três medidas de erro diferentes (entre elas a comparação de pixels "pura") e usando o teste estatístico descrito em [Mao1999]. Todo o software e imagens usados estão disponíveis na página do MusicStaves.

Para as imagens originais "perfeitas", não existe nenhum algoritmo que obtém resultados significativamente melhores que os outros. Para o restante das deformações, o algoritmo apresentado pelos autores só não obteve o melhor desempenho na deformação Typeset Emulation.





(a) Original image.

(b) Curvature.

(c) Thickness.

(d) White speckles.

(e) Interruptions.

(f) Typeset.

(g) Kanungo

(h) Y-Variation.

(i) Rotation.
Figure 1. Deformations used to test the robustness of staff removal methods.




Referência completa: C. Dalitz, M. Droettboom, B. Pranzas, and I. Fujinaga, “A comparative study of staff removal algorithms,” IEEE Trans. Pattern Anal. Mach. Intell., vol. 30, no. 5, pp. 753–766, 2008.  [Download]

[Mao1999] Song Mao and Tapas Kanungo. 2001. Empirical Performance Evaluation Methodology and Its Application to Page Segmentation Algorithms. IEEE Trans. Pattern Anal. Mach. Intell. 23, 3 (March 2001), 242-256. DOI=10.1109/34.910877 [Download]

terça-feira, 16 de dezembro de 2014

Resumo de Otimização: Mínimos Quadrados

Atualização: veja a parte 2 deste texto, onde apresento um método de solução direta do problema e uma formulação regularizada chamada Ridge Regression que evita overfitting. O método de Mínimos Quadrados (Least Squares) é utilizado para resolver sistemas "super"-determinados (ou impossíveis) , i.e. em que existem mais restrições que variáveis desconhecidas. Apesar de não ser possível encontrar uma solução que respeite todas as restrições simultaneamente, é possível calcular uma aproximação. O método de Mínimos Quadrados busca uma solução que minimize a a soma dos quadrados das diferenças entre o valor predito pelo modelo e o valor desejado. 

Dados pares de observações $(x_j, y_j), 1 \leq j \leq m, x_j \in \mathbb{R}^n, m > n$, queremos encontrar uma função $g(x; \theta), \theta \in \mathbb{R}^k$ tal que $g(x_j; \theta) = y_j$ para uma escolha adequada dos parâmetros $\theta$. A função $g(x; \theta)$ é o modelo utilizado e precisa ser definido previamente.

Idealmente, o modelo $g(x; \theta)$ seria flexível o suficiente para representar a transformação desejada. Na prática, porém, o modelo $g(x; \theta)$ pode somente aproximar o valor correto $y_j$ a partir de $x_j$. Desta forma, podemos definir o erro de aproximação do par $(x_j, y_j)$ como

\[ r_j(\theta) = g(x_j; \theta) - y_j \]

e minimizar a função objetivo

\[ f(\theta) =  \frac{1}{2}\sum^m_j [r_j(\theta)]^2 = \frac{1}{2}\sum^m_j [  g(x_j; \theta) - y_j    ]^2. \]

Ao minimizar $f(\theta)$ encontramos o vetor de parâmetros $\theta$ que "melhor" ajusta o modelo $g(x; \theta)$ aos dados $(x_j, y_j)$. Neste caso, "melhor" é definido como o vetor $\theta$ que minimiza a soma do quadrado dos erros. Por isto o nome de método de Mínimos Quadrados.

Justificativa estatística

Suponha que os $r_j(\theta)$ são independentes e identicamente distribuídos com média 0, variância $\sigma^2$ e função densidade de probabilidade $g_\sigma$. Sob estas condições, a probabilidade de observar os $r_j(\theta)$ correspondentes ao conjunto de dados $(x_j, y_j)$, dadas a variância $\sigma$ e o vetor de parâmetros $\theta$ é:

\[p( (x, y) ; \theta ; \sigma) = \prod_j^m g_\sigma( r_j(\theta) )  = \prod_j^m g_\sigma( g(x_j; \theta) - y_i ) \]

Fixadas as observações $(x_j, y_j)$ e $\sigma$, o valor "mais provável" de $\theta$ é o que maximiza $p( (x, y) ; \theta ; \sigma)$. Este estimador para $\theta$ é chamado de Estimador de Máxima Verossimilhança.

Suponha, então, que a distribuição dos $r_j$ é normal. Portanto,

\[ g_\sigma(r) = \frac{1}{\sqrt{2\pi \sigma^2}} \mathrm{exp}(-\frac{r^2}{2\sigma^2}), \]

e então,

\[p( (x, y) ; \theta ; \sigma) =   \frac{1}{(2\pi\sigma^2)^{m / 2}} \mathrm{exp}(-\frac{1}{2\sigma^2}  \sum_j^m [g(x_j; \theta) - y_i )]^2  ). \]

Para maximizar $p( (x, y) ; \theta ; \sigma)$ (dado $\sigma^2$ fixo) é necessário minimizar $\sum_j^m [g(x_j; \theta) - y_i )]^2$. Portanto, a estimativa de $\theta$ obtida pelo método de Mínimos Quadrados equivale ao estimador de máxima verossimilhança de $\theta$ (supondo que os erros $r_j$ são i.i.d. com distribuição normal de média 0 e variância fixa $\sigma^2$).

Modelos Lineares

Diversos problemas podem ser modelados utilizando funções $g(x; \theta)$ lineares em $\theta$. Podemos, portanto, escrever os resíduos como $r_j(\theta) = x_j^T\theta - y_j$.

Seja $J \in \mathbb{R}^{m\times n}$ tal que

\[ J =

\begin{pmatrix}
x_1^T \\
\dots \\
x_m^T\\
\end{pmatrix}, \]

então o problema de mínimos quadrados se reduz a minimizar a função

\[ f(\theta) = \frac{1}{2} || J\theta - y ||_2^2 \]

Modelos lineares são vantajosos pois a função acima pode ser minimizada globalmente. Isto não é necessariamente verdade para modelos não lineares em $\theta$.

Note que a função $g(x; \theta)$ deve ser linear em $\theta$, mas não necessariamente em $x$. Logo, a função

\[ g(x; \theta) = {x^{(1)}}^2  \theta_{(1)} + x^{(1)}x^{(2)}\theta_{(2)} \]

é um modelo válido para a estimação linear, pois ela equivale a construir um novo conjunto de dados $(x'_j, y_j)$, onde $x'_j = ({x^{(1)}_j}^2, x_j^{(1)}x_j^{(2)})$, e fazer a minimização linear "comum".

Exemplos usando Python

A biblioteca Scipy possui tanto a implementação do Método de Mínimos Quadrados para o caso linear quanto para o caso geral. Neste texto mostrarei como utilizar a função numpy.linalg.lstsq para estimar modelos lineares.

Iremos estimar duas funções diferentes. Ambas podem ser estimadas usando modelos lineares. A função $f_1$ é um polinômio de segundo grau e a $f_2$ é uma função de duas variáveis.

\[  f_1(x) = 2x^2 + 5x + 7 \]

\[  f_2(x_1, x_2) = 0.3x^3 - 0.2y^2 + 3y - xy + 5 \]


Estimação de polinômios 

 

Utilizaremos três modelos para estimar $f_1$:

\[ g_1(x) = p_1x + p_2 \]
\[ g_2(x) = p_1x + p_2x^2 + p_3 \]
\[ g_3(x) = p_1x + p_2x^2 + p_3x^3 + p_4 \]

 É esperado que o modelo $g_1$ possua erro grande, pois um polinômio de grau 1 não consegue aproximar um polinômio de grau 2. Por outro lado, tanto $g_2$ quanto $g_3$ deverão obter boas aproximações, sendo que em $g_3$ o componente $x^3$ deverá ser próximo de 0.

Primeiramente, iremos gerar nosso conjunto de observações de $f_1$. Em cada observação também adicionaremos um pequeno erro.

x_data = [1, 4, 7, 8, -2, 5, 6, 12, -3, -5, -10]
y_data = [2 * x*x + 5*x + 7 - (random.random() * 5 - 2.5) for x in x_data]

Agora, iremos definir a matrix $J$ para cada um dos modelos e aplicar a função lstsq para estimar os parâmetros de cada modelo.

m =  len(x_data)
x2 = np.array([x*x for x in x_data]).reshape((m, 1))
x3 = np.array([x*x*x for x in x_data]).reshape((m, 1))
x_data = np.reshape(x_data, (m, 1))
y_data = np.reshape(y_data, (m, 1))

ones = np.ones(m).reshape(m, 1)

J1 = np.hstack([x_data, ones])
J2 = np.hstack([x2, x_data, ones])
J3 = np.hstack([x3, x2, x_data, ones])

theta_g_1 = np.linalg.lstsq(J1, y_data )
theta_g_2 = np.linalg.lstsq(J2, y_data )
theta_g_3 = np.linalg.lstsq(J3, y_data )

Os resultados obtidos podem ser vistos nas figuras abaixo:






Como esperado, a estimação linear foi bem ruim e a quadrática deu resultados quase perfeitos. O polinômio de grau 3 também teve resultados bons e apresentou um coeficiente bem pequeno para o termo $x^3$.

Estimação (linear) de funções de várias variáveis



Utilizaremos 2 modelos para estimar a função $f_2$:

\[ g_1(x, y) = \theta_1 x + \theta_2 y + \theta_3 xy + \theta_4\]
\[ g_2(x, y) = \theta_1 x^2 + \theta_2 x y + \theta_3 y^2 + \theta_4 x + \theta_5 y + \theta_6\]
\[ g_3(x, y) = \theta_1 x^3 + \theta_2 x^2 y + \theta_3 x y^2 + \theta_4 y^3 + \theta_5 x^2 + \theta_6y^2 + \theta_7xy + \theta_8x + \theta_9y + \theta_{10}\] 

Primeiramente, geramos as observações usando o código abaixo. Note que é necessário um número muito maior de pontos para estimar funções mais complexas.


data = np.array([(random.randint(-50, 50), random.randint(-50, 50)) for i in range(100)])
y_data = [0.3*x**3 - 0.2*y**2 + 3*y - x*y + 5 - (random.random() * 5 - 2.5) for (x, y) in data]

Após, geramos os vetores com as componentes de cada modelo e as matrizes $J_1, J2$ e $J_3$.


m = data.shape[0]
x3  = np.array([x**3 for (x, y) in data]).reshape((m, 1))
x2  = np.array([x**2 for (x, y) in data]).reshape((m, 1))
x1   = np.array([x for (x, y) in data]).reshape((m, 1))
y3  = np.array([y**3 for (x, y) in data]).reshape((m, 1))
y2  = np.array([y**2 for (x, y) in data]).reshape((m, 1))
y1   = np.array([y for (x, y) in data]).reshape((m, 1))
x2y = np.array([x**2 * y for (x, y) in data]).reshape((m, 1))
y2x = np.array([x * y**2 for (x, y) in data]).reshape((m, 1))
xy  = np.array([x*y for (x, y) in data]).reshape((m, 1))
ones= np.ones(m).reshape((m, 1))

J_1 = np.hstack([x1, y1, xy, ones])
J_2 = np.hstack([x2, xy, y2, x1, y1, ones])
J_3 = np.hstack([x3, x2y, y2x, y3, x2, y2, xy, x1, y1, ones])

theta_g_1, err1, _, _ = np.linalg.lstsq(J_1, y_data)
theta_g_2, err2, _, _ = np.linalg.lstsq(J_2, y_data)
theta_g_3, err3, _, _ = np.linalg.lstsq(J_3, y_data)

Os resultados obtidos foram os seguintes:
 Erro: 3.73790848e+09
 Erro: 3.64574253e+09
Erro:  204.59062094


Os primeiros dois modelos, mais simples, resultaram em erros grandes pois eles não possuem algumas componentes do modelo original. Já o terceiro modelo obteve resultados muito bons, porém ele contém uma quantidade muito maior de parâmetros que o modelo original. Isto ocorre pois o modelo original, em geral, não é conhecido e acabamos incluindo componentes irrelevantes para a estimação de $y_i$.

Uma desvantagem do método de Mínimos Quadrados é que a minimização feita dificilmente zera algum $\theta_i$, pois ele pode super ajustar a curva utilizando pequenos coeficientes em componentes que podem ser irrelevantes. Desta maneira, o método não é capaz de detectar quais parâmetros/características são relevantes para um dado problema.

Comentários finais

A estimação utilizando o método de Mínimos Quadrados otimiza os parâmetros de um modelo de modo a minimizar a soma dos erros ao quadrado. Este método encontra mínimos globais se o modelo utilizado for linear (nos parâmetros a serem estimados) e é vantajoso quando se conhece ou se tem alguma intuição sobre a forma analítica do modelo original dos dados.
Atualização: veja a parte 2 deste texto, onde apresento um método de solução direta do problema e uma formulação regularizada chamada Ridge Regression que evita overfitting.





sexta-feira, 30 de maio de 2014

Resumo de Local Binary Patterns

Local Binary Patterns (LBP) são descritores locais de textura propostos em [1] baseados na suposição de que a informação de uma textura é dividida em dois aspectos complementares: padrão e intensidade.

O LBP original considerava uma vizinhança 3x3 em torno de cada pixel e, para cada pixel, comparava-o com o pixel central e atribuía 1 para o pixel se ele é maior ou igual ao pixel central e 0 caso contrário. O código LBP de cada pixel é calculado como um número de 8 bits em que o limiar de cada pixel recebe os pesos abaixo. Por fim, é feito um histograma dos códigos LBP calculados. Este histograma representa a textura presente na imagem.

Pesos para a codificação do padrão contido em uma janela 3x3.

A formulação proposta em [2] apresenta um LBP mais geral baseado em vizinhanças circulares e com um número arbitrários de pontos.

Vizinhança circular usada no LBP genérico.


Seja I(x, y) uma imagem em níveis de cinza, gc o nível de cinza de um ponto arbitrário (x, y) da imagem e P o número de pontos amostrados à distância R de (x, y).  Definimos os pontos gp = I(xp, yp), onde

xp = x + R cos(2πp/P),
yp = y - R sin(2πp/P).

Os valores de I(x, y) são interpolados bilinearmente toda vez que (x, y) não estiverem no centro de um pixel.

Suponha que a textura da imagem I possa ser caracterizada pela distribuição conjunta dos P+1 pixels:

T = t(gc, g0, ..., gP-1).

Sem perda de generalidade,

T = t(gc, g0 - gc, ..., gP-1 - gc)

Suponha que o valor do ponto central gc é estatisticamente independente das diferenças, resultando em

T ≈ t(gc)t(g0 - gc, ..., gP-1 - gc)

Desta maneira, a distribuição t(g0 - gc, ..., gP-1 - gc) pode ser usada para caracterizar o padrão da textura. Porém, estimar esta distribuição multi variada com precisão pode ser difícil. Para tornar as diferenças gi - gc robustas à variações nos níveis de cinza e melhorar a estimação de t, consideramos somente o sinal das diferenças. A distribuição estimada é:

t(s(g0 - gc), ..., s(gP-1 - gc))

O código LBP final é definido como

LBPP,R(xc, yc) = ∑ s(gp - gc)2p.

e codifica cada padrão observado como um número binário de P bits. Desta maneira, a distribuição dos padrões LBPP,R(xc, yc) aproxima a textura original T

T ≈ t(LBPP,R(xc, yc)).


A partir deste LBP genérico foram propostos diversas outras variantes deste métodos [3, 4]. Algumas aplicações notáveis do LBP são a segmentação não supervisionada de textura [5, 6] e a localização de faces [7].

Referências:

[1] Timo Ojala, Matti Pietikäinen, David Harwood, A comparative study of texture measures with classification based on featured distributions, Pattern Recognition, Volume 29, Issue 1, January 1996,

[2] Ojala, Timo, Matti Pietikainen, and Topi Maenpaa. "Multiresolution gray-scale and rotation invariant texture classification with local binary patterns." Pattern Analysis and Machine Intelligence, IEEE Transactions on 24.7 (2002): 971-987.

[3] Zhao, Guoying, and Matti Pietikainen. "Dynamic texture recognition using local binary patterns with an application to facial expressions." Pattern Analysis and Machine Intelligence, IEEE Transactions on 29.6 (2007): 915-928.

[4] Zhu, Chao, C-E. Bichot, and Liming Chen. "Multi-scale color local binary patterns for visual object classes recognition." Pattern Recognition (ICPR), 2010 20th International Conference on. IEEE, 2010.

 [5] Ojala, Timo, and Matti Pietikäinen. "Unsupervised texture segmentation using feature distributions." Image Analysis and Processing. Springer Berlin Heidelberg, 1997.

 [6] Ojala, Timo, and Matti Pietikäinen. "Unsupervised texture segmentation using feature distributions." Pattern Recognition 32.3 (1999): 477-486.

[7] Hadid, Abdenour, Matti Pietikainen, and Timo Ahonen. "A discriminative feature space for detecting and recognizing faces." Computer Vision and Pattern Recognition, 2004. CVPR 2004. Proceedings of the 2004 IEEE Computer Society Conference on. Vol. 2. IEEE, 2004.

terça-feira, 19 de novembro de 2013

Resumo do artigo "The ICDAR 2013 Music Scores Competition: Staff Removal"

O artigo "The ICDAR 2013 Music Scores Competition: Staff Removal" apresenta os resultados da competição de remoção de compasso ocorrida no ICDAR 2013. Os autores descrevem o conjunto de imagens usado e os processamentos realizados para degradar as imagens para que elas se tornem similares a documentos históricos.  Também são apresentados os resultados da competição.

(Este resumo foca na descrição do conjunto de dados e nas métricas de avaliação de desempenho. Algumas informações foram retiradas do artigo "The ICDAR/GREC 2013 Music Scores Competition on Staff Removal")

O conjunto de dados utilizado na competição foi o CVC-MUSCIMA, que contém 1000 imagens de 20 partituras escritas por 50 músicos diferentes. Cada músico transcreveu as mesmas 20 páginas. Este conjunto de dados foi submetido à duas operações de degradação das imagens e as imagens são oferecidas tanto em binário como em níveis de cinza.

A primeira degradação adiciona ruído local de modo a imitar os traços de documentos antigos. São adicionados defeitos como pequenos borrões de tinta e falhas "brancas" nos traços da imagem.


A segunda deformação simula a digitalização de documentos deteriorados adicionando pequenas dobras e seções amassadas na imagem.





O conjunto de treinamento foi dividido em três partes:
  1. TrainingSubset1: 1000 imagens geradas usando o modelo de distorção 3D com 2 meshes diferentes;
  2. TrainingSubset2: 1000 imagens geradas com 3 níveis de ruído local;
  3. TrainingSubset3: 2000 imagens geradas com combinações de distorção 3D e ruído local. Os parâmetros são os mesmos usados nos itens 1 e 2.
O conjunto de testes também foi dividido em 3 partes:
  1. TestSubset1: 500 imagens geradas usando o modelo de distorção 3D com 2 meshes diferentes dos do treinamento;
  2. TestSubset2: 500 imagens geradas com os mesmos 3 níveis de ruído local;
  3. TestSubset3: 1000 imagens geradas com combinações de distorção 3D e ruído local. Os parâmetros são os mesmos usados nos itens 1 e 2 dos conjuntos de teste.

Os autores utilizaram 5 medidas de erro: Acurácia, Precisão, Recall, F-measure e Especificidade.

(Acurácia = taxa de erro, Precisão = TP/(TP + FP), Recall = TP/(TP + FN), Especificidade = TN/(TN + FP), F-measure= 2* (Precisão * Recall)/(Precisão + Recall) )

Os resultados de cada método podem ser vistos na tabela da última página do artigo [2].

Referências completas:
  1. Visaniy, M.; Kieu, V.C.; Fornes, A.; Journet, N., "ICDAR 2013 Music Scores Competition: Staff Removal," Document Analysis and Recognition (ICDAR), 2013 12th International Conference on , vol., no., pp.1407,1411, 25-28 Aug. 2013. [Download]
  2. V. Kieu, A. Fornes, M. Visani, and N. Journet, “The ICDAR/GREC 2013 Music Scores Competition on Staff Removal,” in 10th IAPR International Workshop on Graphics RECognition (GREC 2013), Bethlehem, PA, USA. [Download]

terça-feira, 24 de setembro de 2013

Resumo do Artigo "Staff Detection with Stable Paths"

 O artigo "Staff Detection with Stable Paths" de Cardoso et al. apresenta um método para a identificação do compasso em imagens de partituras utilizando caminhos em grafos. Segundo os autores, as abordagens anteriores utilizam somente informações locais das imagens sem considerar seu contexto. Em especial, os autores não conhecem trabalhos que explorem o fato das linhas serem os componentes mais largos da imagem.

O método apresentado trata a imagem como um grafo cujos vértices são os pixels da imagem e as arestas conectam pixels vizinhos. O peso das arestas leva em conta tanto a cor como outras propriedades contextuais de imagens de partituras. Supondo que caminhos contendo pixels pretos são menos custosos que caminhos com pixels brancos, as linhas do compasso são caminhos com menor custo que conectam as duas margens da página e que possuem somente um vértice de cada coluna. Iterando este algoritmo é possível encontrar todas as linhas de uma imagem.

Os autores definem um caminho Ps, t como um caminho estável (Stable Path) se Ps, t é, ao mesmo tempo, o caminho mais curto entre o pixel s e sua margem oposta e o caminho mais curto entre o pixel t e sua margem oposta. O algoritmo apresentado para calcular os caminhos estáveis possui complexidade similar ao de computar os caminhos ótimos entre as margens. Não existe garantia que o algoritmo encontrará um caminho estável para cada linha do compasso. Por isto, o método é iterado diversas vezes na imagem, apagando as linhas encontradas anteriormente. Uma etapa final de pós-processamento descarta linhas redundantes e agrupa as linhas em compassos. Linhas que não fazem parte de um compasso são descartadas.

A avaliação do método é feita utilizando as imagens da base do MusicStaves. O algoritmo apresenta bons resultados na comparação com o algoritmo de detecção de linhas apresentado em Dalitz et al2008. Os autores também testam o efeito da utilização deste algoritmo no lugar do implementado no MusicStaves para a remoção de compasso e obtém resultados competitivos com o Skeleton (apresentado em Dalitz et al2008 e que não detecta as linhas explicitamente).


Referência completa: dos Santos Cardoso, J.; Capela, A.; Rebelo, A.; Guedes, C.; Pinto da Costa, J., "Staff Detection with Stable Paths," Pattern Analysis and Machine Intelligence, IEEE Transactions on , vol.31, no.6, pp.1134,1139, June 2009 [Download]

terça-feira, 17 de setembro de 2013

Resumo do artigo "A Robust Detector for Music Staves"

O artigo "A robust detector for music staves" de Leplumey et al. descreve um método para a extração das linhas do compasso em partituras. O diferencial deste trabalho é que seu algoritmo foi desenvolvido para ser robusto a pequenas variações de curvatura e a interrupções nas linhas. Infelizmente, os autores não  fazem uma avaliação rigorosa do desempenho do algoritmo, apenas exibem seu resultado em uma imagem e comentam que o algoritmo errou apenas uma linha em um conjunto contendo 10 imagens.

O algoritmo depende, como em diversos outros trabalhos da área, de dois parâmetros: a "altura" da linha e a distância entre as linhas. A estimação destes parâmetros é feita da seguinte maneira. Primeiro, a imagem é analisada coluna a coluna e são computadas as frequências do comprimento de cada seguimento preto de cada coluna. O parâmetro staff_height é definido como o comprimento de componentes mais frequente. O parâmetro staff_space é definido como a distância entre segmentos pretos mais frequente. A lista de segmentos pretos por coluna é usada também nas próximas etapas do algoritmo.

O método apresentado possui dois níveis de análise para a detecção das linhas. No primeiro, ele busca agrupar localmente pequenos segmentos, chamados de stains, que possuam alta semelhança para caracterizar o início de uma linha. No segundo nível, os stains são expandidos para formar uma linha do compasso de modo a maximizar seu comprimento. Por fim, as linhas que possuem pouca curvatura (menor que 10 graus) são agrupadas usando um critério que leva em conta a posição e o grau de paralelismo entre as retas. Grupos com pelo menos 5 linhas paralelas são identificados como compassos.

Referência completa: Leplumey, I.; Camillerapp, J.; Lorette, G., "A robust detector for music staves," Document Analysis and Recognition, 1993., Proceedings of the Second International Conference on , vol., no., pp.902,905, 20-22 Oct 1993 [IEEExplore (necessita de autenticação :( ]

quarta-feira, 11 de setembro de 2013

Resumo do artigo "An Effective Staff Detection and Removal Technique"

O artigo "An Effective Staff Detection and Removal Technique" de Bolan Su et al trata do problema de detecção e remoção das linhas de compasso em imagens de partitura. Os autores apresentam um novo método que modela o formato das linhas do compasso e utiliza o modelo estimado para a remoção do compasso.

O algoritmo é divido em 4 passos. No primeiro passo é aplicado um filtro 1D nas colunas da imagem que elimina grande parte dos símbolos musicais. No segundo passo, o modelo é estimado a partir da detecção preliminar obtida no primeiro passo. O modelo utilizado é uma sequência (Oi) de deslocamentos verticais, ou seja, a coordenada y do pixel k da linha é obtida somando Ok na coordenada y do pixel k-1. Para tornar o método mais robusto, o elemento Oi do modelo é determinado utilizando informações de todas as linhas presentes na imagem. Além disto, o algoritmo considera não somente o pixel imediatamente vizinho para o cálculo da orientação da linha, mas também os mais próximos das k colunas seguintes. O terceiro passo envolve a superposição da curva Oi encontrada no passo anterior para detectar a posição de cada linha na imagem. Por fim, a quarta etapa remove da imagem os componentes que cruzam as linhas encontradas e são mais compridos verticalmente do que o tamanho da linha detectado.

O método proposto foi testado no dataset CVC-MUSCIMA e comparado com um algoritmo de Line Tracking e com o ISI01-HA (vencedor da competição do ICDAR 2011). O algoritmo apresenta desempenho superior ao algoritmo de Line Tracking, porém inferior ao ISI01-HA. As principais vantagens do novo método seriam sua robustez à deformações que afetem o formato da linha, como curvatura e rotação. O algoritmo possui duas limitações. A primeira é a sua incapacidade de lidar com linhas grossas. A segunda limitação é a falta de precisão do modelo, que muitas vezes não encaixa perfeitamente nas linhas do compasso. Os autores atribuem esta discrepância a erros de interpolação e acreditam que incorporar informação local no modelo possa melhorar a detecção das linhas.

Referência completa: Su, B., Lu, S., Pal, U., & Tan, C. L. (2012, March). Aneffective staff detection and removal technique for musical documents. InDocument Analysis Systems (DAS), 2012 10th IAPR International Workshop on (pp.160-164). IEEE. [Download]