目录
目标检测
也算是计算机视觉里面最广泛的应用!其实我们常见的图片分类,在应用里面没有那么常见。
我们认为在一个图片里面,存在一个主体。而目标检测的目的就是——找出这个主体(我们感兴趣的东西)
我们发现目标检测其实做的比图片分类要多,不仅要进行多个物体的识别,还需要标注出位置
边缘框
用来表示物体的位置,一个边缘框可以通过4个数字定义:
- (左上x,左上y,右下x,右下y)
- (左上x,左上y,宽,高)
注意这里x轴和y轴的定义和我们平时的不太一样,y轴的0点在上方!
目标检测数据集
一般目标检测的数据集通常要比分类任务的小很多,因为标注的成本很高
通常结构是这样:
- 每一行表示一个物体
- 图片文件名、物体类别、边缘框
如果一个图片文件里面有多个物体的话,这个文件名可能会出现多次
e.g.一个图片文件里面有五个物体,这个文件可能就会出现五次
所以目标检测数据集每一行都有六个值(一个文件名字,一个物品类别,四个边缘框数字)
总结
- 物体检测识别图片里的多个物体的类别和位置
- 位置通常用边缘框表示
代码实现
去原来的文件地方取一张猫和狗的照片
%matplotlib inline
import torch
from d2l import torch as d2l
d2l.set_figsize()
img = d2l.plt.imread('../img/catdog.jpg')
d2l.plt.imshow(img);
定义在两种表示之间进行转换的函数
box_corner_to_center
从两角表示法转换为中心宽度表示法,而box_center_to_corner
反之亦然。 输入参数boxes
可以是长度为4的张量,也可以是形状为(n,4)的二维张量,其中n是边界框的数量。
def box_corner_to_center(boxes):
"""从(左上,右下)转换到(中间,宽度,高度)"""
x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
cx = (x1 + x2) / 2 # 中间就是左上右下的x轴取平均
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 = 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
定义图像中狗和猫的边界框
图像中坐标的原点是图像的左上角,向右的方向为x轴的正方向,向下的方向为y轴的正方向。
# 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))
box_center_to_corner(box_corner_to_center(boxes)) == boxes
# 输出
tensor([[True, True, True, True],
[True, True, True, True]])