当前位置: 首页 > 面试题库 >

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

谭嘉容
2023-03-14
问题内容

我想使Java应用程序通过使用libsvm来识别字符,但是当涉及到这一点时,我不知道如何训练图像数据与libsvm一起使用?

最近要学习它,我对现有数据进行了测试:

我还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)


问题答案:

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

标签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,但请记住,每个文件中每个类的训练向量数量应均衡

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

编辑

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



 类似资料:
  • 问题内容: 我想跑 分句。没有训练模型,因此我将单独训练模型,但是我不确定我使用的训练数据格式是否正确。 我的训练数据是每行一句话。我找不到与此有关的任何文档,只有此线程(https://groups.google.com/forum/#!topic/nltk- users/bxIEnmgeCSM )揭示了一些有关训练数据格式的信息。 句子标记器的正确训练数据格式是什么? 问题答案: 嗯,是的,P

  • 问题内容: 我是TensorFlow的新手。我正在寻找有关图像识别的帮助,可以在其中 训练自己的图像 数据集。 有没有训练新数据集的示例? 问题答案: 如果您对如何在TensorFlow中输入自己的数据感兴趣,可以查看本教程。 我也写与CS230的最佳做法指南在斯坦福这里。 新答案(带有)和带有标签 随着in的引入,我们可以创建一批没有占位符且没有队列的图像。步骤如下: 创建一个包含图像文件名的列

  • 在本教程中,我们将构建一个TensorFlow.js模型,用卷积神经网络对手写数字进行分类. 首先,我们将通过“查看”成千上万的手写数字图像及其标签来训练分类器. 然后我们将使用模型从未见过的测试数据来评估分类器的准确性. 先决条件 本教程假设您熟悉TensorFlow.js的基础构建模块 (张量,变量,和操作),以及优化器和损失的概念. 有关这些主题的更多背景信息, 我们建议在本教程之前完成以下

  • 问题内容: 我正在尝试从位图获取像素rgb值。我得到了一些价值,但远没有达到我期望的价值。我也得到: 我找不到界外错误… 这是代码: 问题答案: 这个: 与此不符: 你已经计数的行和列,即包含 ÿ 值和包含 X 的值。那是倒退。

  • 我试图设计和训练一个卷积神经网络来识别图像中的圆形细胞。我在完整图像的“切口”上训练它,这些图像中间要么有一个圆(正训练样本),要么没有(负训练样本)。 中间有一个圆圈的图像示例(热图颜色不稳定,图像均为灰度):http://imgur.com/a/6q8LZ 我希望网络输出是一个二进制位图,而不仅仅是对两种类型的输入图像(圆形或不在中间)进行分类,如果输入图像中没有圆形,则该位图是一个统一的值(

  • 几种重新培训MobileNet以便与TensorFlow.js一起使用的方法对我来说都失败了。有没有办法用TensorFlow.js来使用重新训练的模型? 使用基于hub的现代教程和使用似乎都失败了。 null null 目的是加载mobilenet,使用自定义数据重新训练,并在TensorFlow.js中使用它。遵循这两个教程似乎都失败了。这可以在Node.js内部完成吗?还有别的办法吗?我在哪