训练您自己的 TensorFlow 神经网络用于 Android





5.00/5 (2投票s)
在本文中,我们将从一个程序生成输出,该程序将提供一个 TensorFlow 冻结图,可以用于或转换为 TensorFlow Lite。
这是关于在 Android 上使用 TensorFlow 系列文章的最后一部分。 该系列文章的前面部分涵盖了设置开发环境、寻找预训练模型、调整其以在 Android 应用程序中使用以及创建使用它的应用程序。 前面部分使用 YOLO 实现来创建一个识别 80 类对象的应用程序。
您可以训练自己的 YOLO 网络来识别您自己选择的物品分类。 YOLO 最初由 Joseph Redmond 和 Farhadi Ali 使用 Darknet 实现。 Darknet 是一个基于 C 语言的开源框架,用于构建神经网络。 如果您的机器已经安装了 C 编译器和 make
,则可以通过三个命令下载和构建 Darknet
git clone https://github.com/pjreddie/darknet cd darknet make
确定您希望网络识别的图像类别。 在文本文件中列出这些类,以便它们处于定义的顺序。 每个类应该在其自己的行上。 此文件将用于训练。 拥有一个有序列表也很重要,因为图像类将在其他地方通过此列表中类的从零开始的索引来表示。 将此文件命名为 classes.txt 并将其放置在 Darknet data 文件夹中。
接下来,收集各种类别的对象图像以进行训练和测试。 这可能是最具挑战性的步骤之一,因为每个类别都需要数百个图像。 对于您想要识别的项目,您需要从不同角度在各种情况下拍摄它们的图片。 每个图像文件也必须被标记。 通过创建一个与图像同名的文本文件(但带有 txt 扩展名)来标记图像,其中包含训练图像中每个样本对象的行。 每行有五个元素,以空格分隔。
<object-class> <x> <y> <w> <h>
以下是此类行的示例。 对于此行,分类为属于第 5 类的对象位于图像内的 x,y 位置 10,12,并且宽 45 像素,高 22 像素。 由于使用了从零开始的索引,因此此处的数字 5 表示您之前创建的 classes.txt 文件中第六行的项目。
5 10 12 45 22
使用标记的图像,您需要将图像分成两个列表。 这两个列表的图像应以 80%/20% 到 90%/10% 的比例分割。 较大的列表将用于训练网络,较小的列表将用于测试网络。 每个列表应包含其自身行上图像文件的绝对路径。 将文件命名为 test.txt 和 train.txt。
这些文件现在将成为配置集的一部分。 在 data 文件夹中,创建一个名为 training_config.data 的文件。 该文件将包含有关网络将检测到的类别的数量、包含训练数据文件列表的文件路径、包含测试文件列表的文件路径以及放置训练期间的间歇性结果的文件夹名称的信息。
classes= 20 train = /dev/darknet/data/train.txt valid = /dev/darknet/data/test.txt names = data/classes.txt backup = backup
有了该文件后,您现在可以开始训练了
./darknet detector train cfg/training_config.data cfg/yolov3-voc.cfg
训练是一个耗时的过程。 一旦训练开始,现在可能是离开计算机并做其他事情的好时机。 如果您在笔记本电脑上运行训练,请确保它已连接到电源。 训练是计算密集型的,计算机可能会在较高功率状态下保持一段时间。
训练完成后,您将拥有一个 DarkNet.weights 文件。 有几个开源实用程序可以将此文件转换为 TensorFlow 冻结图,用于 TensorFlow 1 或 TensorFlow 2。 我建议的与 TensorFlow 兼容的实用程序名为 Yolov4-tflite,这是一个 Python 脚本实用程序,您可以从以下 URL 克隆
https://github.com/hunglc007/tensorflow-yolov4-tflite
要转换权重文件,该实用程序接受文件路径
python save_model.py --weights ../darknet/yolov3.weights -output my-yolov --input_size 416 --model yolov3
该程序的输出提供了一个 TensorFlow 冻结图,可以用于或转换为 TensorFlow Lite。
结论
这是关于在 Android 上使用 TensorFlite Lite 的六部分系列文章的最后一篇。 我专注于使用现有模型并将注意力转移到视觉处理。 这不是 TensorFlow 可以使用的唯一领域。 只要您拥有有关如何形成输入或解释输出的信息,本系列中提供的信息也可用于导入和使用用于非视觉算法的 TensorFlow 模型。
如果您想更深入地研究 TensorFlow 并开始试验训练其他模型,可以使用许多不同的框架来入门。 Keras 是 TensorFlow 最流行的框架之一。 您可以在 CodeProject 上找到其他关于 Keras 的文章。