前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于Tensorflow2 Lite在Android手机上实现图像分类

基于Tensorflow2 Lite在Android手机上实现图像分类

作者头像
夜雨飘零
修改于 2023-06-04 08:24:17
修改于 2023-06-04 08:24:17
2.5K00
代码可运行
举报
文章被收录于专栏:CSDN博客CSDN博客
运行总次数:0
代码可运行

前言

Tensorflow2之后,训练保存的模型也有所变化,基于Keras接口搭建的网络模型默认保存的模型是h5格式的,而之前的模型格式是pb。Tensorflow2的h5格式的模型转换成tflite格式模型非常方便。本教程就是介绍如何使用Tensorflow2的Keras接口训练分类模型并使用Tensorflow Lite部署到Android设备上。

本教程源码:https://github.com/yeyupiaoling/ClassificationForAndroid/tree/master/TFLiteClassification

训练和转换模型

以下是使用Tensorflow2的keras搭建的一个MobileNetV2模型并训练自定义数据集,本教程主要是介绍如何在Android设备上使用Tensorflow Lite部署分类模型,所以关于训练模型只是简单介绍,代码并不完整。通过下面的训练模型,我们最终会得到一个mobilenet_v2.h5模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
import tensorflow as tf
import reader
import config as cfg

# 获取模型
input_shape = (cfg.IMAGE_SIZE, cfg.IMAGE_SIZE, cfg.IMAGE_CHANNEL)
model = tf.keras.Sequential(
    [tf.keras.applications.MobileNetV2(input_shape=input_shape, include_top=False, pooling='max'),
     tf.keras.layers.Dense(units=cfg.CLASS_DIM, activation='softmax')])
model.summary()

# 获取训练数据
train_data = reader.train_reader(data_list_path=cfg.TRAIN_LIST_PATH, batch_size=cfg.BATCH_SIZE)

# 定义训练参数
model.compile(optimizer=tf.keras.optimizers.RMSprop(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              metrics=[tf.keras.metrics.SparseCategoricalAccuracy()])

# 开始训练
model.fit(train_data, epochs=cfg.EPOCH_SUM, workers=4)

# 保存h5模型
if not os.path.exists(os.path.dirname(cfg.H5_MODEL_PATH)):
    os.makedirs(os.path.dirname(cfg.H5_MODEL_PATH))
model.save(filepath=cfg.H5_MODEL_PATH)
print('saved h5 model!')

通过上面得到的mobilenet_v2.h5模型,我们需要转换为tflite格式的模型,在Tensorflow2之后,这个转换就变动很简单了,通过下面的几行代码即可完成转换,最终我们会得到一个mobilenet_v2.tflite模型。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf
import config as cfg

# 加载模型
model = tf.keras.models.load_model(cfg.H5_MODEL_PATH)

# 生成非量化的tflite模型
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open(cfg.TFLITE_MODEL_FILE, 'wb').write(tflite_model)
print('saved tflite model!')

如果保存的模型格式不是h5,而是tf格式的,如下代码,保存的模型是tf格式的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

model = tf.keras.applications.MobileNetV2(input_shape=(224, 224, 3))

model.save(filepath='mobilenet_v2', save_format='tf')

如果是tf格式的模型,那需要使用以下转换模型的方式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

converter = tf.lite.TFLiteConverter.from_saved_model('mobilenet_v2')
tflite_model = converter.convert()
open("mobilenet_v2.tflite", "wb").write(tflite_model)

在部署到Android中可能需要到输入输出层的名称,通过下面代码可以获取到输入输出层的名称和shape。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import tensorflow as tf

model_path = 'models/mobilenet_v2.tflite'

interpreter = tf.lite.Interpreter(model_path=model_path)
interpreter.allocate_tensors()

# 获取输入和输出张量。
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()

print(input_details)
print(output_details)

部署到Android设备

首先要在build.gradle导入这三个库,如果不使用GPU可以只导入两个库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
implementation 'org.tensorflow:tensorflow-lite:2.3.0'
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
implementation 'org.tensorflow:tensorflow-lite-support:0.1.0-rc1'

在以前还需要在android下添加以下代码,避免在打包apk的是对模型有压缩操作,损坏模型。现在好像不加也没有关系,但是为了安全起见,还是添加上去。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    aaptOptions {
        noCompress "tflite"
    }

复制转换的预测模型到app/src/main/assets目录下,还有类别的标签,每一行对应一个标签名称。

Tensorflow Lite工具

编写一个TFLiteClassificationUtil工具类,关于Tensorflow Lite的操作都在这里完成,如加载模型、预测。在构造方法中,通过参数传递的模型路径加载模型,在加载模型的时候配置预测信息,例如是否使用Android底层神经网络APINnApiDelegate或者是否使用GPUGpuDelegate,同时获取网络的输入输出层。有了tensorflow-lite-support库,数据预处理就变得非常简单,通过ImageProcessor创建一个数据预处理的工具,之后在预测之前使用这个工具对图像进行预处理,处理速度还是挺快的,要注意的是图像的均值IMAGE_MEAN和标准差IMAGE_STD,因为在训练的时候图像预处理可能不一样的,有些读者出现在电脑上准确率很高,但在手机上准确率很低,多数情况下就是这个图像预处理做得不对。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private static final float[] IMAGE_MEAN = new float[]{128.0f, 128.0f, 128.0f};
private static final float[] IMAGE_STD = new float[]{128.0f, 128.0f, 128.0f};

public TFLiteClassificationUtil(String modelPath) throws Exception {
    File file = new File(modelPath);
    if (!file.exists()) {
        throw new Exception("model file is not exists!");
    }

    try {
        Interpreter.Options options = new Interpreter.Options();
        // 使用多线程预测
        options.setNumThreads(NUM_THREADS);
        // 使用Android自带的API或者GPU加速
        NnApiDelegate delegate = new NnApiDelegate();
//            GpuDelegate delegate = new GpuDelegate();
        options.addDelegate(delegate);
        tflite = new Interpreter(file, options);
        // 获取输入,shape为{1, height, width, 3}
        int[] imageShape = tflite.getInputTensor(tflite.getInputIndex("input_1")).shape();
        DataType imageDataType = tflite.getInputTensor(tflite.getInputIndex("input_1")).dataType();
        inputImageBuffer = new TensorImage(imageDataType);
        // 获取输入,shape为{1, NUM_CLASSES}
        int[] probabilityShape = tflite.getOutputTensor(tflite.getOutputIndex("Identity")).shape();
        DataType probabilityDataType = tflite.getOutputTensor(tflite.getOutputIndex("Identity")).dataType();
        outputProbabilityBuffer = TensorBuffer.createFixedSize(probabilityShape, probabilityDataType);

        // 添加图像预处理方式
        imageProcessor = new ImageProcessor.Builder()
                .add(new ResizeOp(imageShape[1], imageShape[2], ResizeOp.ResizeMethod.NEAREST_NEIGHBOR))
                .add(new NormalizeOp(IMAGE_MEAN, IMAGE_STD))
                .build();
    } catch (Exception e) {
        e.printStackTrace();
        throw new Exception("load model fail!");
    }
}

为了兼容图片路径和Bitmap格式的图片预测,这里创建了两个重载方法,它们都是通过调用predict()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public int predictImage(String image_path) throws Exception {
    if (!new File(image_path).exists()) {
        throw new Exception("image file is not exists!");
    }
    FileInputStream fis = new FileInputStream(image_path);
    Bitmap bitmap = BitmapFactory.decodeStream(fis);
    int result = predictImage(bitmap);
    if (bitmap.isRecycled()) {
        bitmap.recycle();
    }
    return result;
}

public int predictImage(Bitmap bitmap) throws Exception {
    return predict(bitmap);
}

这里创建一个获取最大概率值,并把下标返回的方法,其实就是获取概率最大的预测标签。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static int getMaxResult(float[] result) {
    float probability = 0;
    int r = 0;
    for (int i = 0; i < result.length; i++) {
        if (probability < result[i]) {
            probability = result[i];
            r = i;
        }
    }
    return r;
}

这个方法就是Tensorflow Lite执行预测的最后一步,通过执行tflite.run()对输入的数据进行预测并得到预测结果,通过解析获取到最大的概率的预测标签,并返回。到这里Tensorflow Lite的工具就完成了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private int predict(Bitmap bmp) throws Exception {
    inputImageBuffer = loadImage(bmp);

    try {
        tflite.run(inputImageBuffer.getBuffer(), outputProbabilityBuffer.getBuffer().rewind());
    } catch (Exception e) {
        throw new Exception("predict image fail! log:" + e);
    }

    float[] results = outputProbabilityBuffer.getFloatArray();
    Log.d(TAG, Arrays.toString(results));
    return getMaxResult(results);
}

选择图片预测

本教程会有两个页面,一个是选择图片进行预测的页面,另一个是使用相机实时预测并显示预测结果。以下为activity_main.xml的代码,通过按钮选择图片,并在该页面显示图片和预测结果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="match_parent"
        android:layout_height="400dp" />

    <TextView
        android:id="@+id/result_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/image_view"
        android:text="识别结果"
        android:textSize="16sp" />


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="horizontal">

        <Button
            android:id="@+id/select_img_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="选择照片" />


        <Button
            android:id="@+id/open_camera"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="实时预测" />

    </LinearLayout>

</RelativeLayout>

MainActivity.java中,进入到页面我们就要先加载模型,我们是把模型放在Android项目的assets目录的,但是Tensorflow Lite并不建议直接在assets读取模型,所以我们需要把模型复制到一个缓存目录,然后再从缓存目录加载模型,同时还有读取标签名,标签名称按照训练的label顺序存放在assets的label_list.txt,以下为实现代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
classNames = Utils.ReadListFromFile(getAssets(), "label_list.txt");
String classificationModelPath = getCacheDir().getAbsolutePath() + File.separator + "mobilenet_v2.tflite";
Utils.copyFileFromAsset(MainActivity.this, "mobilenet_v2.tflite", classificationModelPath);
try {
    tfLiteClassificationUtil = new TFLiteClassificationUtil(classificationModelPath);
    Toast.makeText(MainActivity.this, "模型加载成功!", Toast.LENGTH_SHORT).show();
} catch (Exception e) {
    Toast.makeText(MainActivity.this, "模型加载失败!", Toast.LENGTH_SHORT).show();
    e.printStackTrace();
    finish();
}

添加两个按钮点击事件,可以选择打开相册读取图片进行预测,或者打开另一个Activity进行调用摄像头实时识别。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Button selectImgBtn = findViewById(R.id.select_img_btn);
Button openCamera = findViewById(R.id.open_camera);
imageView = findViewById(R.id.image_view);
textView = findViewById(R.id.result_text);
selectImgBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 打开相册
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, 1);
    }
});
openCamera.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 打开实时拍摄识别页面
        Intent intent = new Intent(MainActivity.this, CameraActivity.class);
        startActivity(intent);
    }
});

当打开相册选择照片之后,回到原来的页面,在下面这个回调方法中获取选择图片的Uri,通过Uri可以获取到图片的绝对路径。如果Android8以上的设备获取不到图片,需要在AndroidManifest.xml配置文件中的application添加android:requestLegacyExternalStorage="true"。拿到图片路径之后,调用TFLiteClassificationUtil类中的predictImage()方法预测并获取预测值,在页面上显示预测的标签、对应标签的名称、概率值和预测时间。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    String image_path;
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == 1) {
            if (data == null) {
                Log.w("onActivityResult", "user photo data is null");
                return;
            }
            Uri image_uri = data.getData();
            image_path = getPathFromURI(MainActivity.this, image_uri);
            try {
                // 预测图像
                FileInputStream fis = new FileInputStream(image_path);
                imageView.setImageBitmap(BitmapFactory.decodeStream(fis));
                long start = System.currentTimeMillis();
                float[] result = tfLiteClassificationUtil.predictImage(image_path);
                long end = System.currentTimeMillis();
                String show_text = "预测结果标签:" + (int) result[0] +
                        "\n名称:" +  classNames[(int) result[0]] +
                        "\n概率:" + result[1] +
                        "\n时间:" + (end - start) + "ms";
                textView.setText(show_text);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

上面获取的Uri可以通过下面这个方法把Url转换成绝对路径。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// get photo from Uri
public static String getPathFromURI(Context context, Uri uri) {
    String result;
    Cursor cursor = context.getContentResolver().query(uri, null, null, null, null);
    if (cursor == null) {
        result = uri.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

摄像头实时预测

在调用相机实时预测我就不再介绍了,原理都差不多,具体可以查看https://github.com/yeyupiaoling/ClassificationForAndroid/tree/master/TFLiteClassification中的源代码。核心代码如下,创建一个子线程,子线程中不断从摄像头预览的AutoFitTextureView上获取图像,并执行预测,并在页面上显示预测的标签、对应标签的名称、概率值和预测时间。每一次预测完成之后都立即获取图片继续预测,只要预测速度够快,就可以看成实时预测。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private Runnable periodicClassify =
        new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    if (runClassifier) {
                        // 开始预测前要判断相机是否已经准备好
                        if (getApplicationContext() != null && mCameraDevice != null && tfLiteClassificationUtil != null) {
                            predict();
                        }
                    }
                }
                if (mInferThread != null && mInferHandler != null && mCaptureHandler != null && mCaptureThread != null) {
                    mInferHandler.post(periodicClassify);
                }
            }
        };

// 预测相机捕获的图像
private void predict() {
    // 获取相机捕获的图像
    Bitmap bitmap = mTextureView.getBitmap();
    try {
        // 预测图像
        long start = System.currentTimeMillis();
        float[] result = tfLiteClassificationUtil.predictImage(bitmap);
        long end = System.currentTimeMillis();
        String show_text = "预测结果标签:" + (int) result[0] +
                "\n名称:" +  classNames[(int) result[0]] +
                "\n概率:" + result[1] +
                "\n时间:" + (end - start) + "ms";
        textView.setText(show_text);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

本项目中使用的了读取图片的权限和打开相机的权限,所以不要忘记在AndroidManifest.xml添加以下权限申请。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

如果是Android 6 以上的设备还要动态申请权限。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    // check had permission
    private boolean hasPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            return checkSelfPermission(Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED &&
                    checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED &&
                    checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
        } else {
            return true;
        }
    }

    // request permission
    private void requestPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            requestPermissions(new String[]{Manifest.permission.CAMERA,
                    Manifest.permission.READ_EXTERNAL_STORAGE,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
        }
    }

选择图片识别效果图:

相机实时识别效果图:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/07/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
作者已关闭评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于Paddle Lite在Android手机上实现图像分类
Paddle Lite是飞桨基于Paddle Mobile全新升级推出的端侧推理引擎,在多硬件、多平台以及硬件混合调度的支持上更加完备,为包括手机在内的端侧场景的AI应用提供高效轻量的推理能力,有效解决手机算力和内存限制等问题,致力于推动AI应用更广泛的落地。
夜雨飘零
2020/08/02
8040
基于Paddle Lite在Android手机上实现图像分类
基于TNN在Android手机上实现图像分类
TNN:由腾讯优图实验室打造,移动端高性能、轻量级推理框架,同时拥有跨平台、高性能、模型压缩、代码裁剪等众多突出优势。TNN框架在原有Rapidnet、ncnn框架的基础上进一步加强了移动端设备的支持以及性能优化,同时也借鉴了业界主流开源框架高性能和良好拓展性的优点。
夜雨飘零
2021/12/07
1.8K0
基于TNN在Android手机上实现图像分类
在Android手机上使用腾讯的ncnn实现图像分类
在之前笔者有介绍过《在Android设备上使用PaddleMobile实现图像分类》,使用的框架是百度开源的PaddleMobile。在本章中,笔者将会介绍使用腾讯的开源手机深度学习框架ncnn来实现在Android手机实现图像分类,这个框架开源时间比较长,相对稳定很多。
夜雨飘零
2020/05/06
3.7K0
TensorFlow Lite for Android 初探(附demo)
TensorFlow Lite 是用于移动设备和嵌入式设备的轻量级解决方案。TensorFlow Lite 支持 Android、iOS 甚至树莓派等多种平台。
OpenCV学堂
2019/11/13
1.2K0
在Android手机上使用PaddleMobile实现图像分类
现在越来越多的手机要使用到深度学习了,比如一些图像分类,目标检测,风格迁移等等,之前都是把数据提交给服务器完成的。但是提交给服务器有几点不好,首先是速度问题,图片上传到服务器需要时间,客户端接收结果也需要时间,这一来回就占用了一大半的时间,会使得整体的预测速度都变慢了,再且现在手机的性能不断提高,足以做深度学习的预测。其二是隐私问题,如果只是在本地预测,那么用户根本就不用上传图片,安全性也大大提高了。现在的手机深度学习会计有很多,比如百度的paddle-mobile、小米的MACNE、腾讯的NCNN、谷歌的TensorFlow lite,而我们在本章使用的是百度的paddle-mobile。
夜雨飘零
2020/05/06
8320
《PaddlePaddle从入门到炼丹》十五——把预测模型部署到Android手机上
现在越来越多的手机要使用到深度学习了,比如一些图像分类,目标检测,风格迁移等等,之前都是把数据提交给服务器完成的。但是提交给服务器有几点不好,首先是速度问题,图片上传到服务器需要时间,客户端接收结果也需要时间,这一来回就占用了一大半的时间,会使得整体的预测速度都变慢了,再且现在手机的性能不断提高,足以做深度学习的预测。其二是隐私问题,如果只是在本地预测,那么用户根本就不用上传图片,安全性也大大提高了。所以本章我们就来学如何包我们训练的PaddlePaddle预测模型部署到Android手机上。
夜雨飘零
2020/05/06
1.7K0
《PaddlePaddle从入门到炼丹》十五——把预测模型部署到Android手机上
基于MNN在Android手机上实现图像分类
MNN是一个轻量级的深度神经网络推理引擎,在端侧加载深度神经网络模型进行推理预测。目前,MNN已经在阿里巴巴的手机淘宝、手机天猫、优酷等20多个App中使用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、权益发放、安全风控等场景。此外,IoT等场景下也有若干应用。
夜雨飘零
2021/12/07
3.2K0
基于MNN在Android手机上实现图像分类
在Android手机上使用MACE实现图像分类
在之前笔者有介绍过《在Android设备上使用PaddleMobile实现图像分类》,使用的框架是百度开源的PaddleMobile。在本章中,笔者将会介绍使用小米的开源手机深度学习框架MACE来实现在Android手机实现图像分类。
夜雨飘零
2020/05/06
1.5K0
Android上的TensorFlow Lite,了解一下?
TensorFlow Lite是TensorFlow针对移动和嵌入式设备的轻量级解决方案。它可以在移动设备上高效运行机器学习模型,因此您可以利用这些模型进行分类、回归或其他功能,而无需和服务器交互。
云水木石
2019/07/02
2K0
Android上的TensorFlow Lite,了解一下?
TensorFlow Lite for Android 初探(附demo)一. TensorFlow Lite二. tflite 格式三. 常用的 Java API四. TensorFlow Lite
我们知道大多数的 AI 是在云端运算的,但是在移动端使用 AI 具有无网络延迟、响应更加及时、数据隐私等特性。
fengzhizi715
2018/12/07
3.3K0
一头栽进了tensorflow lite的巨坑里
之前写过一篇《这个中秋,我开发了一个识别狗狗的app》。图片识别可以算作是深度学习领域烂大街的主题,几乎每本书和教程都会拿来作为入门示例。移动端的图片识别的教程也很多,大多数都脱胎于Google的教程《TensorFlow for Poets》和《TensorFlow for Poets 2: Android》。有了现成的教程,我对实现狗狗的图像识别信心满满,认为重点在于信息的展示及狗狗信息的收集。
云水木石
2019/07/01
1.2K0
一头栽进了tensorflow lite的巨坑里
Kotlin与机器学习实战:Android端集成TensorFlow Lite全指南
本文将手把手教你如何在Android应用中集成TensorFlow Lite模型,实现端侧机器学习推理能力。我们以图像分类场景为例,提供可直接运行的完整代码示例。
龙小雨
2025/05/17
1900
Tensorflow Lite Model Maker --- 图像分类篇+源码
The TensorFlow Lite Model Maker library simplifies the process of adapting and converting a TensorFlow neural-network model to particular input data when deploying this model for on-device ML applications. 解读: 此处我们想要得到的是 .tflite 格式的模型,用于在移动端或者嵌入式设备上进行部署
XianxinMao
2021/10/10
1.3K0
使用TensorFlow Lite在Android手机上实现图像分类
TensorFlow Lite是一款专门针对移动设备的深度学习框架,移动设备深度学习框架是部署在手机或者树莓派等小型移动设备上的深度学习框架,可以使用训练好的模型在手机等设备上完成推理任务。这一类框架的出现,可以使得一些推理的任务可以在本地执行,不需要再调用服务器的网络接口,大大减少了预测时间。在前几篇文章中已经介绍了百度的paddle-mobile,小米的mace,还有腾讯的ncnn。这在本章中我们将介绍谷歌的TensorFlow Lite。
夜雨飘零
2020/05/06
3.9K0
TensorFlow模型部署到Android,需要注意几点
在前面一篇文章《从人工智能鉴黄模型,尝试TensorRT优化》我谈到了TensorFlow模型的优化,这是针对服务器端的优化,实际上优化结果并不理想。这篇文章我将谈谈将TensorFlow模型部署到Android系统上需要注意的几点。
云水木石
2019/07/02
1.2K0
TensorFlow模型部署到Android,需要注意几点
Android基于图像语义分割实现人物背景更换
本教程是通过PaddlePaddle的PaddleSeg实现的,该开源库的地址为:http://github.com/PaddlPaddle/PaddleSeg ,使用开源库提供的预训练模型实现人物的图像语义分割,最终部署到Android应用上。关于如何在Android应用上使用PaddlePaddle模型,可以参考笔者的这篇文章《基于Paddle Lite在Android手机上实现图像分类》。
夜雨飘零
2021/12/07
1.2K0
Android基于图像语义分割实现人物背景更换
如何将自己开发的模型转换为TensorFlow Lite可用模型
对于开发者来说,在移动设备上运行预先训练好的模型的能力意味着向边界计算(edge computing)迈进了一大步。[译注:所谓的边界计算,从字面意思理解,就是与现实世界的边界。数据中心是网络的中心,PC、手机、监控照相机处在边界。]数据能够直接在用户手机上处理,私人数据仍然掌握在他们手中。没有蜂窝网络的延迟,应用程序可以运行得更顺畅,并且可大幅减少公司的云服务账单。快速响应式应用现在可以运行复杂的机器学习模型,这种技术转变将赋予产品工程师跳出条条框框思考的力量,迎来应用程序开发的新潮流。
云水木石
2019/07/01
3.3K0
如何将自己开发的模型转换为TensorFlow Lite可用模型
跨越重重“障碍”,我从 PyTorch 转换为了 TensorFlow Lite
本文最初发表在 Towards Data Science 博客,经原作者 Ran Rubin 授权,InfoQ 中文站翻译并分享。
深度学习与Python
2020/11/06
1.8K0
跨越重重“障碍”,我从 PyTorch 转换为了 TensorFlow Lite
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.7K0
TensorFlow 智能移动项目:11~12
【人工智能】边缘计算与 AI:实时智能的未来
随着物联网设备数量的爆炸性增长和对实时处理需求的增加,边缘计算与人工智能(Edge AI)成为一个热门话题。Edge AI 通过在本地设备上运行 AI 算法,减少对云计算的依赖,实现低延迟、高效能的智能应用。这在自动驾驶、智能家居、工业自动化等领域有着广泛的应用前景。
2的n次方
2024/10/15
2450
【人工智能】边缘计算与 AI:实时智能的未来
推荐阅读
相关推荐
基于Paddle Lite在Android手机上实现图像分类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档