TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11(4)https://developer.aliyun.com/article/1427023
从设备的本地存储中获取图片
在本节中,我们将添加FloatingActionButton
的功能,以使用户可以从设备的图库中选择图像。 这最终将被发送到服务器,以便我们能够收到响应。
以下步骤描述了如何启动图库并让用户选择图像:
- 为了允许用户从设备的图库中选择图像,我们将使用
image_picker
库。 这将启动图库并存储用户选择的图像文件。 我们将从在pubspec.yaml
文件中添加依赖项开始:
image_picker: 0.4.12+1
另外,我们通过在终端上运行flutter pub get
来获取库。
- 接下来,我们将库导入
image_super_resolution.dart
文件中:
import 'package:image_picker/image_picker.dart';
- 现在,让我们定义
pickImage()
函数,该函数使用户可以从图库中选择图像:
void pickImage() async { File pickedImg = await ImagePicker.pickImage(source: ImageSource.gallery); }
- 从函数内部,我们只需调用
ImagePicker.pickImage()
并将source
指定为ImageSource.gallery
即可。 该库本身处理启动设备图库的复杂性。 用户选择的图像文件最终由该函数返回。 我们将函数返回的文件存储在File
类型的pickedImg
变量中。 - 接下来,我们定义
loadImage()
函数,以便在屏幕上显示用户选择的图像:
void loadImage(File file) { setState(() { img1 = Image.file(file); }); }
此函数将用户选择的图像文件作为输入。 在函数内部,我们将先前声明的img1
变量的值设置为Image.file(file)
,这将返回从'file'
构建的Image
小部件。 回想一下,最初,img1
被设置为占位符图像。 为了重新渲染屏幕并显示用户选择的图像,我们将img1
的新分配放在setState()
中。
- 现在,将
pickImage()
添加到builtPickImageButton()
内的FloatingActionButton
的onPressed
属性中:
Widget buildPickImageButton() { return Container( .... child: FloatingActionButton( .... onPressed: () => pickImage(), ) ); }
前面的补充内容确保单击按钮时,会启动图库,以便可以选择图像。
- 最后,我们将从
pickImage()
向loadImage()
添加一个调用:
void pickImage() async { .... loadImage(pickedImg); }
在loadImage()
内部,我们传入用户选择的图像,该图像存储在pickedImage
变量中,以便可以在应用的屏幕上查看该图像。
完成上述所有步骤后,该应用将如下所示:
至此,我们已经构建了应用的用户界面。 我们还添加了一些功能,使用户可以从设备的图库中选择图像并将其显示在屏幕上。
在下一部分中,我们将学习如何托管在“为超分辨率创建 TensorFlow 模型”中创建的模型作为 API,以便我们可以使用它执行超分辨率。
在 DigitalOcean 上托管 TensorFlow 模型
DigitalOcean 是一个了不起的低成本云解决方案平台,非常易于上手,并提供了应用开发人员为立即可用的应用后端提供动力所需的几乎所有功能。 该界面非常易于使用,并且 DigitalOcean 拥有一些最广泛的文档,这些文档围绕着如何在云上设置不同类型的应用服务器提供入门。
在这个项目中,我们将使用 DigitalOcean 的 Droplet 部署我们的超分辨率 API。 DigitalOcean 中的 Droplet 只是通常在共享硬件空间上运行的虚拟机。
首先,我们将在项目目录中创建flask_app.py
文件,并添加服务器工作所需的代码。
创建一个 Flask 服务器脚本
在本节中,我们将处理flask_app.py
文件,该文件将作为服务器在云虚拟机上运行。 让我们开始吧:
- 首先,我们将对文件进行必要的导入:
from flask import Flask, request, jsonify, send_file import os import time from matplotlib.image import imsave from model.srgan import generator from model import resolve_single
- 现在,我们将定义
weights
目录并将生成器权重加载到文件中:
weights_dir = 'weights' weights_file = lambda filename: os.path.join(weights_dir, filename) gan_generator = generator() gan_generator.load_weights(weights_file('gan_generator.h5'))
- 接下来,我们将使用以下代码行实例化
Flask
应用:
app = Flask(__name__)
- 现在,我们准备构建服务器将监听的路由。 首先,我们将创建
/generate
路由,该路由将图像作为输入,生成其超分辨率版本,并将所生成的高分辨率图像的文件名返回给用户:
@app.route('/generate', methods=["GET", "POST"]) def generate(): global gan_generator imgData = request.get_data() with open("input.png", 'wb') as output: output.write(imgData) lr = load_image("input.png") gan_sr = resolve_single(gan_generator, lr) epoch_time = int(time.time()) outputfile = 'output_%s.png' % (epoch_time) imsave(outputfile, gan_sr.numpy()) response = {'result': outputfile} return jsonify(response)
让我们尝试了解前面的代码块中发生的情况。 /generate
路由已设置为仅监听 HTTP 请求的 GET 和 POST 方法。 首先,该方法获取 API 请求中提供给它的图像,将其转换为 NumPy 数组,然后将其提供给 SRGAN 模型。 SRGAN 模型返回超分辨率图像,然后为其分配一个唯一的名称并存储在服务器上。 用户显示文件名,他们可以使用该文件名调用另一个端点来下载文件。 让我们现在构建此端点。
- 为了创建端点以便下载生成的文件,我们可以使用以下代码:
@app.route('/download/<fname>', methods=['GET']) def download(fname): return send_file(fname)
在这里,我们创建了一个名为/download
的端点,该端点附加了文件名后,将其提取并发送回给用户。
- 最后,我们可以编写执行该脚本并设置服务器的代码:
app.run(host="0.0.0.0", port="8080")
保存此文件。 确保此时将您的存储库推送到 GitHub/GitLab 存储库。
现在,我们准备将该脚本部署到DigitalOcean
Droplet。
将 Flask 脚本部署到 DigitalOcean Droplet
要将 Flask 脚本部署到 DigitalOcean Droplet,您必须创建一个 DigitalOcean 帐户并创建一个 Droplet。 请按照以下步骤操作:
- 在您喜欢的 Web 浏览器中转到 digitalocean.com 。
如果您希望在添加帐单详细信息时获得 100 美元的赠金,也可以转到这里。 我们稍后再做。
- 在 DigitalOcean 的注册表格中填写您的详细信息,然后提交表格继续进行下一步。
- 系统将要求您验证电子邮件并为 DigitalOcean 帐户添加结算方式。
- 在下一步中,系统将提示您创建第一个项目。 输入所需的详细信息并提交表单以创建您的项目:
- 创建项目后,您将被带到 DigitalOcean 仪表板。 您将能够看到创建 Droplet 的提示,如以下屏幕截图所示:
- 单击“提示”以弹出 Droplet 创建表单。 选择下表中描述的选项:
字段 | 说明 | 要使用的值 |
选择一张图片 | Droplet 将在其上运行的操作系统。 | Ubuntu 18.04(或最新可用版本) |
选择一个计划 | 选择 Droplet 的配置。 | 4 GB RAM 或更高 |
添加块存储 | Droplet 的其他持久性,可拆卸存储容量。 | 保留默认值 |
选择数据中心区域 | 投放 Droplet 的区域。 | 根据您的喜好选择任何一个 |
选择其他选项 | 选择将与您的 Droplet 一起使用的所有其他功能。 | 保留默认值 |
认证方式 | 选择虚拟机的认证方法。 | 一次性密码 |
完成并创建 | Droplet 的一些其他设置和选项。 | 保留默认值 |
- 单击“创建 Droplet”,然后等待 DigitalOcean 设置您的 Droplet。
- 创建 Droplet 后,单击其名称以打开 Droplet 管理控制台,该控制台应如下所示:
- 现在,我们可以使用上一幅截图所示的 Droplet 控制台左侧导航菜单上的 Access 选项卡登录到 Droplet。 单击“访问”,然后启动控制台。
- 将打开一个新的浏览器窗口,显示您的 Droplet 的 VNC 视图。 系统将要求您输入 Droplet 的用户名和密码。 您必须在此处使用的用户名是
root
。 可以在您已注册的电子邮件收件箱中找到该密码。 - 首次登录时,系统会要求您更改 Droplet 密码。 确保您选择一个强密码。
- 登录 Droplet 后,将在 VNC 终端上看到一些 Ubuntu 欢迎文本,如以下屏幕截图所示:
- 现在,按照本书的“附录”中的说明,执行在云 VM 上设置深度学习环境的步骤。
- 接下来,将项目存储库克隆到您的 Droplet,并使用以下命令将工作目录更改为存储库的
api
文件夹:
git clone https://github.com/yourusername/yourrepo.git cd yourrepo/api
- 使用以下命令运行服务器:
python3 flask_app.py
除了来自 TensorFlow 的一些警告消息之外,在终端输出的末尾,您还应该看到以下几行指示服务器已成功启动:
现在,如 Droplet 控制台所示,您的服务器已启动并在 Droplet 的 IP 上运行。
在下一部分中,我们将学习如何使用 Flutter 应用向服务器发出 POST 请求,并在屏幕上显示服务器的响应。
在 Flutter 上集成托管的自定义模型
在本节中,我们将向托管模型发出 POST 请求,并将其传递给用户选择的图像。 服务器将以 PNG 格式响应NetworkImage
。 然后,我们将更新之前添加的图像小部件,以显示模型返回的增强图像。
让我们开始将托管模型集成到应用中:
- 首先,我们将需要两个以上的外部库来发出成功的 POST 请求。 因此,我们将以下库作为依赖项添加到
pubspec.yaml
文件:
dependencies: flutter: http: 0.12.0+4 mime: 0.9.6+3
http
依赖项包含一组类和函数,这些类和函数使使用 HTTP 资源非常方便。 mime
依赖性用于处理 MIME 多部分媒体类型的流。
现在,我们需要运行flutter pub get
以确保所有依赖项均已正确安装到我们的项目中。
- 接下来,我们将所有新添加的依赖项导入
image_super_resolution.dart
文件:
import 'package:http/http.dart' as http; import 'package:mime/mime.dart';
- 现在,我们需要定义
fetchResponse()
,它接受所选的图像文件并向服务器创建 POST 请求:
void fetchResponse(File image) async { final mimeTypeData = lookupMimeType(image.path, headerBytes: [0xFF, 0xD8]).split('/'); final imageUploadRequest = http.MultipartRequest('POST', Uri.parse("http://x.x.x.x:8080/generate")); final file = await http.MultipartFile.fromPath('image', image.path, contentType: MediaType(mimeTypeData[0], mimeTypeData[1])); imageUploadRequest.fields['ext'] = mimeTypeData[1]; imageUploadRequest.files.add(file); try { final streamedResponse = await imageUploadRequest.send(); final response = await http.Response.fromStream(streamedResponse); final Map<String, dynamic> responseData = json.decode(response.body); String outputFile = responseData['result']; } catch (e) { print(e); return null; } }
在前面的方法中,我们通过使用lookupMimeType
函数并使用文件的路径及其头来查找所选文件的 MIME 类型。 然后,按照托管模型的服务器的预期,初始化一个多部分请求。 我们使用 HTTP 执行此操作。 我们使用MultipartFile.fromPath
并将image
的值设置为作为POST
参数附加的路径。 由于image_picker
存在一些错误,因此我们将图片的扩展名明确传递给请求主体。 因此,它将图像扩展名与文件名(例如filenamejpeg
)混合在一起,这在管理或验证文件扩展名时在服务器端造成了问题。 然后,来自服务器的响应将存储在response
变量中。 响应为 JSON 格式,因此我们需要使用json.decode()
对其进行解码。 该函数接收响应的主体,可以使用response.body
进行访问。 我们将解码后的 JSON 存储在responseData
变量中。 最后,使用responseDate['result']
访问服务器的输出并将其存储在outputFile
变量中。
- 接下来,我们定义
displayResponseImage()
函数,该函数接受服务器在outputFile
参数内返回的 PNG 文件的名称:
void displayResponseImage(String outputFile) { print("Updating Image"); outputFile = 'http://x.x.x.x:8080/download/' + outputFile; setState(() { imageOutput = Image(image: NetworkImage(outputFile)); }); }
根据服务器的自定义,我们需要在文件名之前附加一个字符串以将其显示在屏幕上。 该字符串应包含服务器正在运行的端口地址,后跟'/download/'
。 然后,我们将outputFile
的最终值用作url
值,将imageOutput
小部件的值设置为NetworkImage
。 另外,我们将其封装在[HTG5]中,以便在正确获取响应后可以刷新屏幕。
- 接下来,我们在
fetchResponse()
的最后调用displayResponseImage()
,并传入从托管模型收到的outputFile
:
void fetchResponse(File image) async { .... displayResponseImage(outputFile); }
- 最后,通过传入用户最初选择的图像,将调用从
pickImage()
添加到fetchResponse()
:
void pickImage() async { .... fetchResponse(pickedImg); }
在前面的步骤中,我们首先向托管模型的服务器发出 POST 请求。 然后,我们解码响应并添加代码以在屏幕上显示它。 在pickImage()
末尾添加fetchResponse()
可确保仅在用户选择图像后才发出 POST 请求。 另外,为了确保在成功解码来自服务器的输出之后已经尝试显示响应图像,在fetchResponse()
的末尾调用displayImageResponse()
。 以下屏幕快照显示了屏幕的最终预期状态:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YGKKzKRo-1681785128428)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/mobi-dl-tflite/img/14248601-46e6-421b-aa88-3353ff56bd4d.png)]
因此,我们已经完成了应用的构建,以便可以显示模型的输出。 我们将两个图像保存在屏幕上,以便我们可以看到它们之间的差异。
可以在这个页面上访问image_super_resolution.dart
文件的代码。
创建材质应用
现在,我们将添加main.dart
以创建最终的 Material 应用。 我们将创建一个名为MyApp
的无状态小部件,并覆盖build()
方法:
class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( primarySwatch: Colors.blue, ), home: ImageSuperResolution(), ); } }
最后,我们执行代码,如下所示:
void main() => runApp(MyApp());
至此,我们完成了一个应用的创建,该应用允许用户选择图像并修改其分辨率。
总结
在本章中,我们研究了超分辨率图像以及如何使用 SRGAN 应用它们。 我们还研究了其他类型的 GAN 以及 GAN 的总体工作方式。 然后,我们讨论了如何创建一个 Flutter 应用,该应用可以与 DigitalOcean Droplet 上托管的 API 集成在一起,以便当从图库中拾取图像时可以执行图像超分辨率。 接下来,我们介绍了如何使用 DigitalOcean Droplet,以及由于其低成本和易于使用的界面而成为托管应用后端的理想选择。
在下一章中,我们将讨论一些流行的应用,这些应用通过将深度学习集成到其功能中而获得了很大的改进。 我们还将探索手机深度学习中的一些热门研究领域,并简要讨论已在其上进行的最新工作。
十、前方的路
旅程中最重要的部分是知道结束后要去哪里。 到目前为止,在本系列项目中,我们已经介绍了一些与 Flutter 应用相关的独特且功能强大的深度学习(DL)应用,但重要的是,您必须知道在哪里可以找到更多这样的项目,灵感和知识来构建自己的出色项目。 在本章中,我们将简要介绍当今在移动应用上使用 DL 的最流行的应用,当前趋势以及将来在该领域中将会出现的情况。
在本章中,我们将介绍以下主题:
- 了解移动应用中 DL 的最新趋势
- 探索移动设备上 DL 的最新发展
- 探索移动应用中 DL 的当前研究领域
让我们开始研究 DL 移动应用世界中的一些趋势。
了解移动应用中 DL 的最新趋势
特别是 DL,随着最新技术和硬件的发展,人工智能(AI)变得越来越移动。 组织一直在使用智能算法来提供个性化的用户体验并提高应用参与度。 借助人脸检测,图像处理,文本识别,对象识别和语言翻译等技术,移动应用已不仅仅是提供静态信息的媒介。 它们能够适应用户的个人偏好和选择以及当前和过去的环境状况,以提供无缝的用户体验。
让我们看一下一些流行的应用及其部署的方法,以提供良好的用户体验,同时增加应用的参与度。
数学求解器
数学求解器应用由微软于 2020 年 1 月 16 日启动,可通过简单地单击智能手机上有问题的图片来帮助学生完成数学作业。 该应用为基本和高级数学问题提供支持,涵盖了广泛的主题,包括基本算术,二次方程,微积分和统计。 以下屏幕截图显示了该应用的工作方式:
用户可以在其智能手机上单击手写或打印问题的图片,或直接在设备上涂鸦或键入图片。 该应用利用 AI 来识别问题并准确解决。 此外,它还可以提供分步说明,并提供其他学习资料,例如与问题有关的工作表和视频教程。
Netflix
Netflix 的推荐系统是在移动应用上使用 DL 的最大成功案例之一。 Netflix 利用多种算法来了解用户的偏好,并提供了他们可能感兴趣的推荐列表。所有内容都标记有标签,这些标签提供了可以从中学习算法的初始数据集。 此外,该系统监视着超过 1 亿个用户个人资料,以分析人们观看的内容,以后可能观看的内容,以前观看的内容,一年前观看的内容,等等。 将收集的所有数据汇总在一起,以了解用户可能感兴趣的内容类型。
然后,将使用标签和用户行为收集的数据汇总在一起,并输入到复杂的 ML 算法中。 这些数据有助于解释可能最重要的因素-例如,如果用户一年前观看的电影与上周观看的系列相比应被计数两次。 该算法还可以从用户行为中学习,例如用户喜欢还是不喜欢特定的内容,或者用户在 2 个晚上观看和观看的节目。 将所有因素汇总在一起并进行仔细分析,从而得出用户可能最感兴趣的建议列表。
谷歌地图
Google Maps 已帮助通勤者前往新地方,探索新城市并监控每日流量。 在 2019 年 6 月上旬,谷歌地图发布了一项新功能,使用户可以监控印度 10 个主要城市的巴士旅行时间,以及从印度铁路局获得实时更新。 该功能位于班加罗尔,钦奈,哥印拜陀,德里,海得拉巴,勒克瑙,孟买,浦那和苏拉特,它利用 Google 的实时交通数据和公交时刻表来计算准确的出行时间和延误。 支持该功能的算法可从总线位置随时间的顺序中学习。 该数据还与通勤时公交车上的汽车速度结合在一起。 数据还用于捕获特定街道的独特属性。 研究人员还模拟了围绕某个区域弹出查询的可能性,以使该模型更加健壮和准确。
Tinder
作为结识新朋友的全球最受欢迎的应用,Tinder 部署了许多学习模型,以增加喜欢特定个人资料的人数。 智能照片功能增加了用户找到正确匹配项的可能性。 该功能随机排序特定用户的图片并将其显示给其他人。 支持该功能的算法分析了向左或向右滑动图片的频率。 它使用该知识根据图片的受欢迎程度对其重新排序。 随着越来越多的数据收集,该算法的准确率一直在不断提高。
Snapchat
Snapchat 使用的过滤器是在图片和视频的顶部添加的设计叠加层,可以跟踪面部移动。 这些过滤器是通过计算机视觉实现的。 应用使用的算法的第一步是检测图像中存在的面部。 它输出包围检测到的面部的框。 然后,它为检测到的每个脸部标记面部标志(例如眼睛,鼻子和嘴唇)。 这里的输出通常是一个包含x
-坐标和y
-坐标的二维点。 正确检测到面部和面部特征后,它将使用图像处理功能在整个面部上正确放置或应用过滤器。 该算法使用 Active Shape Model 进一步分析了关键的面部特征。 在通过手动标记关键面部特征的边界进行训练后,该模型将创建与屏幕上出现的面部对齐的平均面部。 该模型将创建一个网格,以正确放置过滤器并跟踪其运动。
现在,我们来看看 DL 领域的研究领域。
探索移动设备上 DL 的最新发展
随着 DL 和 AI 的复杂性与移动应用的结合,正在不断进行软件和硬件优化,以在设备上高效运行模型。 让我们看看其中的一些。
谷歌的 MobileNet
Google 的 MobileNet 于 2017 年推出。它是基于 TensorFlow 的一组移动优先计算机视觉模型,经过精心优化以在受限的移动环境中高效运行。 它充当复杂神经网络结构的准确率与移动运行时性能约束之间的桥梁。 由于这些模型具有在设备本身上本地运行的能力,因此 MobileNet 具有安全性,隐私性和灵活的可访问性的优点。 MobileNet 的两个最重要的目标是在处理计算机视觉模型时减小尺寸并降低复杂性。 MobileNet 的第一个版本提供了低延迟模型,该模型能够在受限资源下正常工作。 它们可用于分类,检测,嵌入和分段,支持各种用例。
于 2018 年发布的 MobileNetV2 是对第一个版本的重大增强。 它可以用于语义分割,对象检测和分类。 作为 TensorFlow-Slim 图像分类库的一部分启动的 MobileNetV2,可以从 Colaboratory 直接访问。 也可以在本地下载,使用 Jupyter 进行浏览,也可以从 TF-Hub 和 GitHub 访问。 添加到架构中的两个最重要的功能是层之间的线性瓶颈和瓶颈之间的快捷连接。 瓶颈对中间的输入和输出进行编码,并且内层支持从较低级别的概念转换为较高级别的描述符的功能。 传统的剩余连接和快捷方式有助于减少训练时间并提高准确率。 与第一个版本相比,MobileNetV2 更快,更准确,并且所需的操作和参数更少。 它非常有效地用于对象检测和分割以提取特征。
阿里巴巴移动神经网络
阿里巴巴移动神经网络(MNN)是开源的轻量级 DL 推理引擎。 阿里巴巴工程副总裁贾阳清说:“与 TensorFlow 和 Caffe2 等通用框架相比,它既涵盖训练又包括推理,MNN 专注于推理的加速和优化,并解决了模型部署过程中的效率问题。 因此可以在移动端更高效地实现模型背后的服务,这实际上与 TensorRT 等服务器端推理引擎中的思想相符在大型机器学习应用中,推理的计算量通常是 10 倍以上,因此,进行推理的优化尤为重要。”
MNN 的主要关注领域是深度神经网络(DNN)模型的运行和推断。 它专注于模型的优化,转换和推断。 MNN 已被成功用于阿里巴巴公司的许多移动应用中,例如 Mobile Tmall,Mobile Taobao,Fliggy,UC,Qianuu 和 Juhuasuan。 它涵盖了搜索推荐,短视频捕获,直播,资产分配,安全风险控制,交互式营销,按图像搜索产品以及许多其他实际场景。 菜鸟呼叫机柜等物联网(IoT)设备也越来越多地使用技术。 MNN 具有很高的稳定性,每天可以运行超过 1 亿次。
MNN 具有高度的通用性,并为市场上大多数流行的框架提供支持,例如 TensorFlow,Caffe 和开放式神经网络交换(ONNX)。 它与卷积神经网络(CNN)和循环神经网络(RNN)等通用神经网络兼容。 MNN 轻巧且针对移动设备进行了高度优化,并且没有依赖关系。 它可以轻松部署到移动设备和各种嵌入式设备。 它还通过便携式操作系统接口(POSIX)支持主要的 Android 和 iOS 移动操作系统以及嵌入式设备。 MNN 不受任何外部库的影响,可提供非常高的性能。 它的核心操作通过大量的手写汇编代码来实现,以充分利用高级 RISC 机器(ARM)CPU 的优势。 借助高效的图像处理模块(IPM),无需 libyuv 或 OpenCV 即可加速仿射变换和色彩空间变换,MNN 易于使用。
在积极开发和研究这些产品的同时,现在让我们看一下将来有望变得越来越重要的一些领域。
探索移动应用中 DL 的当前研究领域
活跃的研究人员社区要投入时间和精力,对于任何研究领域的健康发展至关重要。 幸运的是,DL 在移动设备上的应用引起了全球开发人员和研究人员的强烈关注,许多手机制造商(例如三星,苹果,Realme 和 Xiaomi)将 DL 直接集成到了系统用户界面中 (UI)为所有设备生成。 这极大地提高了模型的运行速度,并且通过系统更新定期提高模型的准确率。
让我们看一下该领域中一些最受欢迎的研究领域,以及它们是如何发展的。
DeepFashion
在 2019 年,DeepFashion2 数据集由葛玉英,张瑞茂等提出。 该数据集是对 DeepFashion 数据集的改进,包括来自卖方和消费者的 491,000 张图像。 数据集可识别 801,000 件服装。 数据集中的每个项目都标有比例,遮挡,放大,视点,类别,样式,边界框,密集的界标和每个像素的蒙版。
数据集在训练集中有 391,000 张图像,在验证集中有 34,000 张图像,在测试集中有 67,000 张图像。 该数据集提供了提出更好的模型的可能性,该模型能够从图像中识别时装和不同的服装。 可以轻松想象此数据集可能会导致的应用范围-包括在线商店根据消费者经常穿的衣服推荐要购买的产品,以及首选品牌和产品的预期价格范围。 仅通过识别他们所穿的服装和品牌,也有可能识别任何人可能从事的职业及其财务,宗教和地理细节。
您可以在此处阅读有关 DeepFashion2 数据集的更多信息。
自我注意生成对抗网络
我们在“第 9 章”,“构建图像超分辨率应用”中讨论了生成对抗网络(GAN)的应用,其中我们从低分辨率图像中生成高分辨率图像。 GAN 在学习模仿艺术和图案方面做得相当不错。 但是,在需要记住更长的序列的情况下,以及在序列的多个部分对于生成生成的输出很重要的情况下,它们无法很好地执行。 因此,我们期待 Ian Goodfellow 及其团队推出的自我注意力 GAN(SAGAN),它们是对图像生成任务应用注意力驱动的远程依赖建模的 GAN 系统。 该系统在 ImageNet 数据集上具有更好的性能,并有望在将来被广泛采用。
Jason Antic 的 DeOldify 项目是使用 SAGANs 完成的工作的衍生产品。 该项目旨在将色彩带入旧的图像和视频中,从而使它们似乎从来没有缺少色彩。 以下屏幕快照显示了 DeOldify 项目的示例:
Dorothea Lange(1936)的《移民母亲》。 图像取自 DeOldify GitHub 存储库。 该项目可通过这里进行测试和演示。 您可以在这个页面上了解有关 SAGAN 的更多信息。
图片动画
Facebook 是一个流行的社交媒体平台,具有用于多个平台的专用应用,一直在致力于创建工具,使您可以使用普通的相机生成 3D 图像,否则这些相机只会生成 2D 图像。 图像动画是一项类似的技术,可让我们将动画带入静态图像。 可以想象这种技术非常令人兴奋的用法,人们拍摄自拍照,然后从运动库中进行选择以对其图像进行动画处理,就好像他们自己在进行这些运动一样。
图像动画虽然还处于起步阶段,但可以成为流行和有趣的应用,考虑到采用 Deepfake 技术的类似应用已成功地成为一项业务-例如,中国的 Zao 应用。
总结
在本章中,我们讨论了一些最流行的移动应用,这些应用因其在业务产品中最前沿地使用 DL 而著称,还讨论了 DL 影响其增长的方式。 我们还讨论了移动应用 DL 领域的最新发展。 最后,我们讨论了该领域的一些令人兴奋的研究领域,以及它们将来如何发展成潜在的流行应用。 我们相信,到目前为止,您将对如何在移动应用上部署 DL 以及如何使用 Flutter 来构建可在所有流行的移动平台上运行的跨平台移动应用有一个很好的了解。
我们在本章结束时希望,您将充分利用本项目系列中介绍的思想和知识,并构建出令人敬畏的东西,从而在此技术领域带来一场革命。
十一、附录
计算机科学领域令人兴奋的是,它允许多个软件组件组合在一起并致力于构建新的东西。 在这个简短的附录中,我们介绍了在移动设备上进行深度学习之前需要设置的工具,软件和在线服务。
在本章中,我们将介绍以下主题:
- 在 Cloud VM 上设置深度学习环境
- 安装 Dart SDK
- 安装 Flutter SDK
- 配置 Firebase
- 设置 Visual Studio(VS)代码
在 Cloud VM 上设置深度学习环境
在本节中,我们将提供有关如何在 Google Cloud Platform(GCP)计算引擎虚拟机(VM)实例以执行深度学习。 您也可以轻松地将此处描述的方法扩展到其他云平台。
我们将以快速指南开始,介绍如何创建您的 GCP 帐户并为其启用结算功能。
创建 GCP 帐户并启用结算
要创建 GCP 帐户,您需要一个 Google 帐户。 如果您有一个以@gmail.com
结尾的电子邮件地址或 G Suite 上的帐户,则您已经有一个 Google 帐户。 否则,您可以通过访问这里创建一个 Google 帐户。 登录到 Google 帐户后,请执行以下步骤:
- 在浏览器上访问这里。
- 接受在弹出窗口中显示给您的所有条款。
- 您将能够查看 GCP 控制台信息中心。 您可以通过阅读这个页面上的支持文档来快速使用此仪表板。
- 在左侧导航菜单上,单击“计费”以打开计费管理仪表板。 系统将提示您添加一个计费帐户,如以下屏幕截图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qtGYRynW-1681785128429)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/mobi-dl-tflite/img/4246b346-b4a9-4e99-998f-165343832c4e.png)]
- 点击“添加结算帐户”。 如果有资格,您将被重定向到
GCP Free Trial
注册页面。 您可以在这个页面上了解有关免费试用的更多信息。 您应该看到类似于以下屏幕截图的屏幕:
- 根据需要填写表格。 创建完帐单后,请返回 GCP 控制台信息中心。
您已成功创建 GCP 帐户并为其启用了结算功能。 接下来,您将能够在 GCP 控制台中创建一个项目并将资源分配给该项目。 我们将在接下来的部分中对此进行演示。
创建一个项目和 GCP Compute Engine 实例
在本部分中,您将在 GCP 帐户上创建一个项目。 GCP 中的所有资源都封装在项目下。 项目可能属于或不属于组织。 一个组织下可以有多个项目,而一个项目中可能有多个资源。 让我们开始创建项目,如以下步骤所示:
- 在屏幕的左上方,单击“选择项目”下拉菜单。
- 在出现的对话框中,单击对话框右上方的“新建项目”。
- 您将看到新的项目创建表单,如以下屏幕截图所示:
- 填写必要的详细信息后,单击
CREATE
完成创建项目。 创建项目后,将带您到项目的仪表板。 在这里,您将能够查看与当前所选项目相关的一些基本日志记录和监视。 您可以在这个页面上了解有关 GCP 资源组织方式的更多信息。 - 在左侧导航窗格中,单击
Compute Engine
。 系统将提示您创建一个 VM 实例。 - 点击“创建”以显示 Compute Engine 实例创建表单。 根据需要填写表格。 我们假设您在创建实例时选择了 Ubuntu 18.04 LTS 发行版。
- 确保在防火墙设置中启用对 VM 实例的 HTTP 和 HTTPS 连接的访问,如以下屏幕快照所示:
- 单击“创建”。 GCP 开始为您配置 VM 实例。 您将被带到 VM 实例管理页面。 您应该在此页面上看到您的 VM,如以下屏幕截图所示:
现在,您准备开始配置此 VM 实例以执行深度学习。 我们将在下一部分中对此进行介绍。
配置您的 VM 实例来执行深度学习
在本节中,我们将指导您如何安装包和模块,以在创建的 VM 实例上执行深度学习。 这些包和模块的安装说明在您选择的任何云服务提供商中都是相似的。
您还可以在本地系统上使用类似的命令,以设置本地深度学习环境。
首先调用 VM 的终端:
- 单击 VM 实例页面上的
SSH
按钮,以启动到 VM 的终端会话。 - 您应该看到终端会话开始,其中包含一些与系统有关的常规信息以及上次登录的详细信息,如以下屏幕截图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8qw0xuwj-1681785128430)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/mobi-dl-tflite/img/b79b0eac-cebe-4895-9616-87a90fd5d3da.png)]
- 现在,让我们对该新创建的实例的包存储库执行更新:
sudo apt update
- 接下来,我们将在此 VM 上安装 Anaconda。 Anaconda 是一个受欢迎的包集合,用于使用 Python 执行深度学习和与数据科学相关的任务。 它带有
conda
包管理器打包在一起,这使得管理系统上安装的 Python 包的不同版本非常容易。 要安装它,我们首先需要获取 Anaconda 安装程序下载链接。 前往这里。 您将转到一个页面,为您提供要安装的 Anaconda 版本的选择,如以下屏幕截图所示:
- 建议您选择 Python 3.7 版本。 右键单击“下载”按钮,然后在菜单中找到允许您复制链接地址的选项。
- 切换到您的 VM 实例的终端会话。 使用以下命令将占位符文本粘贴到命令中,从而将其替换为您复制的链接,如下所示:
curl -O <link_you_have_copied>
- 前面的命令会将 Anaconda 安装程序下载到当前用户的主目录中。 要对其进行验证,可以使用
ls
命令。 现在,要将此文件设置为可执行文件,我们将使用以下命令:
chmod +x Anaconda*.sh
- 现在,安装程序文件可以由您的系统执行。 要开始执行,请使用以下命令:
./Anaconda*.sh
- 安装应开始。 应该显示一个提示,询问您是否接受 Anaconda 软件的许可协议,如下所示:
- 点击
Enter
继续检查许可证。 您会看到许可证文件。 - 点击向下箭头键以阅读协议。 输入
yes
接受许可证。 - 系统将要求您确认 Anaconda 安装的位置,如以下屏幕截图所示:
- 点击
Enter
确认位置。 包提取和安装将开始。 完成此操作后,系统将询问您是否要初始化 Anaconda 环境。 在此处输入yes
,如下所示:
- 现在,安装程序将完成其任务并退出。 要激活 Anaconda 环境,请使用以下命令:
source ~/.bashrc
- 您已经成功安装了 Anaconda 环境并激活了它。 要检查安装是否成功,请在终端中输入以下命令:
python3
如果以下命令的输出在第二行包含单词 Anaconda,Inc.,则表明安装成功。 您可以在以下屏幕截图中看到它:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yk7ZRtMM-1681785128431)(https://gitcode.net/apachecn/apachecn-dl-zh/-/raw/master/docs/mobi-dl-tflite/img/6c35a0ee-26db-44c3-831f-a9c4ba78407c.png)]
现在,您可以在此环境上开始运行深度学习脚本。 但是,您将来可能希望向此环境添加更多工具库,例如 PyTorch 或 TensorFlow 或任何其他包。 由于本书假定读者熟悉 Python,因此我们不会详细讨论pip
工具。
现在让我们看一下如何在 VM 上安装 TensorFlow。
在 VM 上安装 TensorFlow
TensorFlow 是执行深度学习的绝佳框架。
要安装它,可以使用以下命令:
# TensorFlow 1 with CPU only support python3 -m pip install tensorflow==1.15 # TensorFlow 1 with GPU support python3 -m pip install tensorflow-gpu==1.15 # TensorFlow 2 with CPU only support python3 -m pip install tensorflow # Tensorflow 2 with GPU support python3 -m pip install tensorflow-gpu
Python 中另一个经常安装的流行库是自然语言工具包(NLTK)库。 我们将在接下来的部分中演示其安装过程。
在 VM 上安装 NLTK 并下载包
要在 VM 上安装 NLTK 并为其下载数据包,请执行以下步骤:
- 使用
pip
安装 NLTK:
python3 -m pip install nltk
- NLTK 有几种不同的数据包。 在大多数情况下,您并不需要全部。 要列出 NLTK 的所有可用数据包,请使用以下命令:
python3 -m nltk.downloader
前面命令的输出将允许您交互式地查看所有可用的包,选择所需的包,然后下载它们。
- 但是,如果您只希望下载一个包,请使用以下命令:
python3 -m nltk.downloader stopwords
前面的命令将下载 NLTK 的stopwords
数据包。 在极少数情况下,您可能会发现自己需要或使用 NLTK 中可用的所有数据包。
通过这种设置,您应该能够在云 VM 上运行大多数深度学习脚本。
在下一部分中,我们将研究如何在本地系统上安装 Dart。
安装 Dart SDK
Dart 是 Google 开发的一种面向对象的语言。 它用于移动和 Web 应用开发。 Flutter 是用 Dart 构建的。 Dart 具有即时(JIT)开发周期,该状态与有状态的热重载兼容,并且具有提前编译的功能,可以快速启动并提供可预测的性能,这使其成为了可能。 适用于 Flutter。
以下各节讨论如何在 Windows,macOS 和 Linux 上安装 Dart。
Windows
在 Windows 中安装 Dart 的最简单方法是使用 Chocolatey。 只需在终端中运行以下命令:
C:\> choco install dart-sdk
接下来,我们将研究如何在 Mac 系统上安装 Dart。
MacOS
要在 macOS 上安装 Dart,请执行以下步骤:
- 通过在终端中运行以下命令来安装 Homebrew:
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
- 运行以下命令以安装 Dart:
$brew tap dart-lang/dart $brew install dart
接下来,我们将研究如何在 Linux 系统上安装 Dart。
Linux
Dart SDK 可以如下安装在 Linux 中:
- 执行以下一次性设置:
$sudo apt-get update $sudo apt-get install apt-transport-https $sudo sh -c 'wget -qO- https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' $sudo sh -c 'wget -qO- https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > /etc/apt/sources.list.d/dart_stable.list'
- 安装稳定版本:
$sudo apt-get update $sudo apt-get install dart
接下来,我们将研究如何在本地计算机上安装 Flutter SDK。
安装 Flutter SDK
Flutter 是 Google 的一个工具包,用于使用单个代码库构建本地编译的 Android,iOS 和 Web 应用。 Flutter 具有热重载的快速开发,易于构建的表达性 UI 和本机性能等功能,这些都使 Flutter 成为应用开发人员的首选。
以下各节讨论如何在 Windows,macOS 和 Linux 上安装 Flutter SDK。
Windows
以下步骤详细概述了如何在 Windows 上安装 Flutter:
- 从这里下载最新的 Flutter SDK 稳定版本。
- 解压缩 ZIP 文件夹,并导航到要安装 Flutter SDK 的目录,以放置
flutter
文件夹。
避免将flutter
放在可能需要特殊特权的目录中,例如C:\Program Files\
。
- 在“开始”搜索栏中输入
env
,然后选择“编辑环境变量”。 - 使用
;
作为分隔符,将flutter/bin
的完整路径附加到用户变量下的路径。
如果缺少Path
条目,只需创建一个新的Path
变量并将path
设置为flutter/bin
作为其值。
- 在终端中运行
flutter doctor
。
flutter doctor
分析整个 Flutter 的安装,以检查是否需要更多工具才能在计算机上成功运行 Flutter。
接下来,我们将研究如何在 Mac 系统上安装 Flutter。
MacOS
Flutter 可以如下安装在 macOS 上:
- 从这里下载最新的稳定 SDK。
- 将下载的 ZIP 文件夹解压缩到合适的位置,如下所示:
$cd ~/ $unzip ~/Downloads/flutter_macos_v1.9.1+hotfix.6-stable.zip
- 将
flutter
工具添加到路径变量:$ export PATH=
pwd/flutter/bin:$PATH
。 - 打开
bash_profile
以永久更新PATH
:
$cd ~ $nano .bash_profile
- 将以下行添加到
bash_profile
:
$export PATH=$HOME/flutter/bin:$PATH
- 运行
flutter doctor
。
Linux
以下步骤概述了如何在 Linux 上安装 Flutter:
- 从这里下载 SDK 的最新稳定版本。
- 将文件提取到合适的位置:
$cd ~/development $tar xf ~/Downloads/flutter_linux_v1.9.1+hotfix.6-stable.tar.xz
- 将
flutter
添加到path
变量中:
$export PATH="$PATH:`pwd`/flutter/bin"
- 运行
flutter doctor
。
接下来,我们将研究如何配置 Firebase 以提供 ML Kit 和自定义模型。
配置 Firebase
Firebase 提供了可促进应用开发并帮助支持大量用户的工具。 Firebase 可以轻松用于 Android,iOS 和 Web 应用。 Firebase 提供的产品(例如 Cloud Firestore,ML Kit,Cloud Functions,Authentication,Crashlytics,Performance Monitoring,Cloud Messaging 和 Dynamic Links)有助于构建应用,从而在不断发展的业务中提高应用质量。
要集成 Firebase 项目,您需要创建一个 Firebase 项目并将其集成到您的 Android 或 iOS 应用中。 以下各节讨论如何创建 Firebase 项目并将其集成到 Android 和 iOS 项目中。
创建 Firebase 项目
首先,我们需要创建一个 Firebase 项目并将其链接到我们的 Android 和 iOS 项目。 此链接有助于我们利用 Firebase 提供的功能。
要创建 Firebase 项目,请执行以下步骤:
- 通过这里访问 Firebase 控制台。
- 单击“添加项目”以添加新的 Firebase 项目:
- 为您的项目提供一个名称:
- 根据您的要求启用/禁用 Google Analytics(分析)。 通常建议您保持启用状态。
Google Analytics 是一种免费且不受限制的分析解决方案,可在 Firebase Crashlytics,Cloud Messaging,应用内消息传递,远程配置,A/B 测试,预测和 Cloud Functions 中实现目标定位,报告等功能。
- 如果您选择 Firebase Analytics,则还需要选择一个帐户:
在 Firebase 控制台上创建项目后,您将需要分别为 Android 和 iOS 平台进行配置。
配置 Android 项目
以下步骤讨论了如何配置 Android 项目以支持 Firebase:
- 导航到 Firebase 控制台上的应用。 在项目概述页面的中心,单击 Android 图标以启动工作流程设置:
- 添加包名称以在 Firebase 控制台上注册该应用。 此处填写的包名称应与您的应用的包名称匹配。 此处提供的包名称用作标识的唯一密钥:
此外,您可以提供昵称和调试签名证书 SHA-1。
- 下载
google-services.json
文件并将其放在app
文件夹中:
google-services.json
文件存储开发人员凭据和配置设置,并充当 Firebase 项目和 Android 项目之间的桥梁。
- 用于 Gradle 的 Google 服务插件会加载您刚刚下载的
google-services.json
文件。 项目级别的build.gradle
(/build.gradle
)应该进行如下修改,以使用该插件:
buildscript { repositories { // Check that you have the following line (if not, add it): google() // Google's Maven repository } dependencies { ... // Add this line classpath 'com.google.gms:google-services:4.3.3' } } allprojects { ... repositories { // Check that you have the following line (if not, add it): google() // Google's Maven repository ... } }
- 这是应用级别的
build.gradle
(roject>/build.gradle
):
apply plugin: 'com.android.application' // Add this line apply plugin: 'com.google.gms.google-services' dependencies { // add SDKs for desired Firebase products // https://firebase.google.com/docs/android/setup#available-libraries }
现在,您都可以在 Android 项目中使用 Firebase。
配置 iOS 项目
以下步骤演示了如何配置 iOS 项目以支持 Firebase:
导航到 Firebase 控制台上的应用。 在项目概述页面的中心,单击 iOS 图标以启动工作流程设置:
添加 iOS 捆绑包 ID 名称,以在 Firebase 控制台上注册该应用。 您可以在“常规”选项卡中的捆绑包标识符中找到应用主要目标的 Xcode。 它用作标识的唯一密钥:
此外,您可以提供昵称和 App Store ID。
下载
GoogleService-Info.plist
文件:
将刚刚下载的
GoogleService-Info.plist
文件移到 Xcode 项目的根目录中,并将其添加到所有目标中。
Google 服务使用 CocoaPods 来安装和管理依赖项。
打开一个终端窗口,然后导航到您的应用的 Xcode 项目的位置。 如果没有,请在此文件夹中创建一个 Podfile:
pod init
打开您的 Podfile 并添加以下内容:
# add pods for desired Firebase products # https://firebase.google.com/docs/ios/setup#available-pods
保存文件并运行:
pod install
这将为您的应用创建一个
.xcworkspace
文件。 使用此文件进行应用的所有将来开发。
要在应用启动时连接到 Firebase,请将以下初始化代码添加到主
AppDelegate
类中:
import UIKit import Firebase @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { FirebaseApp.configure() return true } }
现在,您都可以在 Android 项目中使用 Firebase。
设置 VS 代码
Visual Studio(VS)Code 是由 Microsoft 开发的轻型代码编辑器。 它的简单性和广泛的插件存储库使其成为开发人员的便捷工具。 凭借其 Dart 和 Flutter 插件,以及应用执行和调试支持,Flutter 应用非常易于开发。
在接下来的部分中,我们将演示如何设置 VS Code 以开发 Flutter 应用。 我们将从这里下载最新版本的 VS Code 开始。
安装 Flutter 和 Dart 插件
首先,我们需要在 VS Code 上安装 Flutter 和 Dart 插件。
可以按照以下步骤进行:
在计算机上加载 VS Code。
导航到“查看 | 命令面板”。
开始输入
install
,然后选择扩展:安装扩展。在扩展搜索字段中键入
flutter
,从列表中选择 Flutter,然后单击安装。 这还将安装所需的 Dart 插件。或者,您可以导航到侧栏来安装和搜索扩展:
成功安装 Flutter 和 Dart 扩展后,我们需要验证设置。 下一节将对此进行描述。
用 Flutter Doctor 验证设置
通常建议您验证设置以确保一切正常。
Flutter 安装可以通过以下方式验证:
导航到“查看 | 命令面板”。
输入
doctor
,然后选择Flutter: Run Flutter Doctor
。查看“输出”窗格中的输出。 输出中列出了所有错误或缺少库。
另外,您可以在终端上运行
flutter doctor
来检查一切是否正常:
上面的屏幕快照显示,尽管 Flutter 很好用,但其他一些相关的配置却丢失了。 在这种情况下,您可能需要安装所有支持软件并重新运行
flutter doctor
以分析设置。
在 VS Code 上成功设置 Flutter 之后,我们可以继续创建我们的第一个 Flutter 应用。
创建第一个 Flutter 应用
创建第一个 Flutter 应用非常简单。 执行以下步骤:
导航到“查看 | 命令面板”。
开始输入
flutter
,然后选择Flutter: New Project
。输入项目名称,例如
my_sample_app
。点击
Enter
。创建或选择新项目文件夹的父目录。
等待项目创建完成,然后显示
main.dart
文件。
有关更多详细信息,请参阅这个页面上的文档。
在下一节中,我们将讨论如何运行您的第一个 Flutter 应用。
运行应用
一个新的 Flutter 项目的创建带有一个模板代码,我们可以直接在移动设备上运行它。 创建第一个模板应用后,可以尝试如下运行它:
导航至“VS Code”状态栏(即窗口底部的蓝色栏):
从设备选择器区域中选择您喜欢的设备:
如果没有可用的设备,并且要使用设备模拟器,请单击“无设备”并启动模拟器:
您也可以尝试设置用于调试的真实设备。
单击设置按钮-位于右上角的齿轮图标齿轮(现已标记为红色或橙色指示器),位于
DEBUG
文本框旁边,显示为No Configuration
。 选择 Flutter,然后选择调试配置以创建仿真器(如果已关闭)或运行仿真器或已连接的设备。导航到“调试 | 开始调试”或按
F5
。等待应用启动,进度会显示在
DEBUG CONSOLE
视图中:
应用构建完成后,您应该在设备上看到已初始化的应用:
在下一节中,我们将介绍 Flutter 的热重载功能,该功能有助于快速开发。
尝试热重载
Flutter 提供的快速开发周期使其适合于时间优化的开发。 它支持有状态热重载,这意味着您可以重载正在运行的应用的代码,而不必重新启动或丢失应用状态。 热重装可以描述为一种方法,您可以通过该方法对应用源进行更改,告诉命令行工具您要热重装,并在几秒钟内在设备或仿真器上查看更改。
在 VS Code 中,可以按以下方式执行热重装:
打开
lib/main.dart
。将
You have pushed the button this many times:
字符串更改为You have clicked the button this many times:
。 不要停止您的应用。 让您的应用运行。保存更改:调用全部保存,或单击
Hot Reload
。