基于DensePose输出生成SURREAL格式SMPL UV纹理图方法咨询
基于DensePose输出生成SURREAL格式SMPL 24部件UV纹理方案
前置输出适配
你当前用show模式只能得到uv可视化结果,需要先切换dump模式获取全量预测字段,执行命令:python3 apply_net.py dump configs/densepose_rcnn_R_101_FPN_DL_WC2M_s1x.yaml model_final_de6e7a.pkl input.jpg --output dump_result.pkl
输出的pkl文件中,除了你已知的uv张量(维度[2, H, W],第一通道为dp_u、第二通道为dp_v,值域[0,1]),还包含每个像素对应的SMPL 24部件分类标签,以及原图坐标映射关系,这是生成纹理的必要字段。
核心实现步骤
- 第一步:初始化SURREAL标准SMPL纹理模板
SURREAL采用固定的24部件分块排布的UV纹理,通常使用2048×2048分辨率的空白画布:
每256×256的子区域对应1个SMPL身体部件,按4行6列排布,多余的空白区域统一填充黑色即可。 - 第二步:像素映射填充
逐点遍历DensePose有效预测区域的像素:- 取当前像素的部件标签
seg(取值范围1~24,对应SMPL定义的24个身体部件) - 取当前像素对应的dp_u、dp_v值,以及原图对应位置的RGB三通道值
- 计算该点在纹理模板上的坐标:
子区域起始x = (seg - 1) % 6 * 256 子区域起始y = (seg - 1) // 6 * 256 纹理坐标x = 子区域起始x + int(dp_u * 255) 纹理坐标y = 子区域起始y + int(dp_v * 255) - 将纹理模板对应坐标位置的RGB值设置为原图提取的RGB值即可
- 取当前像素的部件标签
- 第三步:空洞补全优化
单张图存在遮挡导致的纹理空白区域,可通过邻域像素插值补全;如果有多视角同人体的图像,可叠加多组DensePose预测结果填充,得到完整的纹理图。
内容的提问来源于stack exchange,提问作者Ahmed Shoukr
相关产品推荐
相关产品推荐

