[发明专利]一种面向目标检测的图像矩阵列转换加速方法有效

专利信息
申请号: 202010491523.6 申请日: 2020-06-02
公开(公告)号: CN111640066B 公开(公告)日: 2022-09-27
发明(设计)人: 龚春叶;吕书邻;刘杰;杨博;甘新标;李胜国;陈旭光;肖调杰 申请(专利权)人: 中国人民解放军国防科技大学
主分类号: G06T3/40 分类号: G06T3/40;G06N3/04
代理公司: 长沙中科启明知识产权代理事务所(普通合伙) 43226 代理人: 匡治兵
地址: 410003 湖*** 国省代码: 湖南;43
权利要求书: 查看更多 说明书: 查看更多
摘要:
搜索关键词: 一种 面向 目标 检测 图像 矩阵 转换 加速 方法
【权利要求书】:

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。

下载完整专利技术内容需要扣除积分,VIP会员可以免费下载。

该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国人民解放军国防科技大学,未经中国人民解放军国防科技大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服

本文链接:http://www.vipzhuanli.com/pat/books/202010491523.6/1.html,转载请声明来源钻瓜专利网。

×

专利文献下载

说明:

1、专利原文基于中国国家知识产权局专利说明书;

2、支持发明专利 、实用新型专利、外观设计专利(升级中);

3、专利数据每周两次同步更新,支持Adobe PDF格式;

4、内容包括专利技术的结构示意图流程工艺图技术构造图

5、已全新升级为极速版,下载速度显著提升!欢迎使用!

请您登陆后,进行下载,点击【登陆】 【注册】

关于我们 寻求报道 投稿须知 广告合作 版权声明 网站地图 友情链接 企业标识 联系我们

钻瓜专利网在线咨询

周一至周五 9:00-18:00

咨询在线客服咨询在线客服
tel code back_top