博客
关于我
TFLite: 代码分析(1): 获得模型文件 flatbuffers对象
阅读量:757 次
发布时间:2019-03-23

本文共 3908 字,大约阅读时间需要 13 分钟。

TensorFlow Lite Java 层代码组成

TensorFlow Lite 的 Java 层是一个用于在移动设备上运行机器学习模型的强大框架。它通过 Java API 提供了一种高效的方式来加载和执行预训练模型,而无需依赖大型计算资源。以下是 TensorFlow Lite Java 层的核心代码组成和相关实现。


1. 核心文件组成

TensorFlow Lite 的 Java 层主要包含以下文件:

  • DataType.java: 定义了 TensorFlow Lite 中 Tensor 的元素类型。这包括了 flatbuffers 支持的基本数据类型,如 int、long、float、double 等。

  • Delegate.java: 作为 TensorFlow Lite Delegate 的代理接口,它只是一个抽象接口,具体的实现需要通过 Native 方法来获取。

  • Interpreter.java: 主要负责模型 inference 的驱动类。这类 Interpreter 给解 TensorFlow Lite 模型,执行相关操作并进行数据推理。

  • NativeInterpreterWrapper.java: 内部用来包装 native 解释器,控制模型执行。这是一个内部接口,负责与 native method 调用并处理模型相关的低层操作。

  • Tensor.java: 定义了多维数组(Tensor),用于在 TensorFlow Lite 中表示数据。这是机器学习模型中的核心数据结构。

  • TensorFlowLite.java: 提供静态方法来加载 TensorFlow Lite 运行时环境。这类方法常用于初始化模型和配置。

  • package-info.java: 这个文件通常用于包级信息,比如版本控制或扩展说明。


  • 2. Interpreter.java 的接口

    Interpreter 是一个核心类,主要通过以下方式进行操作:

    1. 引入 Options 类

    Options 类用于控制运行时的解释器行为,常见包括:

    • 设置用于多线程操作的线程数量。-启用或禁用 NN API(针对支持 NNAPI 的设备)。
    • 允许使用 FP32 到 FP16 的下降精度计算。
    • 添加 Delegate 实例,以提高模型执行效率。

    2. NNAPI 与 Delegate

    NNAPI 是 Android Neural Networks API 的缩写,是一种优化模型执行的加速 API。Delegate 是将部分或全部图形执行重定向到另一个执行器的方法,适用于具有硬件加速的设备(如 GPU 或 DSP)。

    3. Interpreter 的实现

    从代码实现来看,Interpreter 的构造函数主要负责加载模型文件和配置选项。其核心逻辑包括:

    public Interpreter(@NonNull ByteBuffer byteBuffer, Options options) {    this.wrapper = new NativeInterpreterWrapper(byteBuffer, options);}

    这里的 wrapper 是一个 Java 对象,负责调用 native method。其中,NativeInterpreterWrapper 是一个内部接口,负责模型文件的加载和解释。


    4. NativeInterpreterWrapper 的实现

    NativeInterpreterWrapper 类负责向 Java.wp层调用 native method,具体涉及以下几个关键步骤:

    1. createModelWithBuffer 方法

    private static native long createModelWithBuffer(ByteBuffer modelBuffer, long errorHandle);

    这个方法通过 JNI 接口调用 native 实现,主要完成模型文件的加载和解释。具体实现如下:

    JNIEXPORT jlong JNICALLJava_org_tensorflow_lite_NativeInterpreterWrapper_createModelWithBuffer(    JNIEnv* env, jclass clazz, jobject model_buffer, jlong error_handle) {    BufferErrorReporter* error_reporter = convertLongToErrorReporter(env, error_handle);    const char* buf = static_cast
    (env->GetDirectBufferAddress(model_buffer)); jlong capacity = env->GetDirectBufferCapacity(model_buffer); auto model = tflite::FlatBufferModel::BuildFromBuffer(buf, static_cast
    (capacity), error_reporter); return reinterpret_cast
    (model.release());}

    2. createInterpreter 方法

    private void init(long errorHandle, long modelHandle, Interpreter.Options options) {    this.errorHandle = errorHandle;    this.modelHandle = modelHandle;    this.interpreterHandle = createInterpreter(modelHandle, errorHandle, options.numThreads);    // 分配输入和输出张量    this.inputTensors = new Tensor[getInputCount(interpreterHandle)];    this.outputTensors = new Tensor[getOutputCount(interpreterHandle)];    allocateTensors(interpreterHandle, errorHandle);    this.isMemoryAllocated = true;}

    5. JNI 层的实现

    如前所述,JNI 的主要功能是桥接 Java 与 native 方法。以下是 createErrorReporter 的实现:

    JNIEXPORT jlong JNICALLJava_org_tensorflow_lite_NativeInterpreterWrapper_createErrorReporter(    JNIEnv* env, jclass clazz, jint size) {    BufferErrorReporter* error_reporter = new BufferErrorReporter(env, static_cast
    (size)); return reinterpret_cast
    (error_reporter);}

    6. Allocation 类

    Allocation 类负责模型文件的内存管理。其核心实现包括:

    class MemoryAllocation : public Allocation {public:    MemoryAllocation(const void* ptr, size_t num_bytes, ErrorReporter* error_reporter) :        Allocation(error_reporter) {        buffer_ = ptr;        buffer_size_bytes_ = num_bytes;    }    ~MemoryAllocation() {}    const void* base() const override { return buffer_; }    size_t bytes() const override { return buffer_size_bytes_; }    bool valid() const override { return true; }private:    const void* buffer_;    size_t buffer_size_bytes_ = 0;}

    总结

    通过以上代码实现可以看出,TensorFlow Lite 的 Java 层主要通过 InterpreterNativeInterpreterWrapper 这两个类完成模型加载与执行。核心逻辑在于 JNI 调用 native 实现,优化模型运行效率,同时支持硬件加速和多线程执行。理解这些实现可以帮助开发者更好地利用 TensorFlow Lite 在移动设备上的高效运行能力。

    转载地址:http://bcuzk.baihongyu.com/

    你可能感兴趣的文章
    OpenCV3 install tutorial for Mac
    查看>>
    opencv3-Mat对象
    查看>>
    opencv30-图像矩
    查看>>
    opencv32-基于距离变换和分水岭的图像分割
    查看>>
    opencv4-图像操作
    查看>>
    opencv5-图像混合
    查看>>
    opencv6-调整图像亮度和对比度
    查看>>
    opencv7-绘制形状和文字
    查看>>
    opencv8-图像模糊
    查看>>
    opencv9-膨胀和腐蚀
    查看>>
    OpenCV_ cv2.imshow()
    查看>>
    opencv_core.dir/objects.a(vs_version.rc.obj)‘ is incompatible with i386:x86-64 output
    查看>>
    opencv——图像缩放1(resize)
    查看>>
    opencv——最简单的视频读取
    查看>>
    Opencv——模块介绍
    查看>>
    OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
    查看>>
    OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
    查看>>
    OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
    查看>>
    OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
    查看>>
    OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
    查看>>