0%

基于FPGA的无人机目标跟踪系统实现

这是第三届全国大学生集成电路创新创业大赛中科芯杯的赛题,当时没有找到合适的队友,就选择了一个人参赛,所以队名还起了名字叫一个人的风景,当时准确率是华东赛区本科生组第一名,可惜华东赛区只有三个队伍能够晋级总决赛,那三个队伍是研究生队伍,我是第四,赛区赛就比较倒霉呀,他们三个队伍总决赛的时候分别是杯赛第一名、第二和第四名,这就很坑了。。。

大概说一下赛题流程,中科芯提供了一个上位机,该上位机的功能是将PC端视频路径加载到上位机中,上位机将该视频流以HDMI格式从PC端的HDMI发送出去,FPGA端进行HDMI数据接收,然后进行处理,上位机在发送HDMI视频流的时候,同时会通过串口发送视频第一帧的无人机坐标,包含左上角坐标、w和h,而FPGA则通过第一帧的无人机信息进行追踪后续所有帧的无人机位置,将追踪得到的左上角坐标进行发送返回。由于串口是无握手通信协议,所以还需要设计链路层的通信协议。下面进行详细说明

一、设计概述

1.1、硬件选取

项目设计是基于XLINX ARTIX-7 系列的 FPGA 开发平台(型号:XC7A35T-2FGG484I),用到USB转TTL模块、HDMI接口、USB接口线.

1.2、项目说明

1.项目内容

(一)、针对中科芯提供的旋翼无人机机动测试视频设计基于FPGA的目标跟踪器,实现对视频中无人机目标的稳定连续跟踪,目标跟踪算法必须完全使用FPGA实现。

(二)、各阶段中科芯均提供若干段比测视频,每段视频均给出目标尺寸w*h和第一帧初始位置坐标x1,y1,用于提供跟踪算法初始化信息。跟踪器测试系统如下图所示,测试设备将受试视频经HDMI接口发送至FPGA开发板,并通过串口接收其跟踪坐标结果。选择将个人计算机作为测试设备,通过下载主办方提供的上位机软件实现上述功能。基于FPGA设计的跟踪器须对每段视频分别进行测试,结果以跟踪结果输出坐标精确度为准。FPGA应选择带HDMI接口芯片的Virtex5、6、7或 Artix-7 系列开发平台进行实现。

W5kaVg.png

​ 图1 输入输出接口配置

(三)、考虑到程移植便利性,建议采用以下输入输出接口配置:参赛队跟踪器图像输入采用标准HDMI接口,目标初始位置坐标采用RS422异步串口输入,跟踪位置坐标采用同一串口输出。在此介绍一下串口的设置和链路层通信协议:

串口通信物理层协议:波特率:9600;数据位位数:8位;校验位:无;停止位:有

链路层通信协议:帧内字节数:8字节;校验码:LRC累加和校验码;位置坐标数据高位在前、高字节在前

例: 目标初始位置坐标(255,511),长宽均为20 ,则PC发送帧为 AA 00 FF 01 FF 14 14 2F,发送帧的意义如下图:

W5Z40K.png

跟踪结果位置坐标(255,511),则FPGA发送帧为 55 00 FF 01 FF 00 00 AC,返回帧的意义如下:

W5Zhm6.png

2.项目指标

(一)、提供的测试和比赛用视频均为彩色,8bit位深,分辨率为720P@25FPS,视频格式为AVI,视频中无人机目标大小>20*20pixel,时长约30秒。赛题跟踪难度见官网发布的受测视频。

​ 视频中目标左上角初始位置坐标(x,y),目标尺寸(w,h)

​ 视频1为564,305,132,48;视频2为720,312,66,30

​ 视频3为820,241,110,44;视频4为592,325,40,20

(二)、 跟踪器在受试过程中禁止人工干预,但允许跟踪器具备自动参数调整和跟踪丢失后的目标自动重捕功能。

(三)、 比赛结果按各跟踪精度性能指标进行排名。精度指标衡量方法基于VOT挑战赛的无监督(unsupervised)模式,以全部受测的N帧图像内,算法跟踪结果波门与实际波门平均重合率AO(Average Overlap)描述。

其中,S_i表示跟踪结果波门与真实波门重叠面积,S=w*h即目标面积由组织方给,其实就是ground truth的面积。若目标跟踪丢失,则跟踪器在当前帧得分为0。因此,应谨慎设计算法,确保连续跟踪,并视需求加入丢失后重捕机制(在本次设计的算法中,是可以通过阈值来推断是否追踪丢失的)。最终性能将以多段比赛视频测试AO指标累加结果为准,排名则依据AO指标从高到低排列。

3.总结

项目设计中,通过上位机发送视频流数据给FPGA,FPGA通过HDMI端口接收数据,进行定位追踪视频中的无人机,通过串口发送给上位机,同时为了显示更加明了,将定位结果通过输出的HDMI接口发送给显示屏,显示屏也同时显示追踪结果.

二、系统组成及算法讲解

2.1 系统介绍

上位机将视频流发送给FPGA,FPGA对视频进行解码转为VGA时序信号和像素信息RGB888,得到RGB888后,将其转到YCBCR色域,然后对其进行灰度化处理,灰度化处理后将灰度像素传送给二值化模块,通过阈值设定对其进行二值化,二值化输出信息传送给sobel边缘提取模块,进行边缘提取,至此图像预处理结束,将预处理输出结果送给追踪模块,追踪模块将生成多个待检测目标窗口,然后与初始帧的无人机目标对比,选出最优窗口作为当前帧的无人机位置。系统框图如图2。W5eBjI.png

2.2、HDMI-VGA

待追踪视频由PC端上位机发送,通过扩展显示屏,把电脑布局与缩放调为100%,扩展屏设置为60hz,HDMI与FPGA连接后,FPGA被PC端识别为扩展屏,并向其发送视频流,FPGA接收到HDMI类型的视频流,由于使用的黑金的alinx7035系列FGPA没有硬核解码器解码HDMI视频,所以通过软核进行解码并将其转换成VGA信号,此软核为github开源IP。

2.3、算法讲解及其仿真结果展示

2.3.1、图像处理算法模块

(1)灰度化

将彩色图像转化为灰度的方法有两种,一个是令 RGB 三个分量的数值相等,输出后便可以得到灰度图像,另一种是转化为 YCbCr 格式,将 Y 分量提取出来,YCbCr 格式中的 Y 分量表示的是图像的亮度和浓度所以只输出 Y 分量,得到的图像就是灰度图像了。我们在这里选择第二种方法实现。

YCbCr是通过有序的三元组来表示的,三元由Y(Luminance)、Cb(Chrominance-Blue)、和Cr(Chrominance-Red)组成,其中Y表示颜色的明亮度和浓度,而Cb和Cr则分别表示颜色的蓝色浓度偏移量和红色浓度偏移量。人的肉眼对由YCbCr色彩空间编码的视频中的Y分量更敏感,而Cb和Cr的微小变化不会引起视觉上的不同。为了得到灰度图像,要将采集到的彩色图像转化为YCbCr后,将Y分量分别送给R、G、B,即此时R、G、B数值上是一致的,这样便得到了灰度图。灰度化效果如图3和图4。

W5m5Je.png

W5nkwV.png

FPGA开发板通过HDMI采集到的数据是RGB888的格式,官方给出的转化公式是严格的RGB888转为YCbCr888。

官方给出的RGB888->YCbCr888转化公式如下:

由于FPGA无法实现浮点数运算,所以需要把系数变为整数,我们不妨将Y、Cb和Cr都扩大1024倍,然后所有系数取整,那么变成如下公式:

这样便可以得到整型的运算,最后得到的结果右移10位即可,但为了时序的科学严谨性,我们不应该一次在always块中算出Y、Cb、Cr,因为一个关系式中涉及到三次乘法和两次加法,越多的运算量就越可能导致时序延时错乱,此处或许不会有问题,但不在一个块中用太复杂的运算式是一种好的习惯,我们应该选择业界普遍使用的流水线做法,将乘法在一个always块里实现,在另一个always块中实现加法。

(2)二值化

在灰度化后,进行二值化操作,二值化操作即是设定一个阈值,当灰度值大于该阈值是赋值为1,小于该值是赋值为0,二值化效果如图5和图6。阈值确定较为经典的算法是大津算法(OTSU),大津算法可以使得前景与背景图像的类间方差最大,它被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响,但其需要一帧数据得到阈值确定,即追踪会造成一帧延迟,所以此处未使用大津算法而是使用的是测试的相对较好的固定阈值,在后续完善中可以考虑运用一帧的部分数据求大津阈值,使其不造成一帧的延迟。

原图和二值化图片如下:

W5Qlge.png

W5Q0gg.png

(4)、Sobel边缘化

二值化会使得前景和背景相区分,但是目标所处地位可能和背景相交换,为了在这种结果发生时依旧可以进行正常追踪,此步我们进行Sobel算子边缘化提取,从而提高后续的追踪算法的稳定性。

Sobel边缘检测的核心在于像素矩阵的卷积,卷积对于数字图像处理非常重要,很多图像处理算法都是做卷积来实现的。卷积运算的本质就是对制定的图像区域的像素值进行加权求和的过程,其计算过程为图像区域中的每个像素值分别与卷积模板的每个元素对应相乘,将卷积的结果作求和运算,运算到的和就是卷积运算的结果。

3×3的窗口M与卷积模板C 的卷积运算如下:

G_x和G_y是图像边缘梯度,将两个因子和原始图像做如下卷积得到边缘梯度,其中A表示原视图像。

得到图像中的每一个点的横向纵向梯度G_x、G_y。最后通过如下公式来计算该点总体梯度的大小。

我们此时还需要设定一个阈值,该如果算出的G大于设定的阈值,那么认为此处是边缘处,使其为黑色,否则认为不是边缘,使其为白色。

上述是算法原理,很显然,这里用到了33矩阵,对于matlab来说,获取是比较简单的,但是FPGA实现时,我们需要考虑如何得到这个33的矩阵,因为FPGA扫描像素点是一个一个进行的。在 FPGA 中生成 3x3 矩阵有以下三种方法:

(1) 通过 2 个或者 3 个 RAM 的存储来实现 3X3 像素窗口;

(2) 通过 2 个或者 3 个 FIFO 的存储来实现 3X3 像素窗口;

(3) 通过 2 行或者 3 行 Shift_RAM 的存储来实现 3X3 像素窗口;

在此我们选用shift ram进行获取矩阵,shift ram是一个移位存储ram,这个 IP 支持一个时钟周期移位一个或多个 bit 的数据,位宽是可以设置的。下面图7和图8是 shift_ram 的移位示意图及仿真图:

W56U3D.png

W56sEt.png

如上图顺序可以容易看出,shift_ram 的工作方式是移位存储,后一个数据将前一个数据往前推,当填满一行的时候,跳到下一行再继续移位存储,相应的第一行的数据填满之后,会填上矩阵的第一行的数据,操作是同时的,如果进行均值滤波的话显然这样目标像素会是 0,以此类推,第二行移位存储完成,刚开始第一行的每一个像素点是目标像素,但是第三行还没有数据,所以第一行的目标像素滤波后显然是不准确的,等到把第三行数据填满后,进行原本第二行的滤波,这时目标像素周围均有数据,所以均值滤波会使图像的边缘不清楚。这是将每一行的宽度设置成 3,如果将宽度设置为 640,800 等分辨率的宽度,那么生成 3x3 矩阵就十分方便。同样的还可以生成 5x5、7x7 等矩阵用于图像处理的算法研究。

Xilinx Vivado 有自己的 Shift_RAM IP Core,不过这里只能缓存出来一行数据,我们这里需要多个 Shift_RAM IP Core。此外720p视频流一行有像素1280个数据,考虑到shift ram深度不能大于1024,所以我们用两个640深度的shift ram组成一个1280深度的shift ram,那么我们需要四个这样的IP核,进行循环移位得到3*3的矩阵,然后进行sobel边缘提取。边缘提取结果如图9和图10

W56bCT.md.png

W56xbR.png

(4)追踪算法

在得到边缘化的数据后,将第一帧的目标数据进行保存,在后续的帧数据传来时,我们选择开窗操作,根据上一帧的定位结果,我们在此帧附近进行开窗,窗口不能太小,否则会丢失目标,在此处,我们选用的是上一帧结果往四周扩展40个像素点进行开窗,在此窗口内,从窗口左上角进行平移获取与目标大小一致的待检测矩阵,获得待检测矩阵后,为了防止周围背景的影响导致误判,需要将待检测矩阵与目标矩阵进行相与操作,相与操作后,对该二值矩阵进行简单求和,得到的结果与目标矩阵和进行对比,当结果最相近时,该待检测矩阵即是该帧的目标位置。下述描述FPGA对该算法的实现的主要模块

1、矩阵生成模块:

在1280*720的图片中,我们由上一帧定位结果判断下一帧的范围,即进行开窗,在此窗口内进行进行追踪定位,我们选取的窗口是212128的窗口,在此窗口内,不断生成132\48的待检测矩阵(无人机大小小于132*48时,进行w和h扩充为132*48).如下图

W5cuIP.md.png

黄色边框代表一帧大小,红色框是选取的开窗大小,黑色框是需生成的待检测矩阵,待检测矩阵就是一个待检测的无人机目标.

由于1280*720图片过大,仿真长度过大,所以验证的时候是使用的一帧6*4,开窗大小是4*4,位于一帧中间位置,生成待检测矩阵是3*3.仿真图如图

W5c2Ix.png

如上图仿真图所示,post_martix_clken代表矩阵有效信号,martix_p1共三bit,代表矩阵第一行的3个数据,martix_p2和martix_p3分别代表第二行和第三行,x和y代表此时矩阵左上角在窗口中的坐标(窗口左上角坐标记为(1,1)),sobel_data代表窗内信号,per_martix_clken代表sobel_data有效。仿真输入的窗口信号第一行的四个数据是:1010;第二行是:0101;第三行是:1010;第四行是0101。在进行仿真时,在4*4的窗口内,可以生成4个完整的矩阵,从仿真中可见共四个clk内有效。在四个使能有效时,对应的3*3矩阵是完全正确的,对应的(x,y)坐标是(1,1),(1,2),(2,1),(2,2)与矩阵符合.

2、sum_h的仿真:如下图

W5g1Fx.png

per_martix1_clken是输入数据的有效信号,如上图,在天蓝色处有两个clk的有效时钟,对应的输入是132’habc3d2e1f0和132’h167cccee55ff,对应的二进制分别是:1010101111000011110100101110000111110000和101100111110011001100 1110111001010101111111 11,含有1的个数分别是21和30.post_martix1_clken是输出结果的有效信号,如上图,在post_martix1_clken为1的时候,说明输出有效,此时输出是0x15和0x1e,十进制就是21和30.可以看出,求1个数的流水线处理模块结果正确.

3、上述模块是对待检测窗口行求和,下述sum模块是对返回的48行值进行累和sum模块的仿真:如下图

W5gW0s.png

如图上图,per_martix1_clken是输入数据有效信号,sum代表待检测窗的累和,post_sum_clken代表输出累和数据的有效信号,如上图,仿真是给予的48行数据分别都是132’d1和132’d3,可以知道一行数据经过sum_h模块输出后分别是1和2,则48行累和分别是48和96,如上图仿真所示,在输出有效信号为1时,对应的结果分别是0x30和0x60即48和96,可以看出sum模块的流水线处理是没有问题的。

4、比较输出模块:如图

在比较模块中,sum是sum模块流水线输出的待检测窗口值,sum0是初始帧目标值,将两者对比,x和y是与sum对应的此时在大窗口中的坐标,x_current_frame和y_current_frame是此时帧定位的窗口坐标,若sum越接近sum0,则更新当前帧的坐标x_current_frame和y_current_frame为x和y,仿真图如上,设定的sum0是100,流水线输入sum值是0x2c,0x96,0x46,0x2h和0x5c,最终x_current_frame和y_current_frame更新为1和5,正常输出。

上述即是追踪算法的大致思想,适合FPGA的逻辑实现,其追踪性能很好,下面我们看一下追踪效果.

三、追踪情况及性能参数

3.1、matlab追踪视频展示

视频一追踪演示:视频一追踪演示

视频二追踪演示:视频二追踪演示

视频三追踪演示:视频三追踪演示

视频四追踪演示:视频四追踪演示

3.2、matlab追踪AO值展示:四个AO值图展示如下图

W5Rdit.png

W5Rssg.png

W5RIQU.png

W5ROF1.png

四个视频追踪的平均AO值如下:

视频一 视频二 视频三 视频四
平均AO值 99.45% 98.18% 99.20% 99.04%

从结果上看,全程没有追丢的情况发生,平均AO值全部达到98%以上。

3.3、FPGA板级验证:板级验证图如下图

W5W4AA.png

W5WIht.png

至此差不多结束了,具体上位机软件等可以从集创赛官网找,往届题目应该会有保存。