Ubuntu利用opencv训练自己的xml文件

先前在windows系统训练的xml,在应用的时候效果不是很好,检测有很大的误差,这里有几点经验(也是出问题的时候,在网上找到的解决方法及理论知识)。

---采集正负样本的数量及尺寸---

1.数量:

正样本500,负样本1500(如果在训练时要用到500正样本和1500负样本,那么在采集的时候需要都要多采集一些,大概多采100张左右)

为什么要多采?

因为在训练时,要填写-numPos 和 -numNeg这两个参数,而根据实际训练情况,要满足以下要求:

实际准备的正样本数量(读入vec-file的正样本数) >= numPos + (numStage - 1) * numPos * (1 - minHitRate)

vec-file的正样本数就是根据原始的正样本生成的,所以如果-numPos设为500的话,vec-file的数量就需要大一些,如果较小的话就会出现(Bad argument < Can not get new positive sample. The most possible reason is insufficient count of samples in given vec-file.)的错误。

相关参数:

vec-fil:通过opencv_createSamples利用pos.txt生成的pos.vec文件(正样本数就是pos.txt读取的原始正样本的数量)

numPos:每一级stage训练所需的正样本数目(本人原始正样本数为565,那numPos就设置为500)

numStage:训练的级数,相当于keras中的epoch,默认为20,本人设置为15( stage数不是越大越好,过大可能会导致过拟合 )

minHitRate:分类器的每一级希望得到最小检测率(即正样本被判断有效的比例),最优设置0.9999

2.尺寸:

正样本( 50px * 50px ) 

正样本的尺寸设置为20*20 / 30*30 / 50*50都行,但不能太大,如果太大就会导致( OpenCV Error: Insufficient memory (Failed to allocate 65408 bytes) in unknown function )内存分配不够的错误。

负样本( 300px * 300px )

负样本的尺寸必须要大于正样本的6倍或者更大。

因为首先我们要知道训练程序中写的numNeg参数表示每级训练用到的负样本数,本人把它设置为1500。其实这个numNeg的大小和原始负样本数量没有任何关联, 因为numNeg是通过滑动窗口在原始负样本上不断滑动采集,得到的预处理负样本图像的数量(滑动窗口的大小就是正样本的大小,这里是50*50)

负样本的尺寸如果不够大,或者和正样本一样大,滑动窗口就无法在原始负样本上滑动来采集足够多的训练图像,再加上如果收集到的原始负样本的数量可能并不比正样本多多少,也许就是3、4倍。这样的话就会导致( 执行opencv_traincascade训练程序过程中中断 )的错误,同时会报(Train dataset for temp stage can not be filled. Branch training terminated。)这时我们发现训练图中的FA( FalseAlarm,虚警率 )为0,表示负样本已全部被正确分类了,也就不会有负样本继续参与下一轮的训练了,所以就退出了。

所以在准备原始负样本的时候一定要保证尺寸足够大,同时包含的内容足够复杂。

---numPos 和 numNeg的比例---

numPos : numNeg = 1:3,这是最优的比例

1. 当numPos和numNeg比例接近的时候1:1,对numNeg内负样本的看中程度很低,在实际的生活中负样本肯定远远多于正样本。

2. 当numPos和numNeg比例较大的时候1:10,对numNeg内负样本多于看中而忽略了正样本的统计特性,造成正样本权重总和很小,当权重小于一定程度的时候可能很大一部分正样本都不参与训练了。

--- Haar和LBP特征 ---

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

所以在训练的参数中要添加 -featureType LBP,这样能加快训练速度


以上是在整个准备和训练期间需要注意的事项,现在正式开始。

系统:Ubuntu16.04

opencv版本:opencv3.2.0

python版本:python2.7

opencv本人用的版本是源码编译的opencv3.2.0,安装链接已给出,进入python后>>>import cv2不报错,即为安装成功。

--- 数据准备 ---

新建一个/my_xml文件夹作为项目根目录,将正样本放入/my_xml/pos中,将负样本放入/my_xml/neg中。

还需要opencv_createsamples 和 opencv_traincascade这两个程序,在/usr/local/bin中可以找到,通过( cp 程序路径 目标路径 )复制过来就OK了,当前目录如下:

---生成样本路径文件---

生成正样本的pos.txt路径文件,命令行进入根目录运行:

ls pos/*.*>pos.txt

然后将刚生成的pos.txt文件在sublime中打开,按住鼠标滚轮,往下拖,即可选中当前列;按一下键盘的“END”键,光标即可跳转到字符串尾部,效果如下:

【1 :该样本数目为1;0 0 :表示样本起始坐标;500 500 : 表示样本宽高】

生成neg.txt同理,不过格式稍有不同,最终两个文件的效果如下:

---生成正样本的vec文件---

命令行进入根目录,运行以下代码:

opencv_createsamples -vec pos.vec -info pos.txt -bg neg.txt -w 50 -h 50

出现以下效果,同时在根目录生成pos.vec文件,即为成功:

--- 开始训练 ---

开始训练前,在根目录底下新建一个/data目录,用于存放训练完毕的xml文件,当前根目录效果如下:

运行以下代码,开始训练

opencv_traincascade -data data -vec pos.vec -bg neg.txt -numPos 500 -numNeg 1500 -numStages 15 -featureType LBP -w 50 -h 50 -minHitRate 0.9999 -maxFalseAlarmRate 0.5

相关参数:

-data : 存放xml文件的目录

-vec : 正样本vec文件源

-bg : 负样本路径txt文件

-numPos : 正样本数量

-numNeg : 负样本数量

numStages:训练分类器的级数

-featureType: 默认使用Haar特征,还有LBP和HOG可供选择(HOG为opencv2.4.0版本以上)

-w -h : 样本宽高

-minHitRate :分类器的每一级希望得到最小检测率(即正样本被判断有效的比例)

-maxFalseAlarmRate:分类器的每一级希望的最大误检率(负样本判定为正样本的概率)

-mode: 选择训练中使用的Haar特征类型。BASIC只使用右上特征,ALL使用所有右上特征及45度旋转特征(使用Haar特征的前提下,否则不使用此参数)

出现以下画面,表示训练顺利进行:

--- 验证效果 ---

迭代玩15次后,在/data目录下生成了一堆xml文件,我们选用cascade.xml

python代码如下:

效果如下:


参考文章:

https://blog.csdn.net/u014587123/article/details/78507649?locationNum=6&fps=1

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容