这种实现的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方法标记自己需要重新渲染。