有效
一种面向目标检测的图像矩阵列转换加速方法
龚春叶、吕书邻、刘杰、杨博、甘新标、李胜国、陈旭光、肖调杰
中国人民解放军国防科技大学
龚
龚春叶 专利 71
中国人民解放军国防科技大学计算机辅助设计电子数据处理计算技术
吕
吕书邻 专利 2
中国人民解放军国防科技大学生物模型计算计算模型系统计算技术
刘
刘杰 专利 102
中国人民解放军国防科技大学申请详情分析优化类型计算机辅助设计
杨
杨博 专利 54
中国人民解放军国防科技大学电子数据处理计算技术物理仪器
甘
甘新标 专利 43
中国人民解放军国防科技大学电子数据处理计算技术物理仪器
李
李胜国 专利 36
中国人民解放军国防科学技术大学电子数据处理计算技术物理仪器
陈
陈旭光 专利 34
中国人民解放军国防科技大学电子数据处理计算技术物理仪器
肖
肖调杰 专利 34
中国人民解放军国防科技大学电子数据处理计算技术物理仪器
摘要
本发明公开了一种面向目标检测的图像矩阵列转换加速方法,目的是解决目前im2col的处理速度慢无法满足目标检测实时要求的问题。技术方案是根据滑移步长stride等于1、2和填充大小pad等于0、1时分情况分别进行加速处理,具体包括加速处理stride=1、pad=0的情况,加速处理stride=2、pad=0的情况,加速处理stride=1、pad=1的情况,加速处理stride=2、pad=1的情况;其它情况则仍采用im2col方法。本发明对stride和pad值分4种情况分别进行加速,避免了在最内层循环进行分支判断,减少了判断数量,且计算量小,转换速度加快,满足目标检测实时性要求。
1.一种面向目标检测的图像矩阵列转换加速方法,其特征在于包括以下步骤:第一步:获取输入变量、计算常用变量、确定输出变量,方法是:从用户提供的图像配置文件获取的输入变量包括待转换的多通道图像数组data_im、通道数channels、图像高度height、图像宽度width、卷积核大小ksize、滑移步长stride、填充大小pad;通道数channels、图像高度height、图像宽度width、卷积核大小ksize均为正整数;data_im是一个大小为channels*height*width的数组,保存channels*height*width个图像数据,元素分别为data_im[0]、data_im[1]、……、data_im[channels*height*width-1];令im2col处理后的通道数channels_col=channels*ksize*ksize;令im2col转换后的多通道图像高度 表示向下取整;令im2col转换后的多通道图像宽度 令im2col转换后的多通道图像数组为data_col,data_col是一个大小为channels_col*height_col*width_col的数组,保存channels_col*height_col*width_col个转换后的数据,元素分别为data_col[0]、data_col[1]、……、data_col[channels_col*height_col*width_col-1];第二步:对stride和pad值按不同情况决定转换加速方法,方法是:2.1若stride=1且pad=0,转第三步;否则转2.2;2.2若stride=1且pad=1,转第四步;否则转2.3;2.3若stride=2且pad=0,转第五步;否则转2.4;2.4若stride=2且pad=1,转第六步;否则转2.5;2.5转第七步;第三步:此时stride=1且pad=0,对data_im进行转换加速,得到data_col,方法是:3.1定义通道变量chs=0;3.2若chs小于channels,转3.3;否则转第八步;3.3定义输出起始位置变量istartOut=chs*width_col*height_col*ksize*ksize,输入起始位置变量istartIn=chs*width*height,输入间隔变量inner=0,当前行号变量nRow=-1;定义核变量k=0;3.4若k小于ksize*ksize,转3.5;否则转3.13;3.5若k%ksize等于0,%表示整除取余,则nRow=nRow+1;3.6令输入间隔inner=k%ksize+nRow*width;定义输出高度变量j=0;3.7若j小于height_col,转3.8;否则转3.12;3.8定义输出宽度变量i=0;3.9若i小于width_col,转3.10;否则转3.11;3.10令data_col[istartOut+k*width_col*height_col+j*width_col+i]=data_im[istartIn+inner+i],即令data_col第istartOut+k*width_col*height_col+j*width_col+i-1个元素的值为data_im第istartIn+inner+i-1个元素的值;令i=i+1;转3.9;3.11令inner=inner+width;令j=j+1;转3.7;3.12令k=k+1;转3.4;3.13 chs=chs+1;转3.2;第四步:此时stride=1且pad=1,对data_im按核二变量k2为0,ksize-1、大于0且小于ksize-1三种情况分别进行转换加速,得到data_col:4.1定义通道变量chs=0;4.2若chs小于channels,转4.3;否则转第八步;4.3定义输出起始位置变量istartOut=chs*width_col*height_col*ksize*ksize,输入起始位置变量istartIn=chs*width*height,当前行号变量nRow=-1;定义核一变量k1=0;4.4若k1小于ksize,转4.5;否则转4.20;4.5定义核二变量k2=0;4.6若k2小于ksize,转4.7;否则转4.19;4.7定义当前行号nRow=k1-1;若k1=0或者k1=1,令nRow=0;定义输出临时位置变量nOut_Start=nOutStart+(k1*ksize+k2)*width_col*height_col;4.8若k1等于0,转4.9;否则转4.13;4.9定义输出宽度变量i=0;4.10若i小于width_col,转4.11;否则转4.13;4.11令data_col[nOut_Start+i]=0;4.12令i=i+1,转4.10;4.13令宽度截止变量n777=width_col,高度截止变量n888=height_col,高度起始变量n999=0;4.13.1若ksize=1,令n777=width_col-1,转4.13.2;4.13.2若k1=ksize-1,令n888=height_col-1,转4.13.3;4.13.3若k1=0,令n999=1,转4.14;4.14若k2等于0,转4.14.1;否则转4.15;4.14.1定义输出高度变量j=n999;4.14.2若j小于n888,转4.14.3;否则转4.15;4.14.3令data_col[nOut_Start+j*width_col]=0;定义输出宽度变量i=1;4.14.4若i小于n777,转4.14.5;否则转4.14.7;4.14.5令data_col[nOut_Start+j*width_col+i]=data_im[nInStart+nRow*width+i-1];4.14.6令i=i+1,转4.14.4;4.14.7令当前行号变量nRow=nRow+1;令j=j+1,转4.14.2;4.15若k2等于ksize-1,转4.15.1;否则转4.16;4.15.1定义输出高度变量j=n999;4.15.2若j小于n888,转4.15.3;否则转4.16;4.15.3定义输出宽度变量i=0;4.15.4若i小于width_col-1,转4.15.5;否则转4.15.6;4.15.5令data_col[nOut_Start+j*width_col+i]=data_im[nInStart+nRow*width+i-1+k2];令i=i+1,转4.15.4;4.15.6令nRow=nRow+1;令data_col[nOut_Start+j*width_col+width_col-1]=0;令j=j+1,转4.15.2;4.16若k2大于0且k2小于ksize-1,转4.16.1,否则转4.17;4.16.1定义输出高度变量j=n999;4.16.2若j小于n888,转4.16.3;否则转4.17;4.16.3定义输出宽度变量i=0;4.16.4若i小于width_col,转4.16.5;否则转4.16.6;4.16.5令data_col[nOut_Start+j*width_col+i]=data_im[nInStart+nRow*width+i-1+k2];令i=i+1,转4.16.4;4.16.6令nRow=nRow+1;令j=j+1,转4.16.2;4.17若k1=ksize-1,转4.17.1;否则转4.18;4.17.1定义临时位置变量i=width_col*height_col-width_col;4.17.2若i小于width_col*height_col,转4.17.3;否则转4.18;4.17.3令data_col[nOut_Start+i]=0;令i=i+1,转4.17.2;4.18令k2=k2+1,转4.6;4.19令k1=k1+1,转4.4;4.20令chs=chs+1,转4.2;第五步 此时stride=2且pad=0,对data_im进行如下转换加速:5.1定义通道变量chs=0;5.2若chs小于channels,转5.3;否则转第八步;5.3定义输出起始位置变量istartOut=chs*width_col*height_col*ksize*ksize;定义输入起始位置变量istartIn=chs*width*height;定义输入间隔变量inner=0,当前行号变量nRow=-1;定义核变量k=0;5.4若k小于ksize*ksize,转5.5;否则转5.13;5.5若k%ksize等于0,令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令data_col[istartOut+k*width_col*height_col+j*width_col+i]=data_im[istartIn+inner+i*2];令i=i+1,转5.9;5.11令inner=inner+width*2;令j=j+1;转5.7;5.12令k=k+1,转5.4;5.13令chs=chs+1,转5.2;第六步 此时stride=2且pad=1,对data_im按k2为0,ksize-1、大于0且小于ksize-1三种情况分别进行如下转换加速,得到data_col,方法如下:6.1定义通道变量chs=0;6.2若chs小于channels,转6.3;否则转第八步;6.3定义输出起始位置变量nOutStart=chs*width_col*height_col*ksize*ksize;定义输入起始位置变量nInStart=chs*width*height;定义核一变量k1=0;6.4若k1小于ksize,转6.5;否则转6.17;6.5定义核二变量k2=0;6.6若k2小于ksize,转6.7;否则转6.16;6.7定义当前行号变量nRow=k1-1;定义输出临时位置变量nOut_Start=nOutStart+(k1*ksize+k2)*width_col*height_col;6.8若k1等于0,转6.8.1;否则转6.9;6.8.1令nRow=1;令输出宽度变量i=0;6.8.2若i小于width_col,转6.8.3;否则转6.9;6.8.3令data_col[nOut_Start+i]=0;令i=i+1,转6.8.2;6.9定义高度起始变量n999=0;定义高度截止变量n888=height_col;定义宽度截止变量n777=width_col;6.9.1若k1等于0,令n999=1,转6.9.2;6.9.2若k1等于ksize-1,令n888=height_col-1,转6.9.3;6.9.3若ksize等于1,令n777=width_col-1,转6.10;6.10若height%2等于0且k1等于ksize-1,转6.10.1,否则转6.11;6.10.1令n888=height_col,转6.11;6.11若k2等于0,转6.11.1;否则转6.12;6.11.1定义输出高度变量j=n999;6.11.2若j小于n888,转6.11.3;否则转6.12;6.11.3令data_col[nOut_Start+j*width_col]=0;令输出宽度变量i=1;6.11.4若i小于width_col,转6.11.5;否则转6.11.6;6.11.5令data_col[nOut_Start+j*width_col+i]=data_im[nInStart+nRow*width+i*2-1];令i=i+1,转6.11.4;6.11.6令当前行号变量nRow=nRow+2;令j=j+1,转6.11.2;6.12若k2等于ksize-1,转6.12.1;否则转6.13;6.12.1定义输出高度变量j=n999;6.12.2若j小于n888,转6.12.3;否则转6.13;6.12.3定义输出宽度变量i=0;6.12.4若i小于width_col,转6.12.5;否则转6.12.6;6.12.5令data_col[nOut_Start+j*width_col+i]=data_im[nInStart+nRow*width+i*2-1+k2];令i=i+1,转6.12.4;6.12.6令nRow=nRow+2;若width%2等于1,转6.12.7,否则转6.12.8;6.12.7令data_col[nOut_Start+j*width_col+width_col-1]=0,转6.12.8;6.12.8令j=j+1,转6.12.2;6.13若k2大于0且k2小于ksize-1,转6.13.1;否则转6.14;6.13.1定义输出高度变量j=n999;6.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.13.5令data_col[nOut_Start+j*width_col+i]=data_im[nInStart+nRow*width+i*2+k2-1];令i=i+1,转6.13.4;6.13.6令nRow=nRow+2;令j=j+1,转6.13.2;6.14若k1等于ksize-1且height%2等于1,转6.14.1;否则转6.15;6.14.1定义临时位置变量i=width_col*height_col-width_col;6.14.2若i小于width_col*height_col,转6.14.3;否则转6.15;6.14.3令data_col[nOut_Start+i]=0;令i=i+1,转6.14.2;6.15令k2=k2+1;转6.6;6.16令k1=k1+1,转6.4;6.17令chs=chs+1,转6.2;第七步 处理stride不为1、2且pad不为0、1的情况,方法为:令通道变量chs=0;7.1若chs小于channels_col,转第7.2;否则转第八步;7.2令宽度偏移变量w_offset=c%ksize;令高度偏移变量h_offset=(c/ksize)%ksize;令临时通道变量c_im=c/ksize/ksize;令高度变量h=0;7.3判定h有没有超出当前转换后的多通道图像高度,即若h小于height_col,转7.4,否则转第7.8;7.4令宽度变量w=0;7.5判定w有没有超出当前转换后的多通道图像宽度,即若w小于width_col,转7.6;否则转7.7;7.6把data_im中的元素转换成data_col中的元素;7.6.1确定待转换的图像数据元素的行号,即令行号row=h_offset+h*stride-pad;确定待转换的图像数据元素的列号,即令列号col=w_offset+w*stride-pad;确定转换后的多通道图像的索引,即令index=c*height_col*width_col+h*width_col+w;7.6.2若row小于0或者col小于0或者row大于等于height或者col大于等于width,令data_col[index]=0;否则data_col[index]=data_im[col+width*(row+height*c_im)];令w=w+1;转7.5;7.7令h=h+1;转7.3;7.8令chs=chs+1;转7.1;第八步 处理完成,得到转换后的多通道图像数组data_col。



