参考教材:https://zh-v2.d2l.ai/
获取图像中目标的类别和具体位置,这类任务被称为目标检测(object detection)或目标识别(object recognition)。
通常使用边界框(bounding box)来描述对象的空间位置。 边界框是矩形的,由矩形左上角的以及右下角的 x 和 y 坐标决定;另一种常用的边界框表示方法是边界框中心的 (x,y) 轴坐标以及框的宽度和高度。原点在图片的左上角,水平方向为x轴,垂直方向为y轴。
两种边界框转换及描绘边界框代码如下:
import torch
import matplotlib.pyplot as plt
def box_corner_to_center(boxes):
"""从(左上,右下)转换到(中间,宽度,高度)"""
"""(x1,y1)表示边界框左上角的坐标,(x2,y2)表示右下角的坐标"""
x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
cx = (x1 + x2) / 2
cy = (y1 + y2) / 2
w = x2 - x1
h = y2 - y1
boxes = torch.stack((cx, cy, w, h), axis=-1)
return boxes
def box_center_to_corner(boxes):
"""从(中间,宽度,高度)转换到(左上,右下)"""
"""(cx,cy)表示边界框中心点的坐标,w和h分别是边界框的宽高"""
cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
x1 = cx - 0.5 * w
y1 = cy - 0.5 * h
x2 = cx + 0.5 * w
y2 = cy + 0.5 * h
boxes = torch.stack((x1, y1, x2, y2), axis=-1)
return boxes
def bbox_to_rect(bbox, color):
# 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:((左上x,左上y),宽,高)
return plt.Rectangle(
xy=(bbox[0], bbox[1]), width=bbox[2] - bbox[0], height=bbox[3] - bbox[1],
fill=False, edgecolor=color, linewidth=2)
if __name__ == '__main__':
img = plt.imread('./images/catdog.jpg')
# bbox是边界框的英文缩写
dog_bbox, cat_bbox = [60.0, 45.0, 378.0, 516.0], [400.0, 112.0, 655.0, 493.0]
boxes = torch.tensor((dog_bbox, cat_bbox))
# 检测边界框转换函数功能是否正确
print(box_center_to_corner(box_corner_to_center(boxes)) == boxes)
fig = plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'))
plt.show()
以每个像素为中心,生成多个缩放比和宽高比(aspect ratio)不同的边界框, 这些边界框被称为锚框(anchor box)。
假设输入图像的高度为H,宽度为W。 以图像的每个像素为中心生成不同形状的锚框:缩放比为s∈(0,1],宽高比为r>0。
下面的例子中,则是以(250,250)这个像素点为中心,生成了5个不同(s,r)的锚框。
J(A,B) = A∩B|A∪B,用来衡量锚框和真实边界框之间的相似度。0表示两个框无重叠,1表示完全重叠,IoU值越高表示重叠部分越多。
输入图片后,会生成多个锚框,有可能很多锚框的重叠性很高,都是围绕着同一个目标。非极大值抑制则用来合并属于同一目标的类似的预测边界框。
对于一个预测边界框B,模型会计算每个类别的预测概率。假设最大的预测概率为 p ,则该概率所对应的类别即为预测的类别,并将 p 称为预测边界框 B 的置信度(confidence)。在同一张图像中,所有预测的非背景边界框都按置信度降序排序,以生成列表 L 。然后通过以下步骤操作排序列表 L :
置信度列表L(按置信度高低排序):蓝框(dog=0.9)、紫框(cat=0.9)、绿框(dog=0.8)、红框(dog=0.7),假设threshold为0.5
基于锚框的目标检测算法通常会在输入图像中采样大量的锚框区域,然后判断这些区域中是否包含我们感兴趣的目标,并调整区域边界从而更准确地预测目标的真实边界框(ground-truth bounding box)。
区域卷积神经网络(region-based CNN或regions with CNN features,R-CNN)模型如下图:
R-CNN模型通过预训练的卷积神经网络有效地抽取了图像特征,但它的速度很慢。从一张图像中选出上千个锚框,需要上千次的卷积神经网络的前向传播来执行目标检测。
对于任何形状为H×W的锚框,指定输出的H1×W1,该锚框会被划分为H1×W1的子区域,每个子区域的大小约为(H/H1)×(W/W1),其中的最大元素作为该子区域的输出。因此,兴趣区域池化层可从形状各异的锚框区域中均抽取出形状相同的特征。
Fast R-CNN模型如下图:
Fast R-CNN相比R-CNN,不再对每个锚框使用CNN进行特征抽取,而是对整张图片进行特征抽取,因此速度有所提升。
Faster R-CNN模型如下图:
区域提议网络作为Faster R-CNN模型的一部分,是和整个模型一起训练得到的。区域提议网络能够学习到如何生成高质量的锚框区域,从而在减少锚框区域数量的情况下,仍保持目标检测的精度。
Mask R-CNN模型如下图:
Mask R-CNN将兴趣区域汇聚层替换为了兴趣区域对齐层,使用双线性插值(bilinear interpolation)来保留特征图上的空间信息,从而更适于像素级预测。
兴趣区域对齐层的输出包含了所有与兴趣区域的形状相同的特征图。 它们不仅被用于预测每个兴趣区域的类别和边界框,还通过额外的全卷积网络预测目标的像素级位置。
SSD模型如下图: