设置 Android AI 开发环境





5.00/5 (5投票s)
这是关于在 Android 上使用 TensorFlow Lite 的系列文章的第一篇,
本系列文章的后续部分将引导您创建 Android 应用程序,准备用于 TensorFlow Lite 的预训练神经网络,并考虑如何提高性能以及训练自己的视觉识别器所需的步骤。
什么是深度神经网络?
深度神经网络 (DNN) 在图像分类和其他类型的自动分类方面表现出色。十年前需要数百万美元的研究和计算能力才能获得的结果,现在任何拥有还不错的 GPU 的人都可以实现。但在移动设备上运行 DNN 时,可能会遇到一个缺点。如果使用传统代码实现,DNN 在移动设备上可能会占用大量处理器资源并且速度缓慢。幸运的是,TensorFlow Lite 提供了一种缩小 DNN 规模的解决方案,使其能够在移动设备上更流畅地运行。
DNN 是实现人工智能的众多方式之一。神经网络是基于仿生学(根据生物实体设计技术和过程)的 AI 方法之一。DNN 基于神经元。生物神经元相互连接,可能会响应来自环境或其他神经元的外部刺激而激活,并刺激它们所连接的其他神经元。软件神经元与之类似,它们的外部刺激来自保存的数据或来自摄像头和麦克风等传感设备。
软件神经网络的实现方式和连接形成方式值得单独讨论。如果您想更详细地了解它,请查看AI:神经网络入门。
简而言之,单个软件神经元(或节点)有多个输入接受一些数值,对于每个输入,该值乘以某个数字并加上一个基值。所有这些输入的结果相加并通过一个激活函数来决定神经元将输出什么值。这些不同的神经元连接在一起以相互传递信息。这些神经元的集合配置被称为模型。对于单个神经元,涉及许多数学运算。对于完整的神经网络模型,可能涉及数千个相互连接的神经元。
典型的计算机处理器可以快速执行顺序操作。但即使是多核 CPU,与 GPU 相比,它能进行的并行操作数量也极其有限。GPU 旨在一次性对向量组执行数学运算。这对于高性能 3D 渲染和训练神经网络都是必需的。CPU 速度极快,但不是我们进行 3D 渲染或训练神经网络所需的正确方式。
GPU 旨在执行大量的并行操作,以便它们能够快速处理和显示构成视觉场景的形状和像素。然而,GPU 不关心它们处理的数据的最终目的,并且发现它们也可以用于更通用的计算。现在,一些 GPU 也提供原生 API 来执行通用计算。在移动设备上,巧妙地利用 GPU 可以显著加快神经网络的处理速度。除了 GPU 之外,现在还有带有专门为处理神经网络而设计的硬件的移动设备。使用 TensorFlow Lite,您的代码可以利用可用的硬件加速。
在深入研究 Android 上的神经网络之前,您需要设置一个开发环境。您可以在 Windows、macOS 或 Linux 上进行开发。所需的软件适用于这三个平台
- 对于手机开发和部署,您将需要 Android Studio。
- 对于训练和转换网络,您将需要 Python 3.7+。
- Netron 虽然不是绝对必要的,但在您需要视觉检查已保存的神经网络模型时,它有时会非常有用。
安装完所有这些后,您可以开始配置。由于 Python 将从命令行使用,因此您需要将其安装位置添加到 PATH 变量中,这样您就不必输入其完整路径来使用它。
此外,您还需要在您的环境中安装额外的 Python 库。这些库可以使用 PIP 工具从命令行轻松安装。您需要安装的库包括以下内容
- NumPy - 用于处理数组、线性代数等的数值计算库。
pip3 install numpy - ONNX-TF - 用于从开放神经网络交换格式转换网络模型。
pip3 install git+https://github.com/onnx/onnx-tensorflow.git - TensorFlow - 用于创建或使用神经网络模型。
对于支持 GPU 的 Windows 和 Linux:pip3 install tensorflow
对于 Windows、Linux 和 macOS:pip3 install tensorflow-gpu - Tensorflow_addons
pip3 install tensorflow_addons
对于 Tensorflow,有多种安装选项。默认情况下,将安装兼容版本的 tensorflow。兼容版本虽然不是最快的,但它可以在最广泛的硬件上运行。如果您的计算机的处理器支持某些向量操作的指令,那么 TensorFlow 将打印一条消息通知您计算机支持可以用于提高性能的选项。
如果您的计算机有受支持的图形适配器,您还可以安装支持 GPU 的 TensorFlow 版本。在撰写本文时,NVIDIA 的 CUDA 启用 GPU 是受支持的显卡系列。如果您有兼容的显卡并想使用 GPU 加速版本的 TensorFlow,您可以使用以下命令安装它
pip3 install tensorflow-cpu
Android Studio 还必须配置为使用 NDK 执行原生代码编译。您不需要自己编写任何原生代码,但 TensorFlow Lite Android 库依赖于此。要安装 NDK,请打开 Tools 菜单并选择 SDK Manager。在 SDK Tools 选项卡下有一个名为 NDK (Side by side) 的项。选择此项将安装最新版本的 NDK。TensorFlow Lite 更新频繁。要安装我使用的版本 (21.0.6113669),请选中右下角的 Show Package Details 复选框。选中后,展开 NDK (Side by Side) 以查看 NDK 版本。
选择 SDK 版本并点击 OK 后,Android Studio 将下载并安装组件。下载完成后,通过新建一个 Android 项目并向其中添加 TensorFlow 引用来测试 NDK 的正确版本是否存在。在 Android Studio 中,打开 File 菜单并选择 New Project。选择 Empty Activity 并接受此项目的默认设置。点击 Finish。
在项目的 build.gradle 文件的 dependencies 部分,添加以下行
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
然后构建项目。如果一切顺利,项目将编译。如果 NDK 要求发生变化,您应该会收到一条错误消息,指出找不到所需的 NDK 版本,并提供所需的版本。如果遇到这种情况,请打开 SDK 管理器并选择错误标识的 NDK 版本。
作为 Python 和 TensorFlow 安装的测试,让我们快速创建一个使用 TensorFlow 的应用程序。对于这个应用程序,TensorFlow 将获取一系列数字和相关的输出,并必须找出它们之间的关系。对于这个测试,这些数字之间将存在线性关系。输入值将是
2, 5, 10, 12, 24, 32, 66, 100
输出值将是
5, 14, 29, 35, 71, 95, 197, 299
发现这种数字集之间的关系被称为线性回归。这些值之间的关系可以用方程 y = 3*x-1 来表示。在此代码中,创建了一个简单的网络来学习关系,然后根据测试值 7 计算输出
import tensorflow as tf
print(tf.__version__)
#This is the training data
training_x = [2, 5, 10, 12, 24, 32, 66, 100]
training_y = [5, 14, 29, 35, 71, 95, 197, 299]
#Building the network that will be trained
layer0 = tf.keras.layers.Dense(units=1, input_shape=[1])
model = tf.keras.Sequential([layer0])
#Compiling the network
model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(1))
#Training
history=model.fit(training_x, training_y, epochs=1000, verbose=False)
#Show the network weights
weights = layer0.get_weights()
print('weight: {} bias: {}'.format(weights[0], weights[1]))
#Try prediction
print(model.predict([7]))
将此程序保存为 regression.py 文件。要运行该程序,请从终端运行以下命令。
python3 regression.py
运行时,TensorFlow 将运行其训练周期,然后打印输入值 7 的输出。
weight: [[3.]] bias: [-1.000001]
[[20.]]
如果代码运行并打印出类似上述的输出,那么您就拥有了一个可用的 TensorFlow 环境。线性回归是一种常见的数据分析和预测工具。但我们想用视觉识别做更复杂的事情。
后续步骤
我们现在已经设置好并准备好进行 Android 和 TensorFlow 开发。在下一篇文章中,我们将学习如何获取一个预训练的神经网络并使其适应 TensorFlow Lite 的使用。