openCV c++:使用 XgBoost(Adaboost 分类器)时出现问题

2023-12-01

我正在创建一个应用程序,用于对城市环境图像中的人类进行分类。

我通过以下方式训练分类器:

int main (int argc, char **argv)
{

/* STEP 2. Opening the file */
//1. Declare a structure to keep the data
  CvMLData cvml;
//2. Read the file
  cvml.read_csv ("directory/train_rand.csv");
//3. Indicate which column is the response
  cvml.set_response_idx (0);

/* STEP 3. Splitting the samples */
//1. Select 4000 for the training
  CvTrainTestSplit cvtts (4000, true);
//2. Assign the division to the data
  cvml.set_train_test_split (&cvtts);

  printf ("Training ... ");
/* STEP 4. The training */
//1. Declare the classifier
  CvBoost boost;
//2. Train it with 100 features
  boost.train (&cvml, CvBoostParams (CvBoost::REAL,100, 0, 1, false, 0),
           false);

/* STEP 5. Calculating the testing and training error */
// 1. Declare a couple of vectors to save the predictions of each sample
  std::vector<float> train_responses, test_responses;
// 2. Calculate the training error
  float fl1 = boost.calc_error (&cvml, CV_TRAIN_ERROR, &train_responses);
// 3. Calculate the test error
  float fl2 = boost.calc_error (&cvml, CV_TEST_ERROR, &test_responses);

  cout<<"Error train: "<<fl1<<endl;

  cout<<"Error test: "<<fl2<<endl;

/* STEP 6. Save your classifier */
// Save the trained classifier
  boost.save ("./trained_boost_4000samples-100ftrs.xml", "boost");

  return 0;
}

train_rand.csv 是一个文件,其中第一列是类别。其余的列将是问题的特征。例如,我可以使用三个功能。它们分别代表图像中每个像素的红色、蓝色和绿色的平均值。所以我的 csv 文件应该如下所示。请注意,在第一列中我使用了一个字符,因此 OpenCV 将其识别为一个类别。

B,124.34,45.4,12.4
B,64.14,45.23,3.23
B,42.32,125.41,23.8
R,224.4,35.34,163.87
R,14.55,12.423,89.67
...

对于我的实际问题,我使用 100 个特征和 8000 个样本。我用一半的数据训练分类器,并用其余的数据进行测试。

训练后,我得到的测试误差约为 5%(这对于只有 100 个特征来说已经相当不错了)。

现在我想在新数据中使用分类器:

CvBoost boost

boost.load("directory/trained_boost_4000samples-100ftrs.xml");

float x = boost.predict(SampleData,Mat(),Range::all(),false,false);
cout<<x;

我在数千个样本上运行此代码,它总是输出相同的值,即 2。我真的不明白我在这里做错了什么,但即使我以错误的方式训练分类器,它也不会以相同的方式 100% 地分类,而且,我之前计算的测试误差表明分类器应该可以正常工作。

困扰我的一件事是 SampleData 必须具有与我用来训练的样本相同数量的列。问题是,用于训练的数据有 100 列 + 1 个响应,如果我尝试仅使用 100 个特征运行分类器,它会抛出一个异常,指出大小不匹配。如果我运行具有 101 个特征的分类器(这绝对是任意的),它会起作用,但结果没有任何意义。

谁能帮我这个?提前致谢!

Regards


我设法通过调整 adaBoost 来工作SVM 文档中的代码。唯一的技巧是确保有足够的样本数据 (>= 11)。

From 复制代码的博客:

注意:由于一个非常奇怪的原因,OpenCV 实现不适用于少于 11 个样本。

// Training data
float labels[11] = { 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0};
Mat labelsMat(11, 1, CV_32FC1, labels);

float trainingData[11][2] = {
    {501, 10}, {508, 15},
    {255, 10}, {501, 255}, {10, 501}, {10, 501}, {11, 501}, {9, 501}, {10, 502}, {10, 511}, {10, 495} };
Mat trainingDataMat(11, 2, CV_32FC1, trainingData);

// Set up SVM's parameters
CvSVMParams params;
params.svm_type    = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

// Train a SVM classifier
CvSVM SVM;
SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);

// Train a boost classifier
CvBoost boost;
boost.train(trainingDataMat,
            CV_ROW_SAMPLE,
            labelsMat);

// Test the classifiers
Mat testSample1 = (Mat_<float>(1,2) << 251, 5);
Mat testSample2 = (Mat_<float>(1,2) << 502, 11);

float svmResponse1 = SVM.predict(testSample1);
float svmResponse2 = SVM.predict(testSample2);

float boostResponse1 = boost.predict(testSample1);
float boostResponse2 = boost.predict(testSample2);

std::cout << "SVM:   " << svmResponse1 << " " << svmResponse2 << std::endl;
std::cout << "BOOST: " << boostResponse1 << " " << boostResponse2 << std::endl;

// Output:
//  > SVM:   -1 1
//  > BOOST: -1 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

openCV c++:使用 XgBoost(Adaboost 分类器)时出现问题 的相关文章

随机推荐

  • 单击控件并使其着色

    在 Windows 中 当您单击桌面上的图标时 该图标会变暗 并带有基于当前使用的 Windows 主题的阴影 我有一个显示图像的自定义控件 我希望具有与 Windows 图标单击相同的功能 如何通过选择自定义控件在 WinForms 中获
  • p:selectOneMenu 在 noSelectionOption 项不存在时预选上一项

    有一个问题p selectOneMenu添加时的选择f selectItem View
  • Tomcat 7 和 JSTL

    我用 Eclipse Tomcat 编写了一个 Web 应用程序 它可以在本地 Tomcat 7 上运行 当我尝试在 Tomcat 7 上在线发布它时 出现以下错误 严重 路径 cp 上下文中 servlet obliquid servle
  • Google Classroom 有没有提取成绩的API

    我正在查看 Google Classroom API 发现没有获取成绩的选项 我需要将 Google Classroom 中的作业成绩提取到我正在创建的外部成绩簿应用程序中 有谁知道这是否可能 或者如何做到这一点 您绝对可以从 API 获得
  • 使用 node.js 通过条件向多个主题发送 FCM 通知的正确语法是什么?

    我正在尝试将 fcm 通知从我的 node js 服务器发送到 Android 设备 它适用于单个主题 但在有多个主题时会失败 注意 处理单个主题 例如 var topic MaleFemale here i have only one t
  • 单向一对多关系的条件查询

    所以 我有以下实体 Entity public class Supplier Column name SUPPLIERID private BigInteger supplierId OneToMany JoinColumn name ID
  • Woocommerce 上的单个产品附加选项卡中显示的自定义元框内容

    感谢这两篇文章 我想出了这个解决方案 用于向 Woocommerce 产品详细信息页面添加多个选项卡 在 Woocommerce 管理产品页面中编辑自定义产品选项卡内容 向 WooCommerce 单一产品页面添加多个选项卡 但是 我仍然无
  • ASP.NET core Angular SPA 模板将自定义引导主题添加到 webpack.config.js

    我需要将自定义引导模板添加到 asp net core spa 模板 我使用命令创建了寺庙 dotnet new install Microsoft AspNetCore SpaTemplates dotnet new angular 生成
  • 计算两个日期之间的年+月+日? [复制]

    这个问题在这里已经有答案了 我有两个人的出生信息 我想对他们做一些分析 比如 他们的年龄之差 秒 年 月 日 我试过这个 from datetime import date a date 1991 07 20 b date 1999 06
  • 使用 Play 2 / Scala 提供本地图像

    我正在尝试找出一种在本地上传和提供文件 图像 的模式 我弄清楚了上传部分 但对存储和服务部分有点困惑 我对如何使用 Ok sendFile 在单个页面上显示本地存储的图像感到困惑 如何将其绑定到视图上的 img src 标签中 我能想到的另
  • 以编程方式链接到特定(非函数)文档页面

    作为为我的代码编写一些文档的一部分 我想包含一个可运行的命令 该命令将向用户显示我所想到的来自 MATLAB 文档的一些特定文档页面 当所需页面属于某个功能或工具时 例如 doc cftool 或者 如果可能存在歧义 也可以指定文件夹 包名
  • 如何根据 Out- Alu 输出的值执行跳转指令

    图来自 计算机系统要素 Nand2Tetris 看看场景 j1 1 out lt 0 j2 0 out 0 j3 1 out gt 0 这种情况如何可能输出 也是如此输出 gt 0 but out 0是假的 如何out可以同时具有正值和负值
  • xcode 4.6 目标构建设置缺少“Apple LLVM 编译器 4.2 - ...”部分

    在 xcode 4 6 中 我创建了一个具有多个目标的新项目 我的目标之一是一个空的 iOS 应用程序 缺少目标构建设置中的所有 Apple LLVM 编译器 4 2 部分 还有其他人看过这个吗 关于如何让它们显示有什么想法吗 我能够通过六
  • 如何左对齐 jqmath 表中的元素

    如果我尝试创建一个表jqmath 它总是以元素为中心 所以如果我写 table a b c dddddddddddd 然后我得到 a b c dddddddddddd 如何使 jqmath 将列向左对齐 以便表格显示为 a b c dddd
  • 从 CSV 读取列数据

    我有一个 CSV 文件 Name Age Data Test 22 Yes Test2 23 No Test3 43 Yes 如何使用 PowerShell 处理此文件 以便我可以复制此功能 foreach var HeaderName i
  • 使用 Docker Compose 将 DDEV Web 容器端口公开给主机

    我已经配置了 DDEV Drupal 环境 需要在其中为我的主题运行 Pattern Lab 这个环境将由我的学生使用 他们可能不熟悉在本地计算机上安装 Node 或 Node 依赖工具 Pattern Lab 需要 Node 作为解决方法
  • 谷歌字体字体粗细为 100 不起作用

    我有一个 Android 游戏 它使用谷歌字体中的 Raleway 字体 在游戏中它看起来不错 我也想在网站上使用该字体 但字体显示不一样 我在游戏中使用Raleway Thin 这与我想在网站上使用的相同 我遇到的问题是细字体并不像游戏中
  • sqlsrv_connect:未找到数据源名称且未指定默认驱动程序

    我在将 PHP 与远程计算机上运行的 SQL SERVER 2008 连接时遇到困难 我有 php 版本 5 4 3 和 apache 2 2 22 我的计算机上已经运行了 SQL SERVER 2008 我的 wamp bin php p
  • 如何为 GlassFish 域指定 JDK?

    我已经安装了 GlassFish 2 1 1 我安装了 1 5 和 1 6 JDK 尽管我的 JAVA HOME 变量设置为 1 5 版本 并且 java version 和 javac version 都显示 1 5 但每当我启动 gla
  • openCV c++:使用 XgBoost(Adaboost 分类器)时出现问题

    我正在创建一个应用程序 用于对城市环境图像中的人类进行分类 我通过以下方式训练分类器 int main int argc char argv STEP 2 Opening the file 1 Declare a structure to