目录
在这里,我们完成了基于TensorFlow Lite的应用程序的构建,该应用程序使用来自ONNX Model Zoo的网络模型执行对象识别。
输出存储在一组数字数组中。除非我们做更多的工作来解释其中的值,否则数值数组本身不会告诉我们有关检查图像的太多信息。数组的保持值之一如下所示:
float[][][][][] buf2 = new float[1][13][13][3][85];
让我们解包这个数组。数组的第一个维度是1,用于选择要检查的一组图像中的哪个图像。对于我们的实现,任何时候都只检查一张图像。数组的下两个维[13] [13]用于选择网格的行和列。每行和每一列都包含有关图像的32x32像素部分的信息。图像部分包含3个针对发现的对象的边界框定义。最后一个维度用于包含有关找到的对象的有趣数据的数组。
此维度的前四个元素包含找到的元素的边界矩形:X,Y,WIDTH,HEIGHT。第五个元素包含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工作时,考察了一些最佳实践和优化技巧可循。