faster-rcnn 之 bbox_transform_inv(boxes, deltas)

本文介绍了一个名为 bbox_transform_inv 的函数,该函数用于将边界框的偏移量转换回原始坐标。通过输入的边界框坐标 (boxes) 和偏移量 (deltas),函数能够计算并返回新的边界框坐标。文章详细解释了函数内部实现过程,包括中心点计算、宽度高度计算等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

def bbox_transform_inv(boxes, deltas):
  if boxes.shape[0] == 0:
    return np.zeros((0, deltas.shape[1]), dtype=deltas.dtype)

  boxes = boxes.astype(deltas.dtype, copy=False)
  widths = boxes[:, 2] - boxes[:, 0] + 1.0
  heights = boxes[:, 3] - boxes[:, 1] + 1.0
  ctr_x = boxes[:, 0] + 0.5 * widths
  ctr_y = boxes[:, 1] + 0.5 * heights

  dx = deltas[:, 0::4]
  dy = deltas[:, 1::4]
  dw = deltas[:, 2::4]
  dh = deltas[:, 3::4]

  pred_ctr_x = dx * widths[:, np.newaxis] + ctr_x[:, np.newaxis]
  pred_ctr_y = dy * heights[:, np.newaxis] + ctr_y[:, np.newaxis]
  pred_w = np.exp(dw) * widths[:, np.newaxis]
  pred_h = np.exp(dh) * heights[:, np.newaxis]

  pred_boxes = np.zeros(deltas.shape, dtype=deltas.dtype)
  # x1
  pred_boxes[:, 0::4] = pred_ctr_x - 0.5 * pred_w
  # y1
  pred_boxes[:, 1::4] = pred_ctr_y - 0.5 * pred_h
  # x2
  pred_boxes[:, 2::4] = pred_ctr_x + 0.5 * pred_w
  # y2
  pred_boxes[:, 3::4] = pred_ctr_y + 0.5 * pred_h

  return pred_boxes
### Mask R-CNN 中边界框回归的相关参数 在Mask R-CNN框架内,边界框回归是实现对象精确定位的关键组件之一。该模型采用了一种称为RoI Align的技术来改进 Faster R-CNN 的 RoI Pooling 方法,从而更好地保持特征图的空间分辨率[^4]。 #### 边界框回归的工作原理 当一个候选区域(Proposal)被选定后,它会被传递给两个并行的头部网络:一个是负责分类和边界框回归的任务特定层;另一个则专注于实例分割即掩码预测。对于前者而言,具体来说: - **输入**: 提取自RoI Align后的固定尺寸(通常是7×7)特征向量作为输入。 - **输出**: 对于每个预定义类别数量\(K\)以及背景类,都会输出四个实数值表示相对于原始建议框坐标的偏移量\((t_x, t_y, t_w, t_h)\),这些值用来调整初始提案的位置与大小以更精确地包围物体。 为了使学习过程更加稳定有效,在训练期间应用了平滑L1损失函数而非传统的均方误差(MSE)[^2]。这种选择有助于减少异常点的影响,并使得优化器更容易收敛至全局最优解附近。 此外值得注意的是,尽管分类子网和边界框回归子网共享相同的骨干网络提取出来的高级语义信息,但在最后一层它们拥有独立的学习权重,这确保了两者之间不会互相干扰,提高了最终检测性能。 ```python def bbox_transform_inv(boxes, deltas): """ Apply inverse delta transform to boxes. Args: boxes (Tensor): Original bounding box coordinates. deltas (Tensor): Predicted offsets from the original boxes. Returns: Tensor: Transformed bounding boxes after applying predicted deltas. """ if boxes.shape[0] == 0: return torch.zeros_like(deltas) widths = boxes[:, 2] - boxes[:, 0] heights = boxes[:, 3] - boxes[:, 1] ctr_x = boxes[:, 0] + 0.5 * widths ctr_y = boxes[:, 1] + 0.5 * heights dx = deltas[:, 0::4] dy = deltas[:, 1::4] dw = deltas[:, 2::4] dh = deltas[:, 3::4] pred_ctr_x = dx * widths.unsqueeze(-1) + ctr_x.unsqueeze(-1) pred_ctr_y = dy * heights.unsqueeze(-1) + ctr_y.unsqueeze(-1) pred_w = torch.exp(dw) * widths.unsqueeze(-1) pred_h = torch.exp(dh) * heights.unsqueeze(-1) pred_boxes = deltas.clone() # x1 pred_boxes[:, 0::4] = pred_ctr_x - 0.5 * pred_w # y1 pred_boxes[:, 1::4] = pred_ctr_y - 0.5 * pred_h # x2 pred_boxes[:, 2::4] = pred_ctr_x + 0.5 * pred_w # y2 pred_boxes[:, 3::4] = pred_ctr_y + 0.5 * pred_h return pred_boxes ``` 此代码片段展示了如何利用预测得到的delta值(\(dx,dy,dw,dh\))去更新原有的边框坐标,进而获得更为精准的对象定位结果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值