簡體   English   中英

Tflite model 在 Android(ml 視覺)和 ZA7F5F35426B5674113ZB3821 中給出不同的 output

[英]Tflite model giving different output in Android (ml vision) and Python

我正在使用 ML Vision api 從 FaceNet model 創建嵌入,然后比較兩個嵌入之間的余弦距離。 Android版本的output和Python相差很大。 Python 版本的性能優於 android 版本。 可能是什么問題? 我在兩者中都使用 FaceNet model。

我正在使用 ML 套件來推斷https://firebase.google.com/docs/ml-kit/android/use-custom-models

我認為這可能是由於 java 讀取圖像的方式引起的,因為 android 中制作的圖像數組與 python 中相同圖像的圖像數組不同。

所以我被困在這個問題上,因為我正在關注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的方式完全不同。

然后我從這個來源找到了這種方法,我用我的方式更改了 function:

    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;
   }

它奏效了!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM