Paddle3D icon indicating copy to clipboard operation
Paddle3D copied to clipboard

SMOKE模型修改相机参数Ks后,转静态模型出错

Open Truebazinga opened this issue 2 years ago • 7 comments

由于paddle模型转ONNX不支持inverse操作,因此将smoker_coder.py 186行的 Ks_inv = Ks.inverse()[obj_id] 修改成了Ks_inv=paddle.to_tensor([[[0.00138593 , 0. , -0.84480590],[0. , 0.00138593 , -0.23956336],[0. ,0. ,1.]]], dtype='float32')[obj_id],如图一所示。 之后使用导出工具导出模型时发生了错误,错误如图2。请问应该怎么解决。 图1 图2

Truebazinga avatar Aug 29 '22 02:08 Truebazinga

@Truebazinga 我们本地验证了下,修改后也可以正常导出,请问你使用的是什么版本的paddle? image

nepeplwu avatar Aug 29 '22 04:08 nepeplwu

@Truebazinga 我们本地验证了下,修改后也可以正常导出,请问你使用的是什么版本的paddle? image

2.3.0

Truebazinga avatar Aug 29 '22 04:08 Truebazinga

@Truebazinga 刚刚看了下,之前改错代码了,确实会有这个问题,这个是因为Ks这个输入Tensor由于没有被用到,在保存推理模型时被错误裁剪掉导致,可以修改成以下代码:

  1. 直接使用Ks,不用Ks.inverse()
  2. 推理的时候,模型输入的Ks是相机内参的逆矩阵
def decode_location_without_transmat(self,
                                        points,
                                        points_offset,
                                        depths,
                                        Ks,
                                        down_ratios=None):
    """
    retrieve objects location in camera coordinate based on projected points
    Args:
        points: projected points on feature map in (x, y)
        points_offset: project points offset in (delata_x, delta_y)
        depths: object depth z
        Ks: camera intrinsic matrix, shape = [N, 3, 3]
        trans_mats: transformation matrix from image to feature map, shape = [N, 3, 3]

    Returns:
        locations: objects location, shape = [N, 3]
    """

    if down_ratios is None:
        down_ratios = [(1, 1)]

    # number of points
    N = points_offset.shape[0]
    # batch size
    N_batch = Ks.shape[0]
    #batch_id = paddle.arange(N_batch).unsqueeze(1)
    batch_id = paddle.arange(N_batch).reshape((N_batch, 1))

    # obj_id = batch_id.repeat(1, N // N_batch).flatten()
    obj_id = batch_id.tile([1, N // N_batch]).flatten()

    Ks_inv = Ks[obj_id]

    down_ratio = down_ratios[0]
    points = paddle.reshape(points, (numel_t(points) // 2, 2))
    proj_points = points + points_offset

    # trans point from heatmap to ori image, down_sample * resize_scale
    proj_points[:, 0] = down_ratio[0] * proj_points[:, 0]
    proj_points[:, 1] = down_ratio[1] * proj_points[:, 1]
    # transform project points in homogeneous form.

    proj_points_extend = paddle.concat(
        [proj_points, paddle.ones((N, 1))], axis=1)
    # expand project points as [N, 3, 1]
    proj_points_extend = proj_points_extend.unsqueeze(-1)
    # with depth
    proj_points_img = proj_points_extend * paddle.reshape(
        depths, (N, numel_t(depths) // N, 1))
    # transform image coordinates back to object locations
    locations = paddle.matmul(Ks_inv, proj_points_img)

    return locations.squeeze(2)

nepeplwu avatar Aug 29 '22 06:08 nepeplwu

这个可行,多谢了

Truebazinga avatar Aug 30 '22 01:08 Truebazinga

他为什么多了这么多不支持的算子吖? paddle2onnx --model_dir exported_model --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file ./outputs/model.onnx --enable_dev_version True [Paddle2ONNX] Start to parse PaddlePaddle model... [Paddle2ONNX] Model file path: exported_model/inference.pdmodel [Paddle2ONNX] Paramters file path: exported_model/inference.pdiparams [Paddle2ONNX] Start to parsing Paddle model... [Paddle2ONNX] Oops, there are some operators not supported yet, including elementwise_floordiv,gather_nd,group_norm,index_select,inverse,p_norm, [ERROR] Due to the unsupported operators, the conversion is aborted. Aborted (core dumped)

qingwan7 avatar Oct 20 '22 12:10 qingwan7

请问是去掉.inverse()之后重新训练一个模型还是去掉.inverse()之后重新导出一个模型?

LeungWaiHo avatar Aug 11 '23 08:08 LeungWaiHo

@LeungWaiHo 重新导出,不需要训练

nepeplwu avatar Feb 01 '24 07:02 nepeplwu