使用 TensorFlow Lite 进行 Android AI 危险检测





5.00/5 (5投票s)
本系列文章将向读者展示如何使用 Android 设备创建一个实时的 AI 危险检测器。
许多现代车辆都配备了摄像头,可以检测前方道路上的危险并提醒驾驶员。但是,如果您驾驶的是一辆旧车,并且您拥有的只是一台 Android 设备呢?您可以创建一个应用程序,在危险出现时检测它们并在您驶入它们之前提醒您吗?本系列将向您展示如何使用 Android 设备创建危险检测器。完成的项目将在检测到危险区域内的障碍物时发出音频警报并突出显示它们。
技术栈
要开始,我们需要 Android Studio、一个 AI 模型和 Python 解释器。可选地,您可能还需要一个名为 Netron 的免费软件工具,用于查看有关训练好的网络模型的信息。作为我们开发的第一步,我们将让解决方案在设备上存储的照片上运行。您将需要来自驾驶区域的图片,其中包含一些可见的障碍物。稍后,我们将让应用程序使用来自摄像头的实时视频。
我们将使用 Kotlin 创建我们的 Android 应用程序。如果您做过很多 Android 开发,您可能已经习惯使用 Java。那么,如果 Java 仍然运行良好,为什么要使用 Kotlin 呢?简而言之,Kotlin 现在是 Google 用于 Android 应用开发的首选语言。新的 Android API 将为 Kotlin 而设计 - 虽然它们可以从 Java 使用,但这样做可能会很尴尬。
但是,如果您是 Java 老手,请不要担心!Kotlin 旨在让 Java 开发人员感到非常熟悉,而且它还有一个很棒的 Java 互操作性故事。您可以加载任何 Java 库并将其无缝用于 Kotlin 应用程序。
AI 模型
AI 模型将能够检测视觉场景中的对象。与其从头开始构建模型,您可能希望从现有模型开始。您可以在 ONNX 模型动物园 或 TensorFlow Hub 上找到训练好的模型。ONNX 是一种用于表示训练网络的格式。ONNX 模型可以转换为其他表示形式。我们将转换一个用于 TensorFlow Lite。在浏览了各种可用模型之后,我决定使用来自 ONNX 模型动物园的 YOLO 模型。YOLO 是一种相对容易使用的模型,可以检测各种不同类型的对象。一些图片分析模型只能说明存在某些对象集,但无法说明它们在图片中的位置。YOLO 还将返回有关对象位置的信息。
必须转换来自 ONNX 模型动物园的模型。从脚本执行此操作最容易。要执行转换,我们需要 Python 和用于 Python 的 TensorFlow 包。在撰写本文时,您需要使用 Python 3.8。虽然可以使用 3.9,但 TensorFlow 兼容到 3.8 版本。如果您已安装 Python,您可以使用以下命令安装 TensorFlow 包和用于 Python 的 ONNX 到 TensorFlow 转换包。
pip3 install tensorflow
Pip3 install onnx-tf
将我们的模型从 ONNX 转换为 TensorFlow Lite 是一个两阶段的过程。必须将文件从 ONNX 转换为 TensorFlow,然后从 TensorFlow 转换为 TensorFlow Lite。要将模型从 ONNX 转换为 TensorFlow,请使用以下命令。
onnx-tf convert -i youlov4.onnx -o yolo.pb
对于第二次转换,我们需要一个简短的 Python 脚本。将以下内容保存到名为 convert.py 的文件中。变量 saved_model_dir
应该设置为您已保存转换后模型的路径。
import tensorflow as tf
saved_model_dir='/dev/projects/models'
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]
tf_lite_model = converter.convert()
open(’yolov4.tflite', 'wb').write(tf_lite_model)
我们的 Android 项目
对于 Android 项目,创建一个带有空活动的新的应用程序。此应用程序最终将是一个全屏应用程序,使用来自摄像头的实时视图。此应用程序将需要访问摄像头和位置的权限。将以下权限添加到您的 AndroidManifest.xml。为了发送紧急警报,该应用程序还需要 SMS 权限。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.SEND_SMS" />
应用程序需要在代码中请求这些权限。为了更专注于此应用程序特定的功能,此处未演示一些相当常见的调用,但它们位于示例项目中。这包括调用 requestPermissions
以获取 SMS、位置和摄像头访问权限。
Android 项目需要进行一些配置更改以准备其用于 TensorFlow Lite。必须添加对 TensorFlow 库的引用,并且应将项目设置为不压缩 TensorFlow 模型文件。要添加 TensorFlow 库,请将这三行添加到 dependencies 部分的底部。
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
implementation 'org.tensorflow:tensorflow-lite-support:0.0.0-nightly'
在同一个文件中,在 android 部分中,必须添加以下内容以防止压缩模型。
aaptOptions {
noCompress "tflite"
}
该项目现在已准备好处理 TensorFlow Lite 模型。在本系列的下一篇文章中,我们将把 TensorFlow Lite 模型添加到项目中并准备好进行处理。