当前位置: 首页 > 知识库问答 >
问题:

如何在android中将tflite模型中的形状[1,28,28,1]数组作为图像输出

万俟英锐
2023-03-14

我有一个保存的tflite模型,其输入和输出详细信息如下:

>

  • 输入:[{“name”:“dense_4_Input”,“index”:0,“shape”:数组([1100],dtype=int32),“shape_signature':数组([1],100],dtype=int 32),'dtype':,'量化':(0.0,0),'量化_parameters”:{“scales”:数组]

    输出 : [{'name': 'Identit', '索引': 22, 'shape': 数组([ 1, 28, 28, 1], dtype=int32), 'shape_signature': 数组([ 1, 28, 28, 1], dtype=int32), 'dtype': , '量化': (0.0, 0), 'quantization_parameters': {'scales': 数组([], dtype=float32), 'zero_points': 数组([], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]

    如何使用Java和Tensorflow解释器在android应用程序上将输出显示为图像?

  • 共有1个答案

    龙玺
    2023-03-14
    import android.content.res.AssetManager
    import android.graphics.Bitmap
    import android.util.Log
    import org.tensorflow.lite.Interpreter
    import org.tensorflow.lite.Tensor
    import java.io.FileInputStream
    import java.lang.StringBuilder
    import java.nio.ByteBuffer
    import java.nio.ByteOrder
    import java.nio.channels.FileChannel
    
    class ImgPredictor(val assetManager: AssetManager, modelFilename: String) {
        private var tflite: Interpreter
    
        private var input: ByteBuffer
        private var output: ByteBuffer
    
        init {
            val tfliteOptions = Interpreter.Options()
    
            val fd = assetManager.openFd(modelFilename)
            val inputStream = FileInputStream(fd.fileDescriptor)
            val fileChannel: FileChannel = inputStream.channel
            val startOffset: Long = fd.startOffset
            val declaredLength: Long = fd.declaredLength
            val mbb = fileChannel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength)
            tflite = Interpreter(mbb, tfliteOptions)
            Log.i("ImgPredictor", "interpreter: ${tflite.detail()}")
            input = ByteBuffer.allocate(100 * Int.SIZE_BYTES)
            input.order(ByteOrder.nativeOrder())
    
            output = ByteBuffer.allocate(1 * 28 * 28 * 1 * Int.SIZE_BYTES)
            output.order(ByteOrder.nativeOrder())
        }
    
        fun predict(data: IntArray): Bitmap {
            val startTs = System.currentTimeMillis();
    
            input.clear()
            output.clear()
    
            input.rewind()
            for (i in 0 until 100) {
                input.putInt(data[i])
            }
            tflite.run(input, output)
            val bitmap = Bitmap.createBitmap(28, 28, Bitmap.Config.ARGB_8888);
            // vector is your int[] of ARGB
            bitmap.copyPixelsFromBuffer(output)
            return bitmap
        }
    }
    
    fun Tensor.detail(): String {
        return "[shape: ${this.shape().toList()} dataType: ${this.dataType()}, bytes: ${this.numBytes()}]"
    }
    
    fun Interpreter.detail(): String {
        val sb = StringBuilder("interpreter: \n")
        sb.append("input: { \n")
        for (i in 0 until this.inputTensorCount) {
            sb.append("    ").append(this.getInputTensor(i).detail()).append("\n")
        }
        sb.append("}, \n")
    
        sb.append("output: { \n")
        for (i in 0 until this.outputTensorCount) {
            sb.append("    ").append(this.getOutputTensor(i).detail()).append("\n")
        }
        sb.append("}")
        return sb.toString()
    }
    

    您可以在此处查看官方教程以了解更多详细信息:对象检测解释器的示例
    但以下是您应该注意的一些点:
    1.保持实现'org.tensorflow: tenorflow-lite: x. x'与您的PC尽可能相同的版本,因为某些操作在较低版本中可能不起作用。
    2.使用一些详细的func来打印解释器输入/输出。
    3.检查输入输出数据缓冲区顺序endian。

     类似资料:
    • 我已经将一个Yolo模型转换为.tflite,以便在Android中使用。在python中就是这样使用的-- 我使用netron https://github.com/lutzroeder/netron可视化模型。输入描述为name:inputs,类型:float32[1,416,416,3],quantization:0≤q≤255,位置:399,输出描述为name:output_boxs,类型

    • 我目前正在从事一个股票市场项目,教学生如何与股票市场互动。我现在正在研究的一个问题围绕着效率和记忆力的问题。我在Adobe illustrator中制作了所有2D图标(例如设置图标,投资组合图标等),我将这些文件导出为png文件,并将它们放入我的程序中。我目前使用 JavaFX,JavaFX 的一个功能是所谓的图像视图,这是一种处理图像打开和查看的方法。 假设用户想在游戏中按下设置图标,当用户悬停

    • 我想在Tensorflow中将整数量化的tflite模型转换为冻结图(.pb)。我通读并尝试了许多有关StackOverflow的解决方案,但没有一个有效。具体来说,toco不起作用(输出格式不能是TENSORFLOW\u GRAPHDEF)。 我的最终目标是通过tf2onnx获得量化的ONNX模型,但tf2onnx不支持tflite作为输入(只支持保存的_模型、检查点和图形_定义)。但是,在使用

    • 我已经使用tensorflow后端训练了一个DNN,我想在FireBase中托管它。训练好的模型被保存为.meta文件,我尝试使用下面的代码将模型转换为tflite,但我遇到了一些错误。那么我如何将这个模型转换成Tensorflow Lite呢?

    • 型号名称: ssd_mobilenet_v1_ppn_coco https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md 我尝试使用此命令将模型转换为tflite pb: ValueError:只有第1维度支持无。张量“image_Tensor”的形

    • 我正在使用ML Vision api从FaceNet模型创建嵌入,然后比较两个嵌入之间的余弦距离。Android版本和Python的输出有很大不同。Python版本的性能比android版本好得多。可能是什么问题?我在两者中都使用FaceNet模型。 我正在使用ML工具包进行推理 https://firebase.google.com/docs/ml-kit/android/use-custom-