可视化 Android 上的 TensorFlow Lite AI 结果





5.00/5 (1投票)
在这一系列文章的前一篇中,TensorFlow Lite 解释器已经检查了一张图像并输出了结果。 在本文中,我们将学习如何解释这些结果并为它们创建可视化效果。
输出存储在一组数值数组中。 这些数值数组本身并不能告诉我们太多关于被检查图像的信息,除非我们做一些额外的工作来解释其中的值。 其中一个包含值的数组如下所示
float[][][][][] buf2 = new float[1][13][13][3][85];
让我们解包这个数组。 数组的第一个维度,即 1,用于选择正在检查的图像集中的哪张图像。 对于我们的实现,一次只检查一张图像。 数组的接下来的两个维度 [13][13] 用于选择网格的行和列。 每行每列包含关于 32x32 像素图像区域的信息。 图像区域包含 3 个边界框定义,用于发现的对象。 最后一个维度是包含关于发现的对象有趣数据的数组。
该维度的前四个元素包含找到的元素的边界矩形:X、Y、宽度、高度。 第五个元素包含一个介于 0 和 1 之间的置信度数值。 如果置信度低于某个阈值,那么我们就认为没有感兴趣的内容被指向,可以跳过对该行中剩余数据的评估。 剩下 80 个数据项。 这些 80 个数据项代表模型可以识别的 80 种对象类别。 类别是一种对象类型。 类别的例子包括“猫”、“狗”、“遥控器”、“电视”、“人”等等。 对于每个类别,都有一个对象属于该类别的置信度值。
这些数据需要进行一些处理。 这些值不是我们想要的格式。 需要进行一些缩放和调整,才能使数字与我们的图像对齐。 当我们有一个可接受置信度的项目时,它会被添加到发现的项目列表中,以便可以在屏幕上渲染标记发现的项目框。
float[][][][][] result = buf2;
for(int y=0;y<IMAGE_SEGMENT_ROWS;++y) {
for(int x=0;x<IMAGE_SEGMENT_COLS;++x) {
for(int b=0;b<BOXES_PER_SEGMENT;++b) {
final float confidence = expit(result[0][y][x][b][4]);
int classIndex = -1;
float maxConfidence = 0;
float[] classConfidence = new float[OBJECT_CLASS_COUNT];
for(int k=0;k<OBJECT_CLASS_COUNT;++k) {
float currentConfidence = classConfidence[k]= result[0][y][x][b][5 + k];
if(currentConfidence > maxConfidence) {
classIndex = k;
maxConfidence = currentConfidence;
}
}
float combinedConfidence = maxConfidence * confidence;
if(combinedConfidence > DETECTION_THRESHOLD) {
final float xPos = (x + expit(result[0][y][x][b][0])) * (float)IMAGE_SEGMENT_WIDTH;
final float yPos = (y + expit(result[0][y][x][b][1])) * (float)IMAGE_SEGMENT_HEIGHT;
final float w = (float)(Math.exp(result[0][y][x][b][2]))*ANCHORS[b*2+0];
final float h = (float)(Math.exp(result[0][y][x][b][3]))*ANCHORS[b*2+1];
final RectF boundary = new RectF(
Math.max(0, xPos - w/2),
Math.max(0, yPos - h/2),
Math.min(IMAGE_WIDTH-1, xPos + w / 2),
Math.min(IMAGE_HEIGHT-1, yPos + h/2)
);
RecognizedBox box = new RecognizedBox(
labels.get(classIndex),
combinedConfidence,
boundary
);
recognizedItems.add(box);
}
}
}
}
}
在添加所有框之后,可以渲染识别项目的边界框在屏幕上,标记出识别的内容。
后续步骤
我们已经走了很长的路! 到目前为止,我们已经获取了一个预训练的模型,将其从 ONNX 转换为 TensorFlow Lite 格式,并使用它来检测 Android 应用程序中的对象。 在 下一篇文章中,我们将探讨在使用 TensorFlow Lite 时需要遵循的一些最佳实践和优化技巧。