gpt4 book ai didi

java - 如何训练 libsvm 格式的图像(像素)数据以用于 Java 识别

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:02 24 4
gpt4 key购买 nike

我想制作一个 Java 应用程序来使用 libsvm 来识别字符,但是当我开始这样做时,我不明白我该如何训练图像数据以与 libsvm 一起使用?

最近为了学习,用existing data:做了个测试

我还通过将每个像素转换为 0,1 创建了基于 32x32 的训练图像数据,但我不知道它是否可以用于创建 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(训练、测试数据)

最佳答案

libsvm具有特定的数据格式,每一行是一个训练/测试 vector ,形式为

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 支持“稀疏”表示,您可以使用“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)随机拆分到文件中即可 trainingtesting ,但请记住为每个文件中的每个类包含平衡数量的训练 vector 。

特别是 - 您的数据看起来有点像 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] 区间内的实值图像将比二进制数据(丢失大量信息)更有值(value)。

编辑

例如,如果您的图像是 8 位灰度图像,那么每个像素实际上是一个数字 v介于 0 和 255 之间。您现在正在做的是一些阈值设置,为 v > T 设置 1 v <= T 为 0 ,同时将这些值映射到实际值将为模型提供更多信息。可以通过简单的挤压来完成v / 255 .结果,所有值都在 [0,1] 中间隔,但也有“介于两者之间”的值,如 0.25等等

关于java - 如何训练 libsvm 格式的图像(像素)数据以用于 Java 识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17666851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com