目录
- 深入解析 MMDetection 中的边界框转换模块
- 一、函数概述及用途
- 1. **find_inside_bboxes**:
- 2. **bbox_flip**:
- 3. **bbox_mapping** 和 **bbox_mapping_back**:
- 4. **bbox2roi**:
- 5. **roi2bbox**:
- 6. **bbox2result**:
- 7. **distance2bbox**:
- 8. **bbox2distance**:
- 9. **bbox_rescale**:
- 10. **bbox_cxcywh_to_xyxy** 和 **bbox_xyxy_to_cxcywh**:
- 11. **bbox2corner** 和 **corner2bbox**:
- 12. **bbox_project**:
- 13. **cat_boxes** 和 **stack_boxes**:
- 14. **scale_boxes**:
- 15. **get_box_wh**:
- 16. **get_box_tensor**:
- 17. **empty_box_as**:
- 18. **bbox_xyxy_to_cxcyah** 和 **bbox_cxcyah_to_xyxy**:
- 二、结语
深入解析 MMDetection 中的边界框转换模块
一、函数概述及用途
1. find_inside_bboxes:
- 功能:找到至少部分在图像内部的边界框。
- 参数:
bboxes
:形状为(N, 4)
的张量,表示一批边界框。img_h
:图像高度。img_w
:图像宽度。
- 返回值:一个布尔张量,表示哪些边界框在图像内部。
2. bbox_flip:
- 功能:水平、垂直或对角翻转边界框。
- 参数:
bboxes
:形状为(..., 4*k)
的张量,表示边界框。img_shape
:图像形状的元组,通常是(height, width)
。direction
:翻转方向,可以是"horizontal"(水平)、“vertical”(垂直)或"diagonal"(对角)。
- 返回值:翻转后的边界框张量。
3. bbox_mapping 和 bbox_mapping_back:
- 功能:在原始图像和测试图像之间映射边界框,包括缩放和翻转操作。
- 参数:
bboxes
:边界框张量。img_shape
:图像形状。scale_factor
:缩放因子,可以是一个浮点数或一个元组。flip
:是否进行翻转。flip_direction
:翻转方向。
- 返回值:映射后的边界框张量。
4. bbox2roi:
def bbox2roi(bbox_list: List[Union[Tensor, BaseBoxes]]) -> Tensor:
"""Convert a list of bboxes to roi format.
Args:
bbox_list (List[Union[Tensor, :obj:`BaseBoxes`]): a list of bboxes
corresponding to a batch of images.
Returns:
Tensor: shape (n, box_dim + 1), where ``box_dim`` depends on the
different box types. For example, If the box type in ``bbox_list``
is HorizontalBoxes, the output shape is (n, 5). Each row of data
indicates [batch_ind, x1, y1, x2, y2].
"""
rois_list = []
for img_id, bboxes in enumerate(bbox_list):
bboxes = get_box_tensor(bboxes)
img_inds = bboxes.new_full((bboxes.size(0), 1), img_id)
rois = torch.cat([img_inds, bboxes], dim=-1)
rois_list.append(rois)
rois = torch.cat(rois_list, 0)
return rois
一、函数概述
这个函数名为bbox2roi
,其作用是将一个批次的图像对应的多个边界框列表转换为感兴趣区域(Region of Interest,ROI)格式的张量。
二、参数说明
bbox_list (List[Union[Tensor, :obj:
BaseBoxes]])
:这是一个列表,其中每个元素是一个张量或特定类型的边界框对象(继承自BaseBoxes
),表示一批图像中的一个图像的边界框集合。
三、函数执行过程
-
初始化 ROI 列表:
rois_list = []
创建一个空列表,用于存储每个图像的 ROI 张量。
-
遍历每个图像的边界框:
for img_id, bboxes in enumerate(bbox_list):
使用
enumerate
函数遍历bbox_list
,得到每个图像的索引img_id
和对应的边界框bboxes
。 -
获取边界框张量并创建图像索引张量:
bboxes = get_box_tensor(bboxes) img_inds = bboxes.new_full((bboxes.size(0), 1), img_id)
- 调用
get_box_tensor
函数将边界框转换为张量类型,确保统一的处理方式。 - 创建一个形状为
(bboxes 的数量, 1)
的张量img_inds
,并使用当前图像的索引img_id
填充这个张量,表示这些边界框所属的图像。
- 调用
-
拼接图像索引和边界框生成 ROI:
rois = torch.cat([img_inds, bboxes], dim=-1)
使用
torch.cat
函数在最后一个维度上拼接图像索引张量img_inds
和边界框张量bboxes
,生成每个图像的 ROI 张量。 -
将每个图像的 ROI 添加到列表中:
rois_list.append(rois)
将当前图像的 ROI 张量添加到
rois_list
中。 -
拼接所有图像的 ROI 张量:
rois = torch.cat(rois_list, 0)
使用
torch.cat
函数将rois_list
中的所有图像的 ROI 张量在第一个维度上进行拼接,得到最终的 ROI 张量。 -
返回结果:
return rois
返回形状为
(n, box_dim + 1)
的 ROI 张量,其中n
是所有图像的边界框总数,box_dim
取决于边界框的类型。例如,如果边界框类型是HorizontalBoxes
,则输出形状是(n, 5)
。每一行数据表示[batch_ind, x1, y1, x2, y2]
。
5. roi2bbox:
- 功能:将 ROI 格式的张量转换回边界框格式。
- 参数:
rois
:RoIs 张量,形状为(n, 5)
,其中第一列表示批次 ID。
- 返回值:一个列表,每个元素是对应图像的边界框张量。
6. bbox2result:
- 功能:将检测结果转换为一个列表的 numpy 数组,每个数组对应一个类别。
- 参数:
bboxes
:边界框张量或 numpy 数组,形状为(n, 5)
。labels
:标签张量或 numpy 数组,形状为(n, )
。num_classes
:类别数量,包括背景类。
- 返回值:一个列表,每个元素是对应类别的边界框结果。
7. distance2bbox:
- 功能:将点到边界的距离解码为边界框。
- 参数:
points
:形状为(B, N, 2)
或(N, 2)
的张量,表示点的坐标。distance
:形状为(B, N, 4)
或(N, 4)
的张量,表示点到四个边界的距离。max_shape
:最大边界形状,可以是一个序列、张量或序列的序列,表示图像的高度和宽度。
- 返回值:解码后的边界框张量。
8. bbox2distance:
- 功能:将边界框解码为点到边界的距离。
- 参数:
points
:形状为(n, 2)
或(b, n, 2)
的张量,表示点的坐标。bbox
:形状为(n, 4)
或(b, n, 4)
的张量,表示边界框。max_dis
:最大距离,可选参数。eps
:一个小值,用于确保目标距离小于最大距离。
- 返回值:解码后的距离张量。
9. bbox_rescale:
- 功能:根据缩放因子重新缩放边界框。
- 参数:
bboxes
:形状为(n, 4)
或(n, 5)
的张量,表示边界框或 RoIs。scale_factor
:缩放因子。
- 返回值:重新缩放后的边界框张量。
10. bbox_cxcywh_to_xyxy 和 bbox_xyxy_to_cxcywh:
- 功能:在中心坐标+宽高(cx, cy, w, h)和左上角+右下角坐标(x1, y1, x2, y2)两种边界框表示形式之间进行转换。
- 参数:
bbox
:形状为(n, 4)
的张量,表示边界框。
- 返回值:转换后的边界框张量。
11. bbox2corner 和 corner2bbox:
- 功能:在边界框坐标(x1, y1, x2, y2)和四个角的坐标表示形式之间进行转换。
- 参数:
bboxes
:形状为(n, 4)
的张量,表示边界框。
- 返回值:转换后的张量。
12. bbox_project:
- 功能:通过几何变换对边界框进行投影。
- 参数:
bboxes
:形状为(n, 4)
的张量,表示边界框。homography_matrix
:形状为(3, 3)
的张量,表示几何变换矩阵。img_shape
:图像形状,可选参数。
- 返回值:转换后的边界框张量或 numpy 数组。
13. cat_boxes 和 stack_boxes:
- 功能:分别用于连接和堆叠具有张量或特定框类型的边界框。
- 参数:
data_list
:一个列表,其中每个元素是张量或特定类型的边界框对象。dim
:连接或堆叠的维度。
- 返回值:连接或堆叠后的结果。
14. scale_boxes:
- 功能:根据缩放因子缩放具有张量或特定框类型的边界框。
- 参数:
boxes
:张量或特定类型的边界框对象,表示需要缩放的边界框。scale_factor
:缩放因子,是一个长度为 2 的元组。
- 返回值:缩放后的边界框。
15. get_box_wh:
- 功能:获取边界框的宽度和高度。
- 参数:
boxes
:张量或特定类型的边界框对象,表示边界框。
- 返回值:一个元组,包含边界框的宽度和高度张量。
16. get_box_tensor:
- 功能:从框类型的对象中获取张量数据。
- 参数:
boxes
:张量或特定类型的边界框对象,表示边界框。
- 返回值:边界框张量。
17. empty_box_as:
- 功能:根据输入的边界框类型和设备生成一个空的边界框。
- 参数:
boxes
:张量或特定类型的边界框对象,表示边界框。
- 返回值:生成的空边界框。
18. bbox_xyxy_to_cxcyah 和 bbox_cxcyah_to_xyxy:
- 功能:在左上角+右下角坐标(x1, y1, x2, y2)和中心坐标+宽高比+高度(cx, cy, ratio, h)两种边界框表示形式之间进行转换。
- 参数:
bboxes
:形状为(n, 4)
的张量,表示边界框。
- 返回值:转换后的边界框张量。
二、结语
这个模块提供了丰富的边界框处理函数,涵盖了从边界框的筛选、翻转、映射、转换到连接、堆叠和缩放等各种操作。这些函数在目标检测的不同阶段,如数据预处理、后处理和模型推理中都起着关键作用,为开发者提供了方便的工具来处理和操作边界框数据。理解这些函数的功能和用法对于深入理解 MMDetection 的目标检测流程以及进行自定义开发和扩展非常重要。