1.6 face_alignment
约 392 字大约 1 分钟
2025-04-20
1.6.1 face_alignment 在 VSCode 调试中发生异常
face_alignment 是一个检测面部 landmark 的包,使用 pip 安装该包:pip install face_alignment
但是在使用 VSCode 调试过程中遇到了以下问题:
发生异常: AssertionError
<code object get_preds_fromhm at 0x7fd6468e0410, file "/home/xxxx/miniforge3/envs/GAGAvatar/lib/python3.12/site-packages/face_alignment/utils.py", line 185> != <code object _get_preds_fromhm at 0x5630e15b9830, file "/home/xxxx/miniforge3/envs/GAGAvatar/lib/python3.12/site-packages/face_alignment/utils.py", line 206>
KeyError: (206, '/home/xxxx/miniforge3/envs/GAGAvatar/lib/python3.12/site-packages/face_alignment/utils.py', <code object _get_preds_fromhm at 0x5630e15b9830, file "/home/xxxx/miniforge3/envs/GAGAvatar/lib/python3.12/site-packages/face_alignment/utils.py", line 206>)
这里提示库中的 get_preds_fromhm
和 _get_preds_fromhm
函数的代码对象不相同。
去翻了源码看到有一个 Numba 库的装饰器 @jit(nopython=True)
,应该就在这个的问题了
@jit(nopython=True)
是一种强大的工具,能够将 Python 代码转化为高效的机器码,使得原本较慢的 Python 函数在执行速度上接近于编译型语言如 C/C++ 的水平。
def get_preds_fromhm(hm, center=None, scale=None):
# ...
preds, preds_orig = _get_preds_fromhm(hm, idx, center, scale)
@jit(nopython=True)
def _get_preds_fromhm(hm, idx, center=None, scale=None):
# ...
所以原因是 face_alignment
库中的该函数使用了 Numba 的 JIT 编译器进行加速。在调试模式下,Numba 的 JIT 编译可能会导致函数的代码对象在内存中的表示发生变化,从而导致代码对象之间的比较(例如断言)失败,引发 AssertionError
。
解决方法:在 VS Code 的 launch.json
中,添加以下配置
"env": {
"NUMBA_DISABLE_JIT": "1"
},
通过设置 NUMBA_DISABLE_JIT=1
,禁用了 Numba 的 JIT 编译,使这些函数以普通的 Python 方式运行,避免了代码对象不一致的问题,从而解决了在 VS Code 调试模式下发生的异常。