MyException - 我的异常网
当前位置:我的异常网» 综合 » 《DSOD:Learning Deeply Supervised Object Detecto

《DSOD:Learning Deeply Supervised Object Detectors from Scratch》通译

www.MyException.Cn  网友分享于:2013-09-28  浏览:0次
《DSOD:Learning Deeply Supervised Object Detectors from Scratch》翻译

论文原文地址:https://arxiv.org/pdf/1708.01241

DSOD:从零开始深度有监督学习目标检测器

Abstract摘要:

        我们提出了深入的监督对象检测器(DSOD),一个框架,可以从零开始学目标探测器。艺术对象的对象的状态在很大程度上依赖于下架网络预培训的大规模数据分类如ImageNet,造成学习偏差由于双方的损失函数和分类和检测任务之间的类别分布的差异。对检测任务进行模型微调可以在一定程度上缓解这种偏见,但不能从根本上消除这种偏见。此外,将经过训练的模型从分类转移到差异域之间的检测更加困难(例如RGB到深度图像)。一个更好的解决方案来解决这些问题是从头培养目标探测器,这促使我们提出的关系和。由于目标检测中复杂的损失函数和有限的训练数据,在这一方向上的许多努力都失败了。在DSOD,我们有一套培训对象检测器的设计原则,从零开始。其中一个关键的发现是,深层的监督,由密集的层间连接,在学习一个好的探测器中起着关键的作用。结合其他几个原则,我们开发的关系和单次检测以下(SSD)框架。在PASCALVOC2007,2012和MS的关系和可可的数据集的实验表明,可以达到更好的结果比国家的最先进的解决方案和更紧凑的模型。例如,优于SSD的关系和所有三个基准与实时检测的速度,而只需要1/2和1/10参数的SSD参数快RCNN。我们的代码和模型有:https://github.com/szq0214/dsod

1.Introduction简介

        卷积神经网络(CNN)已经在许多计算机视觉任务产生了引人注目的的性能改进,如图像分类[17,28,32,9,10],对象检测[5,4,27,19,21,25][23,图像分割,8,2,36]等。在过去的许多年,创新网络结构已经提出。szegedy等。[32]提出的“开始”模块的特点,将城市地图生产各种尺寸的过滤器。氦等。[9]提出的残留箕斗连接块的学习与训练,这使甚深网与超过100层。黄等。[10]提出densenets与密层明智的连接。谢谢这些优秀的网络结构,在大学的许多视觉任务的精度greatly已经提高了。他们在冰上,一个对象检测的运动区域fastest鸽ITS应用在广域监视,自主驾驶等。
        为了获得良好的性能,大多数高级对象检测系统对ImageNet[3]进行了预处理。这个微调过程也被视为迁移学习[24]。从预培训的模型中进行微调至少有两个优点。首先,有许多最先进的深刻模型可以公开发布。将它们重新用于对象检测非常方便。其次,微调可以快速生成最终的模型,并且比分类任务要求更少的实例级注解训练数据。
        然而,在物体检测中采用预先训练的网络也存在关键的局限:(1)有限的结构设计空间。预先训练的网络模型主要来自基于ImageNet的分类任务,通常非常重-包含大量参数。现有的对象检测器直接采用预先训练的网络,因此控制/调整网络结构的灵活性很小(即使是网络结构的小变化)。计算资源的要求也受到沉重的网络结构的约束。(2)学习偏见由于分类和检测任务之间的损失函数和类别分布不同,我们认为这将导致不同的搜索/优化空间。因此,学习可能偏向本地最小值,这对于检测任务来说不是最好的。(3)域不匹配。众所周知,微调可以减轻由于不同目标类别分布引起的差距。然而,当源域(ImageNet)与目标域(例如深度图像,医学图像等)具有巨大的不匹配时,仍然是一个严重的问题[7]。
        我们的工作是有以下两个问题的。首先,是否可以从头开始训练对象检测网络?第二,如果第一个答案是肯定的,是否有任何原则设计一个资源有效的网络结构来进行物体检测,同时保持较高的检测精度?为了达到这个目标,我们提出了深度监督的反射探测器(DSOD),这是一个简单而高效的框架,可以从头开始学习物体探测器。DSOD相当灵活,因此我们可以为不同的计算平台(如服务器,桌面,移动甚至嵌入式设备)定制各种网络结构。
        我们为设计DSOD提供了一套原则。一个关键点是深度监督起着关键作用,这是由[18,35]的工作所驱动的。在[35]中,谢等人提出了一种用于边缘检测的整体嵌套结构,其中包括每个基站网络转发的侧向输出层,用于明确的深度监督。本文采用DenseNet[10]中提出的密集层次连接,而不是使用带有视差输出层的多重切入损失信号。密集结构不仅在骨干子网中采用,而且在前端多尺度预测层中采用。图1示出了前端预测层的结构比较。多分辨率预测图的融合和再利用有助于保持甚至提高最终精度,同时在一定程度上减少模型参数。
        我们的主要贡献总结如下:
        (1)根据我们所知,我们提供了可以从头开始研究物体检测网络的世界第一框架的DSOD,具有最先进的性能。
        (2)我们介绍并验证了一套原理,从零开始逐步消融研究设计高效的物体检测网络。
        (3)我们显示,我们的DSOD可以实时处理速度和更紧凑的型号,在三个标准基准(PASCALVOC2007,2012和MSCOCO数据集)上实现最先进的性能。

2.RelatedWork相关工作

        对象检测。最先进的基于CNN的对象检测方法可以分为两类:(i)区域基于提案的方法和(ii)无提议方法。
        基于提议的方法包括R-CNN[5],FastRCNN[4],更快的R-CNN[27]和R-FCN[19]。R-CNN使用选择性搜索[34]首先生成图像中的潜在对象区域,然后对所提出的区域进行分类。R-CNN需要高的计算成本,因为每个区域由CNN网络分开处理。快速R-CNN和更快的R-CNN通过共享计算和使用神经网络来生成区域提案来提高效率。R-FCN通过删除完全连接的层并采用位置敏感分数图进一步提高速度和精度,以进行最终检测。
        近来已经提出了诸如YOLO[25]和SSD[21]等无提议方法进行实时检测。YOLO使用单个前馈卷积网络直接预测对象类和位置。与基于区域的方法相比,YOLO不再需要进行第二次每个区域的分类操作,因此它非常快。SSD在几个方面改进了YOLO,包括(1)使用小卷积滤波器来预测边界盒位置的类别和锚定偏移;(2)使用金字塔特征进行不同尺度的预测;和(3)使用默认框和宽高比来调整不同的对象形状。我们提出的DSOD基于SSD框架,因此它继承了SSD的速度和精度优势,同时生产更小更灵活的型号。网络架构检测。对图像分类的网络架构设计进行了大量的努力。出现了许多不同的网络,如AlexNet[17],VGGNet[28],GoogLeNet[32],ResNet[9]和DenseNet[10]。同时,还提出了几种正则化技术[29,12]来进一步提高模型能力。大多数检测方法[5,4,27,21]直接利用预先训练的ImageNet模型作为骨干网。
        其他一些作品设计了特定的骨架网络结构进行物体检测,但是首先需要对ImageNet分类数据集进行预培训。例如,YOLO[25]定义了一个具有24个卷积层的网络,其后是2个完全连接的层。YOLO9000[26]通过提出一个名为Darknet-19的新网络来改进YOLO,该网络是VGGNet的简化版本[28]。Kim等人[15]提出了用于对象检测的PVANet,其由GoogleNet的简化“初始”块组成。Huangetal。[11]研究了网络结构和检测框架的不同组合,发现使用InceptionResNet-v2[31]的更快的R-CNN[27]实现了最高的性能。在本文中,我们还考虑了通用对象检测的网络结构。然而,拟议的DSOD不再需要ImageNet的预训练。
        从头开始学习深层模型。据我们所知,没有从头开始训练物体检测网络的作品。所提出的方法与现有解决方案相比具有非常好的优势。我们将在以下部分中详细说明和验证该方法。在语义分割中,Jegou等[13]表明,精心设计的网络结构可以在不使用预先训练的模型的情况下胜过最先进的解决方案。它通过添加上采样路径来恢复完整的输入分辨率,将DenseNets扩展到完全卷积网络。

3.DSOD

        在本节中,我们首先介绍我们的DSOD架构及其组件,并阐述几个重要的设计原则。然后我们描述训练设置。

3.1.DSOD Architecture DSOD架构

        整体框架所提出的DSOD方法是一个类似SSD的多尺度无提议检测框架[21]。DSOD的网络结构可以分为两部分:骨干子网特征提取和前端子网预测多尺度响应图。骨干子网是深度监督的DenseNets[10]结构的变体,由一个干块,四个密集块,两个过渡层和两个过渡w/o合并层组成。前端子网(或称为DSOD预测层)通过精细的密集结构融合多尺度预测响应。图1示出了所提出的DSOD预测层以及SSD中使用的多尺度预测图的平面结构[21]。完整的DSOD网络架构1详见表1.我们在下面详细阐述了每个组件及相应的设计原则。
        原则1:无提议。我们调查了所有最先进的基于CNN的物体检测器,发现它们可以分为三类。首先,R-CNN和FastR-CNN需要外部对象提案生成器,如选择性搜索。第二,更快的R-CNN和R-FCN需要综合区域提案网(RPN)来产生相对较少的区域提案。第三,YOLO和SSD是单次和无提议的方法,其处理对象位置和边界框坐标作为回归问题。我们观察到,只有无提议的方法(第3类)才能在没有预先训练的模型的情况下成功地收敛。我们推测这是由于RoI(区域感兴趣)集中在其他两类方法中-RoIpooling为每个区域提案生成特征,这阻碍了梯度从区域级到卷积特征图的顺利反向传播。基于提议的方法与预培训的网络模型一起工作良好,因为参数初始化对于RoI池之前的那些层是有好处的,而从头开始训练是不正确的。
        因此,我们达成了第一个原则:从零开始的培训检测网络需要一个无提议框架。实际上,我们从SSD框架[21]推出了一个多尺度的无提议框架,因为它可以达到最先进的精度,同时提供快速的处理速度。原则2:深度监督。深入监督学习的有效性已经在GoogLeNet[32],DSN[18],DeepID3[30]等中得到证明。中心思想是提供综合目标函数作为对较早隐藏层的直接监督,而不是仅在输出层。这些“伴侣”或“辅助”目标函数在多个隐藏层可以减轻“消失”梯度问题。无提议检测框架包含分类丢失和本地化损失。明确的解决方案需要添加复杂的视频输出层,以便在每个隐藏层为检测任务引入“伴随”目标,类似于[35]。在这里,我们通过DenseNets[10]中介绍的一种优雅而隐含的密集层次连接方式来强化深度监督。当块中的所有先前层连接到当前层时,块被称为密集块。因此,DenseNet中的较早层可以通过跳过连接从目标函数中接收额外的附件。虽然在网络顶部只需要一个单一的损耗功能,但是包括较早层的所有层仍然可以共享被阻止的信号。我们将在4.1.2节验证深度监督的好处。过渡w/o池层。我们介绍这个层,以增加密集块的数量,而不会降低最终的特征图分辨率。在DenseNet的原始设计中,每个过渡层包含一个池操作,用于对特征图进行抽样。如果要保持相同的输出规模,密集块的数量是固定的(所有DenseNet架构中的4个密集块)。增加网络深度的唯一方法是在原始DenseNet的每个块中添加层。过渡w/o池层消除了对DSOD体系结构中密集块数量的限制,也可以在标准DenseNet中使用。
        原理3:茎块。由Inception-v3[33]和v4[31]驱动,我们将茎块定义为三个3×3卷积层的堆叠,然后是2×2个最大合并层。第一个转换层与stride=2一起工作,另外两个步长为1。我们发现,添加这个简单的树干结构可以显着提高我们的实验中的检测性能。我们推测,与DenseNet(7×7转换层,stride=2,之后是3×3最大池,stride=2)的原始设计相比,干块可以减少原始输入图像的信息丢失。我们将会显示,这个干块的奖励对于4.1.2节的检测性能是重要的。
        原则4:密集预测结构。图1示出了平面结构(如SSD)和我们提出的前端子网中的密集结构的比较。SSD将预测层设计为不对称沙漏结构。对于300×300输入图像,应用六个尺度的特征图来预测物体。Scale-1特征图来自骨干子网的中间层,其具有最大分辨率(38×38),以处理图像中的小对象。其余五个规模位于骨干子网的顶部。然后,在两个相邻尺度的特征图之间采用具有瓶颈结构的平坦过渡层(用于减少特征图的数量加上3×3转换层的1×1转换层)[33,9]。
        学习一半,重复使用一半。在SSD中的平面结构(见图1)中,每个后续的比例从相邻的前一个比例直接转换。我们提出了密集的预测结构,为每个尺度融合多尺度信息。为了简单起见,我们限制每个尺度输出相同数量的预测特征图的通道。在DSOD中,在每个尺度(除了scale-1之外)中,一半的特征图从前一个比例通过一系列的转换层学习,而剩余的一半特征图从直观的高分辨率图像中直接进行采样,分辨率特征图。下采样块由2×2,步幅=2最大合并层,后跟1×1,步幅=1转换层组成。池层旨在在分级时将分辨率与当前大小相匹配。1×1转换层用于将通道数减少到50%。汇集层放置在1×1转换层之前,以考虑降低计算成本。该下采样块实际上带有来自其所有先前尺度的多分辨率特征图的每个尺度,其基本上与在DenseNets中引入的致密分层连接相同。对于每个比例,我们只学习一半的新功能地图,并重用剩下的一半。这个密集的预测结构可以产生比平原结构更少的参数的更准确的结果,这将在第4.1节中进行研究。

3.2.TrainingSettings训练设置

        我们基于Caffe框架来实现我们的检测器[14]。我们所有的模型都是从NVIDIATitanXGPU上的SGD求解器开始的。由于每个尺度的DSOD特征映射都是从多个分辨率连接起来的,所以我们采用L2归一化技术[22],将特征范数扩展到所有输出的20。请注意,SSD仅将此归一化应用于Scale-1。我们的大多数培训策略都遵循固态硬盘,包括数据增加,默认框的规模和宽高比以及损失函数(例如,用于本地化的平滑L1损耗和用于分类目的的softmax损耗),而我们有自己的学习速率调度和mini-批量大小设置。细节将在实验部分给出。

4.Experiments实验

        我们对广泛使用的PASCALVOC2007,2012和MSCOCO数据集进行实验,分别具有20,20,80个对象类别。物体检测性能以平均精度(mAP)测量。

4.1.Ablation Study on PASCAL VOC 2007 PASCALVOC2007消融研究

        我们首先调查我们的DSOD框架的每个组件和设计原理。结果主要总结在表2和表3中。我们使用我们的DSOD300(300×300输入)为PASCALVOC2007设计了几个受控实验用于此消融研究。对所有实验施加一致的设置,除非检查某些组件或结构。在本研究中,我们用VOC2007火车和2012年火车(“07+12”)的综合训练组训练车型,并对VOC2007测试仪进行了测试。

4.1.1Configurations in Dense Blocks 密集块中的配置

        我们首先研究不同配置对骨干子网密集块的影响。
        过渡层压缩因子。我们比较了密集网过渡层中的两个压缩因子值(θ=0.5,1)。结果示于表3(行2和3)。压缩因子θ=1表示过渡层中没有特征图减少,而θ=0.5意味着要素图的一半减少。结果表明,θ=1,mAP比θ=0.5高2.9%。
        #瓶颈层的渠道。如表3(第3行和第4行)所示,我们观察到更宽的瓶颈层(具有更多的响应映射通道)大大提高了性能(4.1%mAP)。
        #第一次转换层的通道我们观察到,第一个转换层中的大量通道是有益的,这带来了1.1%的mAP改进(在表3中列4和5)。
增长率。发现较大的增长率k好得多。当增加k从16到48与4k瓶颈通道时,我们观察到表3(行5和6)中的4.8%mAP改进。

4.1.2EffectivenessofDesignPrinciples设计原则的有效性

        我们现在证明了早先阐述的关键设计原则的有效性。
        无提议框架。我们尝试使用基于提议的框架(如FasterR-CNN和R-FCN)从头开始训练对象检测器。然而,对于我们尝试的所有网络结构(VGGNet,ResNet,DenseNet),培训过程未能收敛。我们进一步尝试使用无提议框架SSD来训练对象检测器。培训收敛成功,但是比起前一种训练模式微调的情况(75.8%),结果更为糟糕(VGG为69.6%),如表4所示。本实验验证了我们的设计原则,自由框架。
        深度监督然后,我们从零开始就深入监督对物体探测器进行训练。我们的DSOD300实现了77.7%的mAP,远远优于使用VGG16(69.6%)从未经过严格监督的从零开始的SSD300S。它也比SSD300(75.8%)的微调结果好得多。这验证了深度监督的原则。
        过渡w/o池层。我们比较没有这个设计层(只有3个密集块)和设计层的情况(我们设计中的4个密集块)的情况。骨干网是DS/32-12-16-0.5。结果如表3所示。具有Transitionw/o汇集层的网络结构带来1.7%的性能增益,从而验证了该层的有效性。
        茎块。从表3(第6行和第9行)可以看出,阀杆块的性能从74.5%提高到77.3%。这验证了我们的猜想,即使用stemblock可以保护原始输入图像中的信息丢失。
        密集预测结构。我们从三个方面分析了密度预测结构:速度,精度和参数。如表4所示,由于来自额外的下采样块的开销,TitanXGPU上的DSOD具有密集的前端结构,运行速度略低于平面结构(17.4fps与20.6fps)。然而,密集结构将mAP从77.3%提高到77.7%,同时将参数从18.2M降低到14.8M。表3给出了更多的细节(第9行和第10行)。我们还试图用提出的密集预测层替代SSD中的预测层。使用VGG-16时,VOC2007测试套件的准确性可以从75.8%(原始SSD)提高到76.1%(具有预先训练的模型),69.6%至70.4%(预先训练有素的模型)型号为骨干。这验证了密集预测层的有效性。
        如果在ImageNet上预培训怎么办?正是看到与骨干网pretrainedImageNet关系和性能的有趣。我们在ImageNet上培养了一个精简骨干网DS/64-12-16-1,在验证集上获得了66.8%的前1个精度和87.8%的前5个精度(略差于VGG-16)。在“07+12”列车车次整体检测框架微调后,我们在VOC2007测试套件上实现了70.3%的MAP。相应的从零开始的解决方案实现了70.7%的精度,甚至略好一些。未来的工作将更彻底地调查这一点。

4.1.3Runtime Analysis 运行时间分析

        推测速度如表4第6列所示。对于300×300输入,我们的全DSOD可以在单个TitanXGPU上以48.6ms(20.6fps)处理具有简单预测结构的图像,而57.5ms(17.4fps)与密集的预测结构。作为比较,R-FCN在ResNet-101上运行90ms(11fps),ResNet-101运行110ms(9fps)。对于VGGNet,SSD300*的ResNet-101为82.6ms(12.1fps),对于VGGNet为21.7ms(46fps)。另外,我们的模型仅使用VGGNet的SSD300约1/2个参数,使用ResNet-101的1/4至SSD300,具有ResNet-101的1/4至R-FCN,具有VGGNet的1/10至更快的R-CNN。DSOD的简单版本(10.4M参数,无任何速度优化)可以运行25.8fps,只有1%的mAP下降。

4.2.Results on PASCAL VOC 2007 PASCAL VOC 2007的结果

        模型是根据VOC2007火车和VOC2012火车(“07+12”)的联合进行训练,随后[21]。我们使用的批量大小为128.请注意,此批量大小超出了GPU存储器的容量(即使是8个GPU服务器,每个都具有12GB内存)。我们使用一个技巧来克服GPU内存约束,通过在Caffe平台上实现的两次训练迭代累积梯度[14]。初始学习率设置为0.1,然后每20k次迭代后除以10。训练完成后达到100k次迭代。以下[21],我们使用0.0005的重量衰减和0.9的动量。所有转换层都使用“xavier”方法[6]进行初始化。
        表4显示了我们在VOC2007测试集上的结果。SSD300是使用新的数据增加技术的更新SSD结果。我们的DSOD300平滑连接达到77.3%,略好于SSD300(77.2%)。具有密集预测结构的DSOD300将结果提高到77.7%。加入COCO作为培训资料后,业绩进一步提升至81.7%。

4.3.Results on PASCAL VOC 2012 PASCAL VOC 2012的结果

        对于VOC2012数据集,我们使用VOC2012火车和VOC2007培训+测试进行培训,并对VOC2012测试集进行测试。对于前30k次迭代,初始学习率设置为0.1,然后在每20k次迭代后除以10。总训练次数为110k。其他设置与VOC2007实验中使用的设置相同。我们的DSOD300的结果如表4所示.DSOD300实现了76.3%的mAP,始终优于SSD300*(75.8%)。

4.4.Results on MSCOCO MSCOCO的结果

        最后,我们在MSCOCO数据集[20]上评估我们的DSOD。MSCOCO包含80k的培训图像,40k的验证和20k的测试(测试开发集)。在[27,19]之后,我们使用训练集(列车组+验证集)进行训练。批次大小也设置为128.初始学习速率在前80k次迭代中设置为0.1,然后每60k次迭代后除以10。训练次数总共为320k。
        结果总结在表6中。我们的DSOD300在测试开发集上达到29.3%/47.3%,优于基准SSD300*,幅度很大。我们的结果与单规模R-FCN相当,并且靠近使用ResNet-101作为预训练模型的R-FCNmulti-sc。有趣的是,我们观察到我们的结果为0.5IoU,低于R-FCN,但是我们的[0.5:0.95]结果更好或可比。这表明在较大的重叠设置下,我们的预测位置比R-FCN更准确。我们的小物体检测精度略低于R-FCN是合理的,因为我们的输入图像尺寸(300×300)远小于R-FCN(〜600×1000)。即使有这个缺点,我们的大对象检测精度仍然比R-FCN好得多。这进一步说明了我们的方法的有效性。图2显示了COCO与DSOD300型号的一些定性检测实例。

5.Discussion5.讨论

        更好的模型结构与更多的培训数据。计算机视觉社区中一个新兴的想法是,通过像ImageNet[3]等大量训练数据支持的更深层次更大的神经网络,可以解决对象检测或其他视觉任务。因此,最近已经收集和发布了越来越多的大型数据集,例如OpenImages数据集[16],其数量比ImageNet大7倍,图像数量大6倍。我们绝对同意,在给定无限训练数据和无限计算能力的适度假设下,深层神经网络应该表现得非常好。然而,我们提出的方法和实验结果意味着处理这个问题的另一种观点:与从大数据训练的复杂模型相比,更好的模型结构可以实现相似或更好的性能。特别是,我们的DSOD仅在VOC2007上接受了16,551张图像的训练,但是与120万+16,551张图像训练的机型达到了竞争性或甚至更好的性能。
        在这个前提下,值得重申的是,随着数据集越来越大,训练深层神经网络越来越昂贵。因此,一种简单而有效的方法变得越来越重要。尽管它的概念简单,我们的方法在这种情况下显示出巨大的潜力。
        为什么从头开始训练?模型微调已经有很多成功的例子。人们可能会问我们为什么要从头开始训练物体探测器。我们认为,如上所述,至少在两种情况下,从头开始的培训至关重要。首先,可能存在与预培训模式域到目标域之间的巨大区域差异。例如,大多数预先训练的模型都在大型RGB图像数据集(ImageNet)上进行了培训。将ImageNet模型传输到深度图像,多光谱图像,医学图像等领域是非常困难的。已经提出了一些先进的域适应技术。但是,如果我们有一种可以从头开始训练物体探测器的技术,那真是太棒了。第二,模型微调限制了对象检测网络的结构设计空间。这对于将资源有限的物联网(IoT)情景部署到深层神经网络模型非常关键。
        模型紧凑性与性能。经常报道,模型紧凑性(参数数量)和性能之间存在权衡。大多数基于CNN的检测解决方案需要巨大的存储空间来存储大量参数。因此,这些型号通常不适用于低端设备,如手机和嵌入式电子产品。由于参数高效密集块,我们的模型比大多数竞争方法小得多。例如,我们最小的密集模型(具有密集预测层的DS/64-64-16-1)实现了73.6%的mAP,仅有5.9M的参数,这在低端设备上显示出巨大的应用潜力。

6.Conclusion结论

        我们提出了深度监督对象检测器(DSOD),这是一个简单而高效的从头开始训练对象检测器的框架。没有在ImageNet上使用预先训练的模型,DSOD在流行的PASCALVOC2007,2012和MSCOCO数据集上展示了最先进的检测器(如SSD,更快的R-CNN和R-FCN)的竞争准确度,只有1/2,1/4和1/10参数分别与SSD,R-FCN和更快的R-CNN相比。DSOD在深度,医疗,多光谱图像等领域的不同场景具有巨大的潜力。我们未来的工作将考虑这些领域,以及学习超高效的DSOD模型来支持资源有限的设备。

Acknowledgements致谢

References参考

文章评论

程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
漫画:程序员的工作
漫画:程序员的工作
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
程序员必看的十大电影
程序员必看的十大电影
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
为什么程序员都是夜猫子
为什么程序员都是夜猫子
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Java程序员必看电影
Java程序员必看电影
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
旅行,写作,编程
旅行,写作,编程
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
编程语言是女人
编程语言是女人
程序员应该关注的一些事儿
程序员应该关注的一些事儿
那些争议最大的编程观点
那些争议最大的编程观点
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
每天工作4小时的程序员
每天工作4小时的程序员
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员的鄙视链
程序员的鄙视链
程序员都该阅读的书
程序员都该阅读的书
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
我是如何打败拖延症的
我是如何打败拖延症的
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
总结2014中国互联网十大段子
总结2014中国互联网十大段子
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
我的丈夫是个程序员
我的丈夫是个程序员
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
中美印日四国程序员比较
中美印日四国程序员比较
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
 程序员的样子
程序员的样子
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
老程序员的下场
老程序员的下场
10个调试和排错的小建议
10个调试和排错的小建议
程序员和编码员之间的区别
程序员和编码员之间的区别
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有