2013-07-16 6 views
5

Chcę utworzyć aplikację Java do rozpoznawania znaków za pomocą biblioteki libsvm, ale kiedy się do tego przyzwyczaję, nie rozumiem, jak mogę ćwiczyć dane obrazu używać z libsvm?Jak trenować dane obrazkowe (pikselowe) w formacie libsvm do wykorzystania w rozpoznawaniu z Javą

Ostatnio się go uczyć, zrobiłem test z existing data:

Mam również tworzyć 32x32 bazie danych szkolenia obrazu przez nawróconego każdego piksela do 0,1 ale nie wiem, czy to może użyć do tworzenia formatu danych szkolenia libsvm ? A także w jaki sposób zostały utworzone dane testowania biblioteki libsvm?

Przykład przekształconych pikseli obrazu (0,1):

00000000000001111000000000000000 
00000000000011111110000000000000 
00000000001111111111000000000000 
00000001111111111111100000000000 
00000001111111011111100000000000 
00000011111110000011110000000000 
00000011111110000000111000000000 
00000011111110000000111100000000 
00000011111110000000011100000000 
00000011111110000000011100000000 
00000011111100000000011110000000 
00000011111100000000001110000000 
00000011111100000000001110000000 
00000001111110000000000111000000 
00000001111110000000000111000000 
00000001111110000000000111000000 
00000001111110000000000111000000 
00000011111110000000001111000000 
00000011110110000000001111000000 
00000011110000000000011110000000 
00000001111000000000001111000000 
00000001111000000000011111000000 
00000001111000000000111110000000 
00000001111000000001111100000000 
00000000111000000111111000000000 
00000000111100011111110000000000 
00000000111111111111110000000000 
00000000011111111111110000000000 
00000000011111111111100000000000 
00000000001111111110000000000000 
00000000000111110000000000000000 
00000000000011000000000000000000 
0 
00000000000001111111110000000000 
00000000001111111111111000000000 
00000000011111111111111100000000 
00000000011111111111111100000000 
00000000011111111111111110000000 
00000001111111111111111100000000 
00000000111110000011111100000000 
00000000000000000001111100000000 
00000000000000000001111100000000 
00000000000000000001111100000000 
00000000000000000011111000000000 
00000000000000000111111000000000 
00000000000000000111111000000000 
00000000000000000111111000000000 
00000000000000001111110000000000 
00000000011111111111111111000000 
00000000111111111111111111100000 
00000000111111111111111111100000 
00000000111111111111111111100000 
00000001111111111111111110000000 
00000001111111111110000000000000 
00000001111111111110000000000000 
00000000111111111110000000000000 
00000000000011111000000000000000 
00000000000011111000000000000000 
00000000000011111000000000000000 
00000000000111111000000000000000 
00000000000111111000000000000000 
00000000001111110000000000000000 
00000000011111110000000000000000 
00000000001111100000000000000000 
00000000001111100000000000000000 
7 

Jak zmusić go do libsvm (training, testing data)?

Odpowiedz

6

libsvm ma specyficzny format danych, każda linia jest jeden trening/testowanie wektor w postaci

LABEL INDEX0: VALUE0 index1: Value1 ... INDEXN: wartośćn

tak w najbardziej „naiwnej” metody, po prostu przekonwertować reprezentacji macierzowej do reprezentacji rzędu przez złączenie consequtive wiersze, tak jak obraz

010 
011 
000 

staną

010011000 

iw formacie libsvm (zakładając, że nazwanie go z "5"):

5 0:0 1:1 2:0 3:0 4:1 5:1 6:0 7:0 8:0 9:0 

jako wsparcie libsvm "rzadki" reprezentacja można ommit wartości "0 w"

5 1:1 4:1 5:1 

jest to ręczny sposób, przykładowe dane znajduje się tutaj: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a1a

Najprostszym „automatyczne” sposobem jest, aby przedstawić swoje dane w postaci formatu .csv (ponownie - konwersja danych do formatu podobnego rzędu, a następnie do .csv), który jest dość standardowy sposób:

LABEL, PIXEL_0, PIXEL_1, ..., PIXEL_N

...

a następnie użyć tego programu do konwersji

/* convert cvs data to libsvm/svm-light format */ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char buf[10000000]; 
float feature[100000]; 

int main(int argc, char **argv) 
{ 
    FILE *fp; 

    if(argc!=2) { fprintf(stderr,"Usage %s filename\n",argv[0]); } 
    if((fp=fopen(argv[1],"r"))==NULL) 
    { 
     fprintf(stderr,"Can't open input file %s\n",argv[1]); 
    } 

    while(fscanf(fp,"%[^\n]\n",buf)==1) 
    { 
     int i=0,j; 
     char *p=strtok(buf,","); 

     feature[i++]=atof(p); 

     while((p=strtok(NULL,","))) 
      feature[i++]=atof(p); 

     //  --i; 
     /* 
     if ((int) feature[i]==1) 
      printf("-1 "); 
     else 
      printf("+1 "); 
     */ 
     //  printf("%f ", feature[1]); 
     printf("%d ", (int) feature[0]); 
     for(j=1;j<i;j++) 
      printf(" %d:%f",j,feature[j]); 


     printf("\n"); 
    } 
    return 0; 
} 

Zarówno szkolenie i pliki testowe mają dokładnie taką samą strukturę , po prostu podziel dane w proporcji (3: 1 lub 9: 1) losowo na pliki training i testing, ale pamiętaj o uwzględnieniu zrównoważonej liczby wektorów treningowych dla każdej klasy w każdym pliku.

W szczególności - dane wygląda trochę jak MNIST zbioru danych, jeśli jest to przypadek, to jest już przygotowany do libsvm:

http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass.html

szkolenie MNIST: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/mnist.scale.bz2

testowanie MNIST : http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/mnist.scale.t.bz2

Jeśli to możliwe za pomocą danych, konwertowanie zdjęć na wartości rzeczywiste we wnętrzu [0,1] val byłby bardziej wartościowy niż dane binarne (które tracą wiele informacji).

EDIT

Jako przykład, jeśli obraz jest obrazem 8bit szarości, a następnie każdy piksel ustawienie 1 jest w rzeczywistości liczba v pomiędzy 0 a 255. To, co teraz robi, to niektóre obcinanie, dla v > T i 0 dla v <= T, podczas odwzorowywania tych wartości na rzeczywiste wartości dałoby więcej informacji do modelu. Można to zrobić przez proste zgniatanie v/255. W rezultacie wszystkie wartości znajdują się w przedziale [0,1], ale mają również wartości "pomiędzy", takie jak 0.25 itd.

+0

Jaka powinna być metoda przekształcania obrazów na wartości rzeczywiste w [0,1] " & w jaki sposób? – Osify

+0

Zaktualizowano odpowiedź, mam na myśli nie odwzorowywanie v -> {0,1}, ale raczej na cały przedział [0,1], na przykład - dzielenie oryginalnych wartości pikseli (0-255 w przypadku obrazu 8-bitowego) przez 255. – lejlot

+0

Dzięki, spróbuję obejść to, aby sprawdzić, czy będzie to w porządku dla libsvm – Osify

Powiązane problemy