代码出处:

GitHub - wangsen1312/joints2smpl: fit smpl parameters model using 3D joints

RuntimeWarning: invalid value encountered in sqrt

你可以通过以下几种方式解决这个问题:

1. 检查负值或零行列式

确保协方差矩阵是正半定的,这意味着其行列式应该是非负的。负或零行列式表示矩阵可能是退化的或者条件不良。

你可以在计算平方根之前进行检查,避免无效值:

 

python

        for idx, c in enumerate(gmm['covars']):
            det = np.linalg.det(c)
            if det <= 0:
                print(f"行列式无效,索引 {idx}: {det}")
        if 0:
            sqrdets = np.array([
                np.sqrt(np.linalg.det(c)) if np.linalg.det(c) > 0 else 0
                for c in gmm['covars']
            ])
        
        epsilon = 1e-6  # 小的常数,用于数值稳定性
        sqrdets = np.array([
            np.sqrt(np.linalg.det(c + epsilon * np.eye(c.shape[0])))  # 对角线添加小常数
            for c in gmm['covars']
        ])

sqrdets = np.array([ np.sqrt(np.linalg.det(c))

if np.linalg.det(c) > 0 else 0

for c in gmm['covars'] ])

这样就确保只有行列式为正的矩阵才会进行平方根计算,若行列式非正,则用0替代。

2. 保证数值稳定性

有时候,由于数值问题,协方差矩阵的行列式可能会非常接近零或略微为负。你可以通过给协方差矩阵的对角线添加一个小的常数来“正则化”矩阵,确保其行列式为正:

epsilon = 1e-6 # 小的常数,用于数值稳定性

sqrdets = np.array([ np.sqrt(np.linalg.det(c + epsilon * np.eye(c.shape[0]))) # 对角线添加小常数

for c in gmm['covars'] ])

3. 调试输出

如果不确定是哪一个协方差矩阵导致的问题,你可以打印出行列式的值,查看哪些矩阵有问题:

python

for idx, c in enumerate(gmm['covars']):

    det = np.linalg.det(c)

    if det <= 0:

        print(f"行列式无效,索引 {idx}: {det}")

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐