[AI学习:SPIN -win-安装SPIN-工具过程 SPIN win 电脑安装=accoda 环境-第二篇:解决报错]
[AI学习:SPIN -win-安装SPIN-工具过程 SPIN win 电脑安装=accoda 环境-第二篇:解决报错])
- 1-概述
- (1)概述
- (2)操作流程-解决问题
- 1-问题:ModuleNotFoundError: No module named 'tensorboard'
- 1)问题原因
- 2)解决方法
- 2-问题:ModuleNotFoundError: No module named 'smplx'
- 1)问题原因
- 2)解决方法
- 3-问题:ImportError: Unable to load OpenGL library; Could not find module 'OSMesa' ...
- 1)问题原因
- 2)解决方法
- 4-问题:ModuleNotFoundError: No module named 'SPIN'
- 1)问题原因
- 2)解决方法
- 5-问题:ModuleNotFoundError: No module named 'SPIN' 和 ModuleNotFoundError: No module named 'utils.smpl'
- 1)问题原因
- 2)解决方法
- 6-问题:FileNotFoundError: Missing SMPL model files. Expected files under 'data/smpl':
- 1)问题原因
- 2)解决方法
- (3)总结
1-概述
(1)概述
上篇已经说了,最近学习AI,看到了SPIN这个工具,可以将图片转换位3D模型,我们继续来尝试,并且将问题记录。
前篇文章:[AI学习:SPIN -win-安装SPIN-工具过程 SPIN win 电脑安装=accoda 环境-第一篇:布置环境]
我们之前布置了环境,之后往后遇到很多问题,今天来继续操作。
(2)操作流程-解决问题
1-问题:ModuleNotFoundError: No module named ‘tensorboard’
如下图所示,就碰到首个问题,
1)问题原因
SPIN 的部分代码(utils/base_trainer.py)里引入了:
from torch.utils.tensorboard import SummaryWriter
这需要依赖 TensorBoard(用于训练日志和可视化),而当前的 Python 环境(spin)里没有安装它。
2)解决方法
pip install tensorboard
安装完成后重新运行:
python demo.py --checkpoint data/model_checkpoint.pt --img examples/front.jpg --json examples/front_bbox.json
2-问题:ModuleNotFoundError: No module named ‘smplx’
1)问题原因
SPIN 在加载 SMPL 模型时会用到 smplx 这个库。
这个库是由 Max Planck Institute (MPI) 发布的开源 Python 包,用于加载和操作 SMPL/SMPL-X 模型。
也就是说,smplx 是 读 .pkl 文件(SMPL 模型) 的接口,没有它,SPIN 就无法从 .pkl 文件构建人体网格。
2)解决方法
在当前的 conda 环境(spin)下执行以下命令:
pip install smplx
如下所示,完成后会有相应显示:
Successfully installed smplx-0.1.28
但是后来发现,SPIN 原始项目(2019 年的代码)确实依赖较早版本的 smplx,
新版(0.1.28 之后)接口略有变动,会导致 SPIN 的 models/smpl.py 出现不兼容导入错误。
因此降级到 smplx==0.1.13 是兼容 SPIN 的最佳选择。
3-问题:ImportError: Unable to load OpenGL library; Could not find module ‘OSMesa’ …
1)问题原因
SPIN 使用了 pyrender + PyOpenGL 来在窗口里显示 3D 模型。
但 Windows 默认没有 OSMesa(那是 Linux 无头渲染库)。
2)解决方法
这里尝试改代码:
- 这行是错的:from SPIN.utils.smpl import SMPL
SPIN 项目里 SMPL 类在 models 包 里,而不是 utils。
改成:from models import SMPL - 其余导入基本没问题;你已经把 PROJECT_ROOT 加进 sys.path,这样 models/、utils/ 都能被正确找到。
最后代码如下:中间过程忘记了。
# demo_norender.py
import os, sys, json, pickle
import cv2
import torch
import numpy as np
from torchvision import transforms# ensure project root on path
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
if PROJECT_ROOT not in sys.path:sys.path.insert(0, PROJECT_ROOT)from models.hmr import hmr as HMR
from utils.geometry import rotation_matrix_to_angle_axis
from utils.imutils import crop
from utils.smpl import SMPLSMPL_MEAN_PARAMS_PATH = r"data\SMPL_mean_params.npz"
DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu'def load_image_with_bbox(img_path, bbox_json):img = cv2.imread(img_path)if img is None:raise FileNotFoundError(f"Cannot read image: {img_path}")img = img[:, :, ::-1] # BGR -> RGBwith open(bbox_json, 'r', encoding='utf-8') as f:bbox = json.load(f)['bbox'] # [x, y, w, h]x, y, w, h = bboxcenter = np.array([x + w / 2.0, y + h / 2.0], dtype=np.float32)scale = max(w, h) / 200.0# Some repo versions: crop returns img only; SPIN's returns (img, _, _, _)out = crop(img, center, scale, (224, 224))rgb_img = out[0] if isinstance(out, tuple) else outnormalize = transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225])to_t = transforms.Compose([transforms.ToTensor(), normalize])return to_t(rgb_img).unsqueeze(0).to(DEVICE).float()def to_obj(verts, faces, out_path):with open(out_path, 'w') as f:for v in verts:f.write(f"v {v[0]} {v[1]} {v[2]}\n")for fa in faces + 1: # 1-basedf.write(f"f {fa[0]} {fa[1]} {fa[2]}\n")def main(ckpt, img, bbox_json, outdir):os.makedirs(outdir, exist_ok=True)# 1) HMR modelmodel = HMR(SMPL_MEAN_PARAMS_PATH).to(DEVICE).eval()# 2) load checkpoint (compatible with PyTorch >=2.6 warning)try:ckpt_dict = torch.load(ckpt, map_location=DEVICE, weights_only=False)except TypeError:# older torch without weights_onlyckpt_dict = torch.load(ckpt, map_location=DEVICE)except Exception as e:print("Retry with legacy pickle:", e)ckpt_dict = torch.load(ckpt, map_location=DEVICE, weights_only=False, pickle_module=pickle)if 'model' in ckpt_dict:model.load_state_dict(ckpt_dict['model'], strict=False)else:# some checkpoints may store directlymodel.load_state_dict(ckpt_dict, strict=False)# 3) SMPL layer (uses smplx under the hood, trimmed to 10 betas)smpl = SMPL(os.path.join('data', 'smpl'), batch_size=1, num_betas=10).to(DEVICE)# 4) image + bboxx = load_image_with_bbox(img, bbox_json)# 5) forwardwith torch.no_grad():pred_rotmat, pred_betas, _ = model(x) # rotmat: [1,24,3,3], betas: [1,?]# ensure 10 betas to match trimmed shapedirsif pred_betas.shape[-1] > 10:pred_betas = pred_betas[:, :10]# 6) rotmat -> axis-angle(72)pose_aa = rotation_matrix_to_angle_axis(pred_rotmat).reshape(1, 72)# 7) SMPL forwardout = smpl(betas=pred_betas,body_pose=pose_aa[:, 3:],global_orient=pose_aa[:, :3])# 8) exportverts = out.vertices[0].detach().cpu().numpy()faces = smpl.facesobj_path = os.path.join(outdir, 'result.obj')to_obj(verts, faces, obj_path)np.savez(os.path.join(outdir, 'params.npz'),betas=pred_betas.detach().cpu().numpy()[0],pose=pose_aa.detach().cpu().numpy()[0])print('Done:', obj_path)if __name__ == "__main__":import argparseap = argparse.ArgumentParser()ap.add_argument('--checkpoint', default='data/model_checkpoint.pt')ap.add_argument('--img', required=True)ap.add_argument('--json', required=True)ap.add_argument('--outdir', default='out_norender')args = ap.parse_args()main(args.checkpoint, args.img, args.json, args.outdir)
4-问题:ModuleNotFoundError: No module named ‘SPIN’
1)问题原因
这其实是导入路径的问题,不是 SPIN 没安装。
在 demo_norender.py 里写了:
from SPIN.utils.smpl import SMPL
但 Python 并不会自动识别当前文件夹名字 “SPIN” 作为一个模块。
Windows 下文件夹名字大写(SPIN)和包导入路径(spin)也区分不了。
2)解决方法
尝试使用正确写法:
from models import SMPL
后来尝试了如下写法
import os, sys, json, cv2, torch, numpy as np
from torchvision import transforms# === 添加项目根路径 ===
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
if PROJECT_ROOT not in sys.path:sys.path.insert(0, PROJECT_ROOT)# === 正确导入 ===
from models import hmr, SMPL
from utils.imutils import crop
5-问题:ModuleNotFoundError: No module named ‘SPIN’ 和 ModuleNotFoundError: No module named ‘utils.smpl’
1)问题原因
这里其实修改的 demo_norender.py 里导入路径还不对。
2)解决方法
尝试使用:如下代码
# demo_norender.py —— Windows 无 OpenGL 版本,直接输出 OBJ 和可视化图
import os, sys, json, cv2, torch, numpy as np
from torchvision import transforms# === 关键:确保能导入项目内部模块 ===
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
if PROJECT_ROOT not in sys.path:sys.path.insert(0, PROJECT_ROOT)# === 正确导入路径 ===
from models import hmr, SMPL
from utils.imutils import crop
同时保证文件夹结构
SPIN/├── demo_norender.py ✅ 你正在运行的脚本├── models/│ ├── __init__.py│ ├── smpl.py ✅ SMPL类定义│ └── hmr.py├── utils/│ ├── __init__.py│ ├── imutils.py ✅ 包含 crop 函数│ └── ...├── data/│ ├── model_checkpoint.pt│ └── smpl/│ ├── SMPL_NEUTRAL.pkl│ ├── SMPL_MALE.pkl│ └── SMPL_FEMALE.pkl└── examples/├── front.jpg└── front_bbox.json(如果没有可忽略)
6-问题:FileNotFoundError: Missing SMPL model files. Expected files under ‘data/smpl’:
1)问题原因
FileNotFoundError: Missing SMPL model files. Expected files under 'data/smpl':
- data/smpl\SMPL_NEUTRAL.pkl
- data/smpl\SMPL_FEMALE.pkl
- data/smpl\SMPL_MALE.pkl
意思是:SPIN 找不到 3 个 SMPL 的 .pkl 模型。把它们放到 C:\Users\Admin\SPIN\data\smpl\
2)解决方法
- 把 3 个 .pkl 放到正确位置并改名
来源:你下载的 SMPL_python_v.1.1.0.zip。解压后能找到:
-
basicModel_neutral_lbs_10_207_0_v1.1.0.pkl
-
basicModel_m_lbs_10_207_0_v1.1.0.pkl
-
basicModel_f_lbs_10_207_0_v1.1.0.pkl
放置与改名(PowerShell,先确保当前在 C:\Users\Admin\SPIN):
# 1) 建目录
mkdir -Force data\smpl# 2) 假设你把zip解压到了 C:\Users\Admin\Downloads\SMPL_python_v.1.1.0\
# (如果路径不同,替换成你的实际路径)
Copy-Item "C:\Users\Admin\Downloads\SMPL_python_v.1.1.0\smpl\models\basicModel_neutral_lbs_10_207_0_v1.1.0.pkl" data\smpl\SMPL_NEUTRAL.pkl
Copy-Item "C:\Users\Admin\Downloads\SMPL_python_v.1.1.0\smpl\models\basicModel_m_lbs_10_207_0_v1.1.0.pkl" data\smpl\SMPL_MALE.pkl
Copy-Item "C:\Users\Admin\Downloads\SMPL_python_v.1.1.0\smpl\models\basicModel_f_lbs_10_207_0_v1.1.0.pkl" data\smpl\SMPL_FEMALE.pkl# 3) 核对
dir data\smpl
看到三个文件就 OK(注意:一定是 .pkl 文件本体,不要放 zip,也不要出现 .pkl.pkl 的双扩展名)。
(3)总结
问题还是太多了,这也是最折磨人地方,准备再分开写吧。