im2col代码解析

前言

数字图像处理专栏的很多博客里,当遇到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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值