Serie OpenPCDet | 7.1 Proceso de prueba de conjunto de datos KITTI predicted_boxes predicción

AnchorHeadTemplate.generate_predicted_boxes部分

El diagrama de estructura del proceso de prueba es el siguiente:
inserte la descripción de la imagen aquí

La entrada de datos inicial de la función generate_predicted_boxes es:
inserte la descripción de la imagen aquí

Primero, cambie la forma de los mapas de características de varios tipos de predicciones y cose la dimensión de anclaje, por ejemplo: (16, 248, 216, 42) -> (16, 321408, 7). Pero hay advertencias aquí. La información del cuadro de la predicción de características se basa en un desplazamiento del ancla, es decir, el coeficiente de desplazamiento codificado, por lo que debe decodificarse de la forma original para obtener la información del cuadro real.

# 各种维度的reshape处理
anchors = torch.cat(self.anchors, dim=-3)   # (1, 248, 216, 3, 2, 7)
num_anchors = anchors.view(-1, anchors.shape[-1]).shape[0]  # 3个类别+2个方向 在特征图上的总anchor数 321408
batch_anchors = anchors.view(1, -1, anchors.shape[-1]).repeat(batch_size, 1, 1)     # (16, 321408, 7)
batch_cls_preds = cls_preds.view(batch_size, num_anchors, -1).float() \
    if not isinstance(cls_preds, list) else cls_preds   # (16, 248, 216, 18) -> (16, 321408, 3)
batch_box_preds = box_preds.view(batch_size, num_anchors, -1) if not isinstance(box_preds, list) \
    else torch.cat(box_preds, dim=1).view(batch_size, num_anchors, -1)    # (16, 248, 216, 42) -> (16, 321408, 7)
# 解码回去
batch_box_preds = self.box_coder.decode_torch(batch_box_preds, batch_anchors)   # 根据pred和anchor解码为正常的尺寸 (16, 321408, 7)

Si hay una función de predicción de dirección, también se modifica su forma. La función de predicción aquí (16, 321408, 2) representa la probabilidad de predicción de cada ancla para dos direcciones, por lo que se debe seleccionar aquí el índice con una probabilidad más alta. El primer resultado de retorno de la función torch.max es el valor más alto, y el segundo resultado de retorno es el índice del valor más alto . Por lo tanto, aquí el mapa de características previsto se convierte en el resultado previsto de 01 según la probabilidad.

if dir_cls_preds is not None:
    dir_offset = self.model_cfg.DIR_OFFSET      # 0.78539
    dir_limit_offset = self.model_cfg.DIR_LIMIT_OFFSET  # 0
    dir_cls_preds = dir_cls_preds.view(batch_size, num_anchors, -1) if not isinstance(dir_cls_preds, list) \
        else torch.cat(dir_cls_preds, dim=1).view(batch_size, num_anchors, -1)  # (16, 321408, 2)
    # 确定正向还是反向
    dir_labels = torch.max(dir_cls_preds, dim=-1)[1]     # (16, 321408)

Finalmente, limite el ángulo a 0-π para construir un ángulo de guiñada gt preciso. Finalmente, se devuelven la información real de la caja predicha y la información de la etiqueta. Las dimensiones de la característica son: (16, 321408, 7) y (16, 321408, 3)

period = (2 * np.pi / self.model_cfg.NUM_DIR_BINS)  # pi
dir_rot = common_utils.limit_period(    # 限制在0到pi之间
    batch_box_preds[..., 6] - dir_offset, dir_limit_offset, period
)
# period * dir_labels.to(batch_box_preds.dtype) 如果label为1,则为π;否则仍然保存0;
batch_box_preds[..., 6] = dir_rot + dir_offset + period * dir_labels.to(batch_box_preds.dtype)

return batch_cls_preds, batch_box_preds

Finalmente almacene las características en un diccionario:

inserte la descripción de la imagen aquí


Supongo que te gusta

Origin blog.csdn.net/weixin_44751294/article/details/130597828
Recomendado
Clasificación