Opencv使用cascade方法训练自己的LBP特征分类器的全过程

2023-10-31

前言

刚刚才把自己训练的分类器整出来,,

现在来理一下整个过程,从制作正负样本开始一直到最后产生自己的分类器.xml文件。

因为毕设的要求,可能要用Opencv训练识别模型,用以识别道路积水。Opencv上自带的只有一些识别脸、眼睛等模型,所以要自己训练分类器模型。在训练自己的分类器之前,我还去尝试了如何调用训练好的模型,也就是调用Opencv自带的分类器模型,就是.xml文件,直接cvLoad就行,具体自己需要去网上查(提醒一下,Opencv3.0以上版本,load方式有所改变,如果还想用cvLoad,需要将.xml文件换成Opencv2.4版本的),Opencv自带的.xml文件路径在:D:\Opencv\opencv\sources\data\haarcascades 下(我的Opencv安装目录是:D:\Opencv\)。

也就是说,训练自己的分类器的最终目标也就是最后产生一个.xml文件!

步骤

1、正负样本的准备

样本的准备,涉及到正样本的准备和负样本的准备。

1.1 样本的旋转/镜像,用以增加样本数量

如果你样本数够多,可以略过这一步,,

我这里要做的是道路积水的识别,所以我的正样本是包含道路积水的图片,样本图片上最好尽可能的全是道路积水。

最初始的正样本图片我是直接从网上百度找的,找了有30张,jpg格式的(什么格式倒无所谓,后面可以转),没有找到相关的道路积水图集,只好用这个凑合了,= =,我只是想先熟悉一下训练分类器模型的过程,,后面再考虑识别效果的问题。最初始的正样本如下:
在这里插入图片描述
然后,是负样本,也就是不包含有道路积水的图片, 也是网上找的,没找到相关图集,= =。
负样本需要尽可能地贴近你识别的场景,然后差别越大越好,这样可以提高识别效果,在我这里负样本就是道路,不含有积水的道路,,暂时先找了有50张,,如下:在这里插入图片描述
正样本30个,负样本50个,样本数量实在是太少了,标准的样本数量都是成千上万的,才能保证识别效果。

但我在网上实在是没找到太多的正样本,负样本的话还好说。然后我就参照网上给的方法,Opencv在其说明文档中其实也提到了,样本数量少的话,可对正负样本都进行了旋转、镜像等操作,用于增加样本数量,然后我用的批量操作哈,挨个操作估计得累死,= =。

用的软件是ACDSee,免费软件,很好用,百度一搜就有,(不是打广告啊,)。
在这里插入图片描述
安装,打开,右边栏选择样本集所在的文件夹,ACDSee就会自动显示文件夹下的图片了,ctrl+a全选,再点击批量,旋转/翻转,然后在选项里修改选择将修改后的图像放入文件夹,防止覆盖原来的样本图像!一般改为另外一个新建的文件夹,点击确定。
在这里插入图片描述
然后,选择不同的旋转/镜像,生成不同的图像,这个过程很简单不细说了,建议每旋转/镜像一次新建不同的文件夹存放。不用右上方的exif,它是另外一个图像格式。

无论是正样本还是负样本,衍生的7个不同文件夹,图片名会雷同,所以,需要进行批量重命名,同样,ACDSee也能进行批量重命名,这个很简单,不细说了。(图片命名建议不要太复杂,我的命名直接是数字,1-240和1-400)

所以,最后能分别衍生出7种不同的正负样本,加上原来的样本,现在正样本数有240个,负样本数有400个。

1.2 对正样本选取感兴趣区域

因为正样本,最后需要统一尺寸,24×24大小(LBP特征:24×24,Haar特征:20×20),而网上找的道路积水图片也不一定整张图全是积水或者大部分是积水,还记得我们前面说过,要尽可能全是你要识别的物体吗,,如果直接缩小尺寸成24×24的,那么在正样本图片中,积水部分占的比例就很小,极大影响识别效果。

所以,我们要在正样本从选取感兴趣区域(ROI),用到的工具是imageclipper,这个工具是我在别人写的博客里面找的,很好用,感谢感谢,最后面会有博客地址,imageclipper的下载地址:https://pan.baidu.com/share/link?shareid=76335086&uk=4227943372,

imageclipper的使用:
将要截取的正样本图集放在imageclipper根目录下(和imageclipper.exe同级),然后点开imageclipper.exe,鼠标左键截图,鼠标右键移动截图区域,然后点空格保存并自动转到截下一张,截的图保存在imageclipper文件夹里面,非常好用!!
截取的区域大小,没有限制,但需要大于24×24。

只需要对正样本处理,负样本不需要。截取是一张一张的截取的,可累惨了 = =,效果如下,可以看到图片大小不一,但积水区域较原图明显很多!

在这里插入图片描述

1.3 对样本统一尺寸,灰度化

因为,对正样本进行感兴趣区域截取后,截取的图片格式从jpg的格式变成了png格式的了,所以我还要进行转换,所幸格式转换很简单,直接写个格式转换批处理脚本即可,如何转换,请看:https://jingyan.baidu.com/article/948f592415cd66d80ff5f986.html,过程简单,不细说。

为什么要转,因为负样本是jpg的,我觉得样本的图片格式最好要统一才对。

转完格式后,然后还要进行统一重命名,因为imageclipper的截图操作后,使图片名发生改变。统一重命名,使用ACDsee批量重命名,很好用,操作也很简单,不细说了。

接下来,就是统一尺寸了,只需要对正样本进行统一尺寸,即,图片的尺寸大小全部改为24×24的,用的工具也是ACDsee。
Ctrl+a全选->批量->调整大小->以像素计的大小,勾去保持原始的纵横比(不勾去的话,大小就不是24×24、1:1的,会有一定的比例,亲测),然后同样更改选项,将调整大小后的图片放在另外一个文件夹里面,点击开始调整大小,欧了!!
在这里插入图片描述
然后是灰度化,注意,正负样本都需要进行灰度化!!

批量灰度化推荐用的软件是美图秀批处理秀,,
在这里插入图片描述
同样,右边栏选取需要灰度化的文件夹,更改另存为的文件夹路径,->特效->推荐下的黑白色,点击确定,即可批量灰度化正负样本图片。
以下分别是正负样本灰度化后的图:
在这里插入图片描述
在这里插入图片描述
OK,现在就才真正地把正负样本准备好了。

正负样本都是灰度图,正样本图片统一尺寸为24*24,负样本图片大小随意,但需比正样本大。

2、生成正负样本的描述文件

首先,在D盘下,新建文件夹TrainTest。

然后,在TrainTest下,新建三个文件夹:pos、neg、xml。pos存放步骤1最后的正样本图片,neg存放步骤1最后的负样本图片,xml用来存放生成的.xml文件,暂时为空。

接下来,在pos文件夹(正样本图集)下,新建一个.txt文件,输入以下内容:

dir /s/b > pos.txt
pause
exit

Ctrl+S保存,退出,然后更改.txt为.bat,然后双击运行,可以看到, 会生成一个pos.txt文件。
在这里插入图片描述
再打开pos.txt,将jpg全部替换为jpg 1 0 0 24 24
删除最后两行:pos.bat和pos.txt,保证没有空行。
最后,pos.txt中的内容如下:
在这里插入图片描述
对neg文件夹也进行同样操作,不过不需要做将jpg全部替换的操作,注意,同样需要删除生成的neg.txt的最后两行
在这里插入图片描述
在这里插入图片描述
然后,将pos.txt、pos.bat和neg.txt、neg.bat剪切出来,放在和pos、neg、xml文件夹同等目录下,
在这里插入图片描述
然后,需要在命令行下执行操作,

win+r,输入cmd,进入命令行,

依次输入:
D:
cd TrainTest
opencv_createsamples.exe -info pos.txt -vec pos.vec -bg neg.txt -num 240 -w 24 -h 24
在这里插入图片描述
再点击Enter,可以看到一长串信息,最后在同级目录下,会生成一个pos.vec文件(有几百kb,具体大小看你的正样本数量大小,如果.vec文件大小是1kb的话(我出现过一次),那就是前面的步骤没做好,仔细检查吧)。因为,我运行过了,所以就没点运行了,看不到效果,哈哈哈,,

最终,如果下面的文件齐了的话,说明我们终于做好了训练分类器的准备了,万事具备,只欠训练了!!
在这里插入图片描述
opencv_createsamples.exe
opencv_traincascade.exe
在D:\Opencv\opencv\build\x64\vc12\bin下(按照自己Opencv的安装目录找),
其他文件前面一一都有说明。

3、训练,生成自己的分类器

到这一步,就看自己的造化了,哈哈哈,,
据网友说,到这里有可能会出各种千奇百怪的错,,

在以上工作都做好下,终于可以用到opencv_traincascade.exe来训练产生自己的分类器了——.xml文件,我来了~~

win+r,输入cmd,进入命令行,

依次输入(注意大小写,不要写错):
D:
cd TrainTest
opencv_traincascade.exe -data xml -vec pos.vec -bg neg.txt -numPos 192 -numNeg 400 -numStages 20 -featureType LBP -w 24 -h 24

在这里插入图片描述
然后,点击Enter。

顺利的话,命令行会不停刷,一段时候过后结束,没报错,然后你就能在xml文件夹下看见.xml文件了。

但我还是出了两次错,一次错是类似这种(忘了截图了,所以只有文字描述,这个错网上很普遍):

OpenCV Error: Bad argument (Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.) 。

后面我查出来,是我一开始做的pos.txt和neg.txt有问题,比如在pos.txt里,我一开始做的是只有1.jpg 1 0 0 24 24 ,前面没有路径D:/TrainTest/pos这些,而且是放在pos文件夹下的,没有剪切出来放在和pos文件夹同级目录,在前面我已经纠正过来了,前面用的是正确的方式,所以如果顺利的话,你应该不会出这种错误。

第二个错误,就是网上常说的numPos值设定的问题(一般说来,numPos设定的值最好比原始正样本数量要稍微小些才不会报错),训练到一半就暂停,报错了:在这里插入图片描述
出这个错的时候,我numPos值设定的是240×0.9 = 216,(按0.9的比例),然后看到网上说,可以设定为240×0.8=192,(按0.8的比例),就改成192,就训练成功了,0-19个stage全部训练完,没报Error,最后结果图如下:
在这里插入图片描述
然后在xml文件夹下可看到生成的.xml文件,最前面的cascade.xml就是我们自己训练的分类器模型了:
在这里插入图片描述
OK,终于写完了完整的过程,剩下后面就是测试分类器的识别效果和优化分类器了,估计又是个难题,,

分类器的识别效果以后再说吧,哈哈哈,,

有空再写啦,又写了两三个小时,累惨了,= =。

参考资料:
训练步骤:
https://blog.csdn.net/qq_26898461/article/details/48802569
https://blog.csdn.net/qq_27063119/article/details/79247266
https://www.cnblogs.com/jhzhu/p/3217297.html
https://www.jianshu.com/p/0afa9712c6d5
训练出错处理:
https://blog.csdn.net/qq_38189484/article/details/87908747
https://answers.opencv.org/question/59371/opencv-error-bad-argument-can-not-get-new-positive-sample/

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

Opencv使用cascade方法训练自己的LBP特征分类器的全过程 的相关文章

  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • 从索贝尔确定图像梯度方向?

    我正在尝试使用 openCV 的 Sobel 方法的结果来确定图像梯度方向 我知道这应该是一个非常简单的任务 我从此处复制了许多资源和答案中的方法 但无论我做什么 所得方向始终在 0 57 度之间 我希望范围为 0 360 我相信所有的深度
  • OpenCV 中“IplImage”和“CvMat”的全称是什么?

    有一个IplImage and CvMat在 OpenCV 中 他们的全名是什么 IPL in IplImage代表英特尔处理库 这是Intel维护OpenCV时的残余 CV in cvMat代表计算机视觉矩阵 这是图形中常用的数据结构 I
  • 如何使用 OpenCV 从图像中获取调色板 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想提取图像的调色板 类似于此 来自 我需要它来提取特定的颜色 如黄色 绿色和棕色 并显示该颜色覆盖的区域的百分比 另外 我可以添加更
  • 如何将 opencv mat 图像转换为 gdi 位图

    我想将 openCV Mat 文件转换为 GDI 位图图像 我找不到任何有关如何执行此操作的信息 我认为没有直接的方法可以做到这一点 但我希望它不涉及将其写入文件并读回 http opencv users 1802565 n2 nabble
  • OpenCV Android - 无法解析相应的JNI函数

    我正在尝试按照此处概述的本教程使用 Opencv 设置 Android Studio https www youtube com watch v OTw GIQNbD8 https www youtube com watch v OTw G
  • ValueError:当数组不是序列时设置带有序列的数组元素

    您好 此代码旨在存储使用 open cv 绘制的矩形的坐标 并将结果编译为单个图像 import numpy as np import cv2 im cv2 imread 1 jpg im3 im copy gray cv2 cvtColo
  • 警告:发生了非法反射访问操作(java 中的便携式 opencv)

    我想做一个便携的opencv将依赖项添加到 maven 文件的应用程序pom xml 简化的代码是 import org opencv core Mat public class Builder public static void mai
  • 基本的 Python OpenCV 裁剪和调整大小

    有人可以帮我一些裁剪算法吗 它的 openCV 我想弄清楚这一点 我知道方法是crop image y y1 x x1 如果我有一个带有 new dimensionXxnew dimensionY 像素的图像 并且我想将其裁剪为相同的宽度
  • OpenCV Python RTSP 流

    我想使用 RTSP 从 IP 摄像机流式传输视频 但我有一个问题 我已经安装了先决条件 而且我的 RTSP 链接可以在 VlC 播放器上运行 但是当我在编辑器中尝试并运行它时 它说找不到相机 这是我的代码 import cv2 import
  • 如何将k4a_image_t转换为opencv矩阵? (Azure Kinect 传感器 SDK)

    我开始尝试使用 Azure Kinect Sensor SDK 我经历了官方操作指南 https learn microsoft com en us azure Kinect dk about sensor sdk sensor sdk 我
  • Android API人脸检测与OpenCV/JavaCV人脸检测

    我在 Android 设备上使用了本地 Android 人脸检测 但它似乎很慢 而且我不太确定其可靠性 我还使用了 OpenCV 的人脸检测 但仅限于 PC 而不是 Android 设备 对于 Android 我猜我必须使用 JavaCV
  • 将yuv420p原始数据转换为opencv图像

    我有来自 rtmp 服务器的原始数据 像素格式为 yuv420p 我使用管道来读取数据 但我不知道如何将原始数据解码为图像 command ffmpeg command extend loglevel fatal i rtmp localh
  • 如何平滑循环列向量

    这是一个 OpenCV2 问题 我有一个矩阵代表closed空间曲线 cv Mat
  • 将向量 转换为大小为 (n x 3) 的 Mat,反之亦然

    我有 Point3d 向量 向量形式的点云 如果我使用 OpenCV 提供的转换 比如 cv Mat tmpMat cv Mat pts Here pts is vector
  • 如何使用Android opencv使图像的白色部分透明

    我无法链接超过 2 个网址 因此我将我的照片发布到此博客 请在这里查看我的问题 http blog naver com mail1001 220650041897 http blog naver com mail1001 220650041
  • 计数物体和更好的填充孔的方法

    我是 OpenCV 新手 正在尝试计算物体的数量在图像中 我在使用 MATLAB 图像处理工具箱之前已经完成了此操作 并在 OpenCV Android 中也采用了相同的方法 第一步是将图像转换为灰度 然后对其进行阈值计算 然后计算斑点的数
  • 如何绘制每个分割对象的轮廓

    我应用分水岭分割来检测触摸对象 这样做效果很好 现在 我想绘制每个对象的轮廓 这样我就可以获得它们的长度 面积 矩等 但是分割结果中的对象仍然是触摸的 所以 我没能画出每一个的轮廓 如何绘制每个对象的轮廓 include
  • opencv - 在图像中绘制轮廓

    我正在尝试在图像周围绘制轮廓 我可以看到找到了轮廓 但无法绘制轮廓 轮廓的颜色似乎是两种 黑色和白色 颜色中的一种 import cv2 import numpy as np import matplotlib pyplot as plt

随机推荐

  • 高精度加法c++

    介绍 当我们加出来是一个特别大的数 开了long long都会爆的时候 我们就会用到高精度加法了 原题链接 讲解 其实高精度加法就是模拟的竖式运算 竖式运算会出现进位的情况 比如说最高位的这个1是进位 比原来的3位还多出1位 那么我们就应该
  • 语音去噪深度学习模型论文总结(大多基于transformer)

    深度学习模型 我总结了之前看的模型 并又寻找了基于transformer的模型 挑选了四个性能较好 评判标准是各种语音评价指标 该论文提出的模型与已有模型相比较得到的结果 的模型 其中前面三个是基于transformer的模型 最后一个是基
  • 晒问答

    1 如果好人没好报 还要不要做好人 如果做好人的意义是为了让自己有好报 那便永远逃不出世间规律的死循环 自己的命运和选择要牢牢掌握在自己手中 不做一个被世俗绑架来的好人 也不做一个害怕背负骂名的坏人 2 看书太少和不爱思考哪个更致命 给纯粹
  • Windows 解决端口占用方法

    查询9200端口 netstat nao findstr 9200 删除端口关联进程PID taskkill pid 11560 F
  • ORA-12505, TNS:listener does not currently know of SID given in connect desc

    出现以上的问题是无法识别SID 解决方法如下 1 找到以下目录 opt oracle product 10 2 0 db 1 network admin 修改listener ora find name listener ora即可找到该文
  • 带隔离变压器的DC/DC单端正激变换电路设计与Simulink仿真

    前期已经介绍了4种DC DC变换电路 这4种电路有一个共同特点 输入输出直接电气连接 之间没有做隔离措施 但是在实际应用中 由于电压等级的变换 安全 系统串并联等原因 开关电源的输入和输出之间需要进行电气隔离 在基本的非隔离DC DC变换电
  • R语言课程资料

    第一节 R语言简介 R语言简介 R 既是一种语言 R是一种解释性语言 也是一个软件由AT T贝尔实验室的S语言发展而来具有统计分析功能和强大的作图功能开源软件 目前在 R 网站上有 17500个程序包 涵盖了基础统计学 社会学 经济学 生态
  • 【ARM】在NUC977上搭建基于boa的嵌入式web服务器

    一 实验目的 搭建基于arm开发板的web服务端程序 通过网页控制开发板LED状态 二 boa简介 Boa服务器是一个小巧高效的web服务器 是一个运行于unix或linux下的 支持CGI的 适合于嵌入式系统的单任务的http服务器 源代
  • C# 调用SQL Server存储过程,传入参数,返回查询结果,更新dataGridView

    调用SQL Server存储过程 传入参数 返回查询结果 using SqlConnection conn new SqlConnection connectionString String cmdText Screen 存储过程名 Sql
  • Bible读经体会

    诸天述说 神的荣耀 穹苍传扬他的手段 诗篇19 1 花草树木在喊叫 耶和华造我的 数学从耶和华而来 自然界自然启示从耶和华而来 里面体现了耶和华的创意无限和思路周全 我们默默欣赏着观看着 今天阅读了创世纪的一点点体会 做下笔记 请勿用验证的
  • Shell--基础--01--介绍

    Shell 基础 01 介绍 1 Shell 环境 Shell 编程需要2个环境 文本编辑器 能解释执行的脚本解释器 2 Linux 的 Shell 常见种类 Bourne Shell usr bin sh或 bin sh Bourne A
  • python dataframe索引转成列_Pandas之DataFrame对象的列和索引之间的转化

    约定 import pandas as pd DataFrame对象的列和索引之间的转化 我们常常需要将DataFrame对象中的某列或某几列作为索引 或者将索引转化为对象的列 pandas提供了set index reset index
  • vue 项目中引用cdn上的静态js文件

    vue 项目中引用cdn上的静态js文件 需求 一份静态配置文件放在cdn中 文件暴露出数据列表和公共方法 读取文件的配置数据和公共方法 初始化Action列表 const cdnUrl https cdn xxx js libs vm a
  • Bat延时退出窗口

    timeout t 5
  • 【Error】ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

    参考文章 如何解决version GLIBCXX 3 4 29 not found的问题 1 问题 在 wsl ubuntu20 04 运行 yolov8 时 出现以下错误 ImportError lib x86 64 linux gnu
  • san.js源码解读之工具(util)篇——each函数

    一 迭代器模式 在开始解析源码之前 先来看一下 javascript 设计模式 迭代器模式 如果没有接触过该模式的小伙伴可能一脸疑惑 表示没听说过 但是这个迭代器模式 可能你已经用了很久了只是不知道它的名字罢了 比如 jquery中的 ea
  • 个位数统计 C语言

    1021 个位数统计 15 分 给定一个 k 位整数 N dk 1 10k 1 d1 101 d0 0 di 9 i 0 k 1 dk 1 gt 0 请编写程序统计每种不同的个位数字出现的次数 例如 给定 N 100311 则有 2 个 0
  • python萤火虫算法_萤火虫算法-python实现

    1 importnumpy as np2 from FAIndividual importFAIndividual3 importrandom4 importcopy5 importmatplotlib pyplot as plt6 7 8
  • FileNotFoundError: [Errno 2] No such file or directory: 'template/

    1 在运行generate list py时一直出现找不到templates header html和templates footer html的错误提示 2 后来才发现是路径问题 由于webapp是另外新建的目录 所以对yate py中w
  • Opencv使用cascade方法训练自己的LBP特征分类器的全过程

    前言 刚刚才把自己训练的分类器整出来 现在来理一下整个过程 从制作正负样本开始一直到最后产生自己的分类器 xml文件 因为毕设的要求 可能要用Opencv训练识别模型 用以识别道路积水 Opencv上自带的只有一些识别脸 眼睛等模型 所以要