移动深度学习(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-27 11:19:16

点击下载

作者:李永会

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

移动深度学习

移动深度学习试读:

前言

深度学习技术在近两年飞速发展,对互联网的诸多方面产生了影响。各种互联网产品都争相应用深度学习技术,这将进一步影响人们的生活。随着移动设备被广泛使用,在移动互联网产品中应用深度学习和神经网络技术已经成为必然趋势。

一直以来,由于技术门槛和硬件条件的限制,在移动端应用深度学习的成功案例不多。传统移动端UI工程师在编写神经网络代码时,可以查阅的移动端深度学习资料也很少。而另一方面,时下的互联网竞争又颇为激烈,率先将深度学习技术在移动端应用起来,可以取得先发制人的优势。

移动端设备的运算能力比PC端弱很多。移动端的CPU要将功耗指标维持在很低的水平,这就给性能指标的提升带来了限制。在App中做神经网络运算,会使CPU的运算量猛增。如何协调好用户功耗指标和性能指标就显得至关重要。另外,App的体积限制也是重大考验,如果为了让用户体验一个深度学习功能而要求其下载200MB甚至更大的模型文件,想必用户是不会愉快接受的。这些都是在移动端应用深度学习技术必须解决的问题。

笔者从2015年开始尝试将深度学习技术应用在移动端,在这个过程中遇到的很多问题是关于性能和功耗的,这些问题最终被逐一解决。现在相关项目代码已经在很多App上运行,这些App有日PV达亿级的产品,也有创业期的产品。2017年9月,笔者所带领的团队在GitHub上开源了该项目的全部代码及脚本,项目名称是mobile-deep-learning,希望它在社区的带动下能够得到更好的发展。本书也是以该项目的代码作为示例进行讲解的。

我们已经在多个重要会议上分享了该方向的成果,听众非常感兴趣,会后和我们讨论了很多问题,我也感觉到这些成果值得分享给更多人,于是产生了撰写本书的想法。

目前,国内外已经有很多关于深度学习的书籍,其中一些对算法的讲述非常精辟且有深度。然而这些书籍基本上都是介绍如何在服务器端使用深度学习技术的,针对在移动端应用深度学习技术的书籍还相对较少。

本书内容

本书力求系统而全面地描绘移动端深度学习技术的实践细节和全景,对iOS和Android两个平台的神经网络实践都会详细讲述。需求不同的读者可以根据自己的情况有重点地阅读。精妙的算法必须加上良好的工业实现,才能给用户提供极致的体验,本书以代码实现为主线讲述工程实践,由浅入深,逐步增加难度,最终会将体系结构和汇编知识应用到实践案例中。

这里需要说明两点:

● 笔者将书中出现的Paddle-Lite代码压缩并放到了博文视点的官网,读者可以扫描“读者服务”中的二维码查看。如果想体验最新版本的Paddle-Lite,可以直接到GitHub上搜索查看。

● 笔者将书中的链接列在表格中并放在了博文视点的官网,读者同样可以扫描“读者服务”中的二维码查看表格,并点击其中的链接直接访问。

本书可以作为移动端研发工程师的前沿读物,读者阅读本书后,完全可以将所学知识应用到自己的产品中去;同时本书也适合对移动端运算领域感兴趣的朋友阅读。

致谢

特别感谢我的同事在本书编写过程中提供的巨大帮助,由于本书涉猎的技术方向较广——从体系结构到框架程序设计,从CPU到GPU编程,所以有些内容请教了在相关方向更资深的同事。感谢赵家英和秦雨两位同事对CPU性能优化部分提供的帮助,感谢刘瑞龙和谢柏渊两位同事对深度学习框架和GPU部分提供的帮助,有了你们的帮助,本书的内容才更完善、有深度,在此深表谢意。李永会2019年7月于北京读者服务

● 获取本书配套代码资源

● 获取更多技术专家分享视频与学习资源

● 加入读者交流群微信扫码回复37182第1章 初窥移动端深度学习技术的应用

本章以应用案例作为切入点,展示移动端深度学习示例代码编译后的效果。希望能让读者对于在移动端应用深度学习技术产生兴趣,而不是仅仅将其看作一连串的公式和高深莫测的概念。本章内容相对简单,主要包括引导读者部署环境、对代码简要说明,以及在移动端应用深度学习技术的现状简介。1.1 本书示例代码简介

为了方便学习和讲解,本书以mobile-deep-learning项目(见“链接1”)作为示例,该项目于2017年开源,先后被用于百度内部的多个App。2018年之后,该项目被Paddle-Lite框架逐步取代,在本书第8章会介绍该框架的设计。由于mobile-deep-learning项目的代码结构简单,更适合初学者,所以本书会多次以该项目的代码作为例子进行讲解。这些代码主要是卷积神经网络的具体实现,也就是我们经常提及的CNN(Convolutional Neural Network)。如果尚未接触CNN的相关知识,请不要着急,关于神经网络和卷积的概念会在第3章详细介绍。1.1.1 安装编译好的文件

本章演示所用的AI场景已经有编译好的Demo(示例)和源码,而且为iOS和Android两个系统都提供了Demo安装文件和源码,见“链接2”。1.1.2 在Demo App中应用神经网络技术

在使用一些神经网络框架进行开发时,大多数情况下并不需要对深度学习的细枝末节都有所了解,就可以轻松开发出示例中的效果。先睹为快,如图1-1所示为iOS系统下的Demo App安装后的效果,该Demo App使用神经网络技术检测物体的大小和位置,并用长方形标出了物体的外框。图1-1 Demo App效果图。该Demo App实现了用CPU和GPU两种模式运行神经网络1.2 移动端主体检测和分类

在移动端应用深度学习技术能做哪些事呢?Android和iOS系统下的两个Demo主要解决了两类问题,对应在移动端平台上应用深度学习技术的两个常见方向。这两类问题分别解释如下。

·物体在哪、有多大

要在移动端App中描述物体在哪(位置)、有多大,其实用4个或者3个数值就可以。首先,必须有一个基础点的坐标,可以位于左上角或者其他顶点处。确立基础点坐标后,还需要4个数值来表示框选出来的物体的长宽和位置。如果展示区域是圆形的,就可以选择物体的中心坐标(确定位置)再加上半径r(确定大小),共3个数值即可。

在深度学习领域,上述确定物体大小及位置的过程叫主体检测(Object Detection)。目前来看,如果得到能够描述主体区域的数值,就可以在图片或者视频中找到物体,并在物体周围标出长方形的外框,这样就完成了主体检测。这个基本认识很重要,在后面章节中会重点分析如何得到所需的坐标数值和范围数值。

至此,我们明确了物体的位置和大小的数值是如何定义的。这一类问题属于主体检测问题范畴,是一个检测的过程,1.1.2节的Demo中就应用了主体检测技术。

·物体是什么

在神经网络运算中,从算法层面来看,主体检测过程和识别物体是什么(物体识别)的过程,在计算方式上是完全相同的,差别在于最终输出的数值。主体检测过程输出的是物体的位置及尺寸信息;而识别物体是什么(物体识别)的过程输出的是所识别的物体可能属于哪些种类,以及该物体属于每个种类的可能性(概率),如表1-1所示。表1-1 物体识别过程得出的概率分布表

由表1-1可以看出,物体识别过程从本质上讲就是一个分类过程。也正因如此,在深度学习中将这个过程称为分类。1.3 在线上产品中以“云+端计算”的方式应用深度学习技术

上面介绍了深度学习技术的两个基本应用场景——检测和分类。目前常见的神经网络大多是部署在云端服务器上,并通过网络请求来完成交互的。纯云端计算的方式简单可靠,但是在用户体验方面却存在诸多问题,比如网络请求的速度限制等。

接下来看一下在实际应用中,“云+端计算”这种方式的应用场景。本书后半部分会系统全面地介绍完全在移动端计算的解决方案。

图1-2展示了百度App的首页,可以点击搜索框右侧的相机图标(箭头处)进入图像搜索界面。图1-2 百度App的图像搜索入口

进入图像搜索界面后,可以对着物体、人脸、文本等生活中的一切事物拍照,并发起搜索,如图1-3所示。

图1-4展示的是进入手机百度图像搜索界面后的UI效果。图片中的框体就应用了典型的主体检测技术。其中的白色光点不需要关注,它们应用的是计算机视觉技术,不属于神经网络算法范畴。

还有一类App会用到深度学习技术,比如帮助用户对照片进行分类的App,如图1-5所示。这类App要对大量图片进行分类,如果在服务器端远程处理后再返回移动端,那么性能和体验都会非常差,也会消耗大量的服务器资源,企业成本会骤增,因此建议将部分计算放在移动端本地处理。“拾相”这款App就使用了深度学习技术对图片进行本地快速分类,这样不但可以提升用户体验,而且不会占用大量服务器端GPU来维持App分类的稳定。图1-3 拍照并发起搜索图1-4 移动端自动识别物体区域图1-5 使用移动端深度学习技术对图片分类1.4 在移动端应用深度学习技术的业界案例

在互联网行业中,在移动端应用深度学习技术的案例越来越多。从深度学习技术的运行端来看,主要可以分为下面两种。

一种是完全运行在移动端,这种方式的优点显而易见,那就是体验好。在移动端高效运行神经网络,用户使用起来会感觉没有任何加载过程,非常流畅。前面的“拾相”和手机百度中的图像搜索都属于这一流派,还有其他一些比较好的应用,典型的如识别植物花卉的App“识花”,见1.4.1节中的例子。

另一种是在服务器端运行深度学习技术,移动端只负责UI展示。在第一种流派出现之前,绝大部分App都是使用这种在服务器端运算、在移动端展示的方式的。这种方式的优点是实现相对容易,开发成本低。1.4.1 植物花卉识别

花卉识别的App近两年来颇多,“识花”是微软亚洲研究院推出的一款用于识别花卉的App,如图1-6所示,用户可以在拍摄后查看花卉信息,App会给出该类花卉的详细相关信息。精准的花卉分类是其对外宣传的一大亮点。图1-6 识花App1.4.2 奇妙的风格化效果

将计算机视觉技术应用在App中,可以为图片实现滤镜效果。使用深度学习技术实现的风格化滤镜效果非常魔幻。例如,Philm这款App就可以提供非常出色的体验,它使用了深度学习技术,有不少风格化滤镜效果,图1-7中的左图是原图,右图是增加滤镜效果之后的图。图1-7 Philm的滤镜效果展示

除此之外,还有许多产品也尝试了在移动端支持视频、图片的风格化,如Prisma和Artisto这两款App也都可以实现风格化的效果。1.4.3 视频主体检测技术在App中的应用

深度学习技术在移动端的应用越来越多,视频主体检测技术在App中的应用也在加速。目前,手机使用视频主体检测技术进行身份认证已经是非常普遍的事。视频主体检测技术主要根据物体的特征来进行判别,整个流程(如识别和监测这样的操作)包含大量的神经网络计算。图1-8是我们团队在2017年做的一个Demo,它通过实时识别视频中的图像主体,再通过该区域进行图像搜索,就可以得到商品、明星等多种垂直分类相关图片的信息。图1-8 移动端视频播放器中的视频主体检测效果

你可能会问,这一功能的意义是什么?直接来看,我们可以利用此技术为视频动态添加演员注解,并且动态支持“跳转到xxx(某个明星的名字)出现的第一个镜头”这样的命令。扩展来看,我们还可以思考一下这一功能实现商业化的方式可能有哪些。例如,假设某个女士看到视频中出现了她喜欢的包包,但是不知道在哪里能够买到。使用了视频主体检测技术后,可以让用户自行筛选,然后在视频中自动提示包包的产地、品牌等信息,甚至可以让用户直接购买。这样就能扩展出非常多的移动AI场景。1.5 在移动端应用深度学习技术的难点1.5.1 在服务器端和移动端应用深度学习技术的难点对比

在移动端应用深度学习技术,要考虑各种机型和App指标的限制,因此难点较多。如何使深度学习技术稳定高效地运行在移动设备上是最大的考验。拆解落地过程中的复杂算法问题,就是移动端团队面临的首要挑战。通过对比服务器端的情况,更容易呈现移动端应用深度学习技术的难点,对比如表1-2所示。表1-2 在服务器端和移动端应用深度学习技术的难点对比(续表)

在移动端App的开发过程中,需要克服以上所有困难,才能在移动端应用相关技术。将Demo的演示效果转化为亿级安装量的App线上效果,并不是一件容易的事情。在移动端和嵌入式设备的App中使用深度学习技术,可以大大提升App给用户带来的体验。但是,只应用深度学习技术还不能实现所有想要的效果,往往还要结合计算机视觉相关的技术,才能解决从实验到上线的难题。工程师需要具备很高的将工程与算法结合的能力,才能综合运用多种技术解决问题。在移动端应用深度学习技术时,往往没有太多可以查阅和参考的资料,需要开发人员活学活用,因地制宜。接下来通过实例看一下,如何使用诸多办法来实现AR实时翻译功能。1.5.2 实现AR实时翻译功能

AR实时翻译能够实现所见即所得的翻译效果,什么意思呢?来看下面的实例,在图1-9中,电脑屏幕上有“实时翻译”四个字,将其放在百度App图像搜索实时翻译框中,就能得到“Real-Time translation”,而且手机上的文字和电脑屏幕上的文字具有同样的背景色和字色。图1-9 实时翻译效果图

AR实时翻译功能最早在Google翻译软件中应用并上线,Google使用了翻译和OCR(图片转文本)模型全部离线的方式。翻译和OCR离线的好处是,用户不联网也能使用实时翻译功能,且每帧图像在及时处理运算后实时贴图,以达到即视效果。

但是全部离线的方式也有弊端,那就是OCR和翻译模型体积较大,且需要用户下载到手机中才可以使用。另外离线OCR和离线翻译模型压缩体积后会导致准确率降低,用户体验变差:Google翻译App中的词组翻译效果较好,在翻译整句和整段时表现就不够理想。

2017年下半年,笔者参与并主导了百度App中的实时翻译工作的落地。在开始时,团队面对的首要问题是,翻译计算过程是使用服务器端返回的结果,还是使用移动端的本地计算结果?如果使用移动端的计算结果,用户就不需要等待服务器端返回结果,能够减少不必要的延迟。我们只需要针对移动端的OCR和翻译的计算过程,在移动端做性能调优,即可保证每一帧图像都可以快速贴图。移动端性能优化技术其实是我们更擅长的。这样看来,似乎使用移动端计算结果的优点很多,但是其缺点也不容忽视——长文本可能出现“不说人话”的翻译效果。经过分析和讨论,我们回到问题的本质:AR实时翻译的本质是要给用户更好的翻译效果,而不是看似酷炫的实时贴合技术。

最后,我们选择了使用服务器端的返回结果。图1-10就是上线第一个版本后的试用效果,左边是原文,右边是融合了翻译结果和背景色的效果。图1-10 实时翻译效果图

看看图1-10的效果,如果从头做这件事,应该如何拆解过程?

首先,需要将文本提取和翻译分成两部分;接着,拿到翻译结果后,还需要找到之前的位置,准确地贴图。依次介绍如下。

1.OCR提取文本(1)需要把单帧图片内的文本区域检测出来。a. 检测文本区域是典型的深度学习技术范畴,使用检测模型来处理。b. 对文本区域的准确识别决定了贴图和背景色的准确性。(2)要对文本的内容进行识别,就要知道写的具体是什么。a. 识别文本内容需要将图像信息转化为文本,这一过程可以在移动端进行,也可以在服务器端进行。其原理是使用深度学习分类能力,将包含字符的小图片逐个分类为文本字符。b. 使用的网络结构GRU是LSTM网络的一种变体,它比LSTM网络的结构更加简单,而且效果也很好,因此是当前非常流行的一种网络结构。

2.翻译获取(1)如果是在移动端进行文本提取,那么在得到提取的文本后,就要将文本作为请求源数据,发送到服务器端。服务器端返回数据后,就可以得到这一帧的最终翻译数据了。(2)请求网络进行图像翻译处理,移动端等待结果返回。

3.找到之前的位置

当翻译结果返回后,很可能遇到一个类似“刻舟求剑”的问题:在移动端发送请求并等待结果的过程中,用户可能移动了手机摄像头的位置,服务器端返回的结果就会和背景脱离关系,从而无法贴合到对应的位置,这是从服务器端提取结果的弊端。解决这一问题需要使用跟踪技术。a. 需要用一个完整的三维坐标系来描述空间,这样就能知道手机现在和刚才所处的位置。b. 需要倒推原来文本所在位置和现在的位置之间的偏移量。c. 在跟踪的同时需要提取文字的背景颜色,以尽量贴近原图效果。文字和背景的颜色提取后,在移动端学习得到一张和原文环境差不多的背景图片。d. 将服务器端返回的结果贴合在背景图片上,大功告成。

图1-11是我们团队在初期对AR实时翻译功能进行的技术拆解,从中可以看到,在移动端进行AI创新,往往需要融合使用深度学习和计算机视觉等技术。图1-11 实时翻译流程图

如果你看过AR实时翻译的案例后仍然觉得晦涩,请不要着急,等学过移动端的机器学习、线性代数、性能优化等章节后,在本书的第8章将会展示一个相似的案例,相信那时候你会觉得明朗许多。1.6 编译运行深度学习App

前面展示了深度学习技术在移动端的应用案例,从利用深度学习技术开发的Demo App安装部署开始,可以快速预览整个移动端神经网络代码的基本结构。我们将分别对iOS和Android两大平台的神经网络代码进行部署及演示,以了解神经网络代码在移动端的应用场景。接下来的内容以简单实践为主,编译过程使用的是OS X系统和Linux系统。1.6.1 mobile-deep-learning项目环境简介

首先,我们要从GitHub将其中一个Demo项目的源代码下载到本地电脑中。这个过程需要预装Git相关工具,可以在网上查找Git的安装方法并完成安装,这里不再赘述。

将代码下载到本地:

下载完mobile-deep-learning代码后,打开项目根目录,可以看到以下目录结构,如图1-12所示:图1-12 mobile-deep-learning的目录结构1.6.2 mobile-deep-learning项目整体代码结构

以上代码文件的数目略多,我们先简单看一下这些目录和文件都是做什么的,如下所示。

根据对文件和目录的注释,我们可以对项目形成初步的认识。对于项目的核心代码、头文件,现在还不需要深入研究,主要关注examples、iOS、android-cmake这几个目录即可。这些目录是和Android、iOS平台的Demo代码相关的。1.6.3 mobile-deep-learning通用环境依赖

Protocol Buffer是一种序列化信息结构的协议,对于程序间通信是很有用的。这个协议包含一个接口描述语言,描述一些协议结构,用于将这些信息结构解析成流。

Protocol Buffer在IT行业中一直被广泛应用,也被用作一些深度学习框架的模型存储格式。

在移动端使用Protocol Buffer格式会造成依赖库的体积过大。在示例代码中使用的是Protocol Buffer描述格式的模型,需要将其转换为Demo程序能运行的格式。实现这一转换过程,需要安装ProtoBuffer,接下来的编译过程则需要安装CMake。相关的安装代码和解释如下。

ProtoBuffer

安装Protocol Buffer,代码如下。

caffe.pb.cc和caffe.pb.h在tools目录中,是用Protocol Buffer 3.4.0生成的。如果已经有相应版本,则可以直接运行以下命令。

CMake

CMake是一个开源的跨平台自动化建构系统,CMake可以编译源码,能很轻松地从源码目录树中建构出多个二进制文件。CMake也支持静态与动态程式库的建构。在源码演示过程中,我们将使用CMake作为构建工具。1.7 在iOS平台上搭建深度学习框架1.7.1 在iOS平台上搭建mobile-deep-learning项目

环境依赖

在iOS开发环境中搭建mobile-deep-learning项目,主要依赖的是常规的iOS开发工具和编译工具的支持。

开发工具

开发工具为XCode IDE。

编译工具

编译工具为CMake。

建议使用HomeBrew(见“链接3”)安装CMake(见“链接4”)。如果你已经安装了CMake,则可以跳过这一步。

导入工程

按1.1.1节中的步骤下载示例代码后进入项目的根目录,用Xcode开发工具打开examples/mdl_ios目录下的MDL.xcworkspace,如图1-13所示。图1-13 mobile-deep-learning iOS工程目录结构

进入MDL.xcworkspace的界面,如图1-14所示。图1-14 MDL.xcworkspace的界面1.7.2 在OS X平台上编译mobile-deep-learning项目

使用mobile-deep-learning项目中的编译脚本可以快速编译出移动端需要的二进制文件。下面是在UNIX内核的个人电脑上编译mobile-deep-learning的代码。1.7.3 iOS平台上mobile-deep-learning项目的Demo代码结构

iOS工程导入完成后,我们可以看到Xcode开发工具中的文件目录结构,如图1-15所示,主要包含三个部分:MDLCPUCore、MDL和MDLDemo。其中,MDL包括GPU部分和CPU部分,CPU部分依赖MDLCPUCore这个工程。

目前我们需要了解的主要是MDLDemo工程,其目录结构如图1-16所示,可以看到这套框架和Demo都有GPU和CPU两套实现。第2章会进一步展开讲述MDLDemo工程,并详细讲解框架的细节,那时你就能看到全部代码。这里先假定你已经能够看懂C++和Swift代码。图1-15 iOS平台上mobile-deep-learning 项目的代码文件目录结构图1-16 MDL Demo工程的目录结构1.8 在Android平台上搭建深度学习框架1.8.1 Android平台上mobile-deep-learning项目的环境依赖

开发工具

在Android平台上编写Java代码,最常见的开发工具是Android Studio,本节也将使用Android Studio来构建工程。

编译工具依赖

mobile-deep-learning项目的Demo代码和神经网络相关的部分是使用C++开发的。在搭建Android开发环境时也要编译C++代码。在开发Android应用程序时,编译C++代码需要依赖NDK(Native Development Kit)开发环境。

NDK提供了一系列的工具,帮助开发者快速开发C或C++的动态库,并能自动将so和Java应用一起打包成APK。NDK集成了交叉编译器(交叉编译器需要运行在UNIX或Linux系统环境下)。

NDK的下载地址见“链接5”。

NDK的配置

配置NDK的步骤如下:

1. 获取和安装Android SDK。

2. 下载NDK,请确保为你的开发平台下载正确的版本。可以将解压缩的目录置于本地驱动器上的任意位置。

3. 将PATH环境变量加入NDK路径,代码如下。

NDK配置完成以后,还需要安装另一个“必备品”——Android Studio。安装好AndroidStudio之后,直接打开,点击File选项,在下拉菜单中点击Project Structure选项,按照图1-17所示进行配置:图1-17 Android平台工程配置1.8.2 Android平台上mobile-deep-learning项目的Demo代码结构

Demo代码中的Android工程部分,建议使用Android Studio或者IDEA开发。使用这两个开发工具可以让代码的部署更快速,不会因为环境问题产生困扰。以Android Studio为例,导入examples目录下的mdl_android工程,界面如图1-18所示,可以看出Android平台的Demo代码非常简单,只有三个Java文件,主要是UI实现及调用神经网络框架的相关代码。

引入mdl类库比较简单,在Android平台只要使用System.loadLibrary就可以加载相关库文件:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载