精华内容
下载资源
问答
  • 弱分类器和强分类器

    万次阅读 2013-10-15 14:24:18
    由此看来,即便是复杂的图形,如具备较多数量的直线,通过重复简单特征识别(有时被称为弱分类器)仍可以达到高度识别的目的。这种识别方法被称作支持向量机算法(Support Vector Machine)或Booting算法。 ...

    原文地址:http://blog.csdn.net/qinzx2004/article/details/2824323


    英文原文地址:http://www.ricoh.com/about/company/technology/voice/column/020.html


    将英文原文中的图片搞过来了。


    动物,包括人类在内,通常是通过判断周边的情况后做出行动,这种反应速度的迅速性和灵活性令人吃惊。大多数生物如一次判断失误,下次便会纠正失误的判断基准。信息识别技术通过借鉴生物的这种灵活的信息处理特征,在信息技术处理方面获得了巨大进步。人类通常以来采取的方法是对需识别的对象做尽可能详细的调查,然后把调查得来的数据与预先获得的数据进行统计、分析,然后得出结论。另外,人们也可以根据持有的经验获得有效的判断效果。例如,对于路面上的一只动物,首先我们根据它的轮廓判断其大小,根据大小判断它可能是一只狗或猫;然后我们接近它,仔细观察它的形状和颜色,发现它既非狗也非猫,而是一只狐狸。这时,我们的经验库里就会增加同样大小的动物也包括狐狸的可能性。各种生物就是通过不断重复这种有机有序的判别方法,做出快速,准确,灵活的反应。

    举一个简单的例子来说明图像识别。如图1所示平面上的一个圆形,传统的方法是尽量采用强分类器来加以识别。假设对象物圆点为(I,J),半径为5,针对标本点(x,y),我们来判断以下公式(1)能否成立。

    (x-I)2+(y-J)2=5(1)

    图 1

    以坐标点(I,J)为圆心,半径为5的圆形(着色部分图像)

    从图 1可以看出,图中着色标本点不能完全满足公式(1).例如,尽管点(5,0)完全满足公式1,但是点(4,2)存在误差-离散空间下误差在所难免。但是,就整体来看,尽管存在误差点,仍可把这个图形识别为一个“大致”圆形。那么,如果把图1进一步变形为图2会产生怎样的效果呢?由公式(1)的评价结果来看,仅5个像素的偏移就增大了误差,但从外观上仍可将其识别为圆形。因此,我们仍将图2中的图形视为圆形,借用公式(1)来加以分析就很容易得出答案。总之,能否将其识别为圆形,我们需要提出判定基准,根据实际状况灵活地做出判断。

    图 2

    由图1中圆形稍微变形后形成的图形

    针对上述单个分类器的性能不高的情况,我们可以考虑重复单纯的是或否判定来获得高精度的识别方法。如图3所示,把作为探索针的任意三条直线:γ123, 与上述圆形相交后形成相交区域。如果直线数量少的话,就很难形成圆形。如果有成百上千条直线,就很容易构成圆弧范围。图中用绿色线表示识别边界。

    图 3

    任意直线γ123与图1中圆形相交情况。绿色线部分表示相交区域范围。直线γ3与圆形部分区域重叠。

    把图2中变形后的圆形与这些直线重叠后形成图4所示情况。变形部分是直线γ2 横切图形点A处。由于未改变图形其它部分,对图形的局部条件改变不影响对图4中变形圆形的识别。由此看来,即便是复杂的图形,如具备较多数量的直线,通过重复简单特征识别(有时被称为弱分类器)仍可以达到高度识别的目的。这种识别方法被称作支持向量机算法(Support Vector Machine)或Booting算法。


    图 4

    图形变形及伴随变形的交叉位置移动情况

    让我们来试用新近流行的识别方法,即利用数个弱分类器来进行人脸识别。用于人脸识别的有效而“简单的分类器”究竟是什么样的?人们还是期待使用简便,判定结果纯粹的分类器。让我们参考以下文献来作进一步探讨。

    (P. Viola and M. Jones, “Rapid Object Detection using a Boosted Cascade of Simple Features,” in Conf. On Computer Vision and Pattern Recognition, Hwaii, 2001;http://research.microsoft.com/~viola/Pubs/Detect/violaJones_CVPR2001.pdf(PDF: 194KB))。

    参考文献中建议将哈尔变换(Haar transform)作为核心参数. 哈尔变换用一个包含(1, -1)行列的矩阵表达,如图5所示 (1),(2), 用一组白色和黑色的筛选器表示。例如,把图5-(1)的筛选器放到脸部的眼睛和额头位置,由于额头位置的亮度较眼睛位置的亮度高,符合(1)的浓淡模式。如果额头被头发盖住,那么就不符合(1)的浓淡模式可能性。同样,把同一筛选器放在嘴部和嘴部上方区域,也会产生同样效果。尽管这种判定结果比较单纯,如果准备数千个考虑尺寸和位置的识别特征,然后把每次的识别结果加以组合,是可以得出非常精确的识别结果的。


    图 5

    简单识别特征与可适用的脸部位置。
    筛选器(1)适用于2处不同位置。

    高速识别测试

    但是,以上的测试流程多数是以弱分类器为测试前提,测试流程难免烦琐。换言之,分类器的数量越多,所需识别时间越长。因此人们总是配置部分强分类器。如进行人脸识别时可抽取出共通特征,如不具备共同特征则可将其忽略不计。在图6中展示了用于图5中两种弱分类器组合后形成强分类器的功能。个体功能较弱的分类器通过三处测试结果的组合,可以识别出人类脸部的特征。只有三个浓淡模式同时成立时,可以判定其为人脸特征。换言之,如无此图像则无法做出评价。这种人脸判定流程如图7所示。

    如流程图所示,最初判定时采用强分类器。但是把若干弱分类器组合后就形成功能较强的分类器,并具备相当高的威力。如分类器功能过于强大则使得识别结果时间延长而变得没有意义。较强分类器在于它可以迅速将不具备人脸特征的图像排除。在弱识别特征很多时,通过配置数个简单而强大的分类器,可以迅速提高识别速度。


    图 6

    特征组合增强脸部识别


    图 7

    根据识别器多段处理进行的人脸识别流程图。识别成功后移动到下一图像。


    照片 1

    被识别的“人脸”,比识别现代人脸要多出20倍时间。

    对照片-1中的人脸识别要比现代人脸识别时间多出20倍。这是因为记忆了现代人特征的弱分类器对照片中的若干不同特征的识别分值不够大,还需要增加超过阈值的弱识别特征。

    我们在很多情况下需要根据弱特征做出识别,判断。本次介绍的利用弱分类器进行识别的方法,非常适合模糊判定条件下的应用。


    展开全文
  • 以上是弱分类器和强分类器的全部内容,在云栖社区的博客、问答、云栖号、人物、课程等栏目也有弱分类器和强分类器的相关内容,欢迎继续使用右上角搜索按钮进行搜索opencv ,以便于您获取更多的相关知识。

    英文原文地址:http://www.ricoh.com/about/company/technology/voice/column/020.html

     

    将英文原文中的图片搞过来了。

     

     

    动物,包括人类在内,通常是通过判断周边的情况后做出行动,这种反应速度的迅速性和灵活性令人吃惊。大多数生物如一次判断失误,下次便会纠正失误的判断基准。信息识别技术通过借鉴生物的这种灵活的信息处理特征,在信息技术处理方面获得了巨大进步。人类通常以来采取的方法是对需识别的对象做尽可能详细的调查,然后把调查得来的数据与预先获得的数据进行统计、分析,然后得出结论。另外,人们也可以根据持有的经验获得有效的判断效果。例如,对于路面上的一只动物,首先我们根据它的轮廓判断其大小,根据大小判断它可能是一只狗或猫;然后我们接近它,仔细观察它的形状和颜色,发现它既非狗也非猫,而是一只狐狸。这时,我们的经验库里就会增加同样大小的动物也包括狐狸的可能性。各种生物就是通过不断重复这种有机有序的判别方法,做出快速,准确,灵活的反应。

    举一个简单的例子来说明图像识别。如图1所示平面上的一个圆形,传统的方法是尽量采用强分类器来加以识别。假设对象物圆点为(I,J),半径为5,针对标本点(x,y),我们来判断以下公式(1)能否成立。

    (x-I)2+(y-J)2=5弱分类器和强分类器(1)

    弱分类器和强分类器弱分类器和强分类器

    图 1

    以坐标点(I,J)为圆心,半径为5的圆形(着色部分图像)

    从图 1可以看出,图中着色标本点不能完全满足公式(1).例如,尽管点(5,0)完全满足公式1,但是点(4,2)存在误差-离散空间下误差在所难免。但是,就整体来看,尽管存在误差点,仍可把这个图形识别为一个“大致”圆形。那么,如果把图1进一步变形为图2会产生怎样的效果呢。由公式(1)的评价结果来看,仅5个像素的偏移就增大了误差,但从外观上仍可将其识别为圆形。因此,我们仍将图2中的图形视为圆形,借用公式(1)来加以分析就很容易得出答案。总之,能否将其识别为圆形,我们需要提出判定基准,根据实际状况灵活地做出判断。

    弱分类器和强分类器弱分类器和强分类器

    图 2

    由图1中圆形稍微变形后形成的图形

    针对上述单个分类器的性能不高的情况,我们可以考虑重复单纯的是或否判定来获得高精度的识别方法。如图3所示,把作为探索针的任意三条直线:γ1,γ2,γ3, 与上述圆形相交后形成相交区域。如果直线数量少的话,就很难形成圆形。如果有成百上千条直线,就很容易构成圆弧范围。图中用绿色线表示识别边界。

    弱分类器和强分类器弱分类器和强分类器

    图 3

    任意直线γ1,γ2,γ3与图1中圆形相交情况。绿色线部分表示相交区域范围。直线γ3与圆形部分区域重叠。

    把图2中变形后的圆形与这些直线重叠后形成图4所示情况。变形部分是直线γ2 横切图形点A处。由于未改变图形其它部分,对图形的局部条件改变不影响对图4中变形圆形的识别。由此看来,即便是复杂的图形,如具备较多数量的直线,通过重复简单特征识别(有时被称为弱分类器)仍可以达到高度识别的目的。这种识别方法被称作支持向量机算法(Support Vector Machine)或Booting算法。

    弱分类器和强分类器

    图 4

    图形变形及伴随变形的交叉位置移动情况

    让我们来试用新近流行的识别方法,即利用数个弱分类器来进行人脸识别。用于人脸识别的有效而“简单的分类器”究竟是什么样的。人们还是期待使用简便,判定结果纯粹的分类器。让我们参考以下文献来作进一步探讨。

    (P. Viola and M. Jones, “Rapid Object Detection using a Boosted Cascade of Simple Features,” in Conf. On Computer Vision and Pattern Recognition, Hwaii, 2001;http://research.microsoft.com/~viola/Pubs/Detect/violaJones_CVPR2001.pdf(PDF: 194KB))。

    参考文献中建议将哈尔变换(Haar transform)作为核心参数. 哈尔变换用一个包含(1, -1)行列的矩阵表达,如图5所示 (1),(2), 用一组白色和黑色的筛选器表示。例如,把图5-(1)的筛选器放到脸部的眼睛和额头位置,由于额头位置的亮度较眼睛位置的亮度高,符合(1)的浓淡模式。如果额头被头发盖住,那么就不符合(1)的浓淡模式可能性。同样,把同一筛选器放在嘴部和嘴部上方区域,也会产生同样效果。尽管这种判定结果比较单纯,如果准备数千个考虑尺寸和位置的识别特征,然后把每次的识别结果加以组合,是可以得出非常精确的识别结果的。

    弱分类器和强分类器

    图 5

    简单识别特征与可适用的脸部位置。
    筛选器(1)适用于2处不同位置。

    高速识别测试

    但是,以上的测试流程多数是以弱分类器为测试前提,测试流程难免烦琐。换言之,分类器的数量越多,所需识别时间越长。因此人们总是配置部分强分类器。如进行人脸识别时可抽取出共通特征,如不具备共同特征则可将其忽略不计。在图6中展示了用于图5中两种弱分类器组合后形成强分类器的功能。个体功能较弱的分类器通过三处测试结果的组合,可以识别出人类脸部的特征。只有三个浓淡模式同时成立时,可以判定其为人脸特征。换言之,如无此图像则无法做出评价。这种人脸判定流程如图7所示。

    如流程图所示,最初判定时采用强分类器。但是把若干弱分类器组合后就形成功能较强的分类器,并具备相当高的威力。如分类器功能过于强大则使得识别结果时间延长而变得没有意义。较强分类器在于它可以迅速将不具备人脸特征的图像排除。在弱识别特征很多时,通过配置数个简单而强大的分类器,可以迅速提高识别速度。

    弱分类器和强分类器

    图 6

    特征组合增强脸部识别

    弱分类器和强分类器

    图 7

    根据识别器多段处理进行的人脸识别流程图。识别成功后移动到下一图像。

    弱分类器和强分类器

    照片 1

    被识别的“人脸”,比识别现代人脸要多出20倍时间。

    对照片-1中的人脸识别要比现代人脸识别时间多出20倍。这是因为记忆了现代人特征的弱分类器对照片中的若干不同特征的识别分值不够大,还需要增加超过阈值的弱识别特征。

    我们在很多情况下需要根据弱特征做出识别,判断。本次介绍的利用弱分类器进行识别的方法,非常适合模糊判定条件下的应用。 

    以上是弱分类器和强分类器的全部内容,在云栖社区的博客、问答、云栖号、人物、课程等栏目也有弱分类器和强分类器的相关内容,欢迎继续使用右上角搜索按钮进行搜索opencv ,以便于您获取更多的相关知识。

    展开全文
  • 本文转自... Column (No.20) Weak Classifier and Strong Classifier Animals, human beings included, behave based on environmental percep

    本文转自http://www.ricoh.com/about/company/technology/voice/column/020.html

    Column

    (No.20) Weak Classifier and Strong Classifier

    Animals, human beings included, behave based on environmental perceptions, which are made quickly and often unconsciously. If the decision was wrong, the embedded learning mechanism corrects the decision criterion instantly. Using this principle based on an animal's flexible recognition adaptability, pattern recognition techniques follow the same strategy. In the traditional approach, we tried to obtain more and more detailed information at the beginning and then took decisions based on statistical data processing. However, we already know a more efficient way. When we see an unknown living object on the road, we may guess it is a dog or cat based on its silhouette size. Drawing closer we may find it is actually a fox by the detailed shape of its silhouette and color. We add another possible animal, fox, to the list in the similar size category. This is the typical strategy an animal uses in which repeated simple decisions lead to quick, flexible and accurate recognition.

    Here is another simple example of pattern recognition. In Figure 1 is a circle. With the traditional approach, we tried hard to create powerful (strong) classifiers to identify the circle correctly. If we already know that the circle has a radius 5 at (I,J), we can simply test the following equation (1) at each sampling point(x,y).

    (x-I) 2+(y-J) 2=5             (1)

    Figure 1
    Figure 1

    A circle with radius 5 located at (I,J). (colored pixels)

    We quickly see that all the colored sample points in figure 1 do not satisfy equation (1). For example, point (5,0) satisfies equation (1) perfectly, but point (4,2) does not. In general, we need to expect sampling errors in the digital space. Including these errors, the figure is satisfactorily regarded as a "circle." What about the modified circle in Figure 2? Using equation (1), shifting five pixels from the original positions increases the error greatly, but it still looks like a circle to the human eye, doesn't it? Therefore, it may be reasonable to train the classifier that Figure 2 is still a circle. What kind of classifier other than equation (1) should we apply? This is not an easy task even though the image has changed a little.

    Figure 2
    Figure 2

    A little modified circle.

    Now we try another approach to define the circle using many weak classifiers; each classifier's classification ability is weak based on simple decision rules, but as a whole, a high precision ratio is achieved. Defining the circle by many line segments with cross points, we can define the circle much simpler. With a small number of lines, it is difficult to define the circle precisely, but using many lines, it becomes precise. Here, the green lines show the error margins.

    Figure 3
    Figure 3

    A circle is defined by cross points of many line segments. The cross point margins are shown by green lines. The crossing areas between the circle and γ3 overlap.

    Replacing the original circle with the modified circle of figure 2, the resulting image is shown in figure 4. The only difference between the original and modified circle is cross point A, between the circle and line . As other relations remain unchanged, this method can be adapted easily by changing only a small part of the condition. It is plausible that even a complicated pattern could be identified by many weak classifiers (detection lines). This methodology using simple and fast decisions is called Support Vector Machine or Boosting.

    Figure 4
    Figure 4

    Modified figure and modified crossing points.

    Now we will test face detection based on this methodology. What is the most effective classifier for a face? The decision should be simple, quick and effective. Here is an example,

    P. Viola and M. Jones, "Rapid Object Detection using a Boosted Cascade of Simple Features," in Conf. On Computer Vision and Pattern Recognition, Hawaii, 2001 (http://research.microsoft.com/~viola/Pubs/Detect/violaJones_CVPR2001.pdf)

    The referenced paper suggests Haar transform as a kernel function. Haar transform is expressed as a matrix with the components of (1, -1), whose graphical representation is the black and white filter set shown in Figure 5, (1) and (2). This function is represented with pairs of darker and lighter areas, like the eye and forehead. If we prepare thousands of similar filters, the human face may be a good Haar filtered model.

    Figure 5
    Figure 5

    Simple two Haar patterns and their three matching areas.

    High Speed Recognition

    Placing the two filters on top of the three human face locations, dark and light pair/triple areas match well with human features. However, if hair masks the forehead, misrecognition may occur. Figure 6 is an example where two Haar filters have three different matched areas. These three pattern matched areas are considered unique to the human face. Combining two filters at three locations, each weak filter (classifier) combines to become a powerful (strong) classifier. Using this strong classifier at the first step of the flow chart in Figure 7, this classifier will exclude most of the image that does not include this face feature. This strategy works well to achieve the fast recognition system. Photo-1 is an extracted face example using the Figure 7 flowchart. As this photo's face differs a bit from modern face features, the system requires 20 times more computations to extract the face area. It requires many weak classifiers to achieve a score larger than the defined threshold.

    Figure 6
    Figure 6

    The combined two features at three different locations becomes a "strong" classifier for the human face.

    Figure 7
    Figure 7

    High-speed face recognition flowchart. The first strong classifier excludes non-face images, which makes it possible to skip unneeded steps.

    Photo 1
    Photo 1

    Recognized human face after 20 times more computations compared with the modern human face.

    In our society, there are many occasions in which decisions must be made with ambiguous evidence. My next article will show how these weak classifiers work well under those circumstances.

    (Ej, 2006.12)

     

    展开全文
  • 此文章假定读者已经了解前面5章的内容,包括Haar特征,弱分类器和强分类器结构,以及GAB等内容。 缩进在opencv_traincascade.exe程序中,有如下参数 缩进如上输入的boostParams中的6个参数决用于决定训练过程...

    http://lib.csdn.net/article/opencv/29324(原文地址)


    本节文章讲解OpenCV中Haar+Adaboost的训练过程。此文章假定读者已经了解前面5章的内容,包括Haar特征,弱分类器和强分类器结构,以及GAB等内容。

    缩进在opencv_traincascade.exe程序中,有如下参数


    缩进如上输入的boostParams中的6个参数决用于决定训练过程:

    1. 参数bt选择Boosting类型(默认GAB),本系列文章五中已经介绍了

    2. minHitRate和maxFalseAlarmRate限定训练过程中各种阈值大小,文章六已经介绍了

    3. 参数weightTrimRate非核心内容,只是个小tricks,本文忽略

    4. 参数maxDepth限定树状弱分类器的深度,如本系列文章三图3中的为2或图5中为1。

    5. 参数maxWeakCount为每个stage中树状弱分类器最大数量,超过此数量会强制break

    缩进本节的强分类器stage训练过程将围绕这些参数展开。强烈建议读者在阅读本章节前,自行收集人脸样本并使用程序opencv_traincascade.exe训练一个简单的人脸分类器,以便理解。


    1 样本收集过程

    缩进首先分析每一个stage训练时如何收集样本,事实上每一个stage训练使用的正负样本都不同。

    1. 正样本patches收集过程

    缩进opencv_trancascade.exe使用的正样本是一个vec文件,即由opencv_createsamples.exe把一组固定w x h大小的图片转换为二进制vec文件(只是读取图片并转化为灰度图,并按照二进制格式保存下来而已,不做任何改变)。由于经过如此处理的正样本就是固定w x h大小的patches,所以正样本可以直接进入训练。

    2. 负样本patches收集过程

    缩进而使用的负样本就不一样了,是一个包含任意大小图片路径的txt文件。在寻找负样本的过程中,程序会以图像金字塔(pyramid)+滑动窗口的模式(sliding-window)去遍历整个负样本集,以获取w x h大小的负样本patches。

    3. 对1和2步骤来中这些自的正负样本的patches进行分类

    缩进获取到这些w x h固定大小的正负样本patches后,利用已经训练好的stage分类这些patches,并且从正样本中收集TP patches,直到够numPos个;从负样本中收集FP patches,直到够numNeg个(假设样本是足够的)。之后利用TP patches作为正样本,FP patches作为负样本训练下一个stage。

    图1 每个Stage训练前收集样本示意图

    缩进那么对于第0个初始stage,直接收集numPos个来自正样本的patches + numNeg个来自负样本的patches进行训练;对于第 i (i > 0)个stage,则利用已经训练好的 0 到 i - 1 的stage分类这些patches,分别从正样本patches中收集numPos个TP,从负样本patches中收集numNeg个FP(numPos和numNeg是在opencv_traincascade.exe中预先人工设置的)。每一个stage都要进行上述收集+分类过程,所以实际中每一个stage所使用的训练样本也都不一样!

    缩进思考1:看到这里,读者不妨思考一下为什么要用TP和FP训练,而不用FN和TN?

    缩进作者的答案:对于正样本中的FN,已经被之前的stage拒绝掉,没法挽救了;而对于负样本中的TN,已经被之前的stage正确拒绝了,没必要再次学习;而负样本中的FP,被错误的通过了,所以当前stage才要专门学习这些FP并且加以拒绝。

    缩进看完我的讲解之后再来看看代码,讲解一定要和代码相符。在opencv的cascadeclassifier.cpp中,有如下fillPassedSamples()函数负责填充训练样本(修改此函数可以实现下文提到的保存TP和FP)。

    1. int CvCascadeClassifier::fillPassedSamples( int first, int count, bool isPositive, double minimumAcceptanceRatio, int64& consumed )  
    2. {  
    3.     int getcount = 0;  
    4.     Mat img(cascadeParams.winSize, CV_8UC1);  
    5.     forint i = first; i < first + count; i++ )  
    6.     {  
    7.         for( ; ; )  
    8.         {  
    9.             if( consumed != 0 && ((double)getcount+1)/(double)(int64)consumed <= minimumAcceptanceRatio )  
    10.                 return getcount;  
    11.   
    12.             bool isGetImg = isPositive ? imgReader.getPos( img ) : imgReader.getNeg( img ); //读取样本  
    13.             if( !isGetImg )  
    14.                 return getcount; //如果不能读取样本(出错or样本消耗光了),返回  
    15.             consumed++; //只要读取到了样本,不管判断结果如何,消耗量consumed增加1  
    16.   
    17.             //当参数isPositive = true时,填充正样本队列,此时选择TP进入队列  
    18.             //当参数isPositive = false时,填充负样本队列,此时选择FP进入队列  
    19.             featureEvaluator->setImage( img, isPositive ? 1 : 0, i ); //将样本img塞入训练队列中  
    20.             if( predict( i ) == 1 ) //根据isPositive判断是否是TP/FP, 是则break进入下一个;反之继续循环,并覆盖上面setImage的样本  
    21.             {  
    22.                 getcount++; //真正添加进训练队列的数量  
    23.                 printf("%s current samples: %d\r", isPositive ? "POS":"NEG", getcount);  
    24.                 break;  
    25.             }  
    26.         }  
    27.     }  
    28.     return getcount;  
    29. }  
    接下来看看第20行的predict()函数:
    1. int CvCascadeClassifier::predict( int sampleIdx )  
    2. {  
    3.     CV_DbgAssert( sampleIdx < numPos + numNeg );  
    4.     for (vector< Ptr<CvCascadeBoost> >::iterator it = stageClassifiers.begin();  
    5.         it != stageClassifiers.end(); it++ )  
    6.     {  
    7.         if ( (*it)->predict( sampleIdx ) == 0.f )  
    8.             return 0;  
    9.     }  
    10.     return 1;  
    11. }  
    再进入第7行的(*it)->predict()函数:
    1. float CvCascadeBoost::predict( int sampleIdx, bool returnSum = false ) const  
    2. {  
    3.     CV_Assert( weak );  
    4.     double sum = 0;  
    5.     CvSeqReader reader;  
    6.     cvStartReadSeq( weak, &reader );  
    7.     cvSetSeqReaderPos( &reader, 0 );  
    8.     forint i = 0; i < weak->total; i++ )  
    9.     {  
    10.         CvBoostTree* wtree;  
    11.         CV_READ_SEQ_ELEM( wtree, reader );  
    12.         sum += ((CvCascadeBoostTree*)wtree)->predict(sampleIdx)->value; //stage内的弱分类器wtree输出值求和sum  
    13.     }  
    14.     if( !returnSum )  
    15.         //默认进行sum和stageThreshold比较  
    16.         //当sum<stageThreshold,输出0,否决当前样本;sum>stageThreshold,输出1,通过  
    17.         sum = sum < threshold - CV_THRESHOLD_EPS ? 0.0 : 1.0;  
    18.     return (float)sum; //若returnSum==true则不与stageThreshold比较,直接返回弱分类器输出之和。下文用到  
    19. }  
    看到这就很清晰了,默认returnSum为false时每个stage内部弱分类器wtree的输出值加起来和stageTheshold比较,当样本通过时输出1,不通过输出0(参考文系列文章三)。那么对于positive samples,输出1即是TP;对于negative samples,输出1即是FP。至此代码与上述内容对应,over!


    2 分类器的训练过程

    缩进为了方便理解,以下章节都是以maxDepth=1为例分析训练过程,其他深度请自行分析代码。在收集到numPos个TP和numNeg个FP后,就可以训分类器了,过程如下:
    1. 首先计算所有Haar特征对这numPos+numNeg个样本patches的特征值,排序后分别保存在的vector中,如图2
    图2 分类器训练过程示意图
    2. 按照如下方式遍历每个存储特征值的vector
    (1) for k= 1 : (numPos+numNeg)
         a. 阈值threshold = 0.5 * (vector[k]+vector[k+1])将vector分为left和right两部分
         b. 计算GAB的输出leftvalue和rightvalue,其中wi为样本的权重,yi为样本标签(1为本 and 0为负)
             (在训练每个stage的首次迭代中初始化wi= 1 / (numPos+numNeg))
        c. 计算GAB WSE ERROR

    (2) 在k的遍历过程中,找到error最小的threshold作为当前vector的Best spilt,以及对应的leftvalue和rightvalue保存下来。可以看出这里的Best spilt threshold就是弱分类器阈值,与Haar特征+leftvalue+rightvalue共同构成一个完成的弱分类器。(注意在第三章中提到的:一个完整的弱分类器包含:Haar特征 + leftValue + rightValue + 弱分类器阈值)
    下面给出一个计算弱分类器的流程图,即1-2步骤(来自该博客):
    3. 至此,已经有很多弱分类器了。但是哪一个弱分类器最好呢?所以要挑选最优弱分类器放进stage中。
    至此,通过步骤(1)-(2)后每一个弱分类器都有一个基于Best split threshold的GAB WSE ERROR,那么显然选择ERROR最小的那个弱分类器作为最优弱分类器放进当前训练的stage中。
    4. 依照GAB方法更新当前训练的stage中每个样本的权重
    对numPos+numNeg个权重按照如下公式更新权重(注意更新后需要对权重进行归一化)。
    5. 计算当前的强分类器阈值stageThreshold
    (1) 使用当前的stage中已经训练好的弱分类器去检测样本中的每一TP,计算弱分类器输出值之和保存在eval中(如果不明白,请查阅第三节“并联的弱分类器”)。
    (2) 对eval升序排序
    (3) 利用minHitRate参数估计一个比例thresholdIdx,以eval[thresholdIdx]作为stage阈值stageThreshold,显然TP越多估计的stageThreshold越准确。
    上述(1)-(3)过程由boost.cpp中的CvCascadeBoost::isErrDesired()函数实现,关键代码如下:
    1. int numPos = 0;  
    2. forint i = 0; i < sCount; i++ ) //遍历样本  
    3.     if( ((CvCascadeBoostTrainData*)data)->featureEvaluator->getCls( i ) == 1.0F ) //if current sample is TP  
    4.         eval[numPos++] = predict( i, true ); //predict加入true参数后,会返回当前stage中弱分类器输出之和(如上文predict介绍)  
    5. icvSortFlt( &eval[0], numPos, 0 ); //升序排序  
    6. int thresholdIdx = (int)((1.0F - minHitRate) * numPos); //按照minHitRate估计一个比例作为index  
    7. threshold = eval[ thresholdIdx ]; //取该index的值作为stageThreshold  
    至此,stage中的弱分类器+stageThreshold等参数都是完整的
    6. 重复1-5步骤,直到满足下列任意一个条件后停止并输出当前的stage
    (1) stage中弱分类器的数量 >= maxWeakCount参数
    (2) 利用当前的stage去检测FP获得当前stage的falseAlarmRate,当falseAlarmRate < maxFalseAlarmRate停止
    同样是boost.cpp中的CvCascadeBoost::isErrDesired()函数:
    1. int numNeg = 0;  
    2. forint i = 0; i < sCount; i++ )  
    3. {  
    4.     if( ((CvCascadeBoostTrainData*)data)->featureEvaluator->getCls( i ) == 0.0F )  
    5.     {  
    6.         numNeg++;  
    7.         if( predict( i ) ) //predict==1也就是falseAlarm,虚警,即俗称的误报  
    8.             numFalse++;  
    9.     }  
    10. }  
    11. float falseAlarm = ((float) numFalse) / ((float) numNeg);  
    12. return falseAlarm <= maxFalseAlarm;  
    返回false时,停止当前stage训练。
    7. 然后重复1-6依次训练每一个stage,直到满足下面任意一个条件:
    (1) stage数量 >= numStages
    (2) 所有stage总的falseAlarmRate < pow(maxFalseAlarmRate,numStages)

    3 一个小例子
    缩进作者选用了约12000张人脸样本,使用opencv_traincascade.exe程序,设置numPos=numNeg=10000,w=h=24,进行一次简单的训练。如下图红线所示,在stage0的时候,程序直接从正负样本中各抽取10000张24x24大小的子图片进行训练,获得了一个包含3个决策树的强分类器。
    缩进在stage1的时,扫描了10008张正样本后获得了10000个TP(当前实际hitRate=10000/10008);扫描了很多负样本窗口后获得了10000个FP(比例为acceptanceRatio=0.243908,即是当前实际falseAlarmRate)。训练完成后获得一个包含5个决策树的强分类器。
    缩进可以看到,在一般情况下,随着训练的进行,acceptancesRatio会越来越低,即直观上看每一级收集的FP会越来越像正样本;那么为了区分TP与FP,每一个stage包含的决策树也会逐渐增多。This is make sense!
    注1:上图中每一级的前几个分类器HR=1,FA=1,这是由训练程序中的数值计算细节导致的,有兴趣的朋友可以自己去翻代码......
    注2:保存FP可以通过修改fillPassedSamples()函数实现。

    4 训练过程总结

    其实回顾一下,整个分类器的训练过程可以分为以下几个步骤:

    1. 寻找TP和FP作为训练样本

    2. 计算每个Haar特征在当前权重下的Best split threshold+leftvalue+rightvalue,组成了一个个弱分类器

    3. 通过WSE寻找最优的弱分类器

    4. 更新权重

    5. 按照minHitRate估计stageThreshold

    6. 重复上述1-5步骤,直到falseAlarmRate到达要求,或弱分类器数量足够。停止循环,输出stage。

    7. 进入下一个stage训练


    到此,整个系列文章就结束了。

    可以看到,相比CNN传统的Boosting方法有极强的理论基础,虽然复杂但是非常严谨。

    由于weightTrim不是核心内容,所以留给读者自己探索
    另外此文主旨是分析算法,而非工具使用说明,所以不会写有关如何使用opencv_traincascade.exe内容,请读者谅解。
    展开全文
  • 人脸检测(AdaBoost)

    2013-04-05 12:40:46
    用VC++6.0实现Adaboost算法,包括弱分类器和强分类器的训练及结果。
  • 详细分析了弱分类器和强分类器的定义和原理,给出了如何从弱分类器来构造所需要的强分类器,最后从统计数据的角度来分析了为什么Haar特征可以用来分类。
  • 基于阈值的分割 基于边缘的分割 传统图像分割的方法 区域生长法 分水岭算法步骤 Graph Cuts分割 ...弱分类器和强分类器 ‘ 级联分类器的检测机制 HOG HOG的步骤 SVM基本模型 DPM ...
  • opencv训练人脸

    2018-11-12 13:39:41
    boosting算法涉及到弱分类器和强分类器的概念。弱分类器分类正确率较低,但是较容易获得,强分类器分类正确率较高,但是较难获得。只要样本充足,弱学习可以通过一定的组合获得任意精度的强学习。级联分类器就是 N个...
  • 图像分割(2)

    2018-10-30 16:19:08
    图像分割(2)引言1、Haar-like特征+级联分类器Haar-like特征Haar-like特征模板Haar-like特征的数量Haar级联分类器弱分类器和强分类器级联分类器的检测机制2、行人检测3、HOG+SVMHOGSVM基本模型4、DPMDPM检测流程 ...
  • 图像分割(1)

    千次阅读 2018-10-30 16:17:05
    图相分割引言1、图像分割(1)基于阈值、 基于边缘基于阈值的分割基于边缘的分割(2)基于...like特征+级联分类器Haar-like特征Haar-like特征模板Haar-like特征的数量Haar级联分类器弱分类器和强分类器级联分类器...
  • 元算法 元算法是对其他算法进行组合的一种方法,其背后的思路就是组合多个...弱分类器和强分类器 关于AdaBoost方法,相比于SVM的大量推导,它显得更为简单一点,具体的推导,这里有一些个人认为非常好理解的推导: AdaB...
  • 具有边缘和强边缘的边缘检测 通过减少垂直线和调整阈值参数来优化边缘检测 额外的Guassian内核可降低噪音 非最大抑制调整 改进的检测器使用基本模板匹配将检测率提高到〜68%。 人脸分类器 使用验证数据实现基本...
  • 1、Adaboost算法把训练集通过弱可学习,得到一系列的弱分类器。然后,把弱分类器,通过加权处理,组合成一个强分类器。 在提升方法中,弱可学习和强可学习是等价的。
  • Adaboost算法

    2020-01-03 16:26:14
    Adaboost算法 集成学习概述 集成学习算法定义 集成学习(Ensemble learning)就是讲若干...而强分类器(strong Classifier)的分类准确率会高很多,这里的弱和强是相对的,弱分类器也叫做基分类器 分类: bagging b...
  • 1:简单概念描写叙述 Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都是分类器,首先我们须要简介几个概念。...这里我们採用的弱分类器是单层决策树,它是一个单节点...
  • 弱分类器:分类效果差,只是比随机猜测好一点。强分类器:具有较高的识别率,较好的分类效果。(在百度百科中有提到要能在多项式时间内完成学习)弱和强更大意义上是相对而言的,并没有严格的限定。比如准确率低于...
  • 1:简单概念描述 &nbsp;&nbsp;&nbsp;&nbsp;&... Adaboost是一种弱学习算法到强学习算法,这里的弱和强学习算法,指的当然都...其实任意的分类器都可以做为弱分类器,比如之前介绍的KNN、决策树、Na...
  • 机器学习笔记(五)——集成学习

    千次阅读 2018-08-16 21:54:30
    集成学习的提出,有时也被笼统的称作提升(Boosting)方法,很广泛的应用与分类和回归任务,也就是说我们在学习集成...在进行集成学习器的时候,我们会接触到学习器和强学习器,那么我们先要搞清楚所有只是架构...
  • 弱分类器:分类效果差,只是比随机猜测好一点。 强分类器:具有较高的识别率,较好的分类效果。(在百度百科中有提到要能在多项式时间内完成学习) 弱和强更大意义上是相对而言的,并没有严格的限定。比如准确率...
  • 1)“三个臭皮匠顶个诸葛亮”,一堆弱分类器的组合就可以成为一个强分类器; 2)“知错能改,善莫大焉”,不断地在错误中学习,迭代来降低犯错概率 当然,要理解好Boosting的思想,首先还是从弱学习算法和强学习...
  • 集成学习

    千次阅读 2016-07-19 14:57:00
    弱分类器的误差和AdaBoost框架的误差 多属性数据集的处理 Bagging Bagging的策略 模型的偏差和方差 方差和偏差的来源 随机森林 算法 随机选取训练样本集 随机选取分裂属性集特征投影 特征扩展 特征选择 随机森林的...
  • 其次,借鉴MIL算法思想,利用弱分类器的组合构成强分类器,然后对候选样本进行计算来确定目标,并提出了模型学习率和强分类器更新方法。最后,根据候选样本集为正样本集的概率值来自适应调节跟踪目标窗口的大小。...
  • 学习者一般是指一个分类器,它的结果只比随机分类好一点点;强学习者指分类器的结果非常接近真值。 一、算法起源 Valiant和 Kearns提出了学习和强学习的概念 ,识别错误率小于1/2,也即准确率仅比随机猜测略高的...
  • 缩进之前的文章主要讲解了OpenCV中与检测相关的内容,包括Haar特征、积分图和检测分类器结构;之后的文章将逐步开始介绍训练相关的内容。 缩进本节主要介绍AdaBoost,以及AdaBoost中的DAB与GAB算法。 1 ...
  • 一、经典的机器学习过程 训练数据 - 模型 -预测 二、集成学习的成功 ...三、集成学习的分类 ...把一个学习改造成一个和强学习有相同效果的算法,创造者给了构造性证明。 (未完) 视频参考:...
  • 与单个搜索相比,该组合将电弱和强生产情况下对规范介导的SUSY的敏感度提高了中性和chargino质量的高达100 GeV,并产生了第一个CMS结果,将事件中的各种SUSY搜索与光子在s时相结合。 = 13 TeV。

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

弱分类器和强分类器