目标检测中的边界框(x,y,w,h形式转换与绘制)

之前做了个关于yolov4的目标检测项目, 对这个领域产生了兴趣, 决定系统的学习一下
记录来源: 李沐老师: 动手学深度学习
在线阅读 https://zh-v2.d2l.ai/

目标检测起到的效果是找到物体的位置并且预测其类别, 效果如下图

我们通常使用边界框(bounding box)来描述对象的空间位置,也就是图中的蓝色框
而常见的对bounding box的描述形式有两种

  • x, y, w, h 表示了框的中心坐标/左上角坐标 + 长 + 宽
  • x1,y1,x2,y2 表示了框的左上角坐标 + 右下角坐标

边框表现形式转换

下面的函数起到了对这两种形式转换的作用


def box_corner_to_center(boxes):"""从(左上,右下)转换到(中间,宽度,高度)"""x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]cx = (x1 + x2) / 2cy = (y1 + y2) / 2w = x2 - x1h = y2 - y1boxes = torch.stack((cx, cy, w, h), axis=-1)return boxesdef box_center_to_corner(boxes):"""从(中间,宽度,高度)转换到(左上,右下)"""cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]x1 = cx - 0.5 * wy1 = cy - 0.5 * hx2 = cx + 0.5 * wy2 = cy + 0.5 * hboxes = torch.stack((x1, y1, x2, y2), axis=-1)return boxes

举例, 先给出猫和狗的框

dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 114, 655, 493]
box = torch.tensor((dog_bbox, cat_bbox))
print(box)
'''
tensor([[ 60,  45, 378, 516],[400, 114, 655, 493]])
'''

验证一下转换的函数是否正确

print(box_center_to_corner(box_corner_to_center(box)) == box)
'''
tensor([[True, True, True, True],[True, True, True, True]])
'''

边框绘制

将框绘制在图像中, 这里使用的是plt.Rectangle, 使用cv2也可以达到同样的效果

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)

tips 保存图片时关闭plt自带的坐标轴

d2l.plt.axis('off')
fig = d2l.plt.savefig('catdogbox.jpg')

全代码

import d2lzh as d2l
from PIL import Image
import torchd2l.set_figsize()
img = Image.open('catdog.jpg')
d2l.plt.imshow(img)
d2l.plt.show()# bbox是bounding box的缩写
# [左上角x,左上角y,右下角x,右下角y]
dog_bbox, cat_bbox = [60, 45, 378, 516], [400, 114, 655, 493]
box = torch.tensor((dog_bbox, cat_bbox))
print(box)def box_corner_to_center(boxes):"""从(左上,右下)转换到(中间,宽度,高度)"""x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]cx = (x1 + x2) / 2cy = (y1 + y2) / 2w = x2 - x1h = y2 - y1boxes = torch.stack((cx, cy, w, h), axis=-1)return boxesdef box_center_to_corner(boxes):"""从(中间,宽度,高度)转换到(左上,右下)"""cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]x1 = cx - 0.5 * wy1 = cy - 0.5 * hx2 = cx + 0.5 * wy2 = cy + 0.5 * hboxes = torch.stack((x1, y1, x2, y2), axis=-1)return boxesdef 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)print(box_center_to_corner(box_corner_to_center(box)) == box)
'''
tensor([[True, True, True, True],[True, True, True, True]])
'''
fig = d2l.plt.imshow(img)
fig.axes.add_patch(bbox_to_rect(dog_bbox, 'blue'))
fig.axes.add_patch(bbox_to_rect(cat_bbox, 'red'))
d2l.plt.axis('off')
fig = d2l.plt.savefig('catdogbox.jpg')

目标检测中的边界框(x,y,w,h形式转换与绘制)相关推荐

  1. ECCV18 Oral | CornerNet目标检测开启预测“边界框”到预测“点对”的新思路

    性能超过所有one-stage类型目标检测算法,训练和测试代码均已开源. 本文来自ECCV2018 Oral论文<CornerNet: Detecting Objects as Paired K ...

  2. 李沐动手学深度学习v2-目标检测中的锚框和代码实现

    一.目标检测中的锚框 前提: 本节锚框代码实现,使用了很多Pytorch内置函数,如果有对应函数看不懂的地方,可以查看前面博客对相应函数的具体解释,如下链接所示: Pytorch中torch.mesh ...

  3. 目标检测中的Anchor-free回顾

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 Anchor-free 的检测算法可分为anchor-point的算法和key-point的算法.An ...

  4. 【深度学习】什么是目标检测中的平均精度均值(mAP)?

    计算机视觉界已经集中在度量 mAP 上,来比较目标检测系统的性能.在这篇文章中,我们将深入了解平均精度均值 (mAP) 是如何计算的,以及为什么 mAP 已成为目标检测的首选指标. 目标检测的快速概述 ...

  5. 目标检测中的数据增强,包括bbox的变换

    检测和分类不同,检测过程中,图片处理以后,bbox往往也需要同步变换 里面碰到最坑的地方,在于cv.rectangle(),如果是对图像进行操作,一定要deepcopy 文章目录 1. 水平翻转 1. ...

  6. 什么是目标检测中的平均精度均值(mAP)?

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 计算机视觉界已经集中在度量 mAP 上,来比较目标检测系统的性能. ...

  7. 目标检测中的mAP和AP计算原理

    目录 前言 一. 基本概念 1.1 分类问题中的四类样本 1.2 精确率(precision) 1.3 召回率(recall) 1.4 准确率(accuracy) 1.5 其他 1.6 讨论 二. m ...

  8. 目标检测入门之矩形框IOU计算

    1. 引言 在目标检测领域中,我们经常用IOU来衡量检测框和标注真实框之间的重叠程度,那么究竟该如何计算IOU呢? 闲话少说,我们直接进入今天的主题- 2. 什么是IOU? IOU(交并比 Inter ...

  9. 目标检测中的Tricks

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来自 | 知乎    作者 | roger 链接 | https: ...

  10. mfc 静态框接收tab焦点_目标检测中焦点损失的入门指南

    介绍 对象检测是计算机视觉社区中研究最广泛的主题之一.它已经进入了各个行业,涉及从图像安全,监视,自动车辆系统到机器检查的用例. 当前,基于深度学习的对象检测可以大致分为两类: 两级检测器,例如基于区 ...

最新文章

  1. Docker(一):这可能是最为详细的Docker入门总结
  2. AI领域为何缺乏突破?前Quora工程VP:Hinton没有说到点子上
  3. TCP_数据报文首部格式
  4. 28 多进程之数据交换Pipe
  5. redis之mq实现发布订阅模式
  6. springboot接收多对象_SpringBoot同时接收单个对象和List<object>参数
  7. Android端的短视频开发技术
  8. 路由器的基本配置--荣新IT培训带给我的......(三)
  9. 数据结构与算法--再来聊聊数组
  10. 从网上看到的很搞笑的东西
  11. Matlab编写一个脚本计算e,Matlab编程基础I脚本.PPT
  12. ssl证书不可信 群晖_上海云盾 CDN 网站 SSL 证书过期更新不生效问题排查和解决...
  13. 各国程序员薪资水平,咱有点惨...
  14. 【ESAPI】WEB安全ESAPI使用
  15. PADS Logic 原理图连接
  16. php 大数据量及海量数据处理算法总结
  17. 基因组序列genbank格式和fasta格式批量下载
  18. 一个U盘装N款系统不是梦!超级好用的装机神器来了!
  19. LibcSearcher报错:no matched libc,please add more libc or try others
  20. 英文字体免费下载:10款最新的高品质字体

热门文章

  1. flutter-dart语言类型后加问号
  2. Object类型转换为int型
  3. 《2019年中国互联网网络安全报告》发布,恶意程序攻击半数来自美国
  4. 开发人员使用Helix QAC满足合规性的5大原因
  5. Geoserver——矢量切片1
  6. 锂电池欧姆内阻和极化内阻
  7. 2017阿里巴巴实习生招聘编程题
  8. Floyd-Warshall算法过程中矩阵计算方法—十字交叉法
  9. 2、恩智浦-车规级-MCU :S32K11X GPIO实验
  10. Mysql和ES数据同步方案汇总