标题:
TLD代码分析全过程 (转)(4)
[打印本页]
作者:
yuyang911220
时间:
2016-8-24 17:24
标题:
TLD代码分析全过程 (转)(4)
6.1.2、TLD跟踪模块的实现原理和trackf2f函数的实现:
TLD
跟踪模块的实现是利用了
MediaFlow
中值光流跟踪和跟踪错误检测算法的结合
。中值流跟踪方法是基于
Forward-BackwardError
和
NNC
的。原理很简单:从
t
时刻的图像的
A
点,跟踪到
t+1
时刻的图像
B
点;然后倒回来,从
t+1
时刻的图像的
B
点往回跟踪,假如跟踪到
t
时刻的图像的
C
点,这样就产生了前向和后向两个轨迹,比较
t
时刻中
A
点和
C
点的距离,如果距离小于一个阈值,那么就认为前向跟踪是正确的;这个距离就是
FB_error
;
boolLKTracker::trackf2f(const Mat& img1, const Mat& img2,vector<
oint2f> &points1, vector<cv:
oint2f> &points2)
函数实现过程如下:
(
1
)先利用金字塔
LK
光流法跟踪预测前向轨迹:
calcOpticalFlowPyrLK( img1,img2, points1, points2, status, similarity,window_size, level, term_criteria, lambda, 0);
(
2
)再往回跟踪,产生后向轨迹:
calcOpticalFlowPyrLK( img2,img1, points2, pointsFB, FB_status,FB_error,window_size, level, term_criteria, lambda, 0);
(
3
)然后计算
FB-error
:前向与
后向
轨迹的误差:
for( int i= 0; i<points1.size(); ++i )
FB_error
= norm(pointsFB
-points1
);
(
4
)再从前一帧和当前帧图像中(以每个特征点为中心)使用亚象素精度提取
10x10
象素矩形(使用函数
getRectSubPix
得到),匹配前一帧和当前帧中提取的
10x10
象素矩形,得到匹配后的映射图像(调用
matchTemplate
),得到每一个点的
NCC
相关系数(也就是相似度大小)。
normCrossCorrelation(img1,img2, points1, points2);//
用
MatchTemplate
进行的计算
(
5
)然后筛选出
FB_error
<=median(FB_error)
和
sim_error
> median(sim_error)
的特征点(舍弃跟踪结果不好的特征点),剩下的是不到
50%
的特征点;
filterPts(points1,points2);
6.2、检测模块detect(img2);
TLD
的检测分类器有三部分:
方差分类器模块、集合分类器模块和最近邻分类器模块;
这三个分类器是级联的。当前帧
img2
的每一个扫描窗口依次通过上面三个分类器,全部通过才被认为含有前景目标。具体实现过程如下:
先计算
img2
的积分图,为了更快的计算方差:
integral(frame,iisum,iisqsum);
然后用高斯模糊,去噪:
GaussianBlur(frame,img,Size(9,9),1.5);
下一步就进入了方差检测模块:
6.2.1
、方差分类器模块:
getVar(grid
,iisum,iisqsum) >= var
利用积分图计算每个待检测窗口的方差,方差大于
var
阈值(
目标(
best_box
)
patch
方差的
50%
)的,则认为其含有前景目标,通过该模块的进入集合分类器模块:
6.2.2
、集合分类器模块:
集合分类器(随机森林)共有
10
颗树(基本分类器),每棵树
13
个判断节点,每个判断节点经比较得到一个二进制位
0
或者
1
,这样每棵树就对应得到一个
13
位的二进制码
x
(叶子),这个二进制码
x
对应于一个后验概率
P(y|x)
。那么整一个集合分类器(共
10
个基本分类器)就有
10
个后验概率了,将
10
个后验概率进行平均,如果大于阈值(一开始设经验值
0.65
,后面再训练优化)的话,就认为该图像片含有前景目标;具体过程如下:
(
1
)先得到该
patch
的特征值(
13
位的二进制代码):
classifier.getFeatures(patch,grid
.sidx,ferns);
(
2
)再计算该特征值对应的后验概率累加值:
conf =classifier.measure_forest(ferns);
(
3
)若集合分类器的后验概率的平均值大于阈值
fern_th
(由训练得到),就认为含有前景目标:
if (conf> numtrees * fern_th) dt.bb.push_back(i);
(
4
)将通过以上两个检测模块的扫描窗口记录在
detectstructure
dt
中;
(
5
)如果顺利通过以上两个检测模块的扫描窗口数大于
100
个,则只取后验概率大的前
100
个;
nth_element(dt.bb.begin(),dt.bb.begin()+100, dt.bb.end(),
CComparator(tmp.conf));
进入最近邻分类器:
6.2.3
、最近邻分类器模块
(
1
)先归一化
patch
的
size
(放缩至
patch_size= 15*15
),存入
dt.patch
;
getPattern(patch,dt.patch
,mean,stdev);
(
2
)计算图像片
pattern
到在线模型
M
的相关相似度和保守相似度:
classifier.NNConf(dt.patch
,dt.isin
,dt.conf1
,dt.conf2
);
(
3
)相关相似度大于阈值,则认为含有前景目标:
if(dt.conf1
>nn_th)
dbb
.push_back(grid[idx]);
到目前为止,检测器检测完成,全部通过三个检测模块的扫描窗口存在
dbb
中;
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0