您的当前位置:首页基于DSP的检测算法实现及优化

基于DSP的检测算法实现及优化

2020-06-04 来源:小侦探旅游网


基于DSP的检测算法实现及优化

摘要:运动目标检测可以从连续变化的多幅图像中把运动目标提取出来。运动目标的捕捉对于目标分化、采集和动作归类等后续处理相当重要,因为后期过程只处理图像中运动目标周围一定范围内的像素。但由于运动目标所处背景的随机性,比如气候、光线及噪声干扰的影响,检测运动目标实际上是一项比较困难的任务。目前对于运动目标的检测的算法可以划分为两类:基于象素强度的算法及基于运动的算法。细分又包括四种:基于特征的方法、基于帧间差分的方法、基于背景建模的方法和基于光流场的方法。其中前三种属于基于象素强度变化检测的算法,第四种可以看作是基于运动的检测方法。基于强度算法容易实现、效率高,可处理目标跟踪问题比较难。基于运动的算法稳定性强,处理跟踪问题相对简单。该文重点研究目标检测的DSP算法实现,所以在参考大量文献后,选用了传统检测算法中速度较快而且相对便于硬件实现的帧间差分算法,为了取得良好快速的目标检测结果,该文采用Sobel算子与帧间差分结合的方法。

关键词:DSP的检测算法;实现及优化

中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2014)13-3070-05

1 基于Sobel算子的帧间差分检测算法

1.1 帧间差分法

由于红外图像的目标特性,用灰度变化表述物体的运动轨迹可以获得较高的检测效率,从而满足检测过程的实时性要求。

假设输入图像为:

[F={fj(a,b),a∈X,b∈Y,j=0,1,2,....}]

其中,(a , b)为实际场景中(X , Y)上一点,[fj(a,b)]为第j帧上(a , b)点的灰度值,j为图像的编号,以下为图像差分的结果:

[D={dj(a,b),a∈X,b∈Y,j=0,1,2,....}]

[其中:dj(a,b)={|fj(a,b)-fj-i(a,b)|,j=0,1,2,...;i=0,1,2,3,...}]

[dj(a,b)]基本上体现出运动目标的边界和高差异区域。一般选择i=1也就是相邻两幅图像进行差分,如果运动目标的速度小于相邻两幅图像的时间差时,可以增大i值避免检测目标遗失。如i=5时仍然没有目标,则可以认为无检测目标,就换为下一幅图像(j+1)图像进行检测。

选择一个恰当的阈值[Tj],将差分结果[dj(a,b)] 转变为二值图像:

[wj(a,b)=0,dj(a,b)≥Tj1,dj(a,b)其中阈值[Tj]定义为:[Tj=0.5×Max(dj(a,b))]

1.2 图像去噪、增强

一般采集到的图像均含有噪声,导致二值图像上有一些孤立点,这些点并不是目标但会对图像的分割产生影响,因此对二值图像进行广义滤波,可以去除这些并非目标的孤立

点,广义滤波会对图像造成一定程度的削弱所以滤波后需对图像进行增强。

为使算法获得比较高的执行效率,滤波采用下式:

[E(A)=I(a,b)I(a-1,b)I(a+1,b)I(a,b-1)I(a,b+1)I(a-1,b-1) I(a+1,b+1) (a-1,b+1)I(a+1,b-1) ]

增强采用下式:

[E(A)=I(a,b)| I(a-1,b)| I(a+1,b)| I(a,b-1)| I(a,b+1)| I(a-1,b-1) | I(a+1,b+1)| I(a-1,b+1)|I(a+1,b-1)]

1.3 图像分割

对于图像上一点[fj(a,b)∈[Ni,Nj]],其中[Ni和Nj]是两个灰度值。若设定灰度集n?[[Ni,Nj]]作为判定依据,灰度值属于n的则将像素转变为某一灰度值,其余像素转变为另一灰度值,处理后图像就被划分为两个区域。

这一过程可表示如下:

[fj(a,b)=n1,fj(a,b)∈nn2,其他]

上式中n1和n2是设定的目标灰度和背景灰度。如果[n1=1,n2=0],则分割结果就为二值图像。

通过差分可以找到两幅图像的差异,差值较大的区域就有可能是目标所处的位置。用

降噪后的二值图像查找目标可能存在的位置,并把该位置从整幅图中分割出来。方法为:找到[wj(a,b)=0] 的点,划定它周围区域作为目标范围,区域划定以(a-5,b-5)作为左上角,以(a+10,b+10)作为右下角。把划定区域的二值图像[wj(a,b)=0]的点设置为1,即找到了目标可能存在的范围。

1.4 边缘检测

用sobel算子对整幅图像进行差分和滤波,可减少干扰,边缘定位准确和相对完整,适用于灰度渐变和有一定噪声干扰的图像处理。Sobel 算子用于检测边沿的算子有2个,一个水平模板、一个垂直模板。如图1:

[-1-2-1000121] [-101-202-101]

水平边沿模板 垂直边沿模板

图1 sobel算子

边缘检测完以后将结果与图像分割的结果相结合即能获得目标的位置。

2 检测算法的程序开发

2.1 图像分帧的实现

2.1.1 子图提取

系统硬件包含的L2总共有64k,均分为四段,通常缓存直接影响运行速度,但如果将

L2都用来做缓存,程序涉及的指令和数据将被放在外部存储器中,这将使缓存操作复杂化,速度反而降低。要使L2与外存保持一致要通过编程来达到, L2和外部存储间的数据线宽为32b,数据的交换速率比较低。通常采取的的做法是把变量和数组存放在L2 中,而把程序存放在外部存储器中。该文的做法是用32k存储器加32k缓存,如果截取的子图过大内存会不够,过小又会额外增加EDMA传递数据的次数,比较后取1k,将程序编译以后内存的使用量大约为26k,可见这样设置是比较合理的。 子图提取是为了在不消耗CPU的情况下,把数据读入内部存储L2 方便CPU使用,节约CPU读写存储器的时间。为了稳定控制数据流动,该文采用QDMA方式。

具体设置如表1,图2:

a) QDMA寄存器设置

表1 寄存器内容

[可选参数\&4520 0001h\&源地址\&Image_address+offset\&单元设置\&000Fh\&0010h\&目标地址\&Ping_addr\&单元索引\&013ch\&Don’t care\&]

b) QDMA可选参数寄存器内容

图2 提取子图的参数寄存器设置

2.1.2 子图回写

提取出的子图经多步处理后仍存于内存中,需回写到外存中方便显示时读取,可利用

EDMA实现该动作。

把子图数据从L2 回写到外存时有些调整:数据从一维变回二维,宽度为8b、每幅子图的数据量也有差异。该差异是由于边界检测运算导致的。对于64x16大小的一幅子图,经检测运算处理后周边各有一行、一列无用数据,假如用读出时的方式直接回写有效的数据会被无用数据改写,所以,只需回写有效的、62x14大小的数据即可。

2.2 内存的使用

为了确保CPU可以不间断运算,分别定义4个缓存区域in1、in2及out1、out2。在初始化程序时把相邻两幅子图(各1k)数据导入in1和in2,先对in1内的子图像进行运算,运算结果保存到out1,完成后,启用QDMA-out1将数据从内存传送到外存进行存储;在对in2内子图运算前提交一个新的QDMA-in1申请,把紧邻的新子图从外存读入到in1中,在对in2中的子图运算结束后,将结果存到out2,启用QDMA-out2。在重新开始in1内的子图运算前又启用QDMA-in2,如此循环,每完成一幅子图运算,就提交一个新的QDMA申请,在对应的子图缓冲存放一幅新的子图, DSP可以直接处理图像数据,而不必消耗时间从外设读取,如示意图3。

图3 内存使用示意图

检测程序的主流程为:1、对相邻两幅原图差分2、广义滤波、增强 3、图像分割然后与sobel检测结果相“与”。

3 检测算法的优化

程序代码编写结束后需要检查程序与DSP硬件特性相符程度,依据硬件的缓存结构做相应调整应作为重点。

3.1 依据DSP结构特性进行优化

原始图像大小为380×240,在输入系统时提取374×240,也就是舍弃边缘,这是DSP的结构特性决定的,而且提取子图时不会有数据量较少的边界图片需要单独处理,减去少量的边界像素不会影响整幅图像的处理结果。

1)设备C6711 DSP的一级缓存包括用于存储程序的和存储数据的两个部分各4k。数据缓存控制器的特性是:无论CPU用到的多少数据,数据缓存控制器总是一次读入一集也就是32B,所以应把需要参与运算的数据对齐并排列成集,且数据读入内存后应等全部运算完毕后再清除,以减少反复读入数据而消耗的时间。

随意排放数据与成集排放数据相比处理速度的不同:

表2 随意排放数据与成集排放数据相比处理速度差异

2)当需要对一组数据进行多个运算时,应考虑把中间运算结果保存在一级数据缓存中,以避免相同数据写出后又读入从而提高运算效率。

对目标的检测需要运行多个处理函数,中间数据的读入写出会消耗费大量时间。若使用数据链方式,把中间运算结果保存在一级数据缓存而不是内存,可以节约读写数据的时间。但在分段问题上需要折中处理,因为过多分段会会增加代码复杂度、降低代码易懂性。折中后将一幅图化分为四段。下表为利用数据处理链后程序速度的提升:

表3 利用数据处理链后程序速度的提升

3)一级程序缓存与CPU及二级缓存间的线宽是256b,可以同时传送32×8条指令。一级程序缓存与CPU及二级缓存间的线宽是128b,缓存内数据是按“line”形式存放的,并且二级缓存中“line”的宽度为128B,因此,程序应用128B的整数倍来定义数组的长度,以此提高缓存在运行过程中的命中率。下表为子图大小不同时速度的差异:

表4 子图大小不同时速度的差异

提取子图为512B时运算一幅图像消耗的时间略少于子图为1kB时,但是子图的数量相比子图大小取1kB时增加一倍,为此需要增加一倍的子图数据传输次数,不可取。

4)二级缓存的大小为64k均分为四块,可以配置成内部存储或缓存,一般情况下缓存空间越大程序执行速度越快,但也并非绝对。表5为缓存取不同值时的执行速度差异:

表5 缓存取不同值时的执行速度差异

3.2 用软件流水对程序进行优化

软件流水是指的指令循环执行、多次迭代且并行执行的一种技术。通过在编译器中进行相应的设置,可实现循环代码的软件流水化。具体的方法是提取循环并把它保存为单独文件,按照4.1的调整以后,再进行编译并运行。

下表为采用软件流水与不采用流水的执行速度差异:

表6 采用软件流水与不采用流水的执行速度差异

3.3 汇编代码优化

C程序代码在上一步优化后,汇编代码中的冗余码已经非常少了,但仍然可对消耗时间较多时滤波、增强程序代码做汇编优化,下表为汇编优化的效果:

表7 为汇编优化的效果

经过以上优化过程,程序执行速度有了大幅提升,下表为具体提升效果:

表8 优化的具体提升效果

3.4 程序的执行结果

目标检测算法经过多步优化以后,图象数据读入内存便连续执行,仅在完成检测的所有步骤以后才回写到外存当中。以下是各个步骤的执行结果图:

下图中image01和image02是相邻两帧红外图像。

图4 相邻两帧红外图像

图5为检测结果图,其中:a是image01和image01差分的结果,这一步有效消除了噪声干扰;b和c分别为经过广义滤波和增强后的结果,图片中的孤立点在这一步被有效去除,并强化了目标;d为图像分割后的结果,途中用15×15的白色区块标出了目标区域;e为Sobel检测结果,Sobel检测结果和差分检测结果相与得到目标如图f,从f图的窗口中左下角可以清楚看到检测出的目标位于原图的坐标值。

3.5 系统测试性能

本文程序执行结果取自TI公司的DSP C6711,目标检测算法经过多步优化后,最终执行结果如表9。

从表9可见,各处理步骤消耗时间均为毫秒级别,处理一幅380×240大小的红外图像所消耗的时间共计53毫秒,也就是检测速度为18.8幅/秒,假定观测船舶目标的距离为600米,船舶行驶速度为10米/秒(也就是36公里/小时),移动方向与摄像机屏幕平行,假定焦距为20厘米则映射到摄像机上为每秒种运动4毫米,在10厘米宽的镜头取380个像素时,该移动值可换算为16个像素点。系统处理速度18. 8幅/秒,平均在每幅图像上移动的距离不超过1个像素,系统运行速度可以跟上目标的运动,可见系统能够满足实时性要求。

4 小结

系统硬件平台的稳定性决定了目标检测算法的实现效果,软件设计的合理性又是系统获得良好性能的基础。该文介绍了基

于DSP的检测算法实现及优化,其中优化是重点,需要同时考虑DSP的缓存结构特性、硬件并行处理及软件流水线化等。该文的优化运行结果是用PRD函数进行估算的,具体结果表明经过优化提高了程序的执行速度,系统性能明显改善。

参考文献:

[1] 徐向辉.红外图像目标检测与跟踪研究[D].北京:北京理工大学,2001.

[2] 李宏贵,李兴国.基于分形特征的红外图像识别方法[J].红外与激光工程,1999,28(1).

[3] 姜锦锋.红外图像的目标检测、识别与跟踪技术研究[D].西北工业大学,2004.

[4] 何斌,马天予,王运坚.数字图像处理[M].北京:北京人民邮电出版社,2002.

[5] 柯丽,黄廉卿.DSP芯片在实时图像处理系统中的应用[J].光机电信息,2005(1).

[6] 彭启棕,管庆.DSP集成开发环境[M].北京:电子工业出版社,2004.

[7] 赵训威.TMS320C6200系列DSPS芯片应用与开发[M].北京:北京人民邮电出版社,2002.

[8] TMS320C621x/C671x DSP Two-Level Internal Memory Reference Guide,Copyright, Texas Instruments Incorporated,2004.

因篇幅问题不能全部显示,请点此查看更多更全内容