2019-09-03 16:39:35 botao_li 阅读数 102
  • TensorFlow 实战教程:如何用卷积神经网络打造图片...

    AI100 特邀阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解Tensorflow实现工业级图像识别应用的详细过程。通过本次公开分享课程大家将能掌握从零开始使用Tensorflow搭建一个图像识别引擎,包括训练、评估及服务的能力。

    18938 人正在学习 去看看 AI100讲师

二维卷积滤波

二维卷积是常用的图像处理算法,即图像滑窗内的并行数据按滑窗内的坐标与卷积核函数对应坐标的参数相乘后,将所有乘法积值相加得到卷积滤波结果。

但是由于卷积核函数大多数情况下都包含小数部分,在 FPGA 内执行浮点数乘法将占用大量资源。比较常用的处理方法是将核函数内各元素数值都乘以 2 的指数,将小数部分放大至整数部分,并且根据核函数的生成原理选择足够大的指数值以保证各元素间的差异。最终在 FPGA 实现时可以将小数乘法转化为整数乘法,在所有元素的乘法积值相加后通过截去低位的方式实现除以前述的 2 的指数的计算。

2×22\times 2 的二维卷积为例,原始核函数包含小数部分:
(kernel00kernel01kernel10kernel11) \left(\begin{array} {} kernel00 & kernel01\\ kernel10 & kernel11 \end{array}\right)
乘以 2N2^N 将小数部分放大至整数部分:
12N×(k00k01k10k11) \frac{1}{2^N}\times \left(\begin{array} {} k00 & k01\\ k10 & k11 \end{array}\right)
其中,
k00=floor(2N×kernel00)k01=floor(2N×kernel01)k10=floor(2N×kernel10)k11=floor(2N×kernel11) k00=floor(2^N\times kernel00)\\ k01=floor(2^N\times kernel01)\\ k10=floor(2^N\times kernel10)\\ k11=floor(2^N\times kernel11)
函数 floor() 表示丢弃小数部分,仅保留整数部分。原因在于必须前述的近似算法的计算结果不会大于原始核函数的计算结果。

因为图像的二维滤波算法根据其原理必须保证计算结果仍然在像素点位宽的量程以内,用于计算产生新的像素点值,即,
1(kernel00+kernel01+kernel10+kernel11) 1\geq(kernel00+kernel01+kernel10+kernel11)
如果不使用 floor() 函数,而采用四舍五入的办法消除小数位,则可能出现计算结果超过像素点位宽满量程的情况,导致出错,或者额外的数值饱和判断逻辑。

sysgen 二维卷积滤波的示意如下:

在这里插入图片描述

流水线最末端的 Slice 模块,即完成截去低 N 位的 2N 的除法运算,又截去由乘法和加法扩位产生的高无效位。

Slice 模块配置如下:

在这里插入图片描述

2018-08-07 19:12:59 Kedongyu_ 阅读数 211
  • TensorFlow 实战教程:如何用卷积神经网络打造图片...

    AI100 特邀阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解Tensorflow实现工业级图像识别应用的详细过程。通过本次公开分享课程大家将能掌握从零开始使用Tensorflow搭建一个图像识别引擎,包括训练、评估及服务的能力。

    18938 人正在学习 去看看 AI100讲师
# -*- coding: utf-8 -*-
"""
Created on Wed May 02 15:08:01 2018

@author: Diko
"""

import numpy 
from skimage import io ,data

def conv2d_v0010(f_, g_):
    g = g_[::-1, ::-1]
    f = f_
    h = numpy.vstack([numpy.zeros(f_.shape[1] + g_.shape[1] - 1)] * (g_.shape[0] + f_.shape[0] -1))
    
    f_up_and_dowm = numpy.vstack([numpy.zeros(f.shape[1])]*g.shape[0])
    f = numpy.vstack((f_up_and_dowm,f,f_up_and_dowm))
    
    f_left_and_right = numpy.vstack([numpy.zeros(g.shape[1])] * f.shape[0])
    f = numpy.hstack((f_left_and_right, f, f_left_and_right))
    
    for i in xrange(f_.shape[0] + g_.shape[0] - 1):
        for j in xrange(f_.shape[1] + g_.shape[1] -1):
            h[i, j]=(f[i+1:i+1+g_.shape[0],j+1:j+1+g_.shape[1]] *g).sum()
            
    print "f=\n", f
    print "g=\n", g
    print "h=\n", h
    io.imshow(h)
    return h
    
            

if __name__ == "__main__":
    f_shape, g_shape = 10, 3
    f_, g_ = numpy.arange(f_shape ), numpy.arange(g_shape)
    f = [f_+i for i in xrange(f_shape)]
    g = [g_+i*5 for i in xrange(g_shape)]
    
    f = numpy.vstack(f) 
    g = numpy.vstack(g)
    f = data.camera()
    io.imshow(f)
    conv2d_v0010(f, g)

 

2015-09-29 14:31:15 gotowu 阅读数 7687
  • TensorFlow 实战教程:如何用卷积神经网络打造图片...

    AI100 特邀阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解Tensorflow实现工业级图像识别应用的详细过程。通过本次公开分享课程大家将能掌握从零开始使用Tensorflow搭建一个图像识别引擎,包括训练、评估及服务的能力。

    18938 人正在学习 去看看 AI100讲师

在用C语言实现图像处理中,经常要用到二维卷积的运算,这个在matlab中是非常容易实现的,只需要conv2()就OK啦,而且速度非常的快。但是在C语言中就需要四层的for循环来实现了。

首先二维卷积的原理是:

 

      1 2 3               2 2 2

A=  1 2 3         B= 1 1 1

      1 2 3               3 3 3

单我们使用AB卷积时,首先需要将B旋转180度。即

 3 3 3

 1 1 1    逐渐右移

 2 2 2

       1 2 3

       1 2 3

       1 2 3

可得(full):

     2     6    12    10     6

     3     9    18    15     9

     6    18    36    30    18

     4    12    24    20    12

     3     9    18    15     9

但是我们在图像处理中一般只选择与A维数相同的矩阵即:

     9    18    15

    18    36    30

    12    24    20

 

所以可以得以下程序(给出部分代码):

#define N1 512
#define M1 512
#define N2 3
#define M2 3
/*x相当于矩阵A,y相当于J矩阵B,z相当于矩阵full时的输出,z2相当于矩阵与A维数相同时的输出,这里的参数类型根据实际情况作出修改。如果矩阵很大,运算时间比较久*/
void conv2(unsigned char x[N1][M1],int y[N2][M2],float z[N1+N2-1][M1+M2-1],float z2[N1][M1])
{
    int i,j;
    int n,m;
    for(i=0; i<N1+N2-1; i++)
        for(j=0; j<M1+M2-1; j++)
        {
            float temp = 0;
            for(m=0; m<N1; m++)
                for(n=0; n<M1; n++)
                    if((i-m)>=0&&(i-m)<N2&&(j-n)>=0&&(j-n)<M2)
                        temp+=x[m][n]*y[i-m][j-n];
            z[i][j]=temp;
        }
    for(i=0; i<N1; i++)
        for(j=0; j<M1; j++)
        {
            z2[i][j]=z[i+(N2-1)/2][j+(M2-1)/2];
        }
}


2019-08-16 11:54:37 weixin_44676499 阅读数 23
  • TensorFlow 实战教程:如何用卷积神经网络打造图片...

    AI100 特邀阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解Tensorflow实现工业级图像识别应用的详细过程。通过本次公开分享课程大家将能掌握从零开始使用Tensorflow搭建一个图像识别引擎,包括训练、评估及服务的能力。

    18938 人正在学习 去看看 AI100讲师

二维卷积即是以为卷积的拓展,并将其应用在图像处理之上 添加链接描述

2013-03-23 11:45:32 memory513773348 阅读数 1728
  • TensorFlow 实战教程:如何用卷积神经网络打造图片...

    AI100 特邀阿里2017 云栖大会 API Solution大赛一等奖团队的联合创始人智亮先生,他将给大家介绍当前图像识别领域中先进的深度学习模型,并从源码级给大家讲解Tensorflow实现工业级图像识别应用的详细过程。通过本次公开分享课程大家将能掌握从零开始使用Tensorflow搭建一个图像识别引擎,包括训练、评估及服务的能力。

    18938 人正在学习 去看看 AI100讲师

Gabor变换的本质实际上还是对二维图像求卷积。因此二维卷积运算的效率就直接决定了Gabor变换的效率。在这里我先说说二维卷积运算以及如何通过二维傅立叶变换提高卷积运算效率。在下一步分内容中我们将此应用到Gabor变换上,抽取笔迹纹理的特征。

1、离散二维叠加和卷积

关于离散二维叠加和卷积的运算介绍的书籍比较多,我这里推荐William K. Pratt著,邓鲁华 张延恒 等译的《数字图像处理(第3版)》,其中第7章介绍的就是这方面的运算。为了便于理解,我用下面几个图来说明离散二维叠加和卷积的求解过程。

A可以理解成是待处理的笔迹纹理,B可以理解成Gabor变换的核函数,现在要求A与B的离散二维叠加卷积,我们首先对A的右边界和下边界填充0(zero padding),然后将B进行水平翻转和垂直翻转,如下图:

然后用B中的每个值依次乘以A中相对位置处的值并进行累加,结果填入相应位置处(注意红圈位置)。通常二维卷积的结果比A、B的尺寸要大。如下图所示:

2、快速傅立叶变换卷积

根据傅立叶变换理论,对图像进行二维卷积等价于对图像的二维傅立叶变换以及核函数的二维傅立叶变换在频域求乘法。通过二维傅立叶变换可以有效提高卷积的运算效率。但在进行傅立叶变换时一定要注意“卷绕误差效应”,只有正确对原有图像以及卷积核填补零后,才能得到正确的卷积结果。关于这部分内容可以参考William K. Pratt著,邓鲁华 张延恒 等译的《数字图像处理(第3版)》第9章的相关内容,此处就不再赘述。


转自 http://zhenyulu.cnblogs.com/articles/325718.html

没有更多推荐了,返回首页