65.9K
CodeProject 正在变化。 阅读更多。
Home

可视化 Android 上的 TensorFlow Lite AI 结果

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020年9月21日

CPOL

2分钟阅读

viewsIcon

6225

在这一系列文章的前一篇中,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 时需要遵循的一些最佳实践和优化技巧。

© . All rights reserved.