李沐动手学深度学习V2-目标检测边界框

一. 目标检测边界框

  1. 加载本节使用的示例图像,可以看到图像左边是一只狗,右边是一只猫,它们是这张图像里的两个主要目标,如下图所示。
import torch
import d2l
import d2l.torch
d2l.torch.set_figsize()
img = d2l.torch.plt.imread('../images/catdog.jpg')
d2l.torch.plt.imshow(img)

图片

  1. 在目标检测中,通常使用边界框(bounding box)来描述对象的空间位置。 边界框是矩形的,由矩形左上角的以及右下角的 𝑥 和 𝑦 坐标决定。 另一种常用的边界框表示方法是边界框中心的 (𝑥,𝑦) 轴坐标以及框的宽度和高度。下面定义在这两种表示法之间进行转换的函数:box_corner_to_center从两角表示法转换为中心宽度表示法,而box_center_to_corner反之亦然。 输入参数boxes可以是长度为4的张量,也可以是形状为( 𝑛 ,4)的二维张量,其中 𝑛 是边界框的数量。
def box_corner_to_center(boxes):
"""从(左上,右下)转换到(中间,宽度,高度)"""
    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),dim=-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),dim=-1)
    return boxes

根据坐标信息定义图像中狗和猫的边界框,图像中坐标的原点是图像的左上角,向右的方向为 𝑥 轴的正方向,向下的方向为 𝑦 轴的正方向。

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))
boxes
box_center_to_corner(box_corner_to_center(boxes)) == boxes
'''
输出结果:
tensor([[True, True, True, True],
        [True, True, True, True]])
'''
  1. 将边界框在图中画出,以检查其是否准确。 画之前定义一个辅助函数bbox_to_rect(),它将边界框表示成matplotlib的边界框格式,结果如下图所示。
def bbox_to_rect(bbox,color):
    # 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:
    # ((左上x,左上y),宽,高)
    return d2l.torch.plt.Rectangle(xy=(bbox[0],bbox[1]),width=bbox[2]-bbox[0],height=bbox[3]-bbox[1],edgecolor=color,fill=False,linewidth=2)
#在图像上添加边界框之后,可以看到两个物体的主要轮廓基本上在两个框内。
fig = d2l.torch.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox,color='blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox,color='red'))

图片边界框展示
4. 小结

  1. 目标检测不仅可以识别图像中所有感兴趣的物体,还能识别它们的位置,该位置通常由矩形边界框表示。
  2. 可以在两种常用的边界框表示(中间,宽度,高度)和(左上,右下)坐标之间进行转换。

二. 全部代码

import torch
import d2l
import d2l.torch

d2l.torch.set_figsize()
img = d2l.torch.plt.imread('../images/catdog.jpg')
d2l.torch.plt.imshow(img)


def box_corner_to_center(boxes):
    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), dim=-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), dim=-1)
    return boxes


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))
boxes

box_center_to_corner(box_corner_to_center(boxes)) == boxes


def bbox_to_rect(bbox, color):
    return d2l.torch.plt.Rectangle(xy=(bbox[0], bbox[1]), width=bbox[2] - bbox[0], height=bbox[3] - bbox[1],
                                   edgecolor=color, fill=False, linewidth=2)


fig = d2l.torch.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, color='blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, color='red'))

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值