动手学深度学习——边界框

张开发
2026/5/14 1:23:57 15 分钟阅读
动手学深度学习——边界框
1. 前言在上一篇中我们初步认识了**物体检测Object Detection**任务。物体检测和图像分类最大的区别在于图像分类只需要判断“图中是什么”而物体检测不仅要判断“是什么”还要回答“在哪里”。那么计算机究竟该如何表示一个目标在图像中的位置呢最常见、最基础的方法就是使用边界框bounding box。边界框可以理解为用一个矩形框把图像中的目标圈出来。这样模型不仅知道目标属于哪一类还能知道它位于图像的哪个区域。这一节我们就来学习什么是边界框边界框的表示方法如何在图像上绘制边界框用代码实现边界框可视化2. 什么是边界框边界框英文叫bounding box也叫边界盒或目标框。它本质上就是一个矩形框用来标记目标在图像中的位置。例如在一张街道图片中如果有一辆汽车那么我们可以画一个矩形把汽车框起来如果还有一个行人就再画一个矩形把行人框起来。这样一来每个目标都能通过一个矩形区域表示出来。所以在物体检测中一个检测结果通常包含两部分信息类别信息这个目标是什么位置信息这个目标在哪里而位置信息最常见的表示方式就是边界框。3. 边界框的两种常见表示方式边界框虽然本质上是一个矩形但在程序中需要用数值来表示。常见的表示方式主要有两种。3.1 左上角 右下角坐标这是最常见的一种表示方式。设边界框左上角坐标为(x_min, y_min)右下角坐标为(x_max, y_max)那么整个边界框就可以写成(x_min, y_min, x_max, y_max)这里x_min表示左上角的横坐标y_min表示左上角的纵坐标x_max表示右下角的横坐标y_max表示右下角的纵坐标这种方式非常直观因为它直接告诉我们矩形框的两个顶点位置。3.2 左上角坐标 宽和高另一种常见方式是矩形左上角坐标(x, y)矩形宽度w矩形高度h于是边界框表示为(x, y, w, h)这种方式在某些数据集标注格式中经常出现例如 COCO 中就常见这种表示。它表示的是从(x, y)开始向右延伸w向下延伸h4. 两种表示方式之间的转换这两种边界框表示方式本质上是等价的可以互相转换。4.1 从角点坐标转换为宽高形式已知(x_min, y_min, x_max, y_max)则w x_max - x_min h y_max - y_min所以可以转换成(x_min, y_min, w, h)4.2 从宽高形式转换为角点坐标已知(x, y, w, h)则x_max x w y_max y h所以可以转换成(x, y, x w, y h)5. 为什么边界框很重要边界框是整个物体检测任务的基础。因为后面很多核心概念都是围绕边界框展开的比如锚框Anchor Box交并比IoU非极大值抑制NMS边界框回归Bounding Box Regression可以说如果不理解边界框后面的检测模型基本就很难真正看懂。边界框虽然只是一个简单的矩形但它承担了“目标定位”的核心作用。6. 在图像中绘制边界框理解了边界框的概念后一个自然的问题就是如何把边界框画到图像上在 Python 中我们通常可以借助matplotlib和PIL来实现。在《动手学深度学习》中常见做法是先读取图片再指定边界框坐标然后将矩形画到图片上。7. 边界框绘制代码示例下面给出一个典型的代码示例。7.1 导入库import torch from d2l import torch as d2l这里我们使用d2l提供的一些绘图工具。7.2 读取图片img d2l.plt.imread(catdog.jpg) d2l.plt.imshow(img)这段代码的作用是读取一张名为catdog.jpg的图片将图片显示出来如果图片中有一只猫和一只狗那么接下来我们就可以给它们分别设置边界框。7.3 定义边界框dog_bbox [60.0, 45.0, 378.0, 516.0] cat_bbox [400.0, 112.0, 655.0, 493.0]这里每个边界框都采用(x_min, y_min, x_max, y_max)的形式。例如dog_bbox表示狗的边界框cat_bbox表示猫的边界框7.4 定义绘制边界框函数def bbox_to_rect(bbox, color): return d2l.plt.Rectangle( xy(bbox[0], bbox[1]), widthbbox[2] - bbox[0], heightbbox[3] - bbox[1], fillFalse, edgecolorcolor, linewidth2 )这段函数的作用是把边界框转换成matplotlib可绘制的矩形对象。我们逐行理解一下xy(bbox[0], bbox[1])表示矩形左上角坐标widthbbox[2] - bbox[0]表示矩形宽度heightbbox[3] - bbox[1]表示矩形高度fillFalse表示矩形内部不填充颜色只画边框edgecolorcolor指定边界框颜色linewidth2指定边框线宽7.5 在图像上画出边界框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.show()运行后我们就能看到狗被蓝色框圈出来猫被红色框圈出来这样图像中的目标位置就被可视化出来了。8. 代码完整示例把上面的代码合在一起完整如下import torch from d2l import torch as d2l img d2l.plt.imread(catdog.jpg) dog_bbox [60.0, 45.0, 378.0, 516.0] cat_bbox [400.0, 112.0, 655.0, 493.0] def bbox_to_rect(bbox, color): return d2l.plt.Rectangle( xy(bbox[0], bbox[1]), widthbbox[2] - bbox[0], heightbbox[3] - bbox[1], fillFalse, edgecolorcolor, linewidth2 ) 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.show()9. 代码理解总结这个例子虽然不复杂但非常重要因为它第一次把“检测中的位置表示”真正落到了代码中。整个流程其实很清晰第一步读取图片img d2l.plt.imread(catdog.jpg)把图片加载进来。第二步给出边界框坐标dog_bbox [60.0, 45.0, 378.0, 516.0] cat_bbox [400.0, 112.0, 655.0, 493.0]用数值描述目标的位置。第三步将坐标转成矩形对象bbox_to_rect(bbox, color)这是“数据表示”到“图像显示”的关键一步。第四步把矩形加到图片上fig.axes.add_patch(...)最终完成边界框绘制。10. 边界框在后续检测模型中的作用在真正的检测模型中边界框并不是人工写死的而是模型预测出来的。也就是说未来我们训练的模型会自动输出类似这样的结果[类别, 置信度, x_min, y_min, x_max, y_max]例如[dog, 0.95, 60, 45, 378, 516]这表示模型认为这是狗置信度为 95%它的位置由这个边界框确定所以边界框不仅仅是一个可视化工具更是检测模型输出结果的核心组成部分。11. 本节总结这一节我们学习了物体检测中最基础的内容边界框。重点可以总结为以下几点。11.1 边界框用于表示目标位置它本质上是一个矩形框用来把图像中的目标圈出来。11.2 边界框有两种常见表示方式第一种(x_min, y_min, x_max, y_max)第二种(x, y, w, h)两种形式可以互相转换。11.3 可以借助 matplotlib 将边界框画到图片上通过定义矩形对象并添加到图像坐标轴中就能完成目标框绘制。11.4 边界框是后续检测知识的基础后面的锚框、IoU、NMS、SSD、YOLO 等内容都会建立在边界框的基础之上。12. 学习感悟边界框这个知识点看起来并不复杂甚至可以说只是“画矩形框”。但它其实是物体检测中最基础、最关键的表示方式之一。很多时候深度学习里真正重要的并不一定是最复杂的公式而是这种最基础的任务定义和表示方法。因为只有先明确目标怎么表示位置怎么编码结果怎么可视化后面的模型设计才有意义。所以边界框虽然是检测章节中比较靠前的小知识点但绝对不能轻视。

更多文章