栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

李沐动手学深度学习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'))

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/958618.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号