源码文件
在 ./maskrcnn_benchmark/structures/
文件夹中, 定义了许多检测模式使用的数据结构, 如 BoxList
, ImageList
等, 下面我们就将对这些数据结构以后适用于它们的操作进行讲解, 涉及到的源码文件如下所示:
bounding_box.py 文件解析
该文件的主要内容就是定义了 class BoxList(object)
类, 该类用于表示一系列的 bounding boxes. 这些 boxes 会以 N×4 大小的 Tensor 来表示. 为了唯一的确定 boxes 在图片中的准确位置, 该类还保存了图片的维度, 另外, 也可以添加额外的信息到特定的 bounding box 中, 如标签信息.
文件概览
该文件篇幅较长, 文件概览如下所示:
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
class BoxList 解析
下面我们对该类进行解析, 由于这个类的定义比较长, 且这个文件没有外部函数, 所有的函数都是类的成员函数, 因此, 我们将这个类拆分来讲解, 以方便我们查阅.
初始化函数
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
extra_fields 操作函数
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
convert() 模式转换函数
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
resize() 放缩函数
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
transpose() 图片翻转或旋转
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
crop() 裁剪函数
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
to() 设备转移函数
将 BoxList 实例转化到指定的设备上(创建新实例返回).
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
clip_to_image()
该函数将 bbox 的坐标限制在 image 的尺寸内, 以便可以将边框显示在 image uh.
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
area() 获取区域面积函数
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
copy_with_fields() 深度复制函数
连带 BoxList 的 extra_fields
信息进行复制, 返回一个新的 BoxList 实例
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
其他函数
getitem(), len(), repr()
1 | # ./maskrcnn_benchmark/structures/bounding_box.py |
boxlist_ops.py
该文件定义了一些与 BoxList 类型数据有关的操作, 根据函数的相互调用关系, 可以分为以下四个主要的函数:
boxlist_nms()
:remove_small_boxes()
:boxlist_iou()
:cat_boxlist()
:
下面我们按照顺序对分别上面的函数进行解析
boxlist_nms() 函数
该函数会对一个 BoxList 类型数据中的 box 执行非极大值抑制算法, 这些 box 的 socre 值可以通过 score_field 获取, 代码的核心逻辑实际上是调用了 ./maskrcnn_benchmark/layers/nms.py
文件中的 _box_nms()
函数, 关于该函数的详细解析可以看 nms 解析
1 | # ./maskrcnn_benchmark/structures/boxlist_ops.py |
remove_small_boxes() 函数
该函数执行后, BoxList 中只会保留那些尺寸大于一定值的区域 box.
1 | # ./maskrcnn_benchmark/structures/boxlist_ops.py |
boxlist_iou() 函数
cat_boxlist() 函数
该函数会将一个组成元素为 BoxList 的列表合并成一个 BoxList 对象. 注意, 列表中的 BoxList 对象必须具有相同 image size.
1 | # ./maskrcnn_benchmark/structures/boxlist.py |
image_list.py