2017-11-27 13:11:57 edogawachia 阅读数 23103
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    829 人正在学习 去看看 郭冰洋

深度学习图像去噪发展概述

由于深度学习,特别是卷积神经网络(CNN)在图像识别等领域取得了较好的成果,近年来,基于深度学习的图像去噪方法也被提出并得到了发展。2008年,Viren Jain等提出用CNN处理自然图像的去噪问题[21],得到了与常规方法(如小波变换和马尔可夫随机场)相近或更优的结果。并说明了特定形式的CNN可以被视为图像去噪的马尔可夫模型推断的结果的一种近似,但是神经网络模型可以避免了马尔可夫模型在概率学习和推断过程中的计算困难,从而降低了计算的复杂度。在训练神经网络的过程中为了更加快速和准确的收敛,采取了逐层训练的方法。该方法网络结构如下图所示:

这里写图片描述

图2.1 Viren Jain等的图像去噪卷积神经网络模型(CN1和CN2区别于训练集的不同)

该网络由四个隐含层组成,每个隐含层含有24个特征通道,每一个特征通道都与8个随机选择的上一层的特征通道相连接。该网络的卷积核大小为5×5,网络的损失函数为带噪图像经过神经网络去噪后的恢复图像和真实图像的误差平方和,即:。除了对噪声已知的情况进行训练和去噪,作者还测试了噪声未知情况下的去噪情况,将在σ=[0,100]的范围内随机变化的不同水平的噪声加入真实图像,并进行训练,此时将隐含层设置为5层,相对于传统方法也取得了较好的效果。

2012年,Xie等利用栈式去噪自编码器(stacked denoising auto-encoder)进行图像去噪以及图像修复(image inpainting)[22],其网络结构为多层的全连接网络,如图2.2所示。

这里写图片描述

图2.2 栈式稀疏去噪自编码器(SSDA)

为了将稀疏编码的思想和深度神经网络结合,作者提出了栈式稀疏去噪自编码器(stacked sparse denoising auto-encoder, SSDA),其损失函数如下:
这里写图片描述
其中KL散度中的ρ^ 代表隐含层激活函数输出的平均值,如果我们设定较小的ρ,则可以通过优化损失函数,使得每一层中被激活的神经元尽可能少,以此达到稀疏约束的目的。训练过程为逐层训练,每训练完一层后,将训练用的数据(带噪图像)和标签(真实图像)都通过该层,将输出送至下一层作为数据和标签进行训练。
Burger等人提出了用多层感知机(Multi Layer Perceptron,MLP)的方法实现神经网络去噪[23],并说明如果训练集足够,MLP模型可以达到图像去噪的当前最优水平。MLP模型对噪声类型不敏感,对于不同类型的噪声,只要对带有该类噪声的图像进行处理,即可得到较好的结果。作者认为,MLP相对于CNN的优点在于,MLP可以近似所有函数,而CNN可以学习到的函数相对有限。为了使MLP网络达到最优水平,训练网络应足够大,分割图像得到的区块大小应足够大,以及训练集也应足够大。该方法的一个不足之处为它无法适应不同强度的噪声,若将不同水平的噪声图像作为输入进行训练则无法达到对特定噪声进行训练时的结果。
2016年,Mao等提出了深度的卷积编解码网络应用于图像去噪[24]。编码(Encoding)和解码(Decoding)结构对称,且每隔较少层就存在一条由编码卷积层到与其对称的解码层的跨层连接。该网络结构如图2.3所示。该网络共采用了对称的10层卷积层,其中前5层为编码层,后5层为解码层。在该CNN网络的编码层中,每隔2层就用一条跳线将编码层连接到对称的解码层,因此可以直接进行正向和反向传播。从该网络开始,图像去噪神经网络层数开始向更深层发展。以前的神经网络层数普遍较浅,原因在于:一方面,与图像分类等问题只需要提取关键特征的任务不同,图像的复原要求图像的细节在网络传播中不能丢失,而网络层数变深可能会导致图像细节的丢失;另一方面,层数较深容易在训练过程中导致梯度弥散,不容易收敛到最优解。由于该网络采用了卷积和解卷积层间的跳线连接,因此可以较好的解决上述的问题,因此网络相对较深。

这里写图片描述

图2.3 卷积编解码去噪网络结构(示跳线)

2017年,Zhang等提出用较深层的CNN网络,称为DnCNN[25],实现去噪,为了解决网络层数加深导致的梯度弥散效应,DnCNN并不对图像进行学习,而是以输出与噪声的l2范数为损失函数来训练网络。网络结构如图2.4所示。DnCNN网络可以视为一个残差学习的过程,这样可以较好的训练。在该网络中利用了BN层(Batch Normalization),实验表明BN层与残差学习共同使用可以提高模型的性能,DnCNN在不同噪声水平上训练,得到的结果要优于现在的最优结果,如BM3D等。

这里写图片描述

图2.4 DnCNN 网络结构

2019-02-18 09:39:36 u012514944 阅读数 1818
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    829 人正在学习 去看看 郭冰洋

深度学习降噪,越来越受到音频算法工程师的关注,以往每一种算法只能处理一种或者几种效果的局限有望

被打破,这是大家都往这个方向研究的原因之一。

 

下面分享基于rnnoise 开源算法的训练经验:

1、效果的好坏,第一取决于噪声源以及纯语音数据的质量,这是深度学习算法的最重要的部分。所以收集

高质量的数据是关键。

2、语音信号特征点的选择,也是深度学习算法最重要的部分,直接决定了训练的效果。

3、深度学习模型结构以及其复杂度,这个现在大部分模型都有一定的效果,哪一个更好就需要自己训练测试。

总的来说:1 = 2 > 3;

 

鉴于目前现状,我觉得对于音频算法工程师做深度学习降噪的困难主要是:

1、高质量数据的收集,因为目前网上很难找到好的数据,语音识别的数据往往并不纯净。

2、由于第一点的问题,导致深度学习降噪的效果没有理想的好,甚至对于一些信噪比的噪声,效果不如基于

噪声估计的算法,这个时候就需要采取更多的其他的方式来优化。

3、特征点的选择以及训练模型也需要更多的实验。

附:

rnnoise 降噪算法 与传统算法对比分析: https://blog.csdn.net/u012514944/article/details/85247753

本文只是简单分析深度学习降噪目前的挑战,欢迎大家加音频算法讨论群:(作者zeark)153268894 

2019-03-14 14:32:03 weiqiwu1986 阅读数 4110
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    829 人正在学习 去看看 郭冰洋

  实时语音通信发展到今天,用户对通话语音质量提出了越来越高的要求。由于终端设备的多样性以及使用场景的差异,声音问题依然存在。传统的音频处理技术从声音信号本身出发,挖掘其时频特性,作出假设,建立物理模型,很多参数都需要人工进行精细化微调,比较费时费力。随着AI技术的发展,凭借着其强大的拟合能力,利用数据驱动,为改善音频体验提供了更多的可能性。

        关于理论部分,包括论文有很多,每种想法都存在一些问题,包括工程方面的,如需做落地,效果稳定良好,还需要做很多更多的工作,这里稍微做了下总结,深度学习降噪基本都在这份分享的PPT上面,降噪部分有些文章可能有些不太新了,但是还是有学习参考意义的。

   此处就分享几张DNN处理后的样本,增加一下新手的信心,处理非平稳噪声,效果还是非常明显的。

white:

     

 destroyerengine:

    

n32:

    

 n38

     

n61:

    

sil:

    

coffee:

    

 

PPT链接地址:

百度云盘

链接: https://pan.baidu.com/s/1vvUiiGtu-HUdZwclBSInZA 提取码: bsc5 

实时语音通信的总结和深度学习降噪资料都可以直接在QQ群下载到

QQ群:音频信号处理读书会 485186545

如上群已满,请加新群: 音频处理与机器学习 238816966

   

2016-09-02 11:00:12 Yt7589 阅读数 4576
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    829 人正在学习 去看看 郭冰洋

在明白了去噪自动编码机(dA)的理论之后,在本篇博文中,我们将讨论用Theano来实现一个去噪自动编码机。

通过上篇博文的讨论,我们知道去噪自动编码机(dA)工作主要有四步组成:第一步是向原始输入信号中加入随机噪音(使原始信号在某些维度上值为零);第二步是将加入噪音的信号输入网络,经过编码器部分,在中间层生成输入信号的压缩信号;第三步是经过解码器层,在输出层得到输出信号;第四步将输出信号与原始输入信号相比较,求出误差,然后根据随机梯度下降算法,更新网络的连接权值。我们通过定义去噪自动编码机(DenosingAutoencoder)类,来实现这些功能,代码如下所示:

from __future__ import print_function

import os
import sys
import timeit

import numpy

import theano
import theano.tensor as T
from theano.tensor.shared_randomstreams import RandomStreams


class DenosingAutoencoder(object):
    def __init__(
        self,
        numpy_rng,
        theano_rng=None,
        input=None,
        n_visible=784,
        n_hidden=500,
        W=None,
        bhid=None,
        bvis=None
    ):
        self.n_visible = n_visible
        self.n_hidden = n_hidden
        if not theano_rng:
            theano_rng = RandomStreams(numpy_rng.randint(2 ** 30))
        if not W:
            initial_W = numpy.asarray(
                numpy_rng.uniform(
                    low=-4 * numpy.sqrt(6. / (n_hidden + n_visible)),
                    high=4 * numpy.sqrt(6. / (n_hidden + n_visible)),
                    size=(n_visible, n_hidden)
                ),
                dtype=theano.config.floatX
            )
            W = theano.shared(value=initial_W, name='W', borrow=True)

        if not bvis:
            bvis = theano.shared(
                value=numpy.zeros(
                    n_visible,
                    dtype=theano.config.floatX
                ),
                borrow=True
            )

        if not bhid:
            bhid = theano.shared(
                value=numpy.zeros(
                    n_hidden,
                    dtype=theano.config.floatX
                ),
                name='b',
                borrow=True
            )
        self.W = W
        self.b = bhid
        self.b_prime = bvis
        self.W_prime = self.W.T
        self.theano_rng = theano_rng
        if input is None:
            self.x = T.dmatrix(name='input')
        else:
            self.x = input
        self.params = [self.W, self.b, self.b_prime]

    def get_corrupted_input(self, input, corruption_level):
        return self.theano_rng.binomial(size=input.shape, n=1,
                                        p=1 - corruption_level,
                                        dtype=theano.config.floatX) * input

    def get_hidden_values(self, input):
        return T.nnet.sigmoid(T.dot(input, self.W) + self.b)

    def get_reconstructed_input(self, hidden):
        return T.nnet.sigmoid(T.dot(hidden, self.W_prime) + self.b_prime)

    def get_cost_updates(self, corruption_level, learning_rate):
        tilde_x = self.get_corrupted_input(self.x, corruption_level)
        y = self.get_hidden_values(tilde_x)
        z = self.get_reconstructed_input(y)
        L = - T.sum(self.x * T.log(z) + (1 - self.x) * T.log(1 - z), axis=1)
        cost = T.mean(L)
        gparams = T.grad(cost, self.params)
        updates = [
            (param, param - learning_rate * gparam)
            for param, gparam in zip(self.params, gparams)
        ]

        return (cost, updates)
在上面代码中,首先是去噪自动编码机的构造函数,在其中对网络参数进行初始化,各参数的含义如下所示:

numpy_rng:随机数生成引擎,用于生成随机的连接权值

input:网络的输入信号,如果是独立的去噪自动编码机,该值为空,如果是堆叠去噪自动编码机的话,则其为前一层去噪自动编码机的输出层

n_visible:输出层神经元数目

n_hidden:中间层神经元数目

W:层间神经元的连接权值矩阵

bhid:中间层神经元Bias值向量

bvis:输出层神经元Bias值向量

需要注意的是,我们所定义的去噪自动编码机(dA)采用中间隐藏层到输出层的连接权值向量是输入层到中间隐藏层连接权值向量的转置,即:。另外,我们信号重建过程中的交叉熵来定义我们的误差:

式1

在定义好了去噪自动编码机(dA)之后,我们来定义DAMnistEngine,用来装入MNIST数据,并对其进行训练,代码如下所示:

from __future__ import print_function

import os
import sys
import timeit

import numpy

import theano
import theano.tensor as T
from theano.tensor.shared_randomstreams import RandomStreams

from mnist_loader import MnistLoader
from denosing_autoencoder import DenosingAutoencoder
from dlt_utils import tile_raster_images

try:
    import PIL.Image as Image
except ImportError:
    import Image

class DAMnistEngine(object):
    def train(self, learning_rate=0.1, training_epochs=15,
                dataset='mnist.pkl.gz',
                batch_size=20, output_folder='dA_plots'):
        loader = MnistLoader()
        datasets = loader.load_data(dataset)
        train_set_x, train_set_y = datasets[0]
        n_train_batches = train_set_x.get_value(borrow=True).shape[0] // batch_size
        index = T.lscalar()    
        x = T.matrix('x')  
        if not os.path.isdir(output_folder):
            os.makedirs(output_folder)
        os.chdir(output_folder)
        self.train_da(x, learning_rate, train_set_x, index, batch_size, \
            training_epochs, n_train_batches, 'filters_corruption_0.png', 0.0)
        self.train_da(x, learning_rate, train_set_x, index, batch_size, \
            training_epochs, n_train_batches, 'filters_corruption_30.png', 0.3)
        os.chdir('../')

    def train_da(self, x, learning_rate, train_set_x, index, batch_size, 
                        training_epochs, n_train_batches, 
                        img_file, 
                        corruption_level=0.0):
        rng = numpy.random.RandomState(123)
        theano_rng = RandomStreams(rng.randint(2 ** 30))
        da = DenosingAutoencoder(
            numpy_rng=rng,
            theano_rng=theano_rng,
            input=x,
            n_visible=28 * 28,
            n_hidden=500
        )
        cost, updates = da.get_cost_updates(
            corruption_level=corruption_level,
            learning_rate=learning_rate
        )
        train_da = theano.function(
            [index],
            cost,
            updates=updates,
            givens={
                x: train_set_x[index * batch_size: (index + 1) * batch_size]
            }
        )
        start_time = timeit.default_timer()
        for epoch in range(training_epochs):
            c = []
            for batch_index in range(n_train_batches):
                c.append(train_da(batch_index))
            print('Training epoch %d, cost ' % epoch, numpy.mean(c))
        end_time = timeit.default_timer()
        training_time = (end_time - start_time)
        print(('The no corruption code for file ' +
               os.path.split(__file__)[1] +
               ' ran for %.2fm' % ((training_time) / 60.)), file=sys.stderr)
        image = Image.fromarray(
            tile_raster_images(X=da.W.get_value(borrow=True).T,
                               img_shape=(28, 28), tile_shape=(10, 10),
                               tile_spacing=(1, 1)))
        image.save(img_file)

    def run():
        print('run Denosing Autoencoder...')
在上面的代码中,我们分别用原始信号和有30%噪音的信号作为输入信号,训练我们的去噪自动编码机(dA)网络,并将训练完成后的权值,以图像的形式打印出来,大家可以看到两种方式训练结束后的权值差异。

我们可以通过如下代码,运行并训练我们的去噪自动编码机(dA):

from d_a_mnist_engine import DAMnistEngine

if __name__ == '__main__':
    engine = DAMnistEngine()
    engine.train()
由于去噪自动编码机(dA)很少单独使用,所以我们就不再讨论单独运行的问题了,我们在堆叠去噪自动编码机(dA)中再讨论这一问题。

有了单层的去噪自动编码机(dA)之后,我们将在下一篇博文中讨论堆叠自动编码机(dA)的原理、实现和应用。

2018-05-20 18:47:35 weixin_41923961 阅读数 14581
  • 深度学习图像处理之垃圾分类

    图像分类是图像处理领域的基本任务,同时也是深度学习领域的“Hello Word”,掌握好相关的基础知识,才能更好地开展识别、分割、去噪等更加复杂的任务。本课程将以当下最火热的垃圾分类作为主题,手把手地带领大家实现图像分类任务的完整过程。课程可以分为三个板块: (1)深度学习在图像处理领域的发展过程; (2)解析经典的卷积神经网络; (3)垃圾分类实战。本课程将使用Pytorch深度学习框架进行实战,并在ubuntu系统上进行演示,包括:不同标注文件下的数据集读取、编写卷积神经网络、训练垃圾分类数据集、测试训练网络模型、网络可视化、性能评估等。

    829 人正在学习 去看看 郭冰洋

深度学习图像去噪发展概述

由于深度学习,特别是卷积神经网络(CNN)在图像识别等领域取得了较好的成果,近年来,基于深度学习的图像去噪方法也被提出并得到了发展。2008年,Viren Jain等提出用CNN处理自然图像的去噪问题[21],得到了与常规方法(如小波变换和马尔可夫随机场)相近或更优的结果。并说明了特定形式的CNN可以被视为图像去噪的马尔可夫模型推断的结果的一种近似,但是神经网络模型可以避免了马尔可夫模型在概率学习和推断过程中的计算困难,从而降低了计算的复杂度。在训练神经网络的过程中为了更加快速和准确的收敛,采取了逐层训练的方法。该方法网络结构如下图所示:

这里写图片描述

图2.1 Viren Jain等的图像去噪卷积神经网络模型(CN1和CN2区别于训练集的不同)

该网络由四个隐含层组成,每个隐含层含有24个特征通道,每一个特征通道都与8个随机选择的上一层的特征通道相连接。该网络的卷积核大小为5×5,网络的损失函数为带噪图像经过神经网络去噪后的恢复图像和真实图像的误差平方和,即:。除了对噪声已知的情况进行训练和去噪,作者还测试了噪声未知情况下的去噪情况,将在σ=[0,100]的范围内随机变化的不同水平的噪声加入真实图像,并进行训练,此时将隐含层设置为5层,相对于传统方法也取得了较好的效果。

2012年,Xie等利用栈式去噪自编码器(stacked denoising auto-encoder)进行图像去噪以及图像修复(image inpainting)[22],其网络结构为多层的全连接网络,如图2.2所示。

这里写图片描述

图2.2 栈式稀疏去噪自编码器(SSDA)

为了将稀疏编码的思想和深度神经网络结合,作者提出了栈式稀疏去噪自编码器(stacked sparse denoising auto-encoder, SSDA),其损失函数如下: 
这里写图片描述 
其中KL散度中的ρ^ 代表隐含层激活函数输出的平均值,如果我们设定较小的ρ,则可以通过优化损失函数,使得每一层中被激活的神经元尽可能少,以此达到稀疏约束的目的。训练过程为逐层训练,每训练完一层后,将训练用的数据(带噪图像)和标签(真实图像)都通过该层,将输出送至下一层作为数据和标签进行训练。 
Burger等人提出了用多层感知机(Multi Layer Perceptron,MLP)的方法实现神经网络去噪[23],并说明如果训练集足够,MLP模型可以达到图像去噪的当前最优水平。MLP模型对噪声类型不敏感,对于不同类型的噪声,只要对带有该类噪声的图像进行处理,即可得到较好的结果。作者认为,MLP相对于CNN的优点在于,MLP可以近似所有函数,而CNN可以学习到的函数相对有限。为了使MLP网络达到最优水平,训练网络应足够大,分割图像得到的区块大小应足够大,以及训练集也应足够大。该方法的一个不足之处为它无法适应不同强度的噪声,若将不同水平的噪声图像作为输入进行训练则无法达到对特定噪声进行训练时的结果。 
2016年,Mao等提出了深度的卷积编解码网络应用于图像去噪[24]。编码(Encoding)和解码(Decoding)结构对称,且每隔较少层就存在一条由编码卷积层到与其对称的解码层的跨层连接。该网络结构如图2.3所示。该网络共采用了对称的10层卷积层,其中前5层为编码层,后5层为解码层。在该CNN网络的编码层中,每隔2层就用一条跳线将编码层连接到对称的解码层,因此可以直接进行正向和反向传播。从该网络开始,图像去噪神经网络层数开始向更深层发展。以前的神经网络层数普遍较浅,原因在于:一方面,与图像分类等问题只需要提取关键特征的任务不同,图像的复原要求图像的细节在网络传播中不能丢失,而网络层数变深可能会导致图像细节的丢失;另一方面,层数较深容易在训练过程中导致梯度弥散,不容易收敛到最优解。由于该网络采用了卷积和解卷积层间的跳线连接,因此可以较好的解决上述的问题,因此网络相对较深。

这里写图片描述

图2.3 卷积编解码去噪网络结构(示跳线)

2017年,Zhang等提出用较深层的CNN网络,称为DnCNN[25],实现去噪,为了解决网络层数加深导致的梯度弥散效应,DnCNN并不对图像进行学习,而是以输出与噪声的l2范数为损失函数来训练网络。网络结构如图2.4所示。DnCNN网络可以视为一个残差学习的过程,这样可以较好的训练。在该网络中利用了BN层(Batch Normalization),实验表明BN层与残差学习共同使用可以提高模型的性能,DnCNN在不同噪声水平上训练,得到的结果要优于现在的最优结果,如BM3D等。

这里写图片描述

图2.4 DnCNN 网络结构

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