相关滤波跟踪算法FPGA实现1

1 概述

目前有很多嵌入式设备上都需要用到目标跟踪的应用,比如导弹(红外制导)、无人机(跟随拍摄)等等,但是鉴于嵌入式设备体积小、能耗低、计算能力小的特点,需要选择一种合适的算法便于嵌入式上来实现,这里只讲基于FPGA的实现,只要算法不涉及不确定次数的迭代优化,一般来说FPGA的计算速度都是能完爆ARM的,而且FPGA的数据收发能力也强很多。

相关滤波算法的计算过程就很适合在FPGA中实现:有解析解,不用迭代优化;考虑到在FPGA中实现需要采用流水线的形式,实现之前当然要对计算过程做点优化,原封不动地实现是不可能的。实现的算法可以参考一篇论文《Staple: Complementary Learners for Real-Time Tracking》,采用了相关滤波的计算框架,结合了HOG特征和颜色直方图,有很强的鲁棒性,且具有尺度估计,在此之后的论文,貌似只是增加了神经网络来提取更强的特征,大体框架没啥变化吧,我也木有关注过了。

2 matlab实现过程

    主要包括了响应计算和模板训练两大部分,涉及到的子函数代码没有的话可以后台留言。论文中的公式中的名字、matlab变量名、Verilog中的变量名是一致的,有问题可以讨论,这里不作详细介绍。原文matlab代码链接:https://github.com/bertinetto/staple。

响应计算过程:

%% TESTING step% extract patch of size bg_area and resize to norm_bg_areaim_patch_cf = getSubwindow(im, pos, p.norm_bg_area, bg_area);pwp_search_area = round(p.norm_pwp_search_area / area_resize_factor);% extract patch of size pwp_search_area and resize to norm_pwp_search_areaim_patch_pwp = getSubwindow(im, pos, p.norm_pwp_search_area, pwp_search_area);% compute feature mapxt = getFeatureMap(im_patch_cf, p.feature_type, p.cf_response_size, p.hog_cell_size);% apply Hann windowxt_windowed = bsxfun(@times, hann_window, xt);% compute FFTxtf = fft2(xt_windowed);% Correlation between filter and test patch gives the response% Solve diagonal system per pixel.if p.den_per_channel  hf = hf_num ./ (hf_den + p.lambda);else  hf = bsxfun(@rdivide, hf_num, sum(hf_den, 3)+p.lambda);  %hf = bsxfun(@rdivide, hf_num, sum_hf_den+p.lambda);endconj_hf_xtf = conj(hf) .* xtf;iconj_hf_xtf = ifft2(sum(conj_hf_xtf, 3));response_cf = ensure_real(iconj_hf_xtf);% Crop square search region (in feature pixels).response_cf = cropFilterResponse(response_cf, ...floor_odd(p.norm_delta_area / p.hog_cell_size));if p.hog_cell_size > 1  % Scale up to match center likelihood resolution.  response_cf = mexResize(response_cf, p.norm_delta_area,'auto');end[likelihood_map] = getColourMap(im_patch_pwp, bg_hist, fg_hist, p.n_bins, p.grayscale_sequence);% (TODO) in theory it should be at 0.5 (unseen colors shoud have max entropy)likelihood_map(isnan(likelihood_map)) = 0;
% each pixel of response_pwp loosely represents the likelihood that% the target (of size norm_target_sz) is centred on itresponse_pwp = getCenterLikelihood(likelihood_map, p.norm_target_sz);
%% ESTIMATIONresponse = mergeResponses(response_cf, response_pwp, p.merge_factor, p.merge_method)

模板训练过程:

%% TRAINING% extract patch of size bg_area and resize to norm_bg_areaim_patch_bg = getSubwindow(im, pos, p.norm_bg_area, bg_area);pos_r = pos;% compute feature map, of cf_response_sizext = getFeatureMap(im_patch_bg, p.feature_type, p.cf_response_size, p.hog_cell_size);% apply Hann windowxt = bsxfun(@times, hann_window, xt);% compute FFTxtf = fft2(xt);%% FILTER UPDATE% Compute expectations over circular shifts,% therefore divide by number of pixels.new_hf_num1 = bsxfun(@times, conj(yf), xtf);new_hf_den1 = (conj(xtf) .* xtf);new_hf_num = new_hf_num1 / prod(p.cf_response_size);new_hf_den = new_hf_den1 / prod(p.cf_response_size);

3 FPGA实现过程

3.1 总体结构

FPGA算法实现过程中,遵循着流水线处理的原则,所以需要对算法的某些计算过程做出近似处理,达到高帧频处理的效果,并对算法效果有较小的影响。

STAPLE算法中需要先对目标位置进行估计,再根据估算出的目标位置信息对滤波模板进行更新,同时根据计算得到的目标位置提取尺度空间,计算目标尺度。但是在FPGA中,跟踪算法计算过程与图像传输过程同时进行,所以需要对目标位置估计、滤波模板更新和尺度估计同步处理,滤波模板更新和尺度估计时采用近似处理,使用了上一帧的目标信息更新目标和生成尺度空间,计算结构优化示意图如下图所示。

   

3.2 模块划分

STAPLE算法主要分为目标位置估计和目标尺度估计两大部分,两部分相互独立,并行处理,这里重点介绍位置估计。计算目标位置时,提取了目标区域的1维灰度特征和32维HOG特征,然后进行相关滤波计算。结合颜色直方图的信息,获得最终的目标位置响应图,算出最大响应的位置,即为估计出的目标位置。尺度估计时,计算7个尺度空间,分别算出各个尺度的响应,响应最大的尺度为估计出的目标尺度。算法模块结构框图如下图所示。在本文实验中,算法模块都工作与150M时钟域下。

ISE工程结构如下:

   

3.3 结果介绍

PC机配置为:Intel i5-6500 CPU @3.2GHz,8GBRAM;FPGA开发工具为ISE 14.7,仿真工具为Modelsim SE 10.1c,MATLAB版本2017b。

仿真波形及计算时间统计:

序号

名称

占用时钟周期数

FPGA计算时间(ms

PC计算时间(ms

加速比

PC / FPGA

A

原始图像帧输入过程

有效时钟周期最少为312010

最少2.08

6.7

-

B

图像块提取过程

有效时钟周期最多为166400

最多0.111

0.372

-

C

插值、HOG特征提取过程

约82790

约0.083

1.2

14.5

D

位置估计过程

约386900

约0.387

3.3

8.5

E

颜色直方图提取、匹配过程

约35400

约0.236

1.4

5.9

F

尺度估计过程

约2716900

约2.717

4.2

1.5

总计

最少2.9

17.172

-

本文所设计的方法支持的最大目标大小为256*256像素,输入图像大小为640*480彩色图像,算法模块工作于150M时钟时,提取一次HOG特征时间为83us,计算跟踪位置的时间为0.387ms,计算尺度的时间为2.717ms,计算位置和尺度时相互独立,理论上最高处理帧频可以达到286 FPS以上,LUT占用48%,存储资源占用42%,对目标的尺度和形变鲁棒性较好,硬件资源占用较少。在后续更新中将依次介绍各个模块Verilog实现思路和实现过程,并附上部分模块的Verilog代码。有说的不对的地方欢迎留言指正。

欢迎关注公众号一起交流学习:

发布了6 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/a752109494/article/details/104877073
今日推荐