用“ 快速卷积”来加速‘卷积’

在《【算法+图像处理】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 程序 。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值