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

Tflite模型在Android (ml vision)和Python中给出不同的输出

邢雨华
2023-03-14

我正在使用ML Vision api从FaceNet模型创建嵌入,然后比较两个嵌入之间的余弦距离。Android版本和Python的输出有很大不同。Python版本的性能比android版本好得多。可能是什么问题?我在两者中都使用FaceNet模型。

我正在使用ML工具包进行推理 https://firebase.google.com/docs/ml-kit/android/use-custom-models

我认为这可能是由于java读取图像的方式造成的,因为android中制作的图像数组与python中相同图像的数组不同。

共有1个答案

向锦
2023-03-14

所以我被困在这个问题上,因为我在ML vision文档中遵循Google文档,其中图像在将其提供给分类器之前被转换为浮点数组,如下所示:

val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true)

val batchNum = 0
val input = Array(1) { Array(224) { Array(224) { FloatArray(3) } } }
for (x in 0..223) {
    for (y in 0..223) {
        val pixel = bitmap.getPixel(x, y)
        // Normalize channel values to [-1.0, 1.0]. This requirement varies by
        // model. For example, some models might require values to be normalized
        // to the range [0.0, 1.0] instead.
        input[batchNum][x][y][0] = (Color.red(pixel) - 127) / 255.0f
        input[batchNum][x][y][1] = (Color.green(pixel) - 127) / 255.0f
        input[batchNum][x][y][2] = (Color.blue(pixel) - 127) / 255.0f
    }
}

然后我逐个分析了每一步,发现获取像素的方式是错误的,并且与python执行所有操作的方式完全不同。

然后我从这个源代码中找到了这种方法,我用我的函数改变了这个函数:

    private fun convertBitmapToByteBuffer(bitmap: Bitmap): ByteBuffer {
        val imgData = ByteBuffer.allocateDirect(4 * INPUT_SIZE * INPUT_SIZE * PIXEL_SIZE)
        imgData.order(ByteOrder.nativeOrder())
        val intValues = IntArray(INPUT_SIZE * INPUT_SIZE)


        imgData.rewind()
        bitmap.getPixels(intValues, 0, bitmap.width, 0, 0, bitmap.width, bitmap.height)
        // Convert the image to floating point.
        var pixel = 0
        for (i in 0 until INPUT_SIZE) {
            for (j in 0 until INPUT_SIZE) {
                val `val` = intValues[pixel++]
                imgData.putFloat(((`val`.shr(16) and 0xFF) - IMAGE_MEAN)/IMAGE_STD)
                imgData.putFloat(((`val`.shr(8) and 0xFF)- IMAGE_MEAN)/ IMAGE_STD)
                imgData.putFloat(((`val` and 0xFF) - IMAGE_MEAN)/IMAGE_STD)
            }
        }
        return imgData;
   }

成功了!

 类似资料:
  • 这是我在Android Studio上导入的tensorflow Lite模型的代码: 在此处输入图像描述 这是我运行应用程序时的输出: 在此处输入图像描述 我不明白,怎么才能得到模型输出?? 更新: 输出是6个元素的浮点数组,但我想要的是 Largesse 元素的索引,我尝试了这样的代码: 在此处输入图像描述 对吗??我在每个预测上都得到相同的输出

  • 我使用以下代码生成量化的tflite模型 但是根据训练后量化: 生成的模型将完全量化,但为了方便起见,仍然采用浮点输入和输出。 要为Google Coral Edge TPU编译tflite模型,我还需要量化输入和输出。 在模型中,我看到第一个网络层将浮点输入转换为,最后一个网络层将转换为浮点输出。如何编辑tflite模型以除去第一个和最后一个浮动层? 我知道我可以在转换期间将输入和输出类型设置为

  • 在我使用自己的图像数据集使用object_detection\model_main重新训练了预先训练好的ssd mobilenet v1模型之后。py脚本,我导出了两个.pb冻结图(使用export_inference_graph.py脚本) 和 .tflite 图形(带有export_tflite_ssd_graph.py脚本和tflite_convert)。 Pb图似乎工作得很好,但tflit

  • 我有一个保存的tflite模型,其输入和输出详细信息如下: > 输入:[{“name”:“dense_4_Input”,“index”:0,“shape”:数组([1100],dtype=int32),“shape_signature':数组([1],100],dtype=int 32),'dtype':,'量化':(0.0,0),'量化_parameters”:{“scales”:数组] 输出

  • 我训练了一个模型,输入了张量:输入形状:[150]输入类型: 在输出中,该张量为:输出形状:[1 50 17]输出类型: 如何在Java中创建这些?在Android设备上使用它?谢谢

  • 上面代码的输出只是 但我希望有更详细的内容,包括模型参数,即: 我做错了什么?