Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android Studio新特性:使用TFLite模型更简单

Android Studio新特性:使用TFLite模型更简单

作者头像
云水木石
发布于 2020-11-03 02:51:31
发布于 2020-11-03 02:51:31
2.4K00
代码可运行
举报
运行总次数:0
代码可运行

Android Studio仍然在疯狂更新中,隔一段时间打开Android Studio,就会提示有新版本,对此我已经见怪不怪。一般而言,我会顺手点击一下升级。今天我又点击了升级,粗略看了一下新版本4.1的特性说明,其中有一项是:使用TensorFlow Lite模型。出于对机器学习的兴趣,于是就研究了一番这个新特性。

TensorFlow Lite是最受欢迎的编写移动端机器学习模型的开发库,在我之前的文章中也写过如何在Android程序中使用TFLite模型。有了TFLite模型后,我们需要模型开发者提供模型的输入、输出等信息,然后编写封装类,对图片进行预处理(比如裁剪、规范化等等),这对于开发者而言,枯燥而且容易出错。而在Android Studio 4.1中,这个开发过程得到了简化,导入模型后,Android Studio会生成辅助类,我们只需编写极少的代码即可运行模型,而且还提升了类型安全性。

我们先说说如何导入TFLite模型并使用,然后再来解释是如何做到的。

导入模型文件

按照如下步骤即可导入TFLite模型:

  1. 新建或打开现有Android项目工程。
  2. 通过菜单项 File > New > Other > TensorFlow Lite Model 打开TFLite模型导入对话框。

Android Studio菜单

  1. 选择后缀名为.tflite的模型文件。模型文件可以从网上下载或自行训练。

导入模型

  1. 点击对话框上的 Finish

导入的模型文件位于工程的 ml/ 文件夹:

可以看到,除了多了 ml/ 文件夹下的模型文件外,似乎代码并没有什么变化。如果仅仅是做这点工作的话,那肯定谈不上什么了不得的新特性,让我们继续往下看。

查看模型元数据(metadata)和用法

在Android Studio中双击 ml/ 文件夹下的模型文件,可以看到模型的详细信息,比如我所使用的 mobilenet_v1_0.25_160_quantized_1_metadata_1.tflite 模型,信息如下:

模型信息

主要包括如下三种信息:

  • 模型:包括模型名称、描述、版本、作者等等。
  • 张量:输入和输出张量。在以往的开发中,这个非常重要,比如图片需要预先处理成合适的尺寸,才能进行推理。
  • 示例代码:说明在应用中如何调用模型,包括JavaKotlin代码。

可以看到,要调用模型,代码相当简单,不需要进行复杂的图片预处理,不需要构建张量,也不需要在张量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
try {
    MobilenetV1025160Quantized1Metadata1 model = MobilenetV1025160Quantized1Metadata1.newInstance(context);

    // Creates inputs for reference.
    TensorImage image = TensorImage.fromBitmap(bitmap);

    // Runs model inference and gets result.
    MobilenetV1025160Quantized1Metadata1.Outputs outputs = model.process(image);
    List<Category> probability = outputs.getProbabilityAsCategoryList();

    // Releases model resources if no longer used.
    model.close();
} catch (IOException e) {
    // TODO Handle the exception
}

代码中的 MobilenetV1025160Quantized1Metadata1 实现在哪儿呢?这个是自动生成的,点击Android Stuido的 Build > Make Project ,在generated目录下就可以看到生成的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.mogoweb.tensorflow.example.modelmetadata.ml;

import android.content.Context;
import androidx.annotation.NonNull;
import java.io.IOException;
import java.lang.Integer;
import java.lang.Object;
import java.lang.String;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.tensorflow.lite.DataType;
import org.tensorflow.lite.support.common.FileUtil;
import org.tensorflow.lite.support.common.TensorProcessor;
import org.tensorflow.lite.support.common.ops.CastOp;
import org.tensorflow.lite.support.common.ops.DequantizeOp;
import org.tensorflow.lite.support.common.ops.NormalizeOp;
import org.tensorflow.lite.support.common.ops.QuantizeOp;
import org.tensorflow.lite.support.image.ImageProcessor;
import org.tensorflow.lite.support.image.TensorImage;
import org.tensorflow.lite.support.image.ops.ResizeOp;
import org.tensorflow.lite.support.image.ops.ResizeOp.ResizeMethod;
import org.tensorflow.lite.support.label.Category;
import org.tensorflow.lite.support.label.TensorLabel;
import org.tensorflow.lite.support.metadata.MetadataExtractor;
import org.tensorflow.lite.support.model.Model;
import org.tensorflow.lite.support.tensorbuffer.TensorBuffer;

/**
 * Identify the most prominent object in the image from a set of 1,001 categories such as trees, animals, food, vehicles, person etc. */
public final class MobilenetV1025160Quantized1Metadata1 {
  @NonNull
  private final ImageProcessor imageProcessor;

  @NonNull
  private final List<String> labels;

  @NonNull
  private final TensorProcessor probabilityPostProcessor;

  @NonNull
  private final Model model;

  private MobilenetV1025160Quantized1Metadata1(@NonNull Context context,
      @NonNull Model.Options options) throws IOException {
    model = Model.createModel(context, "mobilenet_v1_0.25_160_quantized_1_metadata_1.tflite", options);
    MetadataExtractor extractor = new MetadataExtractor(model.getData());
    ImageProcessor.Builder imageProcessorBuilder = new ImageProcessor.Builder()
      .add(new ResizeOp(160, 160, ResizeMethod.NEAREST_NEIGHBOR))
      .add(new NormalizeOp(new float[] {127.5f}, new float[] {127.5f}))
      .add(new QuantizeOp(128f, 0.0078125f))
      .add(new CastOp(DataType.UINT8));
    imageProcessor = imageProcessorBuilder.build();
    TensorProcessor.Builder probabilityPostProcessorBuilder = new TensorProcessor.Builder()
      .add(new DequantizeOp((float)0, (float)0.00390625))
      .add(new NormalizeOp(new float[] {0.0f}, new float[] {1.0f}));
    probabilityPostProcessor = probabilityPostProcessorBuilder.build();
    labels = FileUtil.loadLabels(extractor.getAssociatedFile("labels.txt"));
  }

  @NonNull
  public static MobilenetV1025160Quantized1Metadata1 newInstance(@NonNull Context context) throws
      IOException {
    return new MobilenetV1025160Quantized1Metadata1(context, (new Model.Options.Builder()).build());
  }

  @NonNull
  public static MobilenetV1025160Quantized1Metadata1 newInstance(@NonNull Context context,
      @NonNull Model.Options options) throws IOException {
    return new MobilenetV1025160Quantized1Metadata1(context, options);
  }

  @NonNull
  public Outputs process(@NonNull TensorImage image) {
    TensorImage processedimage = imageProcessor.process(image);
    Outputs outputs = new Outputs(model);
    model.run(new Object[] {processedimage.getBuffer()}, outputs.getBuffer());
    return outputs;
  }

  public void close() {
    model.close();
  }

  @NonNull
  public Outputs process(@NonNull TensorBuffer image) {
    TensorBuffer processedimage = image;
    Outputs outputs = new Outputs(model);
    model.run(new Object[] {processedimage.getBuffer()}, outputs.getBuffer());
    return outputs;
  }

  public class Outputs {
    private TensorBuffer probability;

    private Outputs(Model model) {
      this.probability = TensorBuffer.createFixedSize(model.getOutputTensorShape(0), DataType.UINT8);
    }

    @NonNull
    public List<Category> getProbabilityAsCategoryList() {
      return new TensorLabel(labels, probabilityPostProcessor.process(probability)).getCategoryList();
    }

    @NonNull
    public TensorBuffer getProbabilityAsTensorBuffer() {
      return probabilityPostProcessor.process(probability);
    }

    @NonNull
    private Map<Integer, Object> getBuffer() {
      Map<Integer, Object> outputs = new HashMap<>();
      outputs.put(0, probability.getBuffer());
      return outputs;
    }
  }
}

从代码可以看到,ImageProcess类完成了图片的预处理工作,我们甚至不用关心图片预处理的细节。

不足之处

当然,作为新开发的特性,并不是所有的tflite模型都能通过这种方式导入,目前这种使用方法还存在如下几种限制:

  1. tflite模型必须包含元数据。如果你希望得到包含元数据的模型,一种方法是前往TensorFlow Hub下载模型,一种方法是自行为tflite模型添加元数据。这里有一篇指导说明如何为TFLite模型添加元数据:

https://tensorflow.google.cn/lite/convert/metadata

  1. 目前进支持图片分类和风格迁移类的模型,当然随着开发进程,这个会扩展到更多的模型。
  2. 目前输入输出的数据类型仅支持DataType.UINT8和DataType.FLOAT32。

目前看来,这项新特性还完成的比较粗糙,但也可以看出谷歌的目标,将机器学习扩展到终端,让机器学习应用程序开发越来越简单。你觉得Android Studio的这项新特性有用吗?欢迎交流!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云水木石 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
推出 TF Lite Task Library 接口,简化 ML移动端开发流程
作者 | Lu Wang、Chen Cen、Arun Venkatesan 和 Khanh LeViet
磐创AI
2020/09/28
1.3K0
推出 TF Lite Task Library 接口,简化 ML移动端开发流程
AIoT应用创新大赛-基于TFML的迁移学习实践
NXP eIQ平台提供了嵌入式平台集成化的机器学习应用部署能力,支持BYOD(Bring Your Own Data)和BYOM(Bring You Own Model)的两种建模应用的工作流。
flavorfan
2022/02/23
2.2K0
AIoT应用创新大赛-基于TFML的迁移学习实践
精通 TensorFlow 1.x:16~19
TensorFlow 模型还可用于在移动和嵌入式平台上运行的应用。 TensorFlow Lite 和 TensorFlow Mobile 是资源受限移动设备的两种 TensorFlow。与 TensorFlow Mobile 相比,TensorFlow Lite 支持功能的子集。由于较小的二进制大小和较少的依赖项,TensorFlow Lite 可以获得更好的表现。
ApacheCN_飞龙
2023/04/23
4.9K0
体态识别算法在 Android 端部署实例
随着软硬件技术的发展,智能穿戴式设备逐渐从概念走向商用化。在过去几年内,Google、Apple以及Sony等科技公司在体积、功耗控制以及成本等方面做得越来越好,推出了一大批可穿戴产品,具有代表性的成果有:1. 智能手环:产品具备运动监测、睡眠监测、心率测量以及震动唤醒等功能;2. 智能眼镜:广泛应用于VR、AR领域。
联远智维
2022/11/22
8100
模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo
近日,TensorFlow模型优化工具包又添一员大将,训练后的半精度浮点量化(float16 quantization)工具。
OpenCV学堂
2019/08/14
2.1K0
模型压缩一半,精度几乎无损,TensorFlow推出半精度浮点量化工具包,还有在线Demo
在Android上使用YOLOv8目标检测(步骤+代码)
Yolov8 是一种流行的物体检测 AI。Android是世界上用户最多的移动操作系统。
Color Space
2024/07/25
1.8K2
在Android上使用YOLOv8目标检测(步骤+代码)
Android Tensorflow 示例代码 Pose Estimation项目编译
原先识别人体骨骼,使用的Google的 MLKit 框架 。方便简单,直接通过Gradle添加相关依赖库。就可以使用了。
zinyan.com
2022/12/07
1.2K0
Android Tensorflow 示例代码 Pose Estimation项目编译
TensorFlow Lite for Android 初探(附demo)
TensorFlow Lite 是用于移动设备和嵌入式设备的轻量级解决方案。TensorFlow Lite 支持 Android、iOS 甚至树莓派等多种平台。
OpenCV学堂
2019/11/13
1.1K0
将 TensorFlow 训练好的模型迁移到 Android APP上(TensorFlowLite)
最近在做一个数字手势识别的APP(关于这个项目,我会再写一篇博客仔细介绍,博客地址:一步步做一个数字手势识别APP,源代码已经开源在github上,地址:Chinese-number-gestures-recognition),要把在PC端训练好的模型放到Android APP上,调研了下,谷歌发布了TensorFlow Lite可以把TensorFlow训练好的模型迁移到Android APP上,百度也发布了移动端深度学习框架mobile-deep-learning(MDL),这个框架应该是paddlepaddle的手机版,具体的细节没有了解过。因为对TensorFlow稍微熟悉些,因此就决定用TensorFlow来做。
AI研习社
2018/08/06
2.1K0
将 TensorFlow 训练好的模型迁移到 Android APP上(TensorFlowLite)
【技术创作101训练营】TensorFlow Lite的 GPU 委托(Delegate)加速模型推理
不过从我对文档的理解来看,感觉更像是添加的一种硬件后端(代理我想应该只是调用调用层面,不是底层实现,另外在Hexagon DSP的委托代理部分,文档坦言说Hexagon DSP的代理就是为了补充NNAPI,特别是针对那些NNAPI不可用DSP加速的、老旧驱动的设备,毕竟这些老旧设备也没有NNAPI这个东西,但有DSP硬件),交给模型的子图来去执行。比方原始模型的CPU执行Graph如上图。交给GPU的委托代理后,原Graph变为下面这样:
开心的派大星
2020/09/23
5.4K1
TensorFlow 智能移动项目:11~12
在前九章中,我们使用 TensorFlow Mobile 在移动设备上运行各种由 TensorFlow 和 Keras 构建的强大的深度学习模型。 正如我们在第 1 章,“移动 TensorFlow 入门”中提到的那样,Google 还提供了 TensorFlow Lite(可替代 TensorFlow Mobile 的版本)在移动设备上运行模型。 尽管自 Google I/O 2018 起它仍在开发人员预览中,但 Google 打算“大大简化开发人员针对小型设备的模型定位的体验。” 因此,值得详细研究 TensorFlow Lite 并为未来做好准备。
ApacheCN_飞龙
2023/04/24
4.3K0
TensorFlow 智能移动项目:11~12
TensorFlow在移动设备与嵌入式设备上的轻量级跨平台解决方案 | Google 开发者大会 2018
2018 年 9 月 21 日 ,凌钰城(Google Brain 软件工程师)带来一场《TensorFlow Lite:TensorFlow在移动设备与嵌入式设备上的轻量级跨平台解决方案》的演讲,本文将对演讲做一个回顾。
云水木石
2019/07/01
2.2K0
TensorFlow在移动设备与嵌入式设备上的轻量级跨平台解决方案 | Google 开发者大会 2018
Android上的TensorFlow Lite,了解一下?
TensorFlow Lite是TensorFlow针对移动和嵌入式设备的轻量级解决方案。它可以在移动设备上高效运行机器学习模型,因此您可以利用这些模型进行分类、回归或其他功能,而无需和服务器交互。
云水木石
2019/07/02
1.8K0
Android上的TensorFlow Lite,了解一下?
基于Tensorflow2 Lite在Android手机上实现图像分类
Tensorflow2之后,训练保存的模型也有所变化,基于Keras接口搭建的网络模型默认保存的模型是h5格式的,而之前的模型格式是pb。Tensorflow2的h5格式的模型转换成tflite格式模型非常方便。本教程就是介绍如何使用Tensorflow2的Keras接口训练分类模型并使用Tensorflow Lite部署到Android设备上。
夜雨飘零
2020/07/22
3.3K0
基于Tensorflow2 Lite在Android手机上实现图像分类
深度神经网络移动终端GPU加速实践
我们尝试去工程化深度神经网络并最终落地,当中的一些实践经验通过本文记录下来。
腾讯Bugly
2018/07/19
1.9K0
TensorFlow模型部署到Android,需要注意几点
在前面一篇文章《从人工智能鉴黄模型,尝试TensorRT优化》我谈到了TensorFlow模型的优化,这是针对服务器端的优化,实际上优化结果并不理想。这篇文章我将谈谈将TensorFlow模型部署到Android系统上需要注意的几点。
云水木石
2019/07/02
1.1K0
TensorFlow模型部署到Android,需要注意几点
tflite模型PC端与嵌入式交叉验证
TFLM(Tensorflow lite micro)验证嵌入式端模型运行,直截了当做法是:对比PC端和嵌入式端运行的tflite模型的输入输出。笔者就TinyML的HelloWorld例程,实践了PC端tflite模型运行情况和MCU端RT1062部署后运行情况。
flavorfan
2022/05/13
2.8K0
tflite模型PC端与嵌入式交叉验证
Transformers 4.37 中文文档(六十九)
这是一个最近推出的模型,因此 API 尚未经过广泛测试。可能会有一些错误或轻微的破坏性更改,需要在未来修复。如果发现异常,请提交Github Issue。
ApacheCN_飞龙
2024/06/26
2130
Transformers 4.37 中文文档(六十九)
TensorFlow Lite for Android 初探(附demo)一. TensorFlow Lite二. tflite 格式三. 常用的 Java API四. TensorFlow Lite
我们知道大多数的 AI 是在云端运算的,但是在移动端使用 AI 具有无网络延迟、响应更加及时、数据隐私等特性。
fengzhizi715
2018/12/07
3.2K0
使用NVIDIA TAO工具包优化Arm Ethos-U NPUs的AI模型
本文翻译自:《Optimizing AI models for Arm Ethos-U NPUs using the NVIDIA TAO Toolkit》
GPUS Lady
2023/10/28
4200
使用NVIDIA TAO工具包优化Arm Ethos-U NPUs的AI模型
推荐阅读
相关推荐
推出 TF Lite Task Library 接口,简化 ML移动端开发流程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验