Máquina Associadora de Eventos - MAE

De LCAD
Ir para: navegação, pesquisa

Índice

Manual da MAE

Introdução

O que é a MAE? 
Histórico 

Instalando a MAE

Nesta seção descreveremos o roteiro de instalação passo-a-passo da MAE nos ambientes testados até então (Windows Xp, Windows 7, Ubuntu, Fedora). No entanto acreditamos que seja 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.
    • Para isto crie o seguinte diretório 'C:\MAE'.
    • Clique com o botão direito sobre o diretório 'C:\MAE' e escolha a opção SVN Checkout, deverão aparecer as telas abaixo:
Figura 1: SVN Checkout Option
Figura 2: SVN Checkout
Dependências (bibliotecas) 

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

Siga exatamente as configurações da instalação conforme abaixo:

Figura 3: Bison Tela Inicial
Figura 4: Diretório Instalação do Bison
Figura 5: Opções de Instalação

Continue a instalação padrão, clicando no botão 'next' até o final.

Siga exatamente as configurações da instalação conforme abaixo:

Figura 6: Flex Tela Inicial

[[imagem:flex_install1.png|frame|center|100px|Figura 7: Diretório de Instalação do Flex]

Figura 8: Opções de Instalação

Continue a instalação padrão, clicando no botão 'next' até o final.

Siga exatamente as configurações da instalação conforme abaixo:

Figura 9: LibGW Tela Inicial
Figura 10: Diretório de Instalação da LibGW

Continue a instalação padrão, clicando no botão 'next' até o final.

  • Instalando o DevCpp 4.9.9.2
    • Siga exatamente as configurações PADRÃO da instalação do DevCpp!

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).

Para isto basta ir nas propriedades de Meu Computador:

Figura 11: Propriedades Meu Computador

(no Windows 7 procure o opção Configurações Avançadas de Sistema que está no menu lateral) Na guia Avançado, procure por Variáveis de Ambiente:

Figura 12: Variáveis de Ambiente

Procure a variável 'path' :

Figura 13: A variável PATH

Clique em editar e adicione os diretórios citados acima:

Figura 14: Editando a variável PATH


  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:
make –f Makefile.win clean
make –f Makefile.win
  • Saída
    • A libnet_conn.a gerada no diretório MAE\lib;
Figura 15: libnet_conn.a
    • O netcomp.exe no diretório MAE\bin.
Figura 16: netcomp.exe
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:
make –f Makefile.win clean
make –f Makefile.win
  • Saída
    • A DLL do exemplo é gerada no diretório MAE\lib;
Figura 17: DLL da aplicação
    • O EXE do exemplo é gerado no diretório do exemplo.
Figura 18: Executável da aplicação

No Linux

No Ubuntu

Instale o subversion:

# apt-get install git

Baixe a MAE via GIT:

$ cd
$ git clone https://github.com/LCAD-UFES/MAE.git

Instale as bibliotecas da MAE:

# apt-get install make g++ freeglut3-dev byacc libforms-dev libtiff4-dev libXi-dev libXmu-dev doxygen tcsh flex libdc1394-22-dev

Compile a MAE seguindo esses passos : aqui

Instalando a MAE no Linux Fedora
Baixando a MAE 
  1. Pré-requisito: instalar o Subversion: "yum install subversion";
  2. Fazer checkout do repositório da MAE: "svn checkout http://www.lcad.inf.ufes.br/svn/MAE /home/<user>/MAE", fornecendo usuário e senha de acesso ao repositório;
  3. Fornecer permissões para os arquivos e diretórios da MAE: "chmod 777 -R MAE".
Dependências (bibliotecas) 
  1. g++: "yum install gcc-c++";
  2. Make: "yum install make";
  3. Glut: "yum install freeglut freeglut-devel";
  4. Flex & Bison: "yum install flex flex-static byacc";
  5. XForms: "yum install xforms xforms-devel";
  6. Tiff: "yum install libtiff libtiff-devel";
  7. Xi: "yum install libXi-devel";
  8. Xmu: "yum install libXmu-devel";
  9. Docs: "yum install doxygen";
  10. csh: "yum install csh".

Para instalar tudo de uma vez execute:

yum install gcc-c++ subversion make freeglut-devel flex flex-static byacc xforms-devel libtiff-devel libXi-devel libXmu-devel doxygen csh
Compilando a MAE
  1. Ajustar variáveis de ambiente:
    1. Entrar no console (terminal);
    2. Criar MAEHOME: "export MAEHOME=/home/<user>/MAE";
    3. Adicionar MAEHOME\bin no PATH: "export PATH=$PATH:$MAEHOME/bin";

Você pode também usar:

#MAE
export MAEHOME=~/MAE
export PATH=$PATH:$MAEHOME/bin
  1. Compilar a MAE:
    1. Pré-requisito: as variáveis de ambiente MAEHOME e PATH devem estar ajustadas;
    2. Entrar no diretório da MAE: "cd $MAEHOME";
    3. Compilar a MAE: "make".
    4. Verificar se a biblioteca da MAE libnet_conn.a foi gerado em MAEHOME/lib;
    5. Verificar se o compilador da MAE netcomp foi gerado em MAEHOME/bin.
Compilando os Exemplos 
  1. Entrar no diretório do exemplo: "cd $MAEHOME/examples/<nome_do_exemplo>";
  2. Compilar o exemplo: "make".

Framework MAE

Arquitetura da MAE

A MAE é um framework que permite projetar tanto estruturas modulares usando RNSP (Redes Neurais Sem Peso) com neurônios do tipo VG-RAM (Virtual Generalizing Random Access Memory) quanto estruturas com arquitetura em camadas, definindo um processamento específico para cada camada.

A utilização do framework MAE se deve às várias facilidades fornecidas tais como:

  • Simplicidade na descrição de arquiteturas neurais e/ou baseada em camadas: A MAE permite a descrição de arquiteturas neurais e/ou camadas através de uma linguagem de alto nível, com geração automática do código que as implementa.
  • Flexibilidade: Na linguagem de descrição de arquiteturas, vários parâmetros podem ser alterados; além disso, a ferramenta permite a incorporação de código do usuário.
  • Facilidade visual. Toda camada descrita pela linguagem utilizada pela MAE pode ter uma representação visual, o que torna possível o acompanhamento da resposta temporal de cada camada.
  • Portabilidade. A MAE é implementada utilizando uma linguagem padrão, o C ANSI, possibilitando que seja portada para qualquer sistema que possua um compilador C padrão. Os pacotes e bibliotecas importadas pelo framework são pacotes portáteis como Mesa3D, Flex, Bison, entre outros.

O sistema MAE (Figura 19, abaixo) é composto, basicamente, de duas partes. A primeira é um programa chamado netcomp, que recebe como entrada um arquivo com extensão .con contendo a descrição da arquitetura (neural ou de camadas) escrita na linguagem NADL (Network Architecture Description Language), e gera como saída um arquivo com extensão .c, contendo código C correspondente à tradução do arquivo .con para C. A segunda é a biblioteca de rotinas MAE, a libnet da figura 18, que implementa os neurônios, seu treinamento, processamento específico para cada camada, interface com o usuário, etc.

Figura 19: Diagrama da Arquitetura da MAE

O netcomp é um tradutor da linguagem de descrição de arquitetura descrita no arquivo .con para C. O arquivo .c gerado e os arquivos de rotinas do usuário são compilados e linkados com outras bibliotecas necessárias por um script chamado netcompiler. É este script que gera o arquivo executável final, ou aplicação MAE, que implementa a arquitetura descrita no arquivo .con, além de uma interface que permite ao usuário manipular a arquitetura. Na verdade, para gerar uma aplicação MAE, este processo é transparente ao usuário. O netcompiler se encarrega de realizar todo o processo automaticamente, gerando como saída uma aplicação MAE.

A MAE utiliza uma biblioteca própria implementada em ANSI C e um conjunto de pacotes e bibliotecas externas que são utilizados para fornecer algumas facilidades sem necessidade de implementá-las. Os pacotes e bibliotecas utilizadas pela MAE são:

  • Biblioteca MAE (libnet): Biblioteca implementada em C, com código fonte escrito em ANSI C, com as rotinas necessárias para efetuar todo o controle da aplicação. Contém também todas as rotinas utilizadas para criação e manipulação de cada uma das partes que compõe a arquitetura (neural e/ou camadas), inclusive rotinas para treinamento e execução da rede neural, quando a aplicação for uma RNSP.
  • MESA 3-D e GLUT: MESA 3-D é uma biblioteca gráfica 3D com uma API bastante semelhante ao OpenGL e que utiliza o mesmo tipo de máquina de estados e sintaxe de comandos do OpenGL, porém de distribuição livre. O GLUT (OpenGL Utility Toolkit) é um conjunto de ferramentas independente do sistema de janelas utilizado pelo sistema operacional para escrever programas em OpenGL, que também pode ser utilizado com o MESA 3D.
  • XForms: Conjunto de ferramentas para desenvolver interface gráfica com o usuário baseada no sistema de janelas X Window. Utilizada para a criação do painel de controle de uma aplicação MAE como controle dos eventos do mouse, teclado, menus e botões.
  • Flex & Bison: Flex é um gerador de código de analisadores léxicos. É uma implementação de distribuição livre da ferramenta Lex. Bison é um gerador de código de analisador sintático (paser) baseado numa gramática descrita num arquivo texto entrado como parâmetro. A MAE utiliza o Flex e o Bison em conjunto para descrever e interpretar as duas linguagens (linguagem de descrição da arquitetura e linguagem de execução de scripts para RNSP) utilizadas.

Network Arcitecture Description Language

A Network Architecture Description Language é a linguagem por meio da qual se especifica a arquitetura de camadas da aplicação. Esta linguagem é utilizada tanto na especificação de camadas de funções de processamento específicas, ditos filtros, quanto na descrição de camadas de redes neurais para aplicações baseadas em RNSP, provendo comandos de criação de conexões entre as camadas de redes neurais e filtros, permitindo o treinamento das mesmas por meio de associações. Nesta tambem estão presentes comandos de construção de camadas de entrada e saída para a introdução de dados na rede e visualização das saídas associadas às camadas. Os comandos para descrição das camadas são: filter, neuron_layer, associate, input, output e output_connect.

O léxico e a sintaxe da NADL foram desenvolvidos com as ferramentas Flex e Bison, sendo que os arquivos com a definição léxica e sintática da linguagem de descrição das camadas são netcomp_lex.l e netcomp_yacc.y e se encontram no diretório <diretório da MAE>/src.

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 (Network Architecture Description Language)

As definições léxicas e sintáticas da linguagem NADL se encontram, respectivamente, nos arquivos netcomp_lex.l e netcomp_yacc.y presentes no diretório <diretório da MAE>/src. Nesta seção serão descritos resumidamente os comandos da linguagem.

Variáveis e Constantes

Os tipos possíveis para variáveis são:

  • inteiro;
  • float.

A definição de constantes também é permitida.

Variáveis Globais

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.

Camadas Neurais

Uma camada neural (neuron_layer) é, basicamente, uma matriz de neurônios que é utilizada 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

Comando utilizado para associar nauron_layers. Estas devem possuir as mesmas dimensões. A sintaxe do comando associate é mostrada abaixo:

associate <nome da neuro_layer 1> with <nome da neuro_layer 2>;

<nome da neuron_layer 1> e <nome da neuron_layer 2>: Nome das neuron_layers que serão associadas.

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.

Conexão entre Camadas Neurais

Comando utilizado para conectar neuron_layers. A sintaxe do comando connect é mostrada abaixo:

connect <nome da neuro_layer 1> to <nome da neuro_layer 2> [with <dist>] [random inputs per neuron and <filtro> distribution with <tipo>];

<nome da neuron_layer 1> e <nome da neuron_layer 2>: Nome das neuron_layers que serão conectadas.

<const>: Constante.

<distribuicao>: Tipo de conexão que deverá ser utilizada: gaussian ou linear

<tipo>: RADIUS <float> para distribuição gaussiana ou SIZE <expressao> SQUARED para distribuição linear.

Funções do Usuário

Na construção de uma aplicação utilizando o framework MAE, é permitido incluir funções implementadas pelo usuário. 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 (Control Script Language)

As definições léxicas e sintáticas da linguagem Control Script Language (CSL) se encontram, respectivamente, nos arquivos interpreter_lex.l e interpreter_yacc.y pertencentes ao diretório <diretório da MAE>/src. A sintaxe do CSL compreende um subconjunto da linguagem de programação C. Nesta seção serão descritos resumidamente os comandos da linguagem.

Tipos

Os tipos possíveis para variáveis são:

  • inteiro;
  • float.

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 ====