plt函数显示图片 & 在图片上画边界框 & 边界框坐标转换

一.读取图片并显示图片

python 复制代码
%matplotlib inline
import torch
from d2l import torch as d2l
python 复制代码
'''读取图片'''
image_path = '../data/images/cat_dog_new.jpg'
# 创建画板
figure = d2l.set_figsize()
image = d2l.plt.imread(image_path)
d2l.plt.imshow(image);

二.给出一个(x左上角,y左上角,x右下角,y右下角)类型的框,在图片上画出该框

python 复制代码
'''边界框'''
box = (60,50,460,510)
python 复制代码
def bbox_to_rect(bbox, color):
    # 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:
    # ((左上x,左上y),宽,高)
    return d2l.plt.Rectangle(
        xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
        fill=False, edgecolor=color, linewidth=2)
python 复制代码
# 返回一个画布,该画布上面有图画image
fig = d2l.plt.imshow(image)
# 在该画布上画一个矩形框
fig.axes.add_patch(bbox_to_rect(box,'red'));

三. 边界框坐标转换

3.1 左上角右下角格式的坐标 --> 边界框中心坐标,框的高和宽

原:(x1,y1,x2,y2)

w = x2-x1

h = y2-y1

中心坐标 = (x1+w/2,y1+h/2)

python 复制代码
def box_corner_to_center(boxes):
    # 因为以后boxes可能不止一个,所以 boxes[:,0]取出所有行的第一列
    x1,y1,x2,y2 = boxes[:,0],boxes[:,1],boxes[:,2],boxes[:,3]
    w = x2-x1
    h = y2-y1
    x_center,y_center = x1 + w/2, y1 + h/2
    # axis=-1表示在最后一个维度上进行堆叠
    boxes = torch.stack((x_center,y_center,w,h),axis = -1)
    return boxes

创建两个左上角走下角格式的坐标boxes

python 复制代码
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(boxes)
boxes.shape
python 复制代码
tensor([[ 60.,  45., 378., 516.],
        [400., 112., 655., 493.]])

torch.Size([2, 4])

运行结果

python 复制代码
box_corner_to_center(boxes)
python 复制代码
tensor([[219.0000, 280.5000, 471.0000, 318.0000],
        [527.5000, 302.5000, 381.0000, 255.0000]])
torch.Size([2, 4])

3.2 边界框中心坐标,框的高和宽 --> 左上角右下角格式的坐标

原:(x_center,y_center,w,h)

x1 = x_center - 0.5w
y1 = y_center - 0.5
h

x2 = x_center + 0.5w
y2 = y_center + 0.5
h

python 复制代码
def box_center_to_corner(boxes):
    x_center,y_center,w,h = boxes[:,0],boxes[:,1],boxes[:,2],boxes[:,3]
    x1,y1= x_center-0.5*w , y_center-0.5*h
    x2,y2= x_center+0.5*w , y_center+0.5*h
    boxes = torch.stack((x1,y1,x2,y2),axis=-1)
    return boxes
python 复制代码
boxes = box_center_to_corner(boxes)
print(boxes)
boxes.shape
python 复制代码
tensor([[ 60.,  45., 378., 516.],
        [400., 112., 655., 493.]])

torch.Size([2, 4])
相关推荐
終不似少年遊*6 分钟前
MindSpore框架学习项目-ResNet药物分类-数据增强
人工智能·深度学习·分类·数据挖掘·华为云·resnet·modelart
百锦再13 分钟前
MK米客方德SD NAND:无人机存储的高效解决方案
人工智能·python·django·sqlite·android studio·无人机·数据库开发
侃山25 分钟前
NNLM神经网络语言模型总结
人工智能·神经网络·语言模型
Rachelhi28 分钟前
C++.神经网络与深度学习(赶工版)(会二次修改)
c++·深度学习·神经网络
徐行tag35 分钟前
深度学习基础
人工智能·深度学习
大数网41 分钟前
金融科技比惨:恒生电子减员2200人、宇信科技同比营收-24%,长亮科技同比净利-42%
大数据·人工智能·科技·金融
kovlistudio1 小时前
机器学习第十一讲:标准化 → 把厘米和公斤单位统一成标准值
人工智能·机器学习
水煮蛋不加蛋2 小时前
RAG 赋能客服机器人:多轮对话与精准回复
人工智能·ai·机器人·大模型·llm·rag
池央3 小时前
GPUGeek携手ComfyUI :低成本文生图的高效解决方案
人工智能
Mr.Winter`4 小时前
深度强化学习 | 图文详细推导软性演员-评论家SAC算法原理
人工智能·深度学习·神经网络·机器学习·数据挖掘·机器人·强化学习