2013-07-16 2 views
5

Я хочу, чтобы приложение Java распознавало символы с помощью libsvm, но когда я вникаю в это, я не понимаю, как я мог обучать данные изображения использовать с libsvm?Как подготовить изображения (пиксельные) данные в формате libsvm для использования с распознаванием с помощью Java

Недавно, чтобы узнать это, я сделал тест с existing data:

Я также создать 32x32 данных на основе обучения изображения от преобразования каждого пикселя в 0,1, но я не знаю, если он может использовать для создания libsvm формат обучения данных ? А также как создаются данные тестирования libsvm?

Пример преобразованных пикселей изображения (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 

Как получить его для libsvm (training, testing data)?

ответ

6

libsvm имеет определенный формат данных, каждая строка представляет собой/тестирование вектор один обучение в форме

LABEL INDEX0: value0 INDEX1: VALUE1 ... INDEXN: VALUEN

так в наиболее «наивном» методе, вы просто преобразовать матрицу представление в представление строк с помощью конкатенации строк последовательных, так как изображение

010 
011 
000 

станет

010011000 

и в формате libsvm (предполагая, что мы называем его "5"):

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

, как поддержка libsvm "разреженный" представление, вы можете ommit значения с "0"

5 1:1 4:1 5:1 

Это ручной способ, образец данных находится здесь: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary/a1a

Самый простой «автоматический» способ представлять ваши данные в формате .csv (опять-таки - преобразование данных в строки, как формат, затем в формате CSV), который является довольно стандартным способом:

LABEL, PIXEL_0, PIXEL_1, ..., PIXEL_N

...

, а затем использовать эту программу для преобразования

/* 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; 
} 

Оба обучения и тестирования файлов имеют точно такую ​​же структуру , просто разбивайте свои данные в некоторой пропорции (3: 1 или 9: 1) случайным образом в файлы training и testing, но не забудьте включить сбалансированное количество обучающих векторов для каждого класса в каждом файле.

В частности - ваши данные выглядит как MNIST набора данных, если это так, то это уже готова к libsvm:

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

MNIST обучение: http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/mnist.scale.bz2

MNIST тестирование : http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/multiclass/mnist.scale.t.bz2

Если возможно, ваши данные преобразуют ваши изображения в вещественные в [0,1] inter val будет более ценным, чем двоичные данные (которые теряют много информации).

EDIT

В качестве примера, если изображение является 8bit изображения в оттенках серого, то каждый пиксель на самом деле число v от 0 до 255. То, что вы сейчас делаете, некоторые пороговая, установка 1 для v > T и 0 для v <= T, тогда как отображение этих значений в реальные значения даст больше информации модели. Это можно сделать путем простого раздавливания v/255. В результате все значения находятся в интервале [0,1], но также имеют значения «между ними», например 0.25 и т. Д.

+0

Каким должен быть метод «преобразования ваших изображений в действительные значения в [0,1] " & как? – Osify

+0

Обновленный ответ, я просто имею в виду не отображение v -> {0,1}, а всего всего интервала [0,1], например, - деление исходных значений пикселей (0-255 в случае 8-битного изображения) на 255. – lejlot

+0

Спасибо, я попробую об этом, чтобы посмотреть, будет ли это нормально для libsvm – Osify

Смежные вопросы