《说明书一种面向目标检测的图像矩阵列转换加速方法.docx》由会员分享,可在线阅读,更多相关《说明书一种面向目标检测的图像矩阵列转换加速方法.docx(14页珍藏版)》请在三一办公上搜索。
1、说明书一种面向目标检测的图像矩阵列转换加速方法技术领域本发明涉及对目标检测中图像矩阵列转换进行加速的方法,尤指基于深度学习的目标检测中前向传播中图像矩阵列转换加速方法。背景技术目标检测是计算机视觉和数字图像处埋的一个热门方向,广泛应用于机曙人导航、智能视频监控、工业检测、航空航天等诸多领域,通过计算机视觉减少对人力资本的消耗,具有重要的现实意义。因此,目标检测也就成为了近年来理论和应用的研究热点,它是图像处理和计算机视觉学科的重要分支,也是智能监控系统的核心部分,同时目标检测也是泛身份识别领域的一个基础性的算法,对后续的人脸识别、步态识别、人群计数、实例分割等任务起着至关重要的作用。基于深度学
2、习的目标检测主要包括三步:前后处理、图像矩阵列转换(im2col,imagetocolumn,本文后面均简称为im2col)和矩阵矩阵乘(gemm)。前后处理包括权重置0、归一化和激活等。im2col主要将图像数据中每个卷积核窗口内含有的数据转为列向量,最后按列排成新的矩阵。gemm主要实现权重矩阵和im2col转换后的矩阵的乘积。im2col和gemm实际上进行的是权重矩阵和图像矩阵的卷积运算,在目标检测中,通过卷积操作,如ktride为2时,相当于把输入图像缩小了-半,一批注思森11:Stride是什么东西?从而待im2col处理的图像会越来越小。与此同时,要进行几次、几十次、甚至数百次卷
3、积操作,每一次均需要用到im2col.下面5个原因导致迫切需要加快图像矩阵列转换:(1) gemm有开源或者商业化的优化实现,如openbias和MKL等算法库,计算速度可以提高数倍到数十倍。gemm占用计算时间下降,而im2col可能占用30%-的计算时间,导致im2col的转换速度成为提高目标检测速度的个关键问题。(2)对于实时性要求较高的应用,如基于深度学习的实时目标追踪等,每秒处理的图片可能达到30帧。每一帧的处理时间需要限制在33受秒以内,此时图像矩阵列转换就可能成为实时性关键的限制因素。(3)由于输入的多通道图像直在变化,im2col需要把变化的多通道图像转换成目标检测中gemm需
4、要的数据,所以不能把im2col转换后的数据进行保存,因此im2col是目标检测中不可或缺的一步。(4)传统的im2col的实现方法均比较原始,效率低。(5)在低功耗目标检测平台上,在同样检测速度下,基于高速im2col可以节省部分能耗,这对于低功耗目标检测平台尤为重要。卷积运算如图1所示。图1中I卷积核为元素个数为3*3的方阵|。方阵为矩阵种特一二批注|用*|:卷积核?殊情形。卷积核方阵第一行为1、0、2,第二行为5、4、2,第三行为3、4、5此时卷积核大小ksize为3,即为卷积核方阵的维度。权重方阵的第一行为-1、Os1,第二行为1、0、1,第三行为1、0、1。滑移步长Stride指把卷
5、积核方阵向右或者向下移动的距离。对于图1,假设卷积核向右边滑移1个位置,则新的卷积核为图2所示。023420456图2:滑移一个元素时的卷积核批注I思森3:为什么要有填充大小?Pad存在的意义是什么?慎充大小pad在输入的多通道图像四周加0的层次的数目C假设一张单通道图像一有25个元素,分别为1至25,如图3所示。Pad为0时,仍然为如图3所示的矩阵。Pad为1时,即在矩阵的周围加上一层0,如图4所示。12345678910111213141516171819202122232425图3图像示例。0000000012345006789100011121314150016171819200021
6、2223242500000000图4:填充大小Pad为1的示意图。假设图5中卷积核大小ksize为3,滑移步长stride为1,填充大小pad为00经过im2col处理后得到的矩阵如图6所示。图5中第2个卷积核中的元素用粗体标出,值分别为2、3、4,7、8、9,12、13、14,与之对应的为图2中粗体标出的第2列。类似的图5中第1个卷积核中的元素值为1、2、3,6、7、8,11、12、13,对应的就是图6中的第1列。123456789IOIl1213141516171819202122232425图5:图像卷积核示例1236234734586 7 8 11789128 9 10 1311 12
7、 13 1612 13 14 1713 14 15 187811128 9 12 139 10 13 1412 13 16 1713 14 17 1814 15 18 1917 18 21 2218 19 22 2319 20 23 24131415181920232425图6:im2col处理后得到的矩阵示例。在目标检测中常用的卷积核大小ksize为I、3、5、7等奇数,这样可以保护位置信息和填充时保持对称。整个卷积计算量与ksize的4次方成正比,所以卷积核大小不能太大。滑移步长Stride一般为1、2。滑移步长必须大于1,否则卷积核不滑动,不能检测卷积核外的图像。填充大小Pad般为0、1
8、。Pad为0即为原图像,为1时是为了检测边界特征。Pad太大就会在边界上带来误差。传统im2col实现方法如下所示:第一步:获取输入变量和计算常用变量,包括待转换的多通道图像数组daiajm、通道数ChanneIs、图像高度height、图像宽度Width、卷积核大小ksize、滑移步长Stride、填充大小pad0data_im可以保存channels*height*width个图像数据,索引从0开始,即data_im的元素为别为datajmdatajmlx、dataJmchannels*height*width-1odata_im在内存中实际上是一个大小为Channek*heighdwid
9、ih的一维数组,逻辑上可以理解成高度为height、宽度Width的二维图像,共有ChannelS个。令im2col处理后的通道数channels-col=channels*ksize*ksize令im2col转换后的多通道图像高度heigh(-col=(height+2*ad-ksize)/stride+1,“表示向下取整数,非四舍五入取整数。令im2col转换后的多通道图像宽度width-col=(width+2*pad-ksize)/stride+1.im2col处理后得到的维矩阵数组dataol,为转换后的多通道图像数据。data_col可以保存channels_col*height_
10、col*width_col个转换后的数据,索引从0开始,即data_col的元素为别为data_col0、data_col1、data_colchannels_col*heigh(_col*width_col-1。data_col在内存中实际上是一个大小为channels_col*height_col*width_col的一维数组,逻辑上可以理解成高度为height_col、宽度width_col的二维图像,共有Channels-COl个。令通道变量C=0。第二步:若C小于Channek_col,转第三步;否则转第十步;第三步:令宽度偏移变量w_offset=c%ksize,%表示取余操作。令
11、高度偏移变量h_offset=(c/ksize)%ksize令临时通道变量cjm=c/ksize/ksize。令高度变量h=0o第四步:判定h有没有超出当前转换后的多通道图像高度。若h小于height_col,转第五步,否则转第九步。第五步:令宽度变量w=00第六步:判定W有没有超出当前转换后的多通道图像宽度。若W小于WidIh_col,转第七步,否则转第八步。第七步:1.1 令行号row=h_offset+h*stride-pad0确定待转换的图像数据元素的行号。令列号col=w_offset+w*stride-pado确定待转换的图像数据元素的列号。令index=c*height_col*
12、width_col+h*width_col+w1,确定转换后的多通道图像的索引。1.2 若row小于0或者col小于0或者row大于等于height或者col大于等于width.令data_colindex=0;否则data-colindex=data_imcol+width*(row+height*cjm)。令W=W+1。转第六步。第八步令h=h+10转第四步。第九步令c=c+l:转第二步。第十步:处理完成,得到转换后的多通道图像数组dataol.传统im2col实现并不高效。因为对于im2col处理后得到的一维矩阵数组data_col中的元素值是递增顺序访问,但是在第7.1步中,需要计算等
13、号row、列号col、data.col的索引index,计算量较大;同时在7.2步中,需要对4种情况进行判断,CPU在执行指令时会出现流水线停顿,从而影响计算速度。目前在人脸实时追踪、飞行器实时追踪等目标枪测场合,需要达到处理的速度为30FPS(顿/秒),转换后的每张图像的处理时间约为33亳秒。采用传统im2col处理,最多只能够达到20FPS的处理速度,而。这样的速度无法满足人脸实时追踪等目标检测场合,如何加快实现im2col是本领域技术人员极为关注的技术问题。发明内容本发明要解决的技术问题在于:提供针对滑移步长Stride等于1、2,填充大小Pad等于0、1时的快速图像矩阵列转换方法,从而
14、可以分为4种情况进行处理,总体流程如图3所示。图3:总体流程示意图本发明涉及二个核心输入输出数组,分别为待转换的多通道图像数组data_im和im2col转换后的多通道图像数组data.coL核心方法是根据滑移步长stride和填充大小pad分四种情况分别进行处理,具体包括加速处理Strkle=Ipad=O的情况,加速处理Slride=2、Pad=O的情况,加速处理Slride=1、pad=l的情况,加速处理Stride=2、pad=l的情况。具体技术方案为:第步:获取输入变量、计算常用变量和确定输出变量。获取输入变量包括待转换的多通道图像数组dataJm.通道数Channe1s、图像高度he
15、ight,图像宽度Widlh、卷积核大小ksize、滑移步长Slride、填充大小pad。data_im可以保存Channek*heighl*widlh个图像数据,索引从0开始,即datajm的元素为别为data_im0、data-iml%、data.imchannels*height*width-1data-im在内存中实际上是一个大小为ChannelS*height*width的维数组,逻辑上可以理解成高度为height、宽度Width的二维图像,共有ChannelS个。令im2col处理后的通道数channels-col=channels*ksize*ksizeo令im2col转换后的多
16、通道图像高度height-col=(height+2*pad-ksize)/stride!+1, n表示向下取整数,非四舍五入取整数。令im2col转换后的多通道图像宽度width_col=f(width+2*pad-ksize)/stride1+Ioim2col转换后的多通道图像数组dala_coL为转换后的多通道图像数据,为输出变量。data_col可以保存channels_col*height_col*width_col个转换后的数据,索引从O开始,即data.col的元素为别为当前行号变量nRow=-1o定义核变量k=0。3.4 若k小于ksize*ksize转3.5;否则转3.13。
17、3.5 若k%ksize=O(%表示整除取余),则nRow=nRow+13.6 令输入间隔inner=k%ksize+nRow*width0定义输出高度变量j=0。3.7 若j小于heighjcol,转3.8;否则转3.12。3.8 定义输出宽度变量i=0。3.9 若i小于Width_coL转3.10:否则转3.11。3.10 令data_colistartOut+k*width_col*height_col+j*width_col+i=data_imistariln+inneri4.12 令i=i+L转4.10步。4.13 定义宽度截止变量n777=WidtkcoL高度截止变量n888=he
18、ighLCO1,高度起始变量n999=0o若ksize=1,令n777=width_col-l若k1=ksize-1令n888=height_col-l若kl=O,令n999=l.4.14 若k2=O,转4.14.1;否则转4.15。处理第一种条件,即k2=0的情况。4.14.1 定义输出高度变量j=n9994.14.2 若j小于n888,转4.14.3;否则转4.15。4.14.3 令data_colnOut_Start+j*width_col=0o定义输出宽度变量i=lo4.14.4 若i小于n777,转4.14.5:否则转4.14.7。4.14.5 令data-colnOut_Start
19、+jwidth_col+i=dataJm(nInSiart+nRow*wid(h+i-1;4.14.6 令i=i+L转4.14.4。4.14.7 令当前行号变量nRow=nRow+1令j=j+1,转4.14.2步。4.15 若k2=ksize/,转4.15.1;否则转4.16。处理第二种条件,即k2=ksize”的情况。4.15.1 定义输出高度变量j=n9994.15.2 若j小于n888,转4.15.3:否则转4.16。4.15.3 定义输出宽度变量i=0。4.15.4 若i小于Widthf)I1,转4.15.5;否则转4.15.6。4.15.5 令data_colnOu(_Start+j
20、*width_col+i=data_imnInStart+nRow*widh+i-l+k2令i=i+l0转4.15.4。4.15.6 令nRow=nRow+1。令data_colnOut_Start+j*width_col+width_col-l=0令j=j+l0转4.15.2。4.16 若k2大于0且k2小于ksize-1,转4.16.1步,否则转4.17。处理第三种条件,即k2小于ksize-1且大于0的情况。4.16.1 定义输出高度变量j=n9994.16.2 若j小于n888,转4.16.3:否则转4.17。4.16.3 定义输出宽度变量i=004.16.4 若i小于WidIh_co
21、L转4.16.5;否则转4.16.6。4.16.5 令data-colnOut_Start+j*width_col+i=datajm(nInStart+nRow*width+i-1+k2;令i=i+l0转4.16.4。4.16.6 令nRow=nRow+l。令j=j+L转4.16.2。4.17 若kl=ksize,转4.17.1;否则转4.18。4.17.1 定义临时位置变量i=wid(h_col*height_col-width_colo4.17.2 若i小于Width_col*height_coL转4.17.3:否则转4.18。4.17.3 令data_colnOut_Start+i=0;
22、令i=i+L转4.17.2。4.18 令k2=k2+l0转4.6步。4.19 令kl=kl+l转4.4步。4.20 令ChS=ChS+1,转4.2步。第五步此时Stride=2且Pad=0,对data_im进行如下处理,得到data_col。stride=2导致每次滑移的2个元素。5.1 定义通道变量ChS=0。5.2 若ChS小于Channe1s,转5.3;否则转第七步。5.3 定义输出起始位置变量istartOut=chs*width_col*height_col*ksize*ksize.定义输入起始位置变量istartln=chs*width*height;定义输入间隔变量inner=0
23、,当前行号变量nRow=-1;定义核变量k=0三5.4若k小于ksize*ksize,转5.5;否则转5.13。5.5 若k%ksize=O,令nRow=nRow+1。5.6 令inner=k%ksize+nRow*width定义输出高度变量j=0。5.7 若j小于height_col,转5.8:否则转5.12。5.8 定义输出宽度变量i=0。5.9 若i小于Width_col,转5.10:否则转5.11。5.10 令da(a_colistartOut+k*width_col*height_col+j*width_col+i=datajmistartln+inner+i*2oi*2表示每次间隔
24、了一个元素,体现了滑移大小为2。令i=i+l转5.9。5.11 令inner=inner+width*20令j=j+L转5.7。5.12 令k=k+l,转5.4。5.13 令ChS=ChS+1,转5.2。第六步此时stride=2且pad=1对data-im进行如下处理,得到data_coL对k2分别为0,ksize-1,大于0且小于ksize-1三种情况进行处理。从而不需要在内层循环中进行判断,加速了转换过程。6.1 定义通道变量ChS=0。6.2 若chs小于channels,转6.3;否则转第七步。6.3 定义输出起始位置变量nOutStart=chs*width_col*height_
25、col*ksize*ksize定义输入起始位置变量nInStart=chs*width*heighto定义核一变量kl=006.4 若kl小于ksize,转6.5;否则转6.17。6.5 定义核二变量k2=0。6.6 若k2小于ksize,转6.7;否则转6.16。6.7 定义当前行号变量nRow=kl-l定义输出临时位置变量nOut_Start=nOutStart+(k1*ksize+k2)*width_col*height_col6.8 若kl=0,转6.8.1;否则转6.9。6.8.1 令nRow=l0定义输出宽度变量i=0o6.8.2 若i小于WiddLCol,转6.8.3;否则转6.
26、9。6.8.3 data_coUnOut_Start+i=Oe令i=i+L转6.8.2。6.9 定义高度起始变量n999=0o定义高度截止变量n888=heighi-col.定义宽度截止变量n777=width_col若kl=O,令n999=l若k1=ksize-1令n888=heighLeOI-1。若ksize=1.令n777=width-col-1。6.10 若height%2=0且kl=ksize-l,令n888=height_col。6.11 若k2=0,转6.11.1;否则转6.12。处理第一种条件,即k2=0的情况。6.11.1 定义输出高度变量j=n99906.11.2 若j小于
27、n888,转6.11.3;否则转6.12。6.11.3 data_colnOut_Start+j*width_col=0则data_colnOui_Start+j*width_col+width_col-1=0o令j=j+L转6.12.2。6.13 若k2大于O且k2小于ksize-1,转6.13.1:否则转6.14。处理第三种条件,即k2小于ksize-1且大于O的情况。6.13.1 定义输出高度变量j=n9996.13.2 若j小于n888,转6.12.3;否则转6.14。6.13.3 定义输出宽度变量i=0。6.13.4 若i小于Width_coL转6.13.5;否则转6.13.6。6.
28、13.5 令data_colnOut_Start+j*width_col+i=data_imnInStart+nRow*width+i*2+k2-l;令i=i+L转6.13.4。6.13.6 令nRow=nRow+2令j=j+10转6.13.2。6.14 若kl=ksize-l且height%!=1,转6.14.1;否则转6.15。6.14.1 定义临时位置变量i=wid(h_col*height_col-width_colo6.14.2 若i小于Width_col*height_coL转6.14.3:否则转6.15。6.14.3 令data_colnOut_Start+i=Oo令i=i+l,
29、转6.14.2。6.15 令k2=k2+l0转6.6。6.16 令kl=kl+L转6.4。6.17 令ChS=ChS+1,转6.2。第七步结束。采用本发明可以达到的技术效果如表1所示。对应表1的实验环境配置如下:CPU型号为Intel(R)Core(TM)i7-8565UCPU1.80GHz,关闭睿频,操作系统为UbUnIU18.04.1,编译器采用GCC7.4.0,-03优化。输入图像的通道数ChanneIS为3,图像高度height为1024,图像宽度wid(h为1024,卷积核大小ksize为3,运行时间统计重复运行10次的时间:表1:本发明技术效果情形传统im2col(亳秒)本发明(亳
30、秒)加速比stride=1pad=O180812.22stride=1pad=l1801081.67stride=2pad=O46251.84stride=246251.84pad=1从表1中可以看出,本发明与传统im2col转换技术相比,处理速度的加速比在1.67至2.22之间。本发明在输入图像高度、宽度越小时性能提升效果越明显,如对于ChanneIS为3、ksize为3、stride为1、Pad为0,当height为512,width为512时,加速比为2.37;当height为512,Width为512时,加速比为3.67。在实际应用中,对于空中动态飞行器进行目标检测时,采用本发明前每张
31、图片的目标检测时间为51亳秒,不满足30FPS的性能要求。采用本发明后每张图片的目标检测时间为32亳秒,满足30FPS的性能要求。本发明加速效果主要来自:(1)对stride和pad值不情况进行判断,分4种情况分别进行处理,避免了在最内层循环进行分支判断,减少了判断数量,转换速度加快。(2) 在第四步和第六步中,对k2=0k2=ksize-Kk2大于0且k2小于ksize-1三种情况进行了处理,避免了在最内层循环进行分支判断,减少了判断数量,转换速度加快。(3)最内层循环迭代简洁,索引值计算比传统im2col简单,如步骤5.9-5.10所示。转换速度得到提升图1为背景技术所述的张单通道图像卷积
32、示例。图2为背景技术所述的对图1所示单通道图像滑移一个元素时的卷积核。图3为背景技术所述的一张单通道5*5图像示例。图4为背景技术所述,基于图3,对周围填充1层0,即Pad=I的示意图。图5为背景技术所述,基于图3,Pad=0,采用传统im2col处理后得到的图像矩阵示例。图6为本发明的总体流程图。im2coLJO表示处理Slride=I且pad=O的情况。im2col_11表示处理stride=1且pad=l的情况。im2col_20表示处理stride=2且pad=O的情况。im2col_21表示处理siride=2且pad=l的情况。具体实施方式具体实施方式为:第一步:获取输入变量。第二步:对stride和pad值不情况进行判断,分三四五六步4种情况分别进行处理。第三步:处理Stride=I、pad=O的情况。第四步:处理SIride=1、Pad=I的情况。第五步:处理SIride=2、Pad=O的情况。第六步:处理Stride=2、Pad=I的情况第七步:结束。