学习这一篇课程之前,就听说过YOLO的大名。在疫情期间,有up主就通过yolo训练出了对行人口罩的检测并且大获成功,没成想今天有幸学习到。废话不多说,直接开始学习。
目标检测中的基础概念
在开始学习YOLO之前首先行该学习目标检测的一些基础概念,毕竟YOLO也时目标检测的模型啊。
边界框
边界框(bounding box,bbox)就是图像上恰好可以框住检测物体的矩形框。
例如图中绿色的矩形框,都是恰好框住被检测物体。
在图象中边界框位置的表示方法有两种:
- xyxy型,即提供边界框的左上方坐标(x1,y1)以及右下角坐标(x2,y2),这样可以唯一的确定一个边界框。
- xywh型, 即提供边界框中心坐标(x,y)以及边界框的高(h)和宽(w)。这样也可以唯一的确定一个边界框。
这两种边界框之间的转换方法是:
(x1,y1) = (x - w / 2 , y - h / 2)
(x2,y2) = (x + w / 2 , y + h / 2)
切记在编写代码时确定是哪一种表示方式。
锚框(Anchor box)
锚框(Anchor box),是由人们假想出来的一种框。先设定好锚框的大小和形状,再以图像上某一个点为中心画出矩形框。就和他的名字一样,锚,把框固定在图片上某处。这么做有什么意义呢?其实就是为了之后模型方便在我们框出的众多锚框中找到目标,并且学习如何对锚框进行微调使其恰好可以框住目标。
每种模型都有自己的锚框的生成方式,YOLO-v3也不例外。
交并比(IoU)
这是目标检测里很重要的概念。我们模型预测的边界框,该如何去评价它的好坏即它与真实框的重合程度。这就要引入交并比的概念。
这一概念来源于数学中的集合,用来描述两个集合A和B之间的关系,它等于两个集合的交集里面所包含的元素个数,除以它们的并集里面所包含的元素个数,具体计算公式如下:
IoU=A∪B / A∩B
我们将用这个概念来描述两个框之间的重合度。
下面让我们通过一段代码来加深理解
# 计算IoU,矩形框的坐标形式为xyxy,这个函数会被保存在box_utils.py文件中
def box_iou_xyxy(box1, box2):
# 获取box1左上角和右下角的坐标
x1min, y1min, x1max, y1max = box1[0], box1[1], box1[2], box1[3]
# 计算box1的面积
s1 = (y1max - y1min + 1.) * (x1max - x1min + 1.)
# 获取box2左上角和右下角的坐标
x2min, y2min, x2max, y2max = box2[0], box2[1], box2[2],