亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號