我是靠谱客的博主 野性舞蹈,最近开发中收集的这篇文章主要介绍用“ 快速卷积”来加速‘卷积’,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在《【算法+图像处理】2D卷积与快速卷积算法C语言实现》一文找来一个快速卷积

//2D快速卷积算法的实现  快速卷积算法需要核2D核h能够拆分成一个行向量和一个列向量的乘积的形式。
//实际实现也就是将2D卷积,拆分成两次1D卷积的形式。设和的大小为n*n,这样可以将算法复杂度从n*n降低为2n。     
bool convolve2DFast(float* in, float* out, int dataSizeX, int dataSizeY,
                    float* kernel, int kernelSizeX, int kernelSizeY)

具体原理去看原文吧,为了应用该函数。需要转化一下

定义一个卷积层

class 卷积层
{
	public:
	int		width;    //宽
	int     height;   //高
	int     depth;		  //通道 深度
	float * data;

	//构造函数
	卷积层(int iwidth,int iheight);
	卷积层(int iwidth,int iheight,int idepth);
	卷积层(int iwidth,int iheight,int c,float * data);
	~卷积层();
};

卷积层::卷积层(int iwidth,int iheight): width(iwidth),
                                            height(iheight)
{
	depth=1;
	data=NULL;

}

卷积层::卷积层(int iwidth,int iheight,int idepth): width(iwidth),
                                            height(iheight),depth(idepth)
{
	data=NULL;

}
卷积层::卷积层(int iwidth,int iheight,int idepth,float * fdata): width(iwidth),
                                            height(iheight),depth(idepth),	data(fdata)

{

}

卷积层::~卷积层()
{

}

内存分配就在外部了。

用下面的快速卷积代替原来的卷积

void 卷积快速(卷积矩阵*filter,卷积矩阵*arr, 卷积矩阵*res)
{
	卷积层 in=卷积矩阵2卷积层(arr);
	卷积层 out=卷积矩阵2卷积层(res);
	卷积层 kernel=卷积矩阵2卷积层(filter);

	//convolve2DFast(float* in, float* out, int dataSizeX, int dataSizeY,
 //                   float* kernel, int kernelSizeX, int kernelSizeY);
	convolve2DFast(in.data, out.data, in.width, in.height,
                    kernel.data, kernel.width, kernel.height);
	
	
	卷积层2卷积矩阵_复制(&out,res);

	
    delete []in.data;  in.data=NULL;  
    delete []out.data;  out.data=NULL;  
    delete []kernel.data;  kernel.data=NULL;  

}

相互转换:

卷积层  卷积矩阵2卷积层(卷积矩阵 * a)
{
	int w=a->width;
	int h=a->height;

	卷积层 in(w,h,1);
	in.data=new float[w * h * sizeof(float)]; 
	float * t=in.data;
		
	for (int i = 0; i < w * h; i++)
		*t++=a->data[i];



	return in;

}
void  卷积层2卷积矩阵_复制(卷积层 * a,卷积矩阵 *r)
{
		int w=a->width;
		int h=a->height;

		if(w==r->width && h==r->height)
		//卷积矩阵 in(w,h);
		//float * t=a->data;
		{
		for (int i = 0; i < w * h; i++)
			r->data[i]=a->data[i];//*t++;
		}
		else
			cout<<"不能复制,矩阵大小不等 "<<endl;




}

这样就比原来快一点了

效果图:

原图

2倍图

3倍图

4倍图


程序下载:

https://download.csdn.net/download/juebai123/10528979

3 个不同放大倍率的VDSR 重建程序

和上个SRCNN 程序 。



最后

以上就是野性舞蹈为你收集整理的用“ 快速卷积”来加速‘卷积’的全部内容,希望文章能够帮你解决用“ 快速卷积”来加速‘卷积’所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部