目录
这是在Android上使用TensorFlow Lite进行实时危害检测的系列文章中的第三篇。在上一个文章中,我们向Android项目添加了训练有素的模型,并创建了用于将图像传递到其中的用户界面。
从TensorFlow Lite模型传递的信息是数字数组。这些数字本身并不是很有意义。出于我们的目的,我们不需要从模型传递的所有信息。该模型输出三个多维数组。这些数组的最后一个包含我们想要的信息。最后一个数组有五个维度。每个维度的大小为[1] [13] [13] [3] [85]。数组中的元素是浮点数。
YOLO的此实现将图像分为13列和13行。行或列中的每个单元格为32 x 32像素。在这些单元的每个单元中,YOLO最多可以识别三个对象。有了这些知识,您可以轻松推断大小为13的两个维度(列和行)和大小为3的维度(对于三个已识别对象中的每一个)的含义。
最后一个尺寸为85,需要更详细的说明。此数组中的前四个元素定义了一个边界框(X,Y,宽度,高度)。第五个元素包含一个介于零和一之间的值,表示对该包含匹配项的框中的置信度。接下来的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