使用TensorFlow Lite在Android上进行对象检测

这种实现的YOLO将图像划分为13列和13行。每一行或列中的每个单元格是32x32像素。在这些单元格中,YOLO将识别多达三个对象。有了这些知识,可以很容易地推断出两个大小为13的维度(列和行)以及大小为3的维度(对于每个识别出的对象)的含义。

最后一个维度,大小为85,需要更详细的解释。这个数组中的前四个元素定义了一个边界框(X, Y, 宽度, 高度)。第五个元素包含一个介于0和1之间的值,表示这个框包含匹配项的置信度。接下来的80个元素包含匹配项是80个元素中的一个的概率。具有最高值的位置将被分配给对象。

这个模型还附带了一个标签文件。要识别一个位置识别的对象,可以查看与对象索引匹配的行号。这80个元素中的第一个元素是标签文件第一行识别的对象。这80个元素中的第二个元素是文本文件的第二行,依此类推。如果使用的YOLO模型是使用不同的训练集构建的,那么这个维度的大小可能会有所不同。利用这些信息,现在可以在图像中找到的对象周围绘制边界框。

有几种方法可以在屏幕上渲染轮廓。选择的方法是创建一个基于View的类,并覆盖其onDraw方法。在onDraw方法中,视图接收一个用于渲染的Canvas。传递给这个方法的Canvas有一个优势,那就是它是由硬件能力支持的。通过其他方法获取Canvas,如通过创建一个Bitmap,结果是一个只使用软件渲染的Canvas。

这个视图的大部分将透明渲染。通过将其放置在显示正在处理的图像的视图上,可以与图像一起显示额外的信息。

Python class InfoOverlayView(context: Context?, attr: AttributeSet?) : View(context, attr) { public enum class HighlightType(val highlightType: Int) { Warning(0x01), Attention(0x02) } var warningPaint: Paint var attentionPaint: Paint var highlightList: MutableList var attentionList: MutableList public override fun onDraw(canvas: Canvas) { super.onDraw(canvas) for (r in attentionList) { canvas.drawRect(r, attentionPaint) } for (r in highlightList) { canvas.drawRect(r, warningPaint) } } public fun clear() { highlightList.clear() attentionList.clear() invalidate() } public fun addHighlight(area: Rect, type: HighlightType) { when (type) { HighlightType.Warning -> highlightList.add(area) HighlightType.Attention -> attentionList.add(area) } invalidate() } init { warningPaint = Paint() warningPaint.color = -0x7f010000 warningPaint.style = Paint.Style.STROKE warningPaint.strokeWidth = 16f attentionPaint = Paint() attentionPaint.color = 0x7fFFFF00 attentionPaint.style = Paint.Style.STROKE attentionPaint.strokeWidth = 16f highlightList = ArrayList() attentionList = ArrayList() } }

当想要突出显示一个区域时,可以定义一个区域,并将其传递给addHighlight方法。这个方法让可以标记一个区域为警告(以红色渲染)或引起注意(以绿色渲染)。每当一个矩形被添加到View时,View通过调用invalidate方法标记自己需要重新渲染。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485