目标检测中的边界框(x,y,w,h形式转换与绘制)
目标检测中的边界框(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形式转换与绘制)相关推荐
- ECCV18 Oral | CornerNet目标检测开启预测“边界框”到预测“点对”的新思路
性能超过所有one-stage类型目标检测算法,训练和测试代码均已开源. 本文来自ECCV2018 Oral论文<CornerNet: Detecting Objects as Paired K ...
- 李沐动手学深度学习v2-目标检测中的锚框和代码实现
一.目标检测中的锚框 前提: 本节锚框代码实现,使用了很多Pytorch内置函数,如果有对应函数看不懂的地方,可以查看前面博客对相应函数的具体解释,如下链接所示: Pytorch中torch.mesh ...
- 目标检测中的Anchor-free回顾
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 Anchor-free 的检测算法可分为anchor-point的算法和key-point的算法.An ...
- 【深度学习】什么是目标检测中的平均精度均值(mAP)?
计算机视觉界已经集中在度量 mAP 上,来比较目标检测系统的性能.在这篇文章中,我们将深入了解平均精度均值 (mAP) 是如何计算的,以及为什么 mAP 已成为目标检测的首选指标. 目标检测的快速概述 ...
- 目标检测中的数据增强,包括bbox的变换
检测和分类不同,检测过程中,图片处理以后,bbox往往也需要同步变换 里面碰到最坑的地方,在于cv.rectangle(),如果是对图像进行操作,一定要deepcopy 文章目录 1. 水平翻转 1. ...
- 什么是目标检测中的平均精度均值(mAP)?
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 计算机视觉界已经集中在度量 mAP 上,来比较目标检测系统的性能. ...
- 目标检测中的mAP和AP计算原理
目录 前言 一. 基本概念 1.1 分类问题中的四类样本 1.2 精确率(precision) 1.3 召回率(recall) 1.4 准确率(accuracy) 1.5 其他 1.6 讨论 二. m ...
- 目标检测入门之矩形框IOU计算
1. 引言 在目标检测领域中,我们经常用IOU来衡量检测框和标注真实框之间的重叠程度,那么究竟该如何计算IOU呢? 闲话少说,我们直接进入今天的主题- 2. 什么是IOU? IOU(交并比 Inter ...
- 目标检测中的Tricks
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 来自 | 知乎 作者 | roger 链接 | https: ...
- mfc 静态框接收tab焦点_目标检测中焦点损失的入门指南
介绍 对象检测是计算机视觉社区中研究最广泛的主题之一.它已经进入了各个行业,涉及从图像安全,监视,自动车辆系统到机器检查的用例. 当前,基于深度学习的对象检测可以大致分为两类: 两级检测器,例如基于区 ...
最新文章
- Docker(一):这可能是最为详细的Docker入门总结
- AI领域为何缺乏突破?前Quora工程VP:Hinton没有说到点子上
- TCP_数据报文首部格式
- 28 多进程之数据交换Pipe
- redis之mq实现发布订阅模式
- springboot接收多对象_SpringBoot同时接收单个对象和List<object>参数
- Android端的短视频开发技术
- 路由器的基本配置--荣新IT培训带给我的......(三)
- 数据结构与算法--再来聊聊数组
- 从网上看到的很搞笑的东西
- Matlab编写一个脚本计算e,Matlab编程基础I脚本.PPT
- ssl证书不可信 群晖_上海云盾 CDN 网站 SSL 证书过期更新不生效问题排查和解决...
- 各国程序员薪资水平,咱有点惨...
- 【ESAPI】WEB安全ESAPI使用
- PADS Logic 原理图连接
- php 大数据量及海量数据处理算法总结
- 基因组序列genbank格式和fasta格式批量下载
- 一个U盘装N款系统不是梦!超级好用的装机神器来了!
- LibcSearcher报错:no matched libc,please add more libc or try others
- 英文字体免费下载:10款最新的高品质字体