在Android上使用TensorFlow Lite结果和AI危害检测

262 篇文章 9 订阅
39 篇文章 2 订阅
本文是关于在Android上使用TensorFlowLite进行实时危害检测系列的第三部分,主要讲解如何解析YOLO模型的输出以识别物体,并在屏幕上绘制边界框。模型输出的多维数组包含物体的边界框信息和置信度。通过创建一个自定义View类并在其onDraw方法中渲染边界框,实现了在图像上高亮显示识别的物体。同时,文章提到了如何通过不同颜色区分警告和注意区域,并讨论了未来如何避免不必要的用户警告。
摘要由CSDN通过智能技术生成

目录

识别物体


这是在Android上使用TensorFlow Lite进行实时危害检测的系列文章中的第三篇。在上一个文章中,我们向Android项目添加了训练有素的模型,并创建了用于将图像传递到其中的用户界面。

TensorFlow Lite模型传递的信息是数字数组。这些数字本身并不是很有意义。出于我们的目的,我们不需要从模型传递的所有信息。该模型输出三个多维数组。这些数组的最后一个包含我们想要的信息。最后一个数组有五个维度。每个维度的大小为[1] [13] [13] [3] [85]。数组中的元素是浮点数。

YOLO的此实现将图像分为13列和13行。行或列中的每个单元格为32 x 32像素。在这些单元的每个单元中,YOLO最多可以识别三个对象。有了这些知识,您可以轻松推断大小为13的两个维度(列和行)和大小为3的维度(对于三个已识别对象中的每一个)的含义。

最后一个尺寸为85,需要更详细的说明。此数组中的前四个元素定义了一个边界框(XY,宽度,高度)。第五个元素包含一个介于零和一之间的值,表示对该包含匹配项的框中的置信度。接下来的80个元素包含该YOLO模型识别的80个元素之一的匹配概率。具有最高值的位置是将分配给对象的位置。

识别物体

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

有几种方法可以将轮廓渲染到屏幕上。我选择的方法是制作一个基于View类的类并覆盖其onDraw方法。在该onDraw方法中,视图将接收Canvas进行渲染。传递给此方法的Canvas具有硬件功能支持的优势。通过其他方法(例如通过创建位图)获得Canvas会导致Canvas仅使用软件渲染。

此视图的大多数将透明地呈现。通过将其放在显示正在处理图像的视图上,可以将其他信息与图像一起显示。

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<Rect>
   var attentionList: MutableList<Rect>
   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()
   }
}

当我们想要突出显示一个区域时,我们可以使用Rect定义该区域并将其传递给addHighlight方法。通过此方法,我们可以将警告区域标记为红色(以红色呈现)或引起注意的区域(以绿色呈现)。每当将矩形添加到View时,View标记本身就需要通过调用invalidate进行重新渲染。

现在,我们可以在屏幕上向用户显示识别结果。但是我们可能不想警告用户检测器识别出的每个物体。例如,检测器可以识别其他车辆。车辆应在道路上,并且不应触发任何警告。还有一些物体不代表危险,因为它们不在车辆的行进路线中。

该界面将不仅仅依赖视觉效果来向用户提供反馈。如果用户可以接收音频警告,这样他们就不必将视线移开道路,那将是很好的。在本系列的下一篇文章中,我们将研究如何避免不必要地警告用户,以及如何迅速提醒他们。

https://www.codeproject.com/Articles/5291390/Using-TensorFlow-Lite-Results-with-AI-Hazard-Detec

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值