OpenCV样本训练经验

2023-11-10

从下述几篇文章中总结:
- OpenCV中Adaboost训练的经验总结
- 采用opencv_cascadetrain进行训练的步骤及注意事项
- 使用opencv_traincascade训练遇到的问题总汇

在讲下面内容时首先应先清楚一件事情,自己收集到的原始负样本和参与训练的负样本(numNeg)不是同一个概念,两者无必然联系,通过在原始负样本图像上滑动和scale窗口得到一批预处理负样本图像,然后只有这些图像被前n-1级强分类器错判为正样本才算的上是参与第n级强分类器训练的负样本,这是一个缓慢的过程,这也是NEG count的填充过程。

  1. 收集到的原始负样本尺寸须知

    • 收集到的原始负样本图像最好拥有不同于正样本的尺寸,且要足够大,因为进入训练程序之后滑动窗口的大小就变成了正样本尺寸的大小,当原始负样本图像与正样本尺寸大小相同时,就无法在原始负样本图像上滑动来获得大量的训练用负样本,再加上如果收集到的原始负样本的数量可能并不比正样本多多少,也许就是3、4倍,这样的话,没训练几级强分类器训练程序就会退出,并提示Train dataset for temp stage can not be filled. Branch training terminated。但如果达到上百倍的时候,且能保持numPos和numNeg数量比最为1:3左右,这样也能达到不错的效果。
  2. numPos和numNeg数量比最好是1:3左右

    • 当numPos和numNeg比例接近的时候1:1,对numNeg内负样本的看中程度很低,在实际的生活中负样本肯定远远多于正样本。
    • 当numPos和numNeg比例较大的时候1:10,对numNeg内负样本多于看中而忽略了正样本的统计特性,造成正样本权重总和很小,当权重小于一定程度的时候可能很大一部分正样本都不参与训练了。
    • 原始负样本的数目不用很大,只要其尺寸足够大,内容足够多样,我们就可以设置一个和numPOS成1:3比例的numNeg,让训练程序自动地在原始负样本上通过滑动和scale窗口来获取numNeg个负样本。也就是说,numPos:numNeg = 1:3是最优的,寻找的原始负样本和numNeg之间没有必然的联系。
    • 采集一个很大原始负样本集,且尺寸相当大,内容相当丰富的时候,但保持numPos:numNeg = 1:3,这样就会避免样本不足引起的错误提示:Train dataset for temp stage can not be filled. Branch training terminated。注意:numPos:numNeg = 1:3时,训练程序照样会取遍整个原始负样本集,以确保能从其上取到numNeg个负样本。推荐做法!!!
  3. 正样本描述文件中需要指出目标在每个样本中的数量和位置

    • 例如:pos1.jpg 2 x1 y1 width1 height1 x2 y2 width2 height2
      这句描述表示在图片pos1上有2个目标,并列出了两个目标在图片中的位置
    • 特殊情况:若正样本为在原始图像上裁剪的目标部分,则图像可直接描述为:
      pos.jpg 1 0 0 width height
  4. 设置正确的-numPos参数

    • 实际准备的正样本数量(读入vec-file的正样本数) >= numPos + (numStage - 1) * numPos * (1 - minHitRate)
      这是numPos的最低标准,但因为实际的HR(HitRate)会比minHitRate高,所以在设置numPos时可以将其设置的稍微再大些,毕竟最终的目的是要尽量让所有的正样本都参与到训练中。但是,过大肯定是不对的,会出错,并提示以下信息:Bad argument < Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.
  5. maxFalseAlarm(最大虚警率)的作用

    • FalseAlarm(虚警率)表示训练用的负样本中被错判为正样本的概率。
    • maxFalseAlarm直接影响着每个强分类器中弱分类器的个数。当maxFalseAlarm设置较大的时候,训练用的负样本中就会有很大一部分被错判为正样本(这些被错判的负样本图片会进入下一级参与训练),这样也就直接导致了一级强分类器中不会有太多的弱分类器;设置较小,每级强分类器中弱分类器的个数就较多,检测时间就会相对要长,在可以接受的检测时间下尽量降低maxFalseAlarm是我们要追求的目标。
    • 下一级参与训练的负样本为上一级被错判为正样本的负样本,而并非是重头开始将选择过的负样本也包含进来,只有当遍历完一遍原始负样本列表后才重头再扫描一遍。
  6. acceptanceRatio的含义,实际取出的负样本数与查询过的负样本数之比

    • 查询过的负样本是指,从原始负样本中通过滑动和scale获取的预处理负样本,实际取出的负样本为那些通过了前n-1级强分类器后仍被判为正样本的负样本。
    • 实际取出的负样本数一般都会达到设置的-numNeg。
    • 第n级时的acceptanceRatio = Stage0.FA*Stage1.FA* … *Stagen.FA
    • 当acceptanceRatio(n) 很低时,则表示经过n-1级强分类器仍能被错判为正样本的负样本的几率已经降到很小了,然而我们又必须要在每一级Stage处得到numNeg个负样本,这时就会不断地在原始图像上滑动和scale,直到攒够numNeg个才会开始第n级强分类器的训练。这也是为什么Stage的级数越高,NEG count的计数速度就越慢。
    • 当某一Stage(n)的FA为0时,则acceptanceRatio(n+1)必为0,也就表示在第n+1级Stage再也取不到一个负样本,此时就会终止训练,并提示:Train dataset for temp stage can not be filled. Branch training terminated.
  7. traincascade.exe命令行参数

    • 常用命令例子1: opencv_traincascade.exe -data dt -vec pos.vec -bg neg.txt -numPos 950 -numNeg 3555 -numStages 16 -precalcValbufSize 4048 -precalcdxBufSize 4048 -featureType LBP -w 50 -h 50 -numThreads 24
    • 常用命令例子2: opencv_traincascase.exe -data dt -vec pos.vec -bg neg.txt -numPos 950 -numNeg 3555 -w 50 -h 50
    • 例子中可能使用到的默认参数:
      • -numStages 默认值为20(Stage数不是越多越好,多了可能出现overfitting (过拟合)的情况)
      • -featureType 默认使用Haar特征,还有LBP和HOG可供选择(HOG为opencv2.4.0版本以上)
      • -numThreads 默认开启全部线程(OpenCV在编译时加入了TBB组件,否则不支持多线程)
      • -stageType 默认为BOOST类型
      • -bt 默认的boost分类器类型为GAB,还有DAB、RAB和LB可供选择
      • -mode 默认为BASIC模式(使用Haar特征的前提下,否则不使用此参数)
    • 其他详细参数请查看:链接内的第四部分
  8. Haar和LBP特征

    • 基于LBP特征的分类器几乎能和基于Harr特征的分类器拥有一样的性能,并且由于LBP属于整数型的特征,所以在训练的时候要比Haar特征快得多。
  9. createsamples程序的使用说明

    • createsamples有两个功能,一般使用它来创建vec文件,它的另一个功能会由一张正样本图片生成many artificial samples,通过旋转、缩放或者其他的transformations手段来实现吗,这对那些会在可预见的背景下出现的刚性图片非常有用(例如,网站上的logo),但如果你要寻找的object出现在很复杂的环境下(像人脸、行人,车辆的检测),那这样做就显得很无力。
  10. NEG count的填充过程解析

    1. 获取预处理负样本 —–> imgReader.getNeg(img)
      初始状态下,会先从原始负样本集中取出第一张图片,并将其缩放到一定比例,然后从这张缩放后图片上抠出一块窗口大小的图片作为第一张预处理负样本,之后会以stepFactor倍的步长在缩放图片上先左右后上下的滑动,再取出一系列的预处理负样本,直到取遍第一张缩放图。再然后,取出第二张原始负样本图,并将其按照一定的比例缩放,再在其上滑动取得预处理负样本,如此下去直到将原始负样本集取完一遍。取完一遍之后再次取出第一张原始负样本图,并将其缩放,但这次缩放的比例比第一遍的时候大,再按照上面方法滑动取预处理负样本。之后还会一遍一遍地从原始负样本集取图、增大缩放比例、滑动窗口。当把所有比例用完之后,即经历了winSize.width * winSize.height遍,会重新整个过程。
    2. 计算特征的积分图和标准差 —–> featureEvaluator->setImage( img, isPositive ? 1 : 0, i )
    3. 评估取出的预处理负样本 —–> predict( i )
      若取出的预处理负样本在经过前n-1级强分类器后仍被错判为正样本,则这个预处理负样本就可以成为训练下一级强分类器的训练负样本,如此循环直到取够numNeg个参与训练的负样本。又因为并非每个预处理负样本都能参与下一级强分类器的训练,所以就会存在一个比例acceptanceRatio,即参与下一级强分类器训练的负样本(numNeg)与取够numNeg个参与训练的负样本所需的预处理负样本(查询过的负样本数)之比。
  11. 内容已做了相当多的更新,修改了之前的错误!!!!

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

OpenCV样本训练经验 的相关文章

  • 使用畸变从图像平面计算相机矢量

    我正在尝试使用相机模型来重建可以使用某些相机及其 外部 内部 参数拍摄的图像 这一点我没有任何问题 现在我想添加扭曲 正如它们中所描述的那样OpenCV https docs opencv org 4 x dc dbb tutorial p
  • C++ OpenCV imread 无法在 Android 中工作

    我正在尝试读取 C 代码中的图像 LOGD Loading image s n inFile c str Mat img imread inFile CV LOAD IMAGE GRAYSCALE CV Assert img data 0
  • 在 iPad 上使用 OpenCV 避免碰撞

    我正在开展一个项目 需要使用 OpenCV 实现碰撞避免 这是在 iOS 上完成的 iOS 5 及以上版本即可 项目目标 这个想法是将 iPad 安装在汽车仪表板上并启动应用程序 应用程序应该从相机中抓取帧并进行处理 以检测汽车是否会与任何
  • 在opencv中发现凸性缺陷? [根据给定的输入图像崩溃..]

    我有一个计算图像凸包的程序 我正在尝试使用此信息来计算fingers存在于输入图像中 从一些冲浪中我发现做到这一点的方法 数手指 是 寻找轮廓 凸包 凸性缺陷 但我在使用凸性缺陷函数时遇到了麻烦 它编译得很好 但在运行时程序会因某些输入图像
  • 屏幕截图中低分辨率文本的 OCR

    我正在编写一个 OCR 应用程序来从屏幕截图图像中读取字符 目前 我只关注数字 我的方法部分基于这篇博文 http blog damiles com 2008 11 basic ocr in opencv http blog damiles
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • CvMat 和 Imread 与 IpImage 和 CvLoadImage

    使用 OpenCv 2 4 我有两个选项来加载图像 1 CvMat and Imread 2 IpImage and CvLoadImage 使用哪一个更好 我尝试将两者混合并最终出现段错误 imread返回一个Mat not CvMat
  • 如何使用 OpenCV 检测图像帧中的对象?

    我正在使用 Raspberry Pi 开发一个漫游器 它将清扫房间并捡起掉落在地上的物体 为了检测物体 我使用了在流动站操作开始时拍摄的参考图像 以及每 10 秒单击一次的图像 新图像 为了确定图像帧是否发生变化 我在参考图像和新图像之间进
  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 在 RGB 图像上绘制多类语义分割透明叠加

    我有语义分割掩码的结果 值在 0 1 之间 需要大津阈值来确定什么是积极的 我想直接在 RGB 图像上绘制 在 RGB 图像上每个预测类具有不同的随机颜色 我使用以下内容绘制了具有单一颜色的单个蒙版 是否有一个包或简单的策略可以为多类别做到
  • 如何在opencv python中为图像添加边框

    如果我有如下图所示的图像 如何在图像周围添加边框 以便最终图像的整体高度和宽度增加 但原始图像的高度和宽度保持在中间 下面的代码添加了一个大小恒定的边框10像素到原始图像的所有四个边 对于颜色 我假设您想要使用背景的平均灰度值 这是我根据图
  • 来自 OpenCV 的外部参数

    我正在使用 OpenCV 来校准立体相机对 我拍摄了各种校准照片 并且使用 cv2 calibrateCamera 对内在参数进行了令人满意的拟合 然而 目前尚不清楚如何获取外部参数 该函数仅返回cameraMatrix 尽管它很有用 但实
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • OpenCV Visual Studio ntdll.dll

    我尝试在 Visual Studio 2013 上使用 OpenCV 2 4 10 创建一个项目 但由于以下异常 到目前为止我运气不佳 请建议帮助 TIA letstryitonemoretime exe Win32 Loaded C Us
  • OpenCV C++ 如何知道每行的轮廓数进行排序?

    我有一个二值图像 https i stack imgur com NRLVv jpg在这张图片中 我可以使用重载的函数轻松地对从上到下 从左到右找到的轮廓进行排序std sort 我首先通过以下方式从上到下排序 sort contours
  • 从图像坐标获取对象的世界坐标

    I have been following this http docs opencv org modules calib3d doc camera calibration and 3d reconstruction html docume

随机推荐

  • 通过Tesseract实现简单的OCR

    Tesseract 简介 Tesseract 的 OCR 引擎最先由 HP 实验室于 1985 年开始研发 至 1995 年时已经成为 OCR 业内最准确的三款识别引擎之一 然而 HP 不久便决定放弃 OCR 业务 Tesseract 也从
  • http post请求 参数放在路径后面 java_技术分享

    HTTP协议是Hyper Text Transfer Protocol 超文本传输协议 的缩写 是用于从万维网 WWW World Wide Web 服务器传输超文本到本地浏览器的传送协议 接下来 给大家分享一下关于HTTP协议的基础知识
  • [4G&5G专题-4]:RRU 全面了解什么是4G+5G RF静态射频共享?

    目录 1 什么4G 5G RF静态射频共享 2 4G 5G RF静态共享的好处 3 FPGA数字硬件资源共享的原理 4 RFIC射频硬件资源共享的原理 1 什么4G 5G RF静态射频共享 RF静态射频共享 RF Sharing 就是 在4
  • Java - Maven项目打包成jar给第三方使用(带依赖打包)

    打包成jar 引入这个jar 安装到本地仓库 直接指定jar包的位置 由于我们写项目的时候 有的时候并不是一个独立项目 而是作为一个第三方类库来提供服务的存在 用来给别的项目引入作为某个功能的封装 打包成jar 解决方案主要是从pom xm
  • Android studio 向项目里倒入model

    第一步 选择对应的model 倒入 第二步 完成第一步后 在项目列表里出现倒入的model 修改倒入的model的build gradle 1 如果有 apply plugin com android application 改为 appl
  • Android 7.1 GUI系统-surfaceflinger(四)

    surfaceflinger的启动 Android P 图形显示系统 https www jianshu com u f92447ae8445 Android GUI系统之SurfaceFlinger https blog csdn net
  • 使用libcurl下载文件小例

    libcurl是一个很强大的开源网络处理库 支持包括HTTP HTTPS FTP 一系列网络协议 用它来进行HTTP的get post 或者下载文件更是小菜一碟 chrome内核都用到了它 本文主要讲解一个使用curl下载文件的小例 首先是
  • 数据库的导入导出及授权

    目录 数据库导出 数据库导入 数据库授权 1 忘记root密码 2 创建表时 colume使用的时 mysql 保留字导致报错 数据库导出 1 导出数据库为bname的表结构 其中用户名为root 密码为dbpasswd 生成的脚本名为db
  • 判断素数 C C++两个版本

    题目 输入一个数 判断是否是素数 C代码 include
  • Midjourney2023下载使用详细操作方法教程

    手把手教你入门绘图超强的AI绘画程序Midjourney 用户只需要输入一段图片的文字描述 即可生成精美的绘画 下面是Midjourney注册和使用的方法 第一步 先注册一个Discord账号https discord gg 注册的时候要人
  • 第三十四章、PyQt中的输入部件:QComboBox组合框功能详解

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 一 概述 Designer中输入工具部件中的Combo Box组合框与其他可视化工具组合框功能相同 组合了按钮
  • 《QDebug 2023年1月》

    一 Qt Widgets 问题交流 二 Qt Quick 问题交流 三 其他 1 QScreen grabWindow 截屏 如果没有指定范围 默认是截取对应屏幕的区域 QScreen文档https doc qt io qt 5 15 qs
  • 在控制台打印1000以内的所有素数(质数)

    素数 质数 的定义 质数是指在大于1的自然数中 除了1和它本身以外不再有其他因数的自然数 编程思路 根据定义可以知道 代码应该包括两个循环 外层循环用于遍历范围内的每一个数 可以定义为i 内存循环则用来遍历由2至小于i的数 此处在遍历1和i
  • 挂马方式研究、挂马检测技术研究

    1 挂马定义 所谓的挂马 就是黑客通过各种手段 包括SQL注入 网站敏感文件扫描 服务器漏洞 网站程序0day 等各种方法获得网站管理员账号 然后登陆网站后台 通过数据库 备份 恢复 或者上传漏洞获得一个webshell 利用获得的webs
  • 目标检测算法之YOLOV2

    YOLOV2论文对v1中许多地方都进行了相关的改进和提升 其将骨干网络也进行了更换 不在使用v1的骨干网络 其v2骨干模型结构图如下 作者删去了骨干网络最下面的三层操作 接上了三个卷积核一个高维度特征与低维度特征的融合 并最终生成模型输出
  • 获取进程pid并添加数组,去重。

    var cmd process platform win32 tasklist ps aux var exec require child process exec var qqname qq Array prototype unique1
  • TV模型图像修复 matlab

    原lena 随手截的噪声图 合成的需要修复的图 修复后的图 没有处理边界 对于从来没有接触过图像修复的我来说 效果真是惊艳了 下面介绍运算步骤 和各项异性扩散类似 整个算法也是基于迭代的 迭代公式如下 其中Io代表当前处理的像素 Ip代表邻
  • Java代码规范检查插件调研及总结

    代码规范工具对比 代码规范工具是什么 大家应该都有过写完代码后review的情况 用于提高编码质量 尽早的发现问题 节约开发时间和成本 但review 这个过程往往要消耗 更多的开发资源 所以就出现 自动检测可能代码中存在的问题的工具 我们
  • nrichIP分析command tools(Sodan接口调用查询)

    nrichIP分析command tools 一 项目简介 nrich是一种命令行工具 可快速分析文件中的所有 IP 并查看哪些具有开放端口 漏洞 也可以从标准输入输入数据以在数据管道中使用 二 项目本地部署 1 项目地址 https gi
  • OpenCV样本训练经验

    从下述几篇文章中总结 OpenCV中Adaboost训练的经验总结 采用opencv cascadetrain进行训练的步骤及注意事项 使用opencv traincascade训练遇到的问题总汇 在讲下面内容时首先应先清楚一件事情 自己收