【发布时间】:2019-02-27 17:22:25
【问题描述】:
尝试使用重新训练的 MobileNet 模型来预测犬种,但通过 Firebase MLKit 使用该模型时,无法正确预测犬种。桌面模型和tflite 模型都能够正确预测品种,但是使用相同的图像of a pug,桌面模型和tflite 模型(在桌面上)有 87.8% 的信心认为它是一只哈巴狗;而在 MLKit 上,置信度为 1.47x10-2%。
我怀疑问题出在我对应用代码中图像的预处理中。 The docs 显示如何缩放 -1.0、1.0 范围内的像素;根据keras图像预处理功能的代码,这是需要的。
这是我的infer(iStream) 函数,我认为错误可能存在。非常感谢任何帮助,这让我发疯了。
private fun infer(iStream: InputStream?) {
Log.d("ML_TAG", "infer")
val bmp = Bitmap.createScaledBitmap(BitmapFactory.decodeStream(iStream), 224, 224, true)
i.setImageBitmap(bmp)
val bNum = 0
val input = Array(1) { Array(224) { Array(224) { FloatArray(3) } } }
for (x in 0..223) {
for (y in 0..223) {
val px = bmp.getPixel(x, y)
input[bNum][x][y][0] = (Color.red(px) - 127) / 255.0f
input[bNum][x][y][1] = (Color.green(px) - 127) / 255.0f
input[bNum][x][y][2] = (Color.blue(px) - 127) / 255.0f
}
}
val inputs = FirebaseModelInputs.Builder()
.add(input)
.build()
interpreter.run(inputs, ioOpts).addOnSuccessListener { res ->
val o = res.getOutput<kotlin.Array<FloatArray>>(0)
val prob = o[0]
val r = BufferedReader(InputStreamReader(assets.open("retrained_labels.txt")))
val arrToSort = arrayListOf<Pair<String, Float>>()
val rArr = r.readLines()
for (i in prob.indices) {
val p = Pair(rArr[i], prob[i])
arrToSort.add(p)
}
val sortedList = arrToSort.sortedWith(compareByDescending {it.second})
val topFive = sortedList.slice(0..4)
arrToSort.forEach {
if (it.first == "pug") {
Log.i("ML_TAG", "Pug: ${it.second}")
}
}
sortedList.forEach {
if(it.first == "pug") {
Log.i("ML_TAG", "Pug: ${it.second}")
}
}
topFive.forEach {
Log.i("ML_TAG", "${it.first}: ${it.second}")
}
}
.addOnFailureListener { res ->
Log.e("ML_TAG", res.message)
}
}
【问题讨论】:
-
您的模型采用什么格式输入?预处理步骤取决于它是 int8/uint8 还是 float。
-
@SachinJoglekar float32
标签: android kotlin tensorflow-lite firebase-mlkit