为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

墨色风雨 2022-10-06 17:01:23
我正在使用 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 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

所以我被困在这个问题上,因为我正在关注ML vision docs上的谷歌文档, 其中图像在将其提供给分类器之前被转换为浮点数组,它看起来像这样:

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;

   }


查看完整回答
反对 回复 2022-10-06
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信