三国纷争
所以我被困在这个问题上,因为我正在关注ML vision docs上的谷歌文档, 其中图像在将其提供给分类器之前被转换为浮点数组,它看起来像这样:val bitmap = Bitmap.createScaledBitmap(yourInputImage, 224, 224, true)val batchNum = 0val 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; }