前言:

  与Bounding Box有关的操作有很多,例如对边框列表进行非极大线性抑制、去除过小的边框、计算边框之间的Iou以及对两个边框列表进行合并等操作。在maskrcnn_benchmark中,这些操作都得以实现,其具体代码以及解释如下:

# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
import torchfrom .bounding_box import BoxListfrom maskrcnn_benchmark.layers import nms as _box_nmsdef boxlist_nms(boxlist, nms_thresh, max_proposals=-1, score_field="scores"):"""Performs non-maximum suppression on a boxlist, with scores specifiedin a boxlist field via score_field.在边框列表上进行非极大线性抑制参数:boxlist(BoxList):含有边框目标得分,原始图像大小,预测边框列表等信息的边框列表nms_thresh (float):非极大线性抑制的阈值max_proposals (int): if > 0, then only the top max_proposals are keptafter non-maximum suppression当大于0时,在非极大线性抑制后只保存前max_proposals个最大目标评分的的预测边框score_field (str):保存目标得分列表的键值"""# 如果非极大线性抑制的阈值小于0,则返回所有边框列表if nms_thresh <= 0:return boxlist# 得到预测边框的格式mode = boxlist.mode#  将预测边框转换为左下右上两个点坐标的格式boxlist = boxlist.convert("xyxy")#  得到boxlist里的预测边框boxes = boxlist.bbox#  得到boxlist里的目标得分score = boxlist.get_field(score_field)# 进行非极大线性抑制操作,得到应该保留的相应的边框索引keep = _box_nms(boxes, score, nms_thresh)#  当大于0时,在非极大线性抑制后只保存前max_proposals个最大目标评分的的预测边框if max_proposals > 0:keep = keep[: max_proposals]#  保存经过非极大线性抑制操作,得到应该保留的相应的预测边框boxlist = boxlist[keep]# 将边框格式转换回去,然后返回边框列表return boxlist.convert(mode)def remove_small_boxes(boxlist, min_size):"""Only keep boxes with both sides >= min_size只保存边框的所有边都大于min_size的边框Arguments:boxlist (Boxlist):需要处理的边框列表min_size (int):所能接受的最小的边框边长"""# TODO maybe add an API for querying the ws / hs把边框转换为中心点坐标+宽高的格式xywh_boxes = boxlist.convert("xywh").bbox# 去除xywh_boxes中的第二个维度_, _, ws, hs = xywh_boxes.unbind(dim=1)# 得到应该保留的边框的索引keep = ((ws >= min_size) & (hs >= min_size)).nonzero().squeeze(1)# 返回满足条件的边框return boxlist[keep]# implementation from https://github.com/kuangliu/torchcv/blob/master/torchcv/utils/box.py
# with slight modifications
def boxlist_iou(boxlist1, boxlist2):"""Compute the intersection over union of two set of boxes.计算两个边框列表里面的列表之间的重合度The box order must be (xmin, ymin, xmax, ymax).所有的边框数据必须为xyxy格式Arguments:两个需要计算重合度的边框列表box1: (BoxList) bounding boxes, sized [N,4].box2: (BoxList) bounding boxes, sized [M,4].Returns:(tensor) iou, sized [N,M].返回彼此所有边框互相之间的重合度Reference:https://github.com/chainer/chainercv/blob/master/chainercv/utils/bbox/bbox_iou.py"""# 如果两个边框列表对应的图片大小不同,即对应的是不同的图片,则报错if boxlist1.size != boxlist2.size:raise RuntimeError("boxlists should have same image size, got {}, {}".format(boxlist1, boxlist2))# 得到两个边框列表的长度N = len(boxlist1)M = len(boxlist2)# 得到两个边框列表中边框的面积列表area1 = boxlist1.area()area2 = boxlist2.area()# 得到两个边框列表box1, box2 = boxlist1.bbox, boxlist2.bbox# 分别计算左下角左边中较大的坐标,右上角坐标中较小的,即两个边框重合的坐标lt = torch.max(box1[:, None, :2], box2[:, :2])  # [N,M,2]rb = torch.min(box1[:, None, 2:], box2[:, 2:])  # [N,M,2]TO_REMOVE = 1# 计算重合部分的面积wh = (rb - lt + TO_REMOVE).clamp(min=0)  # [N,M,2]inter = wh[:, :, 0] * wh[:, :, 1]  # [N,M]# 计算重合度iou = inter / (area1[:, None] + area2 - inter)return iou# TODO redundant, remove
def _cat(tensors, dim=0):"""Efficient version of torch.cat that avoids a copy if there is only a single element in a list是对torch.cat的补充,使得其能避免列表中只存在单个元素,即避免模型没有采用FPN或者只是从单层特征层里提取边框信息"""# 判断tensors是不是boxlist格式assert isinstance(tensors, (list, tuple))# 如果tensors只有一个元素,直接返回,不再拼接if len(tensors) == 1:return tensors[0]# 如果tensors有多个元素,拼接return torch.cat(tensors, dim)def cat_boxlist(bboxes):"""Concatenates a list of BoxList (having the same image size) into asingle BoxList。将从不同的FPN特征层里得到的边框以及其对应的目标得分(objectness)并在一起他们对应的是同一张图片,同一数据格式Arguments:bboxes (list[BoxList]):不同的FPN特征层里得到的边框列表"""# 判断bboxes格式是否相同assert isinstance(bboxes, (list, tuple))assert all(isinstance(bbox, BoxList) for bbox in bboxes)# 获得bboxes中所有边框列表对应的同一张图片的大小size = bboxes[0].size# 如果bboxes中所有边框列表对应不是同一张图片,则报错assert all(bbox.size == size for bbox in bboxes)# 获得bboxes中所有边框列表的数据格式,xyxy或者xywhmode = bboxes[0].mode# 如果bboxes中所有边框列表对应不是同一数据格式,则报错assert all(bbox.mode == mode for bbox in bboxes)# 获得第一层FPN特征层的bboxes中保存的其他数据的键名fields = set(bboxes[0].fields())# 如果FPN特征层的bboxes中保存的其他数据的键名不同,则报错assert all(set(bbox.fields()) == fields for bbox in bboxes)# 将不同的FPN特征层的bboxes的边框合并在一起,并保存为BoxList类型cat_boxes = BoxList(_cat([bbox.bbox for bbox in bboxes], dim=0), size, mode)# 将不同的FPN特征层的bboxes的边框的与其对应的目标得分(objectness)并在一起for field in fields:data = _cat([bbox.get_field(field) for bbox in bboxes], dim=0)cat_boxes.add_field(field, data)return cat_boxes

maskrcnn_benchmark 代码详解之 boxlist_ops.py相关推荐

  1. maskrcnn_benchmark 代码详解之 roi_box_predictors.py

    前言: 在对RPN预测到的边框进行进一步特征提取后,需要对边框进行预测,得到边框的类别和位置大小信息.这一操作在maskrcnn_benchmark中由roi_box_predictors.py完成, ...

  2. maskrcnn_benchmark 代码详解之 roi_box_feature_extractors.py

    前言: 在经过RPN层之后,网络会生成多个预测边框(proposal), 这时候需要对这些边框进行RoI池化,使之成为尺度一致的特征.接下来就需要对这些特征进行进一步的特征提取,这就需要用到roi_b ...

  3. maskrcnn_benchmark 代码详解之 poolers.py

    前言: 在目标检测的深度网络中最后一个步骤就是RoI层,其中RoI Pooling会实现将RPN提取的各种形状的边框进行池化,从而形成统一尺度的特征层,这一工程中将涉及到ROIAlign操作.Pool ...

  4. maskrcnn_benchmark 代码详解(更新中...)

    前言: maskrcnn_benchmark是faceboock公司编写的一套用于目标检索的框架,该框架集成了目前用到的大部分使用深度卷积网络来进行目标检测的模型,其中包括Fast RCNN, Fas ...

  5. maskrcnn-benchmar 代码详解之 fpn.py

    前言 FPN网络主要应用于多层特征提取,使用多尺度的特征层来进行目标检测,可以利用不同的特征层对于不同大小特征的敏感度不同,将他们充分利用起来,以更有利于目标检测,在maskrcnn benchmar ...

  6. yolov3代码详解(七)

    Pytorch | yolov3代码详解七 test.py test.py from __future__ import divisionfrom models import * from utils ...

  7. yolov5的detect.py代码详解

    目标检测系列之yolov5的detect.py代码详解 前言 哈喽呀!今天又是小白挑战读代码啊!所写的是目标检测系列之yolov5的detect.py代码详解.yolov5代码对应的是官网v6.1版本 ...

  8. yolov5-5.0版本代码详解----augmentations.py的augment_hsv函数

    yolov5-5.0版本代码详解----augmentations.py的augment_hsv函数 1.用途 图片的hsv色域增强模块 2.调用位置 在datasets.py的LoadImagesA ...

  9. 【Image captioning】Show, Attend, and Tell 从零到掌握之三--train.py代码详解

    [Image captioning]Show, Attend, and Tell 从零到掌握之三–train.py代码详解 作者:安静到无声 个人主页 作者简介:人工智能和硬件设计博士生.CSDN与阿 ...

最新文章

  1. 哈夫曼树--顺序结构(建立、编码、解码)
  2. boost::shared_ptr shared_from_this
  3. stl中unordered_map 和 map的区别 ?
  4. MongoDB学习笔记(三)使用Spring Data操作MongoDB
  5. 图片自适应css代码(转)
  6. 分布式自增ID算法---雪花算法(SnowFlake)Java实现
  7. 全球链界科技发展大会_科技界女性占五席
  8. 【读书笔记】100个Switf必备tips
  9. ubuntu搭建NFS服务 磁盘共享 nfs 搭建
  10. BUAA软工第0次作业
  11. 在SQL Server 2005中实现异步触发器架构
  12. 软件项目管理案例教程第四版答案
  13. 数据库防火墙、数据库加密、数据库脱敏真的可用吗?
  14. 崔荣容,英语如法入门1-50讲
  15. 虚拟化:十大虚拟化最佳实践
  16. 利用逆矩阵解线性方程组_(非)线性方程组求解库大全
  17. 计算机硬件4核是什么意思,8核,6核,4核和双核CPU是什么意思?
  18. 图片自适应手机屏幕大小
  19. android光标Cursor
  20. 信息系统项目管理师必背核心考点(四十三)预期货币价值(EMV)

热门文章

  1. 阿龙学堂-中缀-后缀表达式的计算
  2. 泰坦尼克号生存分析(新手入门)
  3. (高精度GPS北斗RTK手持机)
  4. Emmy Noether传记资料(2010-01-27 23:37:43)
  5. java飞鸽传书_java简单版飞鸽传书
  6. 《途客圈创业记:不疯魔,不成活》一一2.11 途客圈旅行助手
  7. Recyclerview 小demo
  8. 二项式定理在算法中的应用
  9. 删除文件过一会又回来_内存卡数据删了又自动回来怎么回事
  10. php stortm 老是闪退,pr加载界面闪退的原因是什么?