背景介绍
随着软硬件技术的发展,智能穿戴式设备逐渐从概念走向商用化。在过去几年内,Google、Apple以及Sony等科技公司在体积、功耗控制以及成本等方面做得越来越好,推出了一大批可穿戴产品,具有代表性的成果有:1. 智能手环:产品具备运动监测、睡眠监测、心率测量以及震动唤醒等功能;2. 智能眼镜:广泛应用于VR、AR领域。
近来,在哔哩哔哩上看到一个很有趣的成果:项目中将陀螺仪集成到狗狗衣服内,后续通过无线的方式将关节数据传输给手机APP,在手机端通过人工智能算法识别狗的运动状态,并且通过three.js将结果进行可视化。整个项目主要包含硬件和软件两部分,其中硬件部分主要是对传感器的输出信号进行采集,前期文章中具有详细描述,具体可以参考:数据采集版以及血压信号采集等;近来,想要在软件方面做一些初期工作,将深度学习模型集成到Android 端,具体过程如下所示:
附1、不管是现阶段非常火的机器学习,还是研究生阶段从事的有限元模拟,其本质都是如何利用数据,让数据发挥应有的价值。
系统框架
前期推文中详细介绍了体态识别算法的原理、模型的训练过程以及算法的应用实例等,然而如何将模型部署到手机端是一个亟待解决的问题。调研发现,项目实施过程主要包含:1. 将现有的checkpoints模型文件转化为 .tflite文件;2. 在 Android 端加载 .tflite文件,具体过程如下所示:
深度学习模型格式转化
预想中这部分应该没有任何难度,通过几行代码就能实现模型格式转化,奈何实际执行过程中一直报错,显示找不到相应的库函数,场面一度极为尴尬。因为环境问题折腾了大半天,最后将tensorflow升级到1-14版本,成功解决该问题(在此记录一波,希望大家能够少走弯路)~
converter = tf.compat.v1.lite.TFLiteConverter.from_session(sess, [X], [y_pred_softmax])
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
程序运行后能够自动输出 .tflite文件,具体如图3所示:
深度学习模型在Android 端的部署
近来在同学小A的帮组下,将深度学习模型部署在Android studio 内,我们通过调用 'org.tensorflow : tensorflow - lite- support:0.1.0’实现 .tflite 模型的加载,后续编写数据接口函数,对硬件端传输的数据进行解算,并作为输入参数传递给深度学习模型,图4展示了模型的预测结果(与Linux端部署完全一致)。
项目中用到的程序代码为:
val outputs = model.process(inputFeature0)
val resultByteBuffer = outputs.outputFeature0AsTensorBuffer.buffer
val arr = ByteArray(resultByteBuffer.limit())
resultByteBuffer.position(0)
resultByteBuffer.get(arr, 0, arr.size)
findViewById<TextView>(R.id.tv_result).apply {
text = "原始数据: ${arr.contentToString()}\n解析数据: ${Utils.byteArrayToFloatArray(arr).contentToString()}"
}
model.close()