box_coder

paddle.vision.ops. box_coder ( prior_box, prior_box_var, target_box, code_type='encode_center_size', box_normalized=True, name=None, axis=0 ) [源代码]

编码/解码带有先验框信息的目标边界框。

编码规则描述如下:

\[ \begin{align}\begin{aligned}ox &= (tx - px) / pw / pxv\\oy &= (ty - py) / ph / pyv\\ow &= log(abs(tw / pw)) / pwv\\oh &= log(abs(th / ph)) / phv\end{aligned}\end{align} \]

解码规则描述如下:

\[ \begin{align}\begin{aligned}ox &= (pw * pxv * tx * + px) - tw / 2\\oy &= (ph * pyv * ty * + py) - th / 2\\ow &= exp(pwv * tw) * pw + tw / 2\\oh &= exp(phv * th) * ph + th / 2\end{aligned}\end{align} \]

其中 [tx, ty, tw, th] 分别表示目标框的中心坐标、宽度和高度。同样地, [px, py, pw, ph] 表示先验框的中心坐标、宽度和高度。 [pxv, pyv, pwv, phv] 表示先验框变量, [ox, oy, ow, oh] 表示编码/解码坐标、宽度和高度。

在解码期间,支持两种 broadcast 模式。假设目标框具有形状 [N, M, 4] ,并且 prior 框的形状是 [N, 4] 或 [M, 4] , 然后 prior 框将沿指定的轴 broadcast 到目标框。

参数

  • prior_box (Tensor) - 维度为 [M, 4] 的 2-D Tensor , M 表示存储 M 个框,数据类型为 float32 或 float64 。先验框,每个框代表 [xmin, ymin, xmax, ymax] , [xmin, ymin] 是先验框的左顶点坐标,如果输入数图像特征图,则接近坐标原点。 [xmax,ymax] 是先验框的右底点坐标。

  • prior_box_var (List|tuple|Tensor|None) - 支持三种输入类型,一是维度为 [M, 4] 的 2-D Tensor ,存储 M 个先验框的 variance ,数据类型为 float32 或 float64 。另一种是一个长度为 4 的列表,所有先验框共用这个列表中的 variance ,数据类型为 float32 或 float64 。为 None 时不参与计算。

  • target_box (Tensor) - 数据类型为 float32 或 float64 的 Tensor ,当 code_type 为 encode_center_size ,输入是 2-D Tensor ,维度为 [N, 4] , N 为目标框的个数,目标框的格式与先验框相同。当 code_type 为 decode_center_size ,输入为 3-D Tensor ,维度为 [N, M, 4]。通常 N 表示产生检测框的个数, M 表示类别数。此时目标框为偏移量。

  • code_type (str,可选) - 编码类型用目标框,可以是 encode_center_sizedecode_center_size ,默认值为 encode_center_size

  • box_normalized (bool,可选) - 先验框坐标是否正则化,即是否在 [0, 1] 区间内。默认值为 True 。

  • axis (int,可选) - 在 PriorBox 中为 axis 指定的轴 broadcast 以进行框解码,例如,如果 axis 为 0 , TargetBox 具有形状 [N, M, 4] 且 PriorBox 具有形状 [M, 4] ,则 PriorBox 将 broadcast 到 [N, M, 4] 用于解码。仅在 code_type 为 decode_center_size 时有效。默认值为 0 。

  • name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None 。

返回

  • output_box (Tensor) - 解码或编码结果。数据类型为 float32 或 float64。当 code_type 为 encode_center_size 时,形状为 [N, M, 4] 的编码结果, N 为目标框的个数, M 为先验框的个数。当 code_type 为 decode_center_size 时,形状为 [N, M, 4] 的解码结果,形状与输入目标框相同。

代码示例

>>> import paddle

>>> # For encode
>>> prior_box_encode = paddle.rand((80, 4), dtype=paddle.float32)
>>> prior_box_var_encode = paddle.rand((80, 4), dtype=paddle.float32)
>>> target_box_encode = paddle.rand((20, 4), dtype=paddle.float32)
>>> output_encode = paddle.vision.ops.box_coder(
...     prior_box=prior_box_encode,
...     prior_box_var=prior_box_var_encode,
...     target_box=target_box_encode,
...     code_type="encode_center_size")
...
>>> # For decode
>>> prior_box_decode = paddle.rand((80, 4), dtype=paddle.float32)
>>> prior_box_var_decode = paddle.rand((80, 4), dtype=paddle.float32)
>>> target_box_decode = paddle.rand((20, 80, 4), dtype=paddle.float32)
>>> output_decode = paddle.vision.ops.box_coder(
...     prior_box=prior_box_decode,
...     prior_box_var=prior_box_var_decode,
...     target_box=target_box_decode,
...     code_type="decode_center_size",
...     box_normalized=False)
...