Máquina Associadora de Eventos - MAE

De LCAD
Revisão de 11h28min de 21 de setembro de 2010 por Mberger (discussão | contribs)
Ir para: navegação, pesquisa

Manual da MAE

Introdução

O que é a MAE? 
Histórico 

Instalando a MAE

Nesta seção descreveremos o roteiro de instalação da MAE passo-a-passo nos ambientes utilizados no LCAD (Windows Xp, Ubuntu, Fedora). No entanto ainda é possível instalá-la em qualquer sistema LINUX/WINDOWS seguindo os passos aqui citados, porém algumas diferenças na instalação entre distribuições diferentes podem surgir, ficando a cargo do usuário resolvê-las.

No Windows

Baixando a MAE 
  • Baixe um cliente SVN. Recomendamos o TortoiseSVN.
  • Faça checkout do repositório http://www.lcad.inf.ufes.br/svn/MAE no diretório 'C:\MAE'. É necessário ter permissão de acesso ao repositório. Caso você não tenha, entre em contato com a administração do LCAD.
Dependências (bibliotecas) 

Instale os seguintes pacotes para o Windows (caso o link não seja mais válido, procure no Google):

Obs.: Manter os parâmetros default dos instaladores.

Baixe o arquivo zip WINGLUT.zip Abra o zip e:

  • Copie os arquivos libglu32.a, libglut.a e libglut32.a para o diretório C:\Dev-Cpp\lib
  • Copie o arquivo glut.h para o diretório C:\Dev-Cpp\include\GL
  • Copie os arquivos glu32.dll, glut32.dll e opengl32.dll para o diretório C:\Windows\System32 (se o Windows disser que eles já existem lá, mande sobreescrever; é recomendado fazer um backup das cópias das dlls no diretório para que o caso de erros acontecerem).
Compilando a MAE 

Setar a variável de ambiente PATH para apontar para os diretórios C:\Dev-Cpp\bin, MAE\bin e C:\Program Files\GnuWin32\bin (caso esse path seja diferente na sua máquina, mudar os scripts Makefile.win).

  1. Entrar no prompt de comando do DOS;
  2. Acessar o diretório raiz da MAE;
  3. Executar o script de compilação da MAE via os comandos:
    1. make –f Makefile.win clean
    2. make –f Makefile.win
  • Saída
    • A libnet_conn.a gerada no diretório MAE\lib;
    • O netcomp.exe no diretório MAE\bin.
Compilando os Exemplos 
  1. Entrar no prompt de comando do DOS;
  2. Acessar o diretório raiz do exemplo da MAE;
  3. Executar o script de compilação do exemplo via os comandos:
    1. make –f Makefile.win clean
    2. make –f Makefile.win
  • Saída
    • A DLL do exemplo é gerada no diretório MAE\lib;
    • O EXE do exemplo é gerado no diretório do exemplo.
Gerando DLLs de Aplicações MAE 

No Linux

Baixando a MAE 
Dependências (bibliotecas) 
Compilando a MAE 
Compilando os Exemplos 

Framework MAE

Arquitetura da MAE

Network Architecture Description Language

==== Control Script Language

Tutorial

Uma Aplicação Exemplo – Reconhecimento de Faces

Base de Dados de Entrada – AR Face Database

Arquitetura da Aplicação MAE face_recog_planar

Descrição da face_recog_planar em NADL

Compilando e Rodando a face_recog_planar

Interface do Usuário com a face_recog_planar

Funções do Usuário Associadas à Aplicação face_recog_planar

Controlando a face_recog_planar via CSL

Especificação da NADL

O conteúdo dos arquivos com a definição léxica e sintática da linguagem NADL se encontra nos arquivos netcomp_lex.l e netcomp_yacc.y no diretório <diretório da MAE>/src. Nesta seção será descrita resumidamente os comandos da linguagem utilizados.

Variáveis

Constantes

Camadas Neurais

Uma neuron_layer é, basicamente, uma matriz de neurônios que são utilizadas para implementar as camadas de neurônios (células simples, células complexas, células de MT, etc.). A sintaxe para especificar uma neuron_layer é mostrada abaixo:

neuron_layer <nome><dimensão> with <tipo de saída> outputs;

<nome> : Nome pelo qual a neuron_layer poderá ser referenciada. <dimensão> : Dimensão da neuron_layer. Definida entre colchetes. Exemplo da dimensão de uma neuron_layer bidimensional 10x10 com um total de 100 neurônios: [10][10].

<tipo de saída> : Define o tipo de saída dos neurônios de uma neuron_layer. Pode ser: b&w, grayscale, grayscale_float e color. Quando as saídas são definidas como b&w elas podem assumir os valores 0 ou 1 apenas, representando, o preto e o branco. Quando as saídas são definidas como grayscale elas podem assumir valores inteiros de 0 à 255, representando uma escala de cinza com 256 valores. Quando as saídas são definidas como grayscale_float elas podem assumir qualquer valor de ponto flutuante, entretanto para a visualização, é selecionado o maior valor em módulo (|s_max|) da saída dos neurônios desta neuron_layer, e este valor é utilizado para realizar uma discretização na visualização: a parte positiva, definida pelo intervalo [0, |s_max|], é discretizada e visualizada como 256 níveis de verde, enquanto que a parte negativa, definida pelo intervalo [-|s_max|, 0[, é discretizada e visualizada como 256 níveis de vermelho. Caso só possua valores positivos, a visualização é feita em escala de cinza. Quando as saídas são definidas como color, elas podem assumir um valor RGB de 24 bits, com 8 bits por cor.

Entrada

Através do comando input, é criada uma neuron_layer com nome, dimensão e saída especificadas, entretanto, um tratamento especial é dada nestas neuron_layer’s. É criada uma janela para cada input gerada que mostra o estado dos neurônios desta input, e podem ser associadas duas funções, uma para geração e outra para manipulação da input. A neron_layer criada pela input pode ser manipulada por eventos de mouse e teclado. A sintaxe para especificar uma input é mostrada abaixo:

input <nome><dimensão> with <tipo de saída> outputs [produced by <função geradora>] [controled by <função de controle>];

<nome> : Nome pelo qual a input poderá ser referenciada.

<dimensão> : Dimensão da input. Possui a mesma descrição do parâmetro <dimensão> da neuron_layer, citado anteriormente.

<tipo de saída> : Define o tipo de saída dos neurônios de uma input. Podem ser: b&w, grayscale, grayscale_float e color. Possui a mesma descrição do parâmetro <tipo de saída> da neuron_layer, citado anteriormente.

<função geradora> : O objetivo da função de geração é inicializar parâmetros da input, criar sua janela, associá-la às funções de controle de mouse, teclado, além do controle de atualização do conteúdo da janela. Podem-se passar quantos parâmetros forem necessários para a função de geração, desde que sejam constantes, expressões aritméticas ou nomes de objetos já definidos no arquivo de definição. Nesta função, normalmente é definida como a input receberá as informações de entrada, por exemplo, de um arquivo de entrada. A declaração de uma função de geração é opcional. Se não for definida, a função pré-estabelecida na biblioteca MAE será utilizada, que é a que trata de imagens estáticas. Esta função procura no diretório em que está sendo executada a aplicação MAE, um arquivo com o mesmo nome da input com extensão .in. Uma string na primeira linha deste arquivo deve informar o nome de um arquivo .bmp contendo a imagem estática a ser usada como entrada. Os valores de cada pixel deste arquivo são passados para os neurônios da input.

<função de controle> : Também é opcional. O objetivo da função de controle é fornecer o código necessário para tratar a interação da input com o usuário, por exemplo, eventos de clique de mouse sobre a janela de visualização da input. Podem-se passar quantos parâmetros quiser, desde que sejam constantes, expressões aritméticas ou nomes de objetos já definidos no arquivo de definição.

Saida

Uma output é apenas uma visualização das saídas de uma neuron_layer. Através de uma output, pode-se fornecer uma interação do usuário com uma determinada neuron_layer, semelhante a input. A sintaxe para especificar uma output é mostrada abaixo:

output <nome><dimensão> [handled by <função manipuladora>];

<nome> : Nome pelo qual a output poderá ser referenciada.

<dimensão> : Dimensão da output. Possui a mesma descrição do parâmetro <dimensão> da neuron_layer, citado anteriormente.

<função manipuladora> : A declaração desta função é opcional. O objetivo da função manipuladora é fornecer o código necessário para tratar a interação da output, e portanto com a neuron_layer na qual está associada (vide comando output_connect), com o usuário. Podem-se passar quantos parâmetros quiser, desde que sejam constantes, expressões aritméticas ou nomes de objetos já definidos no arquivo de definição.

Filtros

Este comando define que uma ou mais neuron_layers, terão suas saídas processadas e, o resultado deste processamento será a entrada de uma outra neuron_layer. Esta é a definição de filtro para a MAE. Alguns filtros mais utilizados, por exemplo, um filtro que computa a soma da saída de um conjunto de neuron_layer’s colocando o resultado numa outra neuron_layer, estão implementados no arquivo <diretório da MAE>/src/filter.c, entretanto podem ser implementados filtros específicos para uma determinada aplicação, bastando que seja codificada no arquivo de funções do usuário que será descrito posteriormente. A sintaxe do comando filter é mostrada abaixo:

filter <neuron_layer’s de entrada> with <nome do filtro><parâmetros> producing <neuron_layer de saída>;

<neuron_layer’s de entrada> : Nome das neuron_layer’s que são entrada para o filtro. Caso tenha mais de uma neuron_layer, deverão ser separadas por vírgula.

<nome do filtro> : Nome do filtro, que deve ser o mesmo nome da função que o implementa.

<parâmetros> : Conjunto de parâmetros passado para a função que implementa o filtro, cuja sintaxe é semelhante à sintaxe do comando printf da linguagem C.

<neuron_layer de saída> : Nome da neuron_layer que receberá a saída do processamento do filtro.

Associações

O comando set atribui um valor a uma variável global qualquer da aplicação MAE, definida em seu código fonte. A sintaxe do comando set é mostrada abaixo:

set <variável> = <valor>;

<variável> : Nome da variável global.

<valor> : Valor a ser atribuído na variável global.

Conexão entre Camadas Neurais

Conexão com Saídas

Comando utilizado para associar uma output com uma neuron_layer que, para isto, devem possuir as mesmas dimensões. A sintaxe do comando output_connect é mostrada abaixo:

output_connect <nome da neuro_layer> to <nome da output>;

<nome da neuron_layer> : Nome da neuron_layer que terá a saída de seus neurônios mostrada na output.

<nome da output> : Nome da output que mostrará a saída dos neurônios da neuron_layer.

Funções do Usuário

Na construção de uma aplicação utilizando o framework MAE, é permitido incluir funções implementadas pelo usuário. Nesta seção serão descritas as funções de usuário predefinidas pelo framework, juntamente com a sintaxe, objetivos e quando são chamadas. Estas funções devem estar dentro de um arquivo cujo nome deve estar de acordo com o nome do arquivo .con que define a arquitetura da aplicação. Se o arquivo se chama <arq>.con, este arquivo deve se chamar <arq>_user_functions.c e deve estar localizado dentro de um diretório localizado no mesmo diretório do arquivo <arq>.con de nome <arq>_user_functions.

Arquivo de descrição da arquitetura <arq>.con

Arquivo do rotinas do usuário: <arq>_user_functions/<arq>_user_functions.c

  • int init_user_functions (INPUT_DESC *input, int status);

Nesta função o usuário pode implementar qualquer inicialização necessária para a aplicação desenvolvida. Recebe como parâmetro um ponteiro para uma input e o código de status da execução da aplicação, isto é, se está em movimentação (MOVE), processando (RUN) ou apenas posicionando-o (SET_POSITION). É chamada uma única vez depois que as neuron_layer’s já foram instanciadas e antes de entrar no ciclo de espera por algum evento do usuário. Função de implementação obrigatória.

  • void input_generator (INPUT_DESC *input, int status);

Função de geração da input. Pode ter qualquer nome, contudo igual ao nome do parâmetro <função de geração> do comando de descrição da input. É chamada uma vez por ciclo de execução da aplicação. Recebe como parâmetro um ponteiro para a input na qual foi definida e o código de status da execução da aplicação. Esta função só é obrigatória caso seja definida no comando de criação da input.

  • void input_controler (INPUT_DESC *input, int status);

Função de controle da input. Pode ter qualquer nome, contudo igual ao nome do parâmetro <função de controle> do comando de descrição da input. É chamada toda vez que ocorre um evento de clique de mouse dentro da janela da input na qual foi definida. Recebe como parâmetro um ponteiro para a input na qual foi definida e o código de status da execução da aplicação. Esta função só é obrigatória caso seja definida no comando de criação da input.

  • void output_handler (OUTPUT_DESC *output, int status);

Função de manipulação da neuron_layer na qual a output foi associada. Pode ter qualquer nome, contudo igual ao nome do parâmetro <função de manipulação> do comando de descrição da output. É chamada toda vez que ocorre um evento de clique de mouse dentro da janela da output na qual foi definida. Recebe como parâmetro um ponteiro para a output na qual foi definida e o código de status da execução da aplicação. Esta função só é obrigatória caso seja definida no comando de criação da output.

  • void <nome do filtro> (FILTER_DESC *filter_desc);

Função que implementa o processamento de um filtro definido no arquivo de descrição da arquitetura da aplicação (arquivo .con). Pode ter qualquer nome, contudo igual ao nome do parâmetro <nome do filtro> de algum comando filter. É chamada uma vez por ciclo de execução da aplicação. Recebe como parâmetro um ponteiro para uma estrutura do tipo FILTER_DESC no qual possui todas as informações sobre este filtro, como as neuron_layer’s e os parâmetros de entrada e a neuron_layer de saída. A consistência quanto à quantidade de camadas de entrada e saída deve ser implementada pelo usuário dentro do código do filtro. Só é obrigatória se a mesma tiver sido usada no comando filter e não existir na biblioteca MAE.

Especificação da CSL

Tipos

Variáveis

Constantes

Expressões e Atribuições

Controles de Fluxo de Execução

Funções do Usuário

Funções do Usuário

Especificação dos diretórios

Função Init()

Função InputGenerator() e InputController()

Função OutputHandler()

Filtros

Funções do Usuário Invocadas Via CSL

Implementação da MAE

Netcompiler

Estruturas de Dados Principais

LibNet

DLLs de Aplicações MAE