前言
在数字图像处理专栏的很多博客里,当遇到sobel算子、均值滤波等算子时,我们使用的是传统的卷积方法(直接卷积),也就是将卷积核在输入图像上不断进行移动产生输出。直接计算时,由于输入图像矩阵存放在内存中地址有重叠且不连续的空间上,在计算时有可能需要多次访问内存。多次访问内存直接增加了数据传输时间,从而进一步影响了卷积计算速度。
同样地在深度学习中,卷积层也需要对输入特征图进行卷积,如果还是使用直接卷积的方式,势必会影响模型训练以及推理的速度。因此,人们采用一些策略来加速卷积运算。
im2col
im2col算法的原理这里不再阐述,网上有很有优质的博客,大家自行阅读即可。这里我们主要关注im2col的具体C语言实现。
总的来说,im2col需要把图像张量data_im转换为一个列表示矩阵data_col,期间不做任数值上的运算。如下图所示,左边是输入特征图data_im(三通道),右边为im2col后的矩阵data_col(单通道),这里为了简单,我们假设padding=0,stride=2,卷积核大小ksize=3。经过卷积后的输出特征图data_output(单通道)大小为2*2。

代码
float im2col_get_pixel(float *im, int height, int width, int channels,
int row, int col, int channel, int pad)
{
row -= pad;
col -= pad;
if (row < 0 || col < 0 ||
row >= height || col >= width) return 0; // 超过范围的直接返回pading的0
return im

最低0.47元/天 解锁文章
3296

被折叠的 条评论
为什么被折叠?



