如何利用OpenCV自带的级联分类器训练程序训练分类器
1个回答
展开全部
使用级联分类器工作包括两个阶段:训练和检测。 检测部分在OpenCV
objdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍。当前的指南描述了如何训练分类器:准备训练数据和运行训练程序。参考:http://jingyan.baidu.com/article/4dc40848f50689c8d946f197.html
利用
OpenCV
自带的 haar training
程序训练一个分类器,需要经过以下几个步骤:
(
1
)收集训练样本:
训练样本包括正样本和负样本。正样本,通俗点说,就是图片中只有你需要的目标。而负样本的图片只要其中不含有目标就可以了。但需要说明的是,负样本也并非
随便选取的。例如,你需要检测的目标是汽车,那么正样本就应该是仅仅含有汽车的图片,而负样本显然不能是一些包含天空的,海洋的,风景的图片。因为你最终
训练分类器的目的是检测汽车,而汽车应该出现在马路上。也就是说,分类器最终检测的图片应该是那些包含马路,交通标志,建筑物,广告牌,汽车,摩托车,三
轮车,行人,自行车等在内的图片。很明显,这里的负样本应该是包含摩托车、三轮车、自行车、行人、路面、灌木丛、花草、交通标志、广告牌等。
另外,需要提醒的是,adaboost方法也是机器学习中的一个经典算法,而机器学习算法的前提条件是,测试样本和训练样本独立同分
布。所谓的独立同分布,可以简单理解为:训练样本要和最终的应用场合非常接近或者一致。否则,基于机器学习的算法并不能保证算法的有效性。此外,足够的训
练样本(至少得几千张正样本、几千张负样本)也是保证训练算法有效性的一个前提条件。
这里,假设所有的正样本都放在 /pos文件夹下,所有的负样本都放在 /neg文件夹下;
(
2
)对所有的正样本进行尺寸归一化:
上一步收集到的正样本,有很多的尺寸大小,有的是
200*300
,有的是
500*800...
尺寸归一化的目的,就是把所有的图片都缩放到同一大小。比如,都缩放到
50*60
的大小。(程序或者光影魔术手都可以)
(
3
)生成正样本描述文件:
所谓的正样本描述文件,其实就是一个文本文件,只不过,很多人喜欢将这个文件的后缀改成
.dat
而已。正样本描述文件中的内容包括:文件名 目标个数 目标在图片中的位置(
x,y,width,height
)典型的正样本描述文件如下所示:
0.jpg 1 0 0 30 40….
假如,
\pos
文件夹下有
5000
个正样本图片,每个图片中仅有一个目标。命令行下 dir /b > pos.dat生成一个
pos.dat
文件作为正样本描述文件。
(
4
)创建正样本
vec
文件
由于
haarTraining
训练的时候需要输入的正样本是
vec
文件,所以需要使用
createsamples
程序来将正样本转换为
vec
文件。(例如:
f:\pos\pos.vec
)。
Createsamples
程序的命令行参数:
命令行参数:
-
vec <vec_file_name>
训练好的正样本的输出文件名。
-
img<image_file_name>
源目标图片(例如:一个公司图标)
-
bg<background_file_name>
背景描述文件。
-
num<number_of_samples>
要产生的正样本的数量,和正样本图片数目相同。
-
bgcolor<background_color>
背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由
bgthresh
参数来指定。则在
bgcolor
-
bgthresh
和
bgcolor
+
bgthresh
中间的像素被认为是透明的。
-
bgthresh<background_color_threshold>
-
inv
如果指定,颜色会反色
-
randinv
如果指定,颜色会任意反色
-
maxidev<max_intensity_deviation>
背景色最大的偏离度。
-
maxangel<max_x_rotation_angle>
-
maxangle<max_y_rotation_angle>
,
-
maxzangle<max_x_rotation_angle>
最大旋转角度,以弧度为单位。
-
show
如果指定,每个样本会被显示出来,按下
"esc"
会关闭这一开关,即不显示样本图片,而创建过程继续。这是个有用的
debug
选项。
-
w<sample_width>
输出样本的宽度(以像素为单位)
-
h
《
sample_height
》
输出样本的高度,以像素为单位。
(
5
)
创建负样本描述文件
在保存负样本的文件夹下生成一个负样本描述文件,具体步骤同(
3
),此处不再赘叙;
(
6
)进行样本训练
该步骤通过调用
OpenCV\bin
目录下的
haartraining
程序
(
新版本的
opencv
改名为
opencv_haartraining)
来完成。其中,
Haartraining
的命令行参数为:
-
data<dir_name>
存放训练好的分类器的路径名。
-
vec<vec_file_name>
正样本文件名(由
trainingssamples
程序或者由其他的方法创建的)
-
bg<background_file_name>
背景描述文件。
-
npos<number_of_positive_samples>
,
-
nneg<number_of_negative_samples>
用来训练每一个分类器阶段的正
/
负样本。合理的值是:
nPos = 7000;nNeg = 3000
-
nstages<number_of_stages>
训练的级联分类器层数。
-
nsplits<number_of_splits>
决定用于阶段分类器的弱分类器。如果
1
,则一个简单的
stump classifier
被使用。如果是
2
或者更多,则带有
number_of_splits
个内部节点的
CART
分类器被使用。
-
mem<memory_in_MB>
预先计算的以
MB
为单位的可用内存。内存越大则训练的速度越快。
-
sym
(
default
)
-
nonsym
指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。
-
minhitrate
《
min_hit_rate
》
每个阶段分类器需要的最小的命中率。总的命中率为
min_hit_rate
的
number_of_stages
次方。
-
maxfalsealarm<max_false_alarm_rate>
没有阶段分类器的最大错误报警率。总的错误警告率为
max_false_alarm_rate
的
number_of_stages
次方。
-
weighttrimming<weight_trimming>
指定是否使用权修正和使用多大的权修正。一个基本的选择是
0.9
-
eqw
-
mode<basic(default)|core|all>
选择用来训练的
haar
特征集的种类。
basic
仅仅使用垂直特征。
all
使用垂直和
45
度角旋转特征。
-
w
《
sample_width
》
-
h
《
sample_height
》
训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。
一个训练分类器的例子:
"D:\Program Files\OpenCV\bin\haartraining.exe" -data data\cascade -vec data\pos.vec -bg negdata\negdata.dat -npos 49 -nneg 49 -mem 200 -mode ALL -w 20 -h 20
训练结束后,会在目录
data
下生成一些子目录,即为训练好的分类器。
(
7
)
生成
xml
文件
上一步在进行
haartraining
的时候,会在
data
目录下生成一些目录及
txt
文件,我们需要调用opencv\bin\
haarconv.exe
将这些
txt
文件转换为
xml
文件,也就是所谓的分类器。
至此,分类器的训练工作已完成。剩下的,就是在程序中加载
xml
文件,并调用相应的函数接口来实现分类检测的作用了。
objdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍。当前的指南描述了如何训练分类器:准备训练数据和运行训练程序。参考:http://jingyan.baidu.com/article/4dc40848f50689c8d946f197.html
利用
OpenCV
自带的 haar training
程序训练一个分类器,需要经过以下几个步骤:
(
1
)收集训练样本:
训练样本包括正样本和负样本。正样本,通俗点说,就是图片中只有你需要的目标。而负样本的图片只要其中不含有目标就可以了。但需要说明的是,负样本也并非
随便选取的。例如,你需要检测的目标是汽车,那么正样本就应该是仅仅含有汽车的图片,而负样本显然不能是一些包含天空的,海洋的,风景的图片。因为你最终
训练分类器的目的是检测汽车,而汽车应该出现在马路上。也就是说,分类器最终检测的图片应该是那些包含马路,交通标志,建筑物,广告牌,汽车,摩托车,三
轮车,行人,自行车等在内的图片。很明显,这里的负样本应该是包含摩托车、三轮车、自行车、行人、路面、灌木丛、花草、交通标志、广告牌等。
另外,需要提醒的是,adaboost方法也是机器学习中的一个经典算法,而机器学习算法的前提条件是,测试样本和训练样本独立同分
布。所谓的独立同分布,可以简单理解为:训练样本要和最终的应用场合非常接近或者一致。否则,基于机器学习的算法并不能保证算法的有效性。此外,足够的训
练样本(至少得几千张正样本、几千张负样本)也是保证训练算法有效性的一个前提条件。
这里,假设所有的正样本都放在 /pos文件夹下,所有的负样本都放在 /neg文件夹下;
(
2
)对所有的正样本进行尺寸归一化:
上一步收集到的正样本,有很多的尺寸大小,有的是
200*300
,有的是
500*800...
尺寸归一化的目的,就是把所有的图片都缩放到同一大小。比如,都缩放到
50*60
的大小。(程序或者光影魔术手都可以)
(
3
)生成正样本描述文件:
所谓的正样本描述文件,其实就是一个文本文件,只不过,很多人喜欢将这个文件的后缀改成
.dat
而已。正样本描述文件中的内容包括:文件名 目标个数 目标在图片中的位置(
x,y,width,height
)典型的正样本描述文件如下所示:
0.jpg 1 0 0 30 40….
假如,
\pos
文件夹下有
5000
个正样本图片,每个图片中仅有一个目标。命令行下 dir /b > pos.dat生成一个
pos.dat
文件作为正样本描述文件。
(
4
)创建正样本
vec
文件
由于
haarTraining
训练的时候需要输入的正样本是
vec
文件,所以需要使用
createsamples
程序来将正样本转换为
vec
文件。(例如:
f:\pos\pos.vec
)。
Createsamples
程序的命令行参数:
命令行参数:
-
vec <vec_file_name>
训练好的正样本的输出文件名。
-
img<image_file_name>
源目标图片(例如:一个公司图标)
-
bg<background_file_name>
背景描述文件。
-
num<number_of_samples>
要产生的正样本的数量,和正样本图片数目相同。
-
bgcolor<background_color>
背景色(假定当前图片为灰度图)。背景色制定了透明色。对于压缩图片,颜色方差量由
bgthresh
参数来指定。则在
bgcolor
-
bgthresh
和
bgcolor
+
bgthresh
中间的像素被认为是透明的。
-
bgthresh<background_color_threshold>
-
inv
如果指定,颜色会反色
-
randinv
如果指定,颜色会任意反色
-
maxidev<max_intensity_deviation>
背景色最大的偏离度。
-
maxangel<max_x_rotation_angle>
-
maxangle<max_y_rotation_angle>
,
-
maxzangle<max_x_rotation_angle>
最大旋转角度,以弧度为单位。
-
show
如果指定,每个样本会被显示出来,按下
"esc"
会关闭这一开关,即不显示样本图片,而创建过程继续。这是个有用的
debug
选项。
-
w<sample_width>
输出样本的宽度(以像素为单位)
-
h
《
sample_height
》
输出样本的高度,以像素为单位。
(
5
)
创建负样本描述文件
在保存负样本的文件夹下生成一个负样本描述文件,具体步骤同(
3
),此处不再赘叙;
(
6
)进行样本训练
该步骤通过调用
OpenCV\bin
目录下的
haartraining
程序
(
新版本的
opencv
改名为
opencv_haartraining)
来完成。其中,
Haartraining
的命令行参数为:
-
data<dir_name>
存放训练好的分类器的路径名。
-
vec<vec_file_name>
正样本文件名(由
trainingssamples
程序或者由其他的方法创建的)
-
bg<background_file_name>
背景描述文件。
-
npos<number_of_positive_samples>
,
-
nneg<number_of_negative_samples>
用来训练每一个分类器阶段的正
/
负样本。合理的值是:
nPos = 7000;nNeg = 3000
-
nstages<number_of_stages>
训练的级联分类器层数。
-
nsplits<number_of_splits>
决定用于阶段分类器的弱分类器。如果
1
,则一个简单的
stump classifier
被使用。如果是
2
或者更多,则带有
number_of_splits
个内部节点的
CART
分类器被使用。
-
mem<memory_in_MB>
预先计算的以
MB
为单位的可用内存。内存越大则训练的速度越快。
-
sym
(
default
)
-
nonsym
指定训练的目标对象是否垂直对称。垂直对称提高目标的训练速度。例如,正面部是垂直对称的。
-
minhitrate
《
min_hit_rate
》
每个阶段分类器需要的最小的命中率。总的命中率为
min_hit_rate
的
number_of_stages
次方。
-
maxfalsealarm<max_false_alarm_rate>
没有阶段分类器的最大错误报警率。总的错误警告率为
max_false_alarm_rate
的
number_of_stages
次方。
-
weighttrimming<weight_trimming>
指定是否使用权修正和使用多大的权修正。一个基本的选择是
0.9
-
eqw
-
mode<basic(default)|core|all>
选择用来训练的
haar
特征集的种类。
basic
仅仅使用垂直特征。
all
使用垂直和
45
度角旋转特征。
-
w
《
sample_width
》
-
h
《
sample_height
》
训练样本的尺寸,(以像素为单位)。必须和训练样本创建的尺寸相同。
一个训练分类器的例子:
"D:\Program Files\OpenCV\bin\haartraining.exe" -data data\cascade -vec data\pos.vec -bg negdata\negdata.dat -npos 49 -nneg 49 -mem 200 -mode ALL -w 20 -h 20
训练结束后,会在目录
data
下生成一些子目录,即为训练好的分类器。
(
7
)
生成
xml
文件
上一步在进行
haartraining
的时候,会在
data
目录下生成一些目录及
txt
文件,我们需要调用opencv\bin\
haarconv.exe
将这些
txt
文件转换为
xml
文件,也就是所谓的分类器。
至此,分类器的训练工作已完成。剩下的,就是在程序中加载
xml
文件,并调用相应的函数接口来实现分类检测的作用了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询