神经网络重学习,新感悟和传统去模糊算法初步学习

机器视觉中的神经网络进行目标检测(使用pycharm)

神经网络其实就是一个特征提取的网络,该网络可以通过学习和训练后逐渐优化自身的识别细节从而识别出复杂多变的目标。

神经网络的核心包括两个部分,一是正向传播部分,一是反向传播部分。

正向传播部分包括了用于特征提取和识别的各个网络层,而各层的核心是神经元,由神经元的类别不同,排列方式不同,组成不同,神经网络的类型也随之不同。

反向传播部分包括了损失函数,梯度下降等核心知识,通过这些知识,可以实现神经网络的反复学习,迭代,从而可以适应识别复杂的目标。

这里使用神经网路中最基础的手写数字识别项目,意在形象的解释博主现在对神经网络的理解。先简单说一下该项目的基础原理,在该项目中使用的是sigmoid神经元,而在该神经元中的sigmoid代表该神经元的激活函数(所谓激活函数,就是通过一个公式,将输入转换为0到1之间的一个小数,而该小数的大小就代表了该输入对于目标输入的可能性,例如y=sigmoid(x)后,y=0.66,则机器就认为输入x有百分之66的可能性是目标)。假设对手写数字0的识别,该项目中首先由输入层的各个神经元分块提取特征图像上的特征,假设有四个神经元,则它们分别识别0图像上的左上,左下,右上,右下四个部分,每个神经元通过激活函数后分别得到一个小数,然后该小数和各个神经元的权重(权重就是各个部分的重要程度)一起作为隐藏层或者输出层的输入进入下一层,各层通过全连接,最后会得到一个0到1之间的小数作为输出,而网络就会根据这个小数判断该手写数字是谁。

在简单介绍该项目之后,下面就上代码了

我们在 Network 类中添加一个前馈方法,给定网络的输入 a,返回相应的输出,该方法所做的就是对每一层应用等式a′=σ(wa+b),该等式也就是sigmoid的激活函数,则这一段代码的意义也就是上面说到的正向传播部分

def feedforward(self, a):
        """Return the output of the network if "a" is input."""
        for b, w in zip(self.biases, self.weights):
            a = sigmoid(np.dot(w, a)+b)
        return a

我们希望 Network 对象做的主要事情是学习。 为此,我们将为他们提供一种实现随机梯度下降的 SGD 方法。该代码的工作原理如下。 在每个 epoch 中,它先随机打乱训练数据,然后将其划分为适当大小的小批量。 这是从训练数据中随机抽样的一种简单方法。 然后对于每个 mini_batch 使用一步梯度下降。 这是由代码 self.update_mini_batch(mini_batch, eta) 完成的,它根据梯度下降的单次迭代更新网络权重和偏差,仅使用 mini_batch 中的训练数据,update_mini_batch 方法的代码在下文展示。该段代码如下

def SGD(self, training_data, epochs, mini_batch_size, eta,
            test_data=None):
        """Train the neural network using mini-batch stochastic
        gradient descent.  The "training_data" is a list of tuples
        "(x, y)" representing the training inputs and the desired
        outputs.  The other non-optional parameters are
        self-explanatory.  If "test_data" is provided then the
        network will be evaluated against the test data after each
        epoch, and partial progress printed out.  This is useful for
        tracking progress, but slows things down substantially."""
        if test_data: n_test = len(test_data)
        n = len(training_data)
        for j in xrange(epochs):
            random.shuffle(training_data)
            mini_batches = [
                training_data[k:k+mini_batch_size]
                for k in xrange(0, n, mini_batch_size)]
            for mini_batch in mini_batches:
                self.update_mini_batch(mini_batch, eta)
            if test_data:
                print "Epoch {0}: {1} / {2}".format(
                    j, self.evaluate(test_data), n_test)
            else:
                print "Epoch {0} complete".format(j)

在该段代码中                                                                                     

  • training_data 是表示训练输入和相应的期望输出的元组 (x, y) 列表。             
  •  epochs和mini_batch_size是所期望的训练的时期数,以及采样时要使用的批次的大小。       
  • eta 是学习率

update_mini_batch 的代码如下:

def update_mini_batch(self, mini_batch, eta):
        """Update the network's weights and biases by applying
        gradient descent using backpropagation to a single mini batch.
        The "mini_batch" is a list of tuples "(x, y)", and "eta"
        is the learning rate."""
        nabla_b = [np.zeros(b.shape) for b in self.biases]
        nabla_w = [np.zeros(w.shape) for w in self.weights]
        for x, y in mini_batch:
            delta_nabla_b, delta_nabla_w = self.backprop(x, y)
            nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)]
            nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)]
        self.weights = [w-(eta/len(mini_batch))*nw 
                        for w, nw in zip(self.weights, nabla_w)]
        self.biases = [b-(eta/len(mini_batch))*nb 
                       for b, nb in zip(self.biases, nabla_b)]

这里会调用反向传播算法,这是一种计算损失函数梯度的快速方法。 因此 update_mini_batch 的工作原理是为 mini_batch 中的每个训练结果计算这些梯度,然后适当地更新 self.weights 和 self.biases。上述的SGD和update_mini_batch 的代码共同构成了之前说的反向传播部分

该项目的完整源码来自网址(感谢该作者):http://neuralnetworksanddeeplearning.com/chap1.html#sigmoid_neurons

维纳滤波和盲反卷积(使用matlab)

动态模糊(区别于噪声)或运动模糊(motion blur)是静态场景或一系列的图片像电影或是动画中快速移动的物体造成明显的模糊拖动痕迹(在博主的理解中动态模糊是由于拍摄过程中由于拍摄者的抖动或者拍摄画面中的运动物体所造成的模糊),在这类动态模糊中,我们往往理性的认为该模糊是由原清晰图像通过某种退化函数进而变为模糊图像的,所以在去模糊的过程中,我们往往希望找到与模糊图像对应的退化函数,然后通过该函数对模糊图片做逆运算,从而达到去模糊的效果。在这里将会聊到去动态模糊的两种方法,即维纳滤波和盲反卷积法

盲反卷积法

必要的知识点是点扩散函数,点扩散函数是反卷积中的退化函数,是反卷积的核心,点扩散函数(point spread function (PSF) 以下均使用PSF缩写)描述了一个成像系统对一个点光源(物体)的响应。对光学系统来讲,输入物为一点光源时其输出像的光场分布,称为点扩散函数,也称点扩展函数。在数学上点光源可用δ函数(点脉冲)代表,输出像的光场分布叫做脉冲响应,所以点扩散函数也就是光学系统的脉冲响应函数。

在简单了解了盲反卷积中的退化函数PSF后,就可以去了解该方法的核心思想了。区别于维纳滤波法,盲反卷积的精妙之处就在于它的盲。也就是说盲反卷积可以在不知道具体PSF的情况下通过反复迭代去估计PSF的值并逐渐完成去卷积工作,具体操作如下:

第一步将原始模糊图像和最初估计的PSF(这里一般将PSF估计为全1矩阵)输入到盲反卷积算法中,代码如下:

PSF=fspecial('gaussian',7,10); 
blurred01=imfilter(I,PSF, 'circular', 'conv');%图像退化 
UNDERPSF=ones(size(PSF)-4); 
INITPSF=padarray(UNDERPSF,[2 2], 'replicate', 'both'); 
[J3,P3]= deconvblind(blurred01, INITPSF); 

在该段代码中,退化图像为blurred01,初始估计的全一PSF为UNDERPSF,INITPSF为大小和原PSF一样的全一初始估计矩阵。我们将blurred01和INITPSF作为输入输入到盲反卷积算法中,在matlab里盲反卷积算法为deconvblind。

如下是该处生成的PSF退化矩阵

如下是该处的INITPSF全一初始矩阵

第二步,当模糊图像和初始估计矩阵输入到deconvblind之后,盲反卷积算法就会通过如下两个公式反复迭代估计真实的PSF矩阵以及生成去卷积图片

在该公式中,gi代表着每从迭代得到的新的PSF估计矩阵,fi代表每次迭代得到的复原图像。

公式解释:

该公式由概率论中的贝叶斯公式推导而来,两个公式分别代表假设图像恢复到该迭代效果(k-1)则得到真实PSF(k代)的概率以及假设得到该迭代程度的PSF退化函数(k代)则恢复图像的概率。上述的两断话对应为一个概率公式,将该概率公式推导为上述形式的过程如下:

这里博主只列出了g的推导公式,而f的推导公式也基本相同,这里就不重复推导了。

通过如上俩个公式原理,将两个公式反复迭代,不断估计,就可完成所谓盲去卷积法。

第三步,结束上述步骤后盲卷积就完成啦,然后就是对结果进行分析评估了

figure, imshow(J3); title('2.4 盲反卷积(使用真实的PSF进行逆滤波)');

如上代码就是输出由算法得出的盲反卷积图片,其于原图片对比图如下:

可以看到卷积结果有振铃,但是总的效果还是很好的。

下面对盲反卷积估计的PSF和真实的PSF进行对比:

可见公式的估计PSF矩阵和真实的PSF矩阵的偏差不超过0.04,效果也很不错。

完整代码地址(感谢原作者):https://blog.csdn.net/ABV09876543210/article/details/106011718

维纳滤波法

对于动态模糊的去除,首先还是要找到该造成动态模糊的退化函数,我们假设退化函数为h,原始图像为f,噪声函数为z,退化所得图像为g,则可以得到退化公式g=f*h+z,这是空域中的公式,将它转化到频域的结果为:G=FH+Z。

对于维纳滤波的处理,但h未知时,需要先求出h。

对于h的求解,按照最小均方误差准则确定,该准则的公式为:min E(e^{_{2}^{n}}​)=E([s(n)−s^(n)]2);

上式中s代表期望信号,s^代表滤波结果信号。

为了按最小均方误差准则求解h(n),这里用到概率论中的最大似然估计的思想,即令 E(n)对h(j)的导数为0,(化简部分省略)可以得到公式:E[e(n)s(n−j)]=0;该式称为正交方程,它表明任意时刻的估计误差都与滤波器的输入正交,也就是说滤波器的输入信息被完全利用了。再将输入噪声图像公式:y(n)=∑i​h(i)x(n−i)和上文中的最小误差准则公式带入上述推出式可得

E[s(n)s(n+m)]=∑i​h(i)E[x(n)s(n+m)]

通过上式可以得到退化函数h,也就解决了未知退化函数的问题,可以进入下一步了。

在已知退化函数时,先将退化函数h转化到频域H,然后带入如下公式

上述公式由空域公式 E(e^{_{2}^{n}}​)=E([s(n)−s^(n)]2)推导而来,通过该公式,就可以得到滤波结果了。

 

噪声(区别于动态模糊),噪声就是在机器接受到图片信号后所产生的多余的干扰信号,区别于动态模糊,噪声是由机器系统自身产生的模糊,而动态模糊是由于拍照时拍照者的抖动或者照片中物体的运动所造成的模糊。去噪声中包括着多类滤波器,而去动态模糊的算法去噪效果一般较差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值