随机蕨(Random Fern)
最近在做 Zdenek Kalal 的 TLD 算法,其成果发表在CVPR 2010 上,文章的名字叫做 P-N Learning: Bootstrapping Binary Classifiers by Structural Constraints,是关于一个跟踪算法的,主要思想还是实时地对跟踪对象的模型进行更新。检测部分用到了一种作者称为 Fern 的结构,它是在 Random Forests 的基础上改进得到的,不妨称之为Random Fern。下面,根据我的理解和体会总结下 Random Fern 是怎么做的。
首先,不得不先说一下论文在进行检测时所使用的特征,是作者定义的一种称之为 2bitBP(2bit Binary Pattern)的特征。
2bitBP(2bit Binary Pattern)的特征
这种特征是一种类似于 harr-like 的特征,这种特征包括了特征类型以及相应的特征取值。
假定现在我们要判断一个Patch 块是不是我们要检测的目标。所谓特征类型,就是指在这个 Patch 在 (x,y)坐标,取的一个长 width,高 height 的框子,这个组合 (x, y, width, height) 就是相应的特征类型。
下面解释什么是特征的取值。在已经选定了特征类型的情况下,如果我们把框子左右分成相等的两部分,分别计算左右两部分的灰度和,那么就有两种情况:(1)左边灰度大,(2)右边灰度大,直观的看,就是左右两边哪边颜色更深。同样的,把框子分成上下相等的两部分,也会有两种情况,直观地看,就是上下两边哪边颜色更深。于是在分了上下左右后,总共会有4种情况,可以用 2bit 来描述这4种情况,即可得到相应的特征取值。这个过程可以参见图1。
实际上每种类型的特征都从某个角度来看待我们要跟踪的对象。比如图1中的红框,这个框子中,车灯的地方灰度应该要深一些,那么红框这个类型的特征,实际上就意味着,它认为,如果该 Patch 是一个车子,在相应的地方,相应的长和高,这个地方颜色也应该深一些。

图1. 2bitBP特征说明
接下来,开始介绍 Random Fern。
Random Fern
前面已经提及,每种类型的特征都代表了一种看待跟踪对象的观点,那么是否可以用若干种类型的特征来进行一个组合,使之更好地描述跟踪的对象呢?答案是肯定的,还是举图1的例子,左边有一个车灯,右边也有一个车灯,如果我们把这两个框子都取到了,可以预见检测的效果会比只有一个框子来得好。Random Fern 的思想就是用多个特征组合来表达对象。
下面,我们先讲一个 Fern 是怎么生成和决策的,再讲多个 Fern 的情况下,如何进行统一决策。
不妨假设我们选定了 nFeat 种类型的特征来表达对象。每个棵 Fern 实际上是一棵4叉树,如图2所示,选了多少种类型的特征,这棵4叉树就有多少层。对于一个 Patch,每一层就用相应的类型的特征去判断,计算出相应类型特征的特征取值,由于采用的是2bitBP特征,会有4种可能取值,在下一层又进行相同的操作,这样每个 Patch 最终会走到最末层的一个叶子节点上。
对于训练过程,要记录落到每个叶子结点上的正样本个数(用nP记),同时也要记录落到每个叶子结点上的负样本的个数(用nN记)。则可算出正样本落到每个叶子结点上的后验概率nP/(nP+nN)。
对于检测过程,要检测的 Patch 最终会落到某个叶子结点上,由于训练过程已经记录了 正样本落到每个叶子结点上的后验概率,最终可输出该 Patch 为正样本的概率。

图2. Fern 的结构
前面介绍了一个 Fern 的生成,以及用 Fern 检测一个 Patch,并给出它为正样本的概率。这样多个 Fern进行判断时,就会给出多个后验概率。这就好比我们让多个人来决策,看这个东西是不是正样本,每个人对应于一个 Fern。最终我们计算这一系列的 Fern 输出的后验的均值,看是否大于阈值,从而最终确定它是否是正样本。
补充:
随机蕨分类器(Random Ferns Classifier),类似于随机森林(Random Forest),区别在于随机森林的树中每层节点判断准则不同,而随机蕨的“蕨”中每层只有一种判断准则。

如上图所示,把左面的树每层节点改成相同的判断条件,就变成了右面的蕨。所以蕨也不再是树状结构,而是线性结构。随机蕨分类器根据样本的特征值判断其分类。从图像元中任意选取两点A和B,比较这两点的亮度值,若A的亮度大于B,则特征值为1,否则为0。每选取一对新位置,就是一个新的特征值。蕨的每个节点就是对一对像素点进行比较。
比如取5对点,红色为A,蓝色为B,样本图像经过含有5个节点的蕨,每个节点的结果按顺序排列起来,得到长度为5的二进制序列01011,转化成十进制数字11。这个11就是该样本经过这个蕨得到的结果。

同一类的很多个样本经过同一个蕨,得到了该类结果的分布直方图。高度代表类的先验概率p(F|C),F代表蕨的结果(如果蕨有s个节点,则共有1+2^s种结果)。

不同类的样本经过同一个蕨,得到不同的先验概率分布。

以上过程可以视为对分类器的训练。当有新的未标签样本加入时,假设它经过这个蕨的结果为00011(即3),然后从已知的分布中寻找后验概率最大的一个。由于样本集固定时,右下角公式的分母是相同的,所以只要找在F=3时高度最大的那一类,就是新样本的分类。

只用一个蕨进行分类会有较大的偶然性。另取5个新的特征值就可以构成新的蕨。用很多个蕨对同一样本分类,投票数最大的类就作为新样本的分类,这样在很大程度上提高了分类器的准确度。
随机蕨(Random Fern)的更多相关文章
- python产生随机值-random模块
import random产生随机值的模块random.random() #获取一个随机的浮点值;help(random.random) #查看随机范围:0-1;random.uniform(1,10 ...
- sklearn_随机森林random forest原理_乳腺癌分类器建模(推荐AAA)
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- 机器学习方法(六):随机森林Random Forest,bagging
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 前面机器学习方法(四)决策树讲了经典 ...
- 随机模块 random 函数的调用
随机模块 random 作用: 用于模拟或生成随机输出的模块. 用法示意: import random as R 函数名 描述 R.random() 返回一个[0, 1) 之间的随机实数 R.unif ...
- 【JMeter_16】JMeter逻辑控制器__随机控制器<Random Controller>
随机控制器<Random Controller> 业务逻辑: 当每次执行到该逻辑控制器时,随机挑选控制器下的任意一个子节点<取样器.逻辑控制器> Ignore sub-cont ...
- Python 随机(random)模块的不可预测之美
1 . 概念 1.1 真.伪随机数 大部分的计算机语言都会提供 API 生成随机数,此类 API 称为随机数生成器. 计算机可以用随机数模拟现实世界中的各种随机概率问题,没有随机生成器的编程语言不是& ...
- 时间模块 time 随机模块random os模块,sys模块
时间模块 time #时间模块 import time #三种格式 #时间戳时间:是一个浮点数,以秒为单位,计算机用语 #结构化时间 :是一个元组 #用于中间转换 #格式化时间:str数据类型, 用 ...
- 随机森林——Random Forests
[基础算法] Random Forests 2011 年 8 月 9 日 Random Forest(s),随机森林,又叫Random Trees[2][3],是一种由多棵决策树组合而成的联合预测模型 ...
- 【Python】随机模块random & 日期时间のtime&&datetime
■ random 顾名思义,random提供了python中关于模拟随机的一些方法.这些方法都一看就懂的,不多说了: random.random() 返回0<n<=1的随机实数 rando ...
随机推荐
- Java 多线程 - synchronize 关键字
目录 Java 多线程 - synchronize 关键字 Java 多线程 - synchronize 关键字 学习自 http://cmsblogs.com/?p=2071 https://www ...
- 不同浏览器的userAgent
一.IE浏览器 //IE6 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" //IE7 "Mozill ...
- BZOJ.3522.[POI2014]Hotel(DP)
题目链接 BZOJ 洛谷 以为裸点分治,但数据范围怎么这么小?快打完了发现不对.. n^2做的话其实是个水题.. 枚举每一个点为根,为了不重复计算,我们要求所求的三个点必须分别位于三棵子树上. 考虑当 ...
- Gym 100646 Problem E: Su-Su-Sudoku 水题
Problem E: Su-Su-Sudoku/center> 题目连接: http://codeforces.com/gym/100646/attachments Description By ...
- Tomcat无法启动8005端口,提示:java.net.ConnectException: 拒绝连接 (Connection refused)
修改$JAVA_HOME/jre/lib/security/Java.security 文件中 securerandom.source 配置项: 将 securerandom.source=file: ...
- 最近5年183个Java面试问题列表及答案[最全]
Java 面试随着时间的改变而改变.在过去的日子里,当你知道 String 和 StringBuilder 的区别(String 类型和 StringBuffer 类型的主要性能区别其实在于 Stri ...
- Revit Family API 添加类型
FamilyManager.NewType("");添加新类型,然后设置参数,就是为新类型设置参数. [TransactionAttribute(Autodesk.Revit.At ...
- delphi 线程的应用 和spcomm的应用
http://bbs.csdn.net/topics/390744417 串口控件本身的线程不是这样理解的,你不用管它本身用不用线程,它的内部线程和你也没关系.前面说过了,你可以在自己的主线程里创建好 ...
- QQ去除未读状态的动画
QQ去除未读状态的动画 by 伍雪颖 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmFpbmxlc3Zpbw==/font/5a6L5L2T/fonts ...
- myeclipse 2014 专业版 安装 svn插件
团队合作的项目肯定少不了版本控制,那么现在就看看myeclispe中是如何使用的吧. 开发环境:myeclipse 2014 java 8 tomcate 8 试了网上说的几种方法,都没有成功,最 ...