end to end 与 HED

end to end 这个是我在HED这个深度学习中看到。这里记录下,它是什么东西。

原文中提出的end-to-end的边缘检测系统,称为holistically-nested edge detection (HED),使用holistically来表示边缘预测的结果是基于图像到图像的,端到端的过程;而nested则强调了在生成的输出过程中不断地继承和学习得到精确的边缘预测图的过程(具体算法后面再说明)。这里使用多尺度的方法进行特征的学习,多尺度下的该方法边缘检测结果示意图如下图,图中的d,e,f分别为卷积层2,3,4响应得到的边缘检测结果,HED方法的最后输出是远远优于canny算子的。 
-这里写图片描述

算法结构: 
具体算法结构上,作者提出的holistically-nested方法,主要通过几种不同的多尺度深度学习下的结构进行对比说明。在多尺度方面,有更加内部网络形成的多尺度,和外部网络形成的多尺度。前者是学习神经网络里不同层由于降采样的不同得到的不同尺度特征,结合形成多尺度,后者是通过对输入图像的尺度处理时的多尺度,获得不同尺度信息。作者将具体多尺度下的深度学习分为四种,如下图。 

这里写图片描述


(a)Multi-stream learning 示意图,可以看到图中的平行的网络下,每个网络通过不同参数与receptive field大小的不同,获得多尺度的结果。输入影像是同时进入多个网络处理,得到的特征结果直接反应多尺度。 
(b)Skip-layer network learning 示意图,该方法主要连接各个单的初始网络流得到特征响应,并将响应结合在一起输出。 
这里(a)和(b)都是使用一个输出的loss函数进行单一的回归预测,而边缘检测可能通过多个回归预测得到结合的边缘图效果更好。 
(c)Single model on multiple inputs 示意图,单一网络,图像resize方法得到多尺度进行输入,该方法在训练和test过程均可加入。同时在非深度学习中也有广泛应用。 
(d)Training independent networks ,从(a)演化来,通过多个独立网络分别对不同深度和输出loss进行多尺度预测,该方法下训练样本量较大。 
(e)Holistically-nested networks,本文提出的算法结构,从(d)演化来,类似地是一个相互独立多网络多尺度预测系统,但是将multiple side outputs组合成一个单一深度网络。

代码测试: 
下载hed之后,caffe编译完成之后,按照readme.txt文件当中进行数据以及模型文件的下载。 
在example是/hed文件夹下面应该有7个文件,deploy.prototxt  ,solve.py   ,solver.prototxt  ,  HED-tutorial.ipynb , train_val.prototxt,最后还有两个模型文件(自己下载的,要放在这个路径之下)。 
deploy.prototxt ,solver.prototxt ,train_val.prototxt,训练网络的配置文件,solve.py进行训练。这些都是网络训练必要的。我也进行了训练是可以直接来训练的。

网络模型的测试:HED-tutorial.ipynb这个文件是进行测试的,注意理解里面的意思,对于我一开始想要换其他图片进行测试,然而我并不知道怎么换没有理解里面参数的意思。这里,我告诉大家,想要换其他test文件夹中的图片进行测试需要改一个参数就好

idx=11

该这个参数就好,0-199,就可以随便测试里面的图片了 


End to End(端到端)
回答1:
论文《End to End Learning for Self-Driving Cars》里面提到,他们训练了一个CNN,能够把从前置摄像头获取图像中从像素到最终控制车辆行驶指令。也就是:像素–>指令。
回答2:
不同人对end2end有不同定义。你可以定义成从图像到最终结果,还可以在前面再增加一个获取数据,从获取数据到最终结果;甚至从申请项目到得到最终结果。。。。好吧,一层一层剥削啊。反正,这个词不太好,不严谨。
回答3:
提供了从数据处理到为用户提供解决方案的整个过程。
回答4:
用一个任务来搞定所有相关的任务。因此end2end意思是一口气做好整个事情,包括数据流、算法选择和参数调整、算法相关硬件、结果可视化
总结:
看了这几个回答,end2end的意思在不同人看来有不同理解,但是作为程序员/深度学习,应当理解为:至少是从处理过的图像–>最终目标结果(比如分类结果、检测结果、分割结果等)的一个流程,


张旭--------------------------------->

 

端到端指的是输入是原始数据,输出是最后的结果,原来输入端不是直接的原始数据,而是在原始数据中提取的特征,这一点在图像问题上尤为突出,因为图像像素数太多,数据维度高,会产生维度灾难,所以原来一个思路是手工提取图像的一些关键特征,这实际就是就一个降维的过程。
那么问题来了,特征怎么提?
特征提取的好坏异常关键,甚至比学习算法还重要,举个例子,对一系列人的数据分类,分类结果是性别,如果你提取的特征是头发的颜色,无论分类算法如何,分类效果都不会好,如果你提取的特征是头发的长短,这个特征就会好很多,但是还是会有错误,如果你提取了一个超强特征,比如染色体的数据,那你的分类基本就不会错了。
这就意味着,特征需要足够的经验去设计,这在数据量越来越大的情况下也越来越困难。
于是就出现了端到端网络,特征可以自己去学习,所以特征提取这一步也就融入到算法当中,不需要人来干预了。

 

YJango---------------------------->

 


经典机器学习方式是以人类的先验知识将raw数据预处理成feature,然后对feature进行分类。分类结果十分取决于feature的好坏。所以过去的机器学习专家将大部分时间花费在设计feature上。那时的机器学习有个更合适的名字叫feature engineering

后来人们发现,利用神经网络,让网络自己学习如何抓取feature效果更佳。于是兴起了representation learning。这种方式对数据的拟合更加灵活。

网络进一步加深,多层次概念的representation learning将识别率达到了另一个新高度。于是你听到了是个搞机器学习的人都知道的名字:deep learning。实指多层次的特征提取器识别器统一训练和预测的网络。

end to end的好处:通过缩减人工预处理和后续处理,尽可能使模型从原始输入到最终输出,给模型更多可以根据数据自动调节的空间,增加模型的整体契合度。

拿语音识别为具体实例。普遍方法是将语音信号转成频域信号,并可以进一步加工成符合人耳特点的MFCC进行编码(encode)。也可以选择Convolutional layers对频谱图进行特征抓取。这样可在encode的部分更接近end to end 中的第一个end。

但识别出的结果并不可以告诉我们这段语音到底是什么。DNN-HMM混合模型还需要将DNN识别出的结果通过HMM来解码(decode)。而RNN-CTC就将HMM的对齐工作交给了网络的output layer来实现。在decode的部分更接近end to end 中的第二个end。

 

王赟---------------------------->

我的理解跟@YJango 不太一样。我就在语音识别的范围内说说我的理解吧。

传统的语音识别系统,是由许多个模块组成的,包括声学模型、发音词典、语言模型。其中声学模型和语言模型是需要训练的。这些模块的训练一般都是独立进行的,各有各的目标函数,比如声学模型的训练目标是最大化训练语音的概率,语言模型的训练目标是最小化 perplexity。由于各个模块在训练时不能互相取长补短,训练的目标函数又与系统整体的性能指标(一般是词错误率 WER)有偏差,这样训练出的网络往往达不到最优性能。

针对这个问题,一般有两种解决方案:

  • 端到端训练(end-to-end training):一般指的是在训练好语言模型后,将声学模型和语言模型接在一起,以 WER 或它的一种近似为目标函数去训练声学模型。由于训练声学模型时要计算系统整体的输出,所以称为「端到端」训练。可以看出这种方法并没有彻底解决问题,因为语言模型还是独立训练的。
  • 端到端模型(end-to-end models):系统中不再有独立的声学模型、发音词典、语言模型等模块,而是从输入端(语音波形或特征序列)到输出端(单词或字符序列)直接用一个神经网络相连,让这个神经网络来承担原先所有模块的功能。典型的代表如使用 CTC 的 EESEN [1]、使用注意力机制的 Listen, Attend and Spell [2]。这种模型非常简洁,但灵活性就差一些:一般来说用于训练语言模型的文本数据比较容易大量获取,但不与语音配对的文本数据无法用于训练端到端的模型。因此,端到端模型也常常再外接一个语言模型,用于在解码时调整候选输出的排名(rescoring),如 [1]。

「端到端训练」和「端到端模型」的区分,在 [2] 的 introduction 部分有比较好的论述。

与 @YJango 的答案不同,我觉得「输入是语音波形(raw waveform)」并不是端到端模型的本质特征,端到端模型的输入也可以是特征序列(MFCC 等)。端到端模型的本质特征是把声学模型、发音词典、语言模型这些传统模块融合在一起。

参考文献:
[1] Yajie Miao, Mohammad Gowayyed, and Florian Metze, "EESEN: End-to-End Speech Recognition using Deep RNN Models and WFST-based Decoding," in Proc. ASRU 2015.
[2] William Chan, et al. "Listen, attend and spell: A neural network for large vocabulary conversational speech recognition," in Proc. ICASSP 2016.

 

陈永志-------------->
 

我从目标检测角度来说说我对end-to-end的理解。

非end-to-end方法:
目前目标检测领域,效果最好,影响力最大的还是RCNN那一套框架,这种方法需要先在图像中提取可能含有目标的候选框(region proposal), 然后将这些候选框输入到CNN模型,让CNN判断候选框中是否真的有目标,以及目标的类别是什么。在我们看到的结果中,往往是类似与下图这种,在整幅图中用矩形框标记目标的位置和大小,并且告诉我们框中的物体是什么。
这种标记的过程,其实是有两部分组成,一是目标所在位置及大小,二是目标的类别。在整个算法中,目标位置和大小其实是包含在region proposal的过程里,而类别的判定则是在CNN中来判定的。这种标记的过程,其实是有两部分组成,一是目标所在位置及大小,二是目标的类别。在整个算法中,目标位置和大小其实是包含在region proposal的过程里,而类别的判定则是在CNN中来判定的。

end-to-end方法:
end-to-end方法的典型代表就是有名的yolo。前面的方法中,CNN本质的作用还是用来分类,定位的功能其并没有做到。而yolo这种方法就是只通过CNN网络,就能够实现目标的定位和识别。也就是原始图像输入到CNN网络中,直接输出图像中所有目标的位置和目标的类别。这种方法就是end-to-end(端对端)的方法,一端输入我的原始图像,一端输出我想得到的结果。只关心输入和输出,中间的步骤全部都不管。

 

杨楠---------------------->

 

end-end在不同应用场景下有不同的具体诠释,对于视觉领域而言,end-end一词多用于基于视觉的机器控制方面,具体表现是,神经网络的输入为原始图片,神经网络的输出为(可以直接控制机器的)控制指令,如:

1. Nvidia的基于CNNs的end-end自动驾驶,输入图片,直接输出steering angle。从视频来看效果拔群,但其实这个系统目前只能做简单的follow lane,与真正的自动驾驶差距较大。亮点是证实了end-end在自动驾驶领域的可行性,并且对于数据集进行了augmentation。链接:https://devblogs.nvidia.com/parallelforall/deep-learning-self-driving-cars/

2. Google的paper: Learning Hand-Eye Coordination for Robotic Grasping with Deep Learning and Large-Scale Data Collection,也可以算是end-end学习:输入图片,输出控制机械手移动的指令来抓取物品。这篇论文很赞,推荐:https://arxiv.org/pdf/1603.02199v4.pdf

3. DeepMind神作Human-level control through deep reinforcement learning,其实也可以归为end-end,深度增强学习开山之作,值得学习:http://www.nature.com/nature/journal/v518/n7540/full/nature14236.html

4. Princeton大学有个Deep Driving项目,介于end-end和传统的model based的自动驾驶之间,输入为图片,输出一些有用的affordance(实在不知道这词怎么翻译合适…)例如车身姿态、与前车距离、距路边距离等,然后利用这些数据通过公式计算所需的具体驾驶指令如加速、刹车、转向等。链接:http://deepdriving.cs.princeton.edu/

总之,end-end不是什么新东西,也不是什么神奇的东西,仅仅是直接输入原始数据,直接输出最终目标的一种思想。

 

胖子不胖------------------------>

 

其实就是joint learning.

end-to-end 的本质是你要解决的问题是多阶段的或多步的(跟所谓的raw feature没啥关系)。如果分阶段学习的话,第一阶段的最优解不能保证第二阶段的问题达到最优。end-to-end把他们堆在一起来优化,确保最后阶段的解达到最优。

 

想飞的石头-------------------------->

 

因为多层神经网络被证明能够耦合任意非线性函数,通过一些配置能让网络去做以前需要人工参与的特征设计这些工作,然后配置合适的功能如classifier,regression,而现在神经网络可以通过配置layers的参数达到这些功能,整个输入到最终输出无需太多人工设置,从raw data 到最终输出指标。


我的理解  一端图片 一端给出结果   或者 在场景中,摄像头给出图像,这个图片喂给cnn,给出结果。连个过程是串联的关系。