Tensorflow Lite 0.1 for Android

本文介绍如何在Android设备上部署TensorFlow Lite,包括直接使用预训练模型和自定义模型的方法。涵盖环境搭建、模型转换及应用示例等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接使用JCenter库方式:
移动设备上使用谷歌开源的深度学习框架 Tensorflow Lite,最新源码位置:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/lite
要求:
Android Studio 3.0
SDK Version API25,或者API26
NDK Version 14
步骤:
1 导入tensorflow/contrib/lite/java/demo 这个项目到Studio,
2 如果没有gradle,则安装好gradle,根据Studio的提示进行安装就好(测试使用的是2.3.1)
3 下载移动端的模型(model)和标签数据(lables)(https://storage.googleapis.com/download.tensorflow.org/models/tflite/mobilenet_v1_224_android_quant_2017_11_08.zip
4 下载完成解压mobilenet_v1_224_android_quant_2017_11_08.zip文件得到一个xxx.tflite和labes.txt文件,分别是模型和标签文件,并且把这两个文件复制到assets文件夹下。
5 构建app,在run一下不出意外应该是可以看到以下画面:

这里写图片描述

自行构建Tensorflow Lite demo
1 首先clone tensorflow库 (https://github.com/tensorflow/tensorflow
2 安装构建工具Bazel (https://docs.bazel.build/versions/master/install.html
(注:Bazel目前不支持Android的Windows上的构建。gradle/ CMake将来会被支持,在Windows预构建二进制代替。)
3 确保机器安装了Android SDK和Android NDK,如果没安装则先安装.(https://developer.android.com/tools/revisions/build-tools.html
4 修改Tensroflow 下面的WORKSPACE 文件中的sdk和ndk指向:

 Android_sdk_repository (
   name = "androidsdk",
   api_level = 23,
   build_tools_version = "23.0.2",
   path = "/home/xxxx/android-sdk-linux/", )
android_ndk_repository(
  name="androidndk",
  path="/home/xxxx/android-ndk-r10e/",
  api_level=19)

5 用命令开始构建源代码
使用bazel 构建一个demo app :

(注意:构建app时,由于bazel 存在的bug,需要在python2 的环境中进行)

关于mobilenet_v1_224_android_quant_2017_11_08.zip模型

 demo是调整每个摄像机的图像帧(224宽×224高)与量化室移动模型被使用。调整后的图像是由排尺寸1×224×224×3字节转换成一个字节缓冲区的行,其中1是在一批224×224图像的数量是3个字节的图像的宽度和高度是三种颜色的像素。本程序使用java API tensorflow Lite推理模型以单输入单输出提供。这输出一个二维数组,第一个维度是类别索引,第二个维度是分类的自信度。该室移动模型具有1001个不同的类别和应用程序类型的所有类别的概率,显示前三个可能性。

关于Tensorflow Lite
根据不同的使用情况下,可以选择使用一个流行的开源模型如inceptionv3或mobilenets,重新训练这些模型用自己的自定义数据集或甚至建立自己的自定义模型。

直接使用一个预训练好的模型
mobilenets是tensorflow移动计算机视觉模型家族,这个设计有效地提高精度并且在的资源受限的设备或嵌入式应用。mobilenets的优点是模型资源小、低延迟、低功耗模型参数来满足各种使用情况下的资源约束。他们可以建立在分类、检测、嵌入和分割类似于其他流行的大型模型,如成立以来,使用。谷歌提供了16个预训练的ImageNet分类检查用于各种尺寸的移动项目mobilenets
以上例子中使用的inception-v3:
是图像识别模型与1000类一般物体识别,达到了较高的精度,如“斑马”、“狗”、“洗碗机”。该模型采用卷积神经网络的输入图像提取的一般特点和分类的基础上的特征完全连接和softmax层。
其他预训练好的模型下载地址可以在 tensorflow/tensorflow/contrib/lite/g3doc/models.md 文件中找到。

使用inception-v3或MobileNet为自定义的数据集
上述预先训练模式已经被训练在ImageNet数据集,包括1000个预定义的类。如果这些类对给定的用例不相关或有用,则需要对模型进行再培训。这项技术被称为迁移学习,开始用一个模型已经训练上的问题,将被训练在一个类似的问题。从零开始深入学习可能需要几天时间,但是转移学习可以很快完成。为了做到这一点,开发人员需要生成与相关类标记的自定义数据集。

训练自定义模型
第二种利用已经有的网络框架训练自己的数据基本可以满足大部分需求,但是除了以上方式,也可以自定义网络模型。如:先使用python构建出深度网络,训练好以后进行数据导出,大概会有这些文件xxx.pb,xxx.ckpt等文件,可以根据这些文件转换成Lite 可用的模型xxx.tflite。具体见下文。
模型格式转换
把一个标准的tensorflow模型转换成mobileNets 。标准模型中有保护 .pb 或者 .pbtxt 图( GraphDef ) 文件。如果应用程序开发人员使用预先培训过的模型(如上面步骤1中所定义的),他们可以从这里下载一个现成的、已经转换过的模型。使用再培训(即迁移学习)或自定义模型生成的模型需要使用下面提到的步骤进行转换。
(GraphDef ) xxx.pb :一个protobuf表示tensorflow培训或计算图。这包含运算符、张量和变量定义。
(CheckPoint) xxx.ckpt:这是一个GraphDef 延伸变量,这个文件一般无法被单独解释。
(FrozenGraphDef) graphdef不含变量的子类。一个graphdef可以转换为一个冻结状态的graphdef通过CheckPoint 和graphdef转换每个变量
(TensorFlow lite model ).lite:文件是序列化flatbuffer,含tensorflow Lite算子和张量的tensorflow Lite的翻译。这是最类似于TensorFlow frozen GraphDefs冻结“图”要在TensorFlow Lite中使用此.pb GraphDef文件,我们需要包含经过训练的权重参数的CheckPoint。 .pb只包含图形的结构。 合并CheckPoint值与图形结构的过程称为“冻结”图形。

首先要确检查点文件夹存在的位置,或者也可以下载一个预先训练的模型的检查点(例如:这里是一个MobileNets的链接)。
图冻结可以使用下面的命令完成(并适当地修改参数)

bazel build tensorflow/python/tools:freeze_graph
bazel-bin/tensorflow/python/tools/freeze_graph\
    --input_graph=/tmp/mobilenet_v1_224.pb \
    --input_checkpoint=/tmp/checkpoints/mobilenet-10202.ckpt \
    --input_binary=true --output_graph=/tmp/frozen_mobilenet_v1_224.pb \
    --output_node_names=MobileNet/Predictions/Reshape_1

用户必须首先使用bazel构建freeze_graph脚本,然后运行脚本。 必须启用input_binary标志以确保protobuf以二进制格式读取和写入。 用户必须输入.pb和.ckpt文件才能冻结图形。output_node_names可能在构建模型的代码之外不明显。 找到它们的最简单方法是用graphviz或tensorboard可视化图形。

这个冻结的Graphdef现在已经准备好转换为flatbuffer格式(.lite),以便在Android或iOS上使用。 在Android用户可以使用Tensorflow Optimizing Converter工具,灵活地使用冻结graphdef的浮点或量化版本(如果有的话)。

下面是一个示例命令行,用于将冻结的Graphdef转换为“.lite”格式。Tensorflow Optimizing Converter支持浮点模型和量化模型,但是,根据是否使用FLOAT或QUANTIZED模式,需要使用不同的配置参数。

bazel build tensorflow/contrib/lite/toco:toco
bazel run --config=opt tensorflow/contrib/lite/toco:toco -- \
  --input_file=(pwd)/mobilenet_v1_1.0_224/frozen_graph.pb \
  --input_format=TENSORFLOW_GRAPHDEF  --output_format=TFLITE \
  --output_file=/tmp/mobilenet_v1_1.0_224.lite --inference_type=FLOAT \
  --input_type=FLOAT --input_arrays=input \
  --output_arrays=MobilenetV1/Predictions/Reshape_1 --input_shapes=1,224,224,3

参数说明:
input_file参数应指向包含模型体系结构的冻结GraphDef文件。
output_file参数应指向TensorFlow Lite模型文件的生成位置。
input_type和inference_type参数应设置为FLOAT,除非转换量化的模型。
设置input_array,output_array和input_shape参数有点棘手。 找到这些值最简单的方法是测试TensorBoard中的图形。 用户应该重用现有的freeze_graphstep中用于指定输出节点进行推理的参数。

请注意,也可以通过protos使用Tensorflow Optimizing Converter,可以将转换步骤整合到模型设计工作流程中,以确保模型可以轻松转换为移动推理图。 例如:

import tensorflow as tf
img = tf.placeholder(name="img", dtype=tf.float32, shape=(1, 64, 64, 3))
val = img + tf.constant([1., 2., 3.]) + tf.constant([1., 4., 4.])
out = tf.identity(val, name="out")
with tf.Session() as sess:
  tflite_model = tf.contrib.lite.toco_convert(sess.graph_def, [img], [out])
  open("converteds_model.tflite", "wb").write(tflite_model)
<think>好的,我现在要处理用户关于Android离线人脸识别的介绍请求。首先,我需要明确用户的需求。用户可能是一位开发者,想要在Android应用中集成离线人脸识别功能,所以需要了解相关的基本概念、技术实现步骤、优缺点以及推荐的开源库或SDK。 接下来,我得回忆一下Android平台上人脸识别的常见方法。离线识别意味着不依赖网络,所有处理在设备上进行,这涉及到图像处理、特征提取和机器学习模型的应用。我需要分步骤解释,从人脸检测到特征提取,再到模型训练与识别,可能还要提到活体检测。 然后,要考虑用户可能关心的技术选型,比如推荐哪些开源库,比如OpenCV、TensorFlow Lite、ML Kit,或者一些第三方SDK如Face++或ArcFace。需要比较它们的优缺点,帮助用户做出选择。 还要注意用户提到的系统级指令,比如数学公式的正确使用。不过在这个问题中可能涉及较少,但如果有算法或数学概念,比如欧氏距离计算相似度,就需要用行内公式格式,比如$d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2}$。 需要确保回答结构清晰,分步骤说明,并且语言简洁。同时,要提醒用户注意性能优化、隐私合规以及不同Android版本的兼容性问题,这些都是开发中常见的痛点。 最后,检查是否有遗漏的重要点,比如数据安全、模型准确率、实时性要求等。可能用户没有明确说,但作为全面的介绍,应该涵盖这些方面。确保推荐的工具和库是当前流行的,并且有活跃的社区支持,比如TensorFlow Lite的例子。 总结下来,回答的结构应该是:概述、技术步骤、优缺点、推荐工具、开发注意事项,分点说明,方便用户理解。同时使用中文,避免专业术语过多,必要时解释概念,比如活体检测是什么,为什么重要。</think>以下是对Android平台离线人脸识别技术的分步解析: 一、技术原理概述 1. 人脸检测 - 使用Haar级联分类器或深度学习模型(如MTCNN)定位人脸区域 - 典型输出:人脸边界框坐标$(x,y,w,h)$ 2. 特征提取 - 通过深度神经网络提取128-512维特征向量 - 特征距离计算示例: $$d = \sqrt{\sum_{i=1}^n (v1_i - v2_i)^2}$$ 其中$v1$,$v2$为两个特征向量 3. 识别匹配 - 建立本地特征数据库进行相似度比对 - 阈值判定:当$d < 0.6$时通常判定为同一人 二、实现步骤 1. 开发环境配置 ```gradle // 示例:TensorFlow Lite依赖 implementation 'org.tensorflow:tensorflow-lite:2.12.0' implementation 'org.tensorflow:tensorflow-lite-gpu:2.12.0' ``` 2. 核心流程 ① 摄像头帧捕获 → ② 人脸检测 → ③ 对齐归一化 → ④ 特征提取 → ⑤ 本地数据库查询 → ⑥ 结果反馈 三、技术方案对比 | 方案类型 | 优点 | 缺点 | |----------------|----------------------|--------------------------| | 原生Camera2 API| 低延迟,可控性强 | 开发复杂度高 | | OpenCV | 跨平台,算法丰富 | 需要自行优化性能 | | ML Kit | 谷歌官方支持 | 需捆绑Google服务 | | 第三方SDK | 功能完善 | 可能有授权费用 | 四、推荐工具库 1. 开源方案 - OpenCV (4.5+): 提供经典人脸识别算法 - TensorFlow Lite: 支持移动端模型部署 - dlib: 包含68点人脸特征点检测 2. 商业SDK - Face++离线版:准确率高,支持活体检测 - ArcFace(虹软):免费基础版,识别速度<200ms 五、性能优化要点 1. 模型量化:将FP32转换为INT8,体积缩小4倍 2. 多线程处理:分离图像采集与计算线程 3. 分级检测:先快速粗筛再精确识别 4. 内存优化:使用`ByteBuffer`直接操作图像数据 六、注意事项 1. 隐私合规 - 遵循GDPR/个人信息保护法 - 人脸数据必须本地加密存储 2. 设备兼容性 - 最低建议配置:Android 8.0+,2GB RAM - 使用`CameraX`兼容不同摄像头硬件 3. 用户体验 - 推荐识别耗时<500ms - 添加实时预览框和结果反馈动画 典型应用场景:智能门禁(误识率<0.1%)、相册分类、考勤系统等。建议从小型PoC项目开始验证,逐步优化模型精度与速度的平衡。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值