123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import numpy as np
- class FasterRcnnBoxCoder:
- """Faster RCNN box coder.
-
- Notes:
- boxes should be in cxcywh format.
- """
-
- def __init__(self, stddevs=None):
- """Constructor for FasterRcnnBoxCoder.
-
- Args:
- stddevs: List of 4 positive scalars to scale ty, tx, th and tw.
- If set to None, does not perform scaling. For Faster RCNN,
- the open-source implementation recommends using [0.1, 0.1, 0.2, 0.2].
- """
- if stddevs:
- assert len(stddevs) == 4
- for scalar in stddevs:
- assert scalar > 0
- self.stddevs = stddevs
- def encode(self, boxes, reference_boxes, copy=True):
- """Encode boxes with respect to reference boxes.
- """
- if copy:
- boxes = boxes.copy()
-
- boxes[..., 2:4] += 1e-8
- reference_boxes[..., 2:4] += 1e-8
-
- boxes[..., 0:2] -= reference_boxes[..., 0:2]
- boxes[..., 0:2] /= reference_boxes[..., 2:4]
- boxes[..., 2:4] /= reference_boxes[..., 2:4]
- boxes[..., 2:4] = np.log(boxes[..., 2:4], boxes[..., 2:4])
- if self.stddevs:
- boxes[..., 0:4] /= self.stddevs
- return boxes
- def decode(self, rel_boxes, reference_boxes, copy=True):
- """Decode relative codes to boxes.
- """
- if copy:
- rel_boxes = rel_boxes.copy()
-
- if self.stddevs:
- rel_boxes[..., 0:4] *= self.stddevs
-
- rel_boxes[..., 0:2] *= reference_boxes[..., 2:4]
- rel_boxes[..., 0:2] += reference_boxes[..., 0:2]
- rel_boxes[..., 2:4] = np.exp(rel_boxes[..., 2:4], rel_boxes[..., 2:4])
- rel_boxes[..., 2:4] *= reference_boxes[..., 2:4]
- return rel_boxes
-
- def decode_points(self, rel_points, reference_boxes, copy=True):
- """Decode relative codes to points.
- """
- if copy:
- rel_points = rel_points.copy()
- if self.stddevs:
- rel_points[..., 0::2] *= self.stddevs[0]
- rel_points[..., 1::2] *= self.stddevs[1]
- rel_points[..., 0::2] *= reference_boxes[..., 2:3]
- rel_points[..., 1::2] *= reference_boxes[..., 3:4]
- rel_points[..., 0::2] += reference_boxes[..., 0:1]
- rel_points[..., 1::2] += reference_boxes[..., 1:2]
- return rel_points
|