解决报错:ModuleNotFoundError: No module named ‘_pafprocess‘
目录
一、报错分析
1、报错描述
2、原因分析
二、解决方法
1、安装swig
(1)命令行安装方法
(2) Windows安装方法
2、配置环境变量
(1)配置方法
(2)安装验证
3、编译pafprocess
(1)进入源码目录
(2)编译生成链接库
在编译tf-pose-estimation进行2D人体姿态识别时,遇到了ModuleNotFoundError: No module named '_pafprocess'的错误,本文分析报错原因并给出解决方案。
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named '_pafprocess'
一、报错分析
1、报错描述
TF-Pose-Estimation 是一个基于 TensorFlow 的开源库,专注于 2D 人体姿态估计(Human Pose Estimation)。它能够从图像或视频中检测人体的关键点(如关节、四肢等),适用于动作识别、运动分析、虚拟试衣等场景。
在编译基于tensorflow的开源代码TF-Pose-Estimation时,遇到了“ModuleNotFoundError: No module named '_pafprocess'”错误,具体如下图所示。
此错误表明 Python 在运行时无法找到名为 _pafprocess 的模块,_pafprocess 是人体姿态估计库的核心组件,用于处理 Part Affinity Fields (PAF) 的 C++ 扩展模块。其文件形式应为:
-
Windows:
_pafprocess*.pyd
-
Linux/Mac:
_pafprocess*.so
2、原因分析
进入到TF-Pose-Estimation源码的pafprocess目录中,在其tf_pose\pafprocess目录中,以我的电脑为例,具体如下所示。
#源码目录:
C:\Users\Administrator\PycharmProjects\nn\01 Deep Pytorch\22 Keypoints-of-humanpose\tf-pose-estimation\tf-pose-estimation#pafprocess子目录
C:\Users\Administrator\PycharmProjects\nn\01 Deep Pytorch\22 Keypoints-of-humanpose\tf-pose-estimation\tf-pose-estimation\tf_pose\pafprocess
在pafprocess源码目录中打开Readme.md,提示需要安装swig,编译_pafprocess模块,具体如下所示。
二、解决方法
1、安装swig
SWIG(Simplified Wrapper and Interface Generator,简化封装器和接口生成器)是一个开源工具,用于将 C/C++ 代码自动转换为多种高级语言的接口(如 Python、Java、C#、Ruby 等)。它的核心作用是消除不同语言间的调用壁垒,使开发者能直接在 Python 等语言中调用 C/C++ 库,无需手动编写繁琐的绑定代码。
(1)命令行安装方法
# Linux (Debian/Ubuntu)
sudo apt-get install swig# macOS (Homebrew)
brew install swig# Windows (conda)
conda install swig -c conda-forge
(2) Windows安装方法
在官网下载后解压缩, 官网的链接为SWIG官网下载,点击如下红框内容即可下载。
将下载的swigwin-4.3.1.zip进行解压缩,进入到解压缩后的swig文件夹,可以看到有 swig.exe 在文件夹内。以我的电脑为例解压后目录为C:\Users\Administrator\Downloads\swigwin-4.3.1。
2、配置环境变量
(1)配置方法
将 swig.exe 所在路径添加至系统变量 Path 中的步骤如下:
-
右键点击“此电脑”或“我的电脑”,选择“属性”。
- 点击“高级系统设置” > “环境变量”。
- 编辑
Path
变量,点击新建,输入 SWIG 的目录路径。 - 点击确定保存。
(2)安装验证
打开新的命令提示符(CMD/PowerShell),运行swig -version,如果显示版本信息则代表配置成功。如下所示,即代表安装成功
3、编译pafprocess
(1)进入源码目录
进入到pafprocess源码目录,效果如下所示。
(2)编译生成链接库
执行如下编译命令,命令通过 SWIG 将 C++ 代码(pafprocess.i
中定义)自动转换为 Python 可调用的接口(生成 pafprocess_wrap.cxx
和 pafprocess.py
),再通过 Python 的 setuptools
编译生成动态链接库(_pafprocess.so/pyd)。
swig -python -c++ pafprocess.i && python setup.py build_ext --inplace
执行结果如下所示,输出显示C++扩展模块_pafprocess
已成功编译完成,生成了适用于64位Windows系统、Python 3.7环境的.pyd
动态链接库文件。
tf-pose-estimation\tf_pose\pafprocess\pafprocess.h(10): warning C4305: “初始化”: 从“double”到“float”截断
pafprocess.cpp(64): warning C4244: “=”: 从“int”转换到“float”,可能丢失数据
pafprocess.cpp(65): warning C4244: “=”: 从“int”转换到“float”,可能丢失数据
pafprocess.cpp(83): warning C4244: “初始化”: 从“_Ty”转换到“float”,可能丢失数据with[_Ty=double]
pafprocess.cpp(147): warning C4244: “=”: 从“int”转换到“_Ty”,可能丢失数据with[_Ty=float]
pafprocess.cpp(167): warning C4244: “=”: 从“int”转换到“_Ty”,可能丢失数据with[_Ty=float]
pafprocess.cpp(174): warning C4244: “=”: 从“int”转换到“_Ty”,可能丢失数据with[_Ty=float]
pafprocess.cpp(175): warning C4244: “=”: 从“int”转换到“_Ty”,可能丢失数据with[_Ty=float]
pafprocess.cpp(186): warning C4267: “初始化”: 从“size_t”转换到“int”,可能丢失数据
pafprocess.cpp(195): warning C4267: “return”: 从“size_t”转换到“int”,可能丢失数据
pafprocess.cpp(199): warning C4244: “return”: 从“_Ty”转换到“int”,可能丢失数据with[_Ty=float]
pafprocess_wrap.cpp正在创建库 build\temp.win-amd64-cpython-37\Release\_pafprocess.cp37-win_amd64.lib 和对象 build\temp.win-amd64-cpython-37\Release\_pafprocess.cp37-win_amd64.exp
正在生成代码
已完成代码的生成
再次编译程序,错误不再出现,程序能够顺利运行。