VIBE是一个的3D人体姿态预测开源项目,需要基于该项目作一些开发,首先需要能够搭建和是的环境成功复现它。

不过,这个项目的复现的,真的不是一星半点的艰难。

1、系统选择

之前一直用的Windows,最开始想在windows上复现它,经过一周的折腾,我放弃了。

接着尝试了Docker,由于GPU的问题放弃了。

接着尝试了WSL,虽然基本解决了GPU加速问题,但其中的某些方法还是只能使用CPU,导致速度异常慢,在最后的渲染阶段也是不能正常渲染的,最终也放弃了。

一不做二不休,把自己的电脑整个重装系统,变成一台Ubuntu电脑。

所以,如果你也想验证该项目,那么就不要在Windows上纠缠了,也不要去考虑虚拟机什么的,直接换系统吧。

2、硬件

官方是在2080Ti显卡上测试,宣称可达到30FPS,所以这个玩意是真的吃性能的,1060会报显存不够的错误的。

本人做测试时,电脑信息如下

3、准备阶段

  • 显卡驱动、在ubuntu上安装Nvidia的驱动,简直是一件%#@%@¥%¥#%,为此重装了三遍系统。。。
  • 安装Anaconda、VSCode(在ubuntu上不推荐pycharm,pycharm的坑有点多)、以及科学上网工具(如果有能力)

4、克隆项目

git clone https://github.com/mkocabas/VIBE.git

5、开始安装

官方提供了两种安装方式,pip和conda,因为其安装过程是需要创建虚拟环境的,个人习惯使用conda,

所以使用conda的安装:

cd VIBE
# pip
# source scripts/install_pip.sh
# conda
source scripts/install_conda.sh

打住!还是打开该文件,对照着内容一步一步手动来吧

首先创建 名为 vibe-env python=3.7的虚拟环境,接着激活该环境

接着手动使用pip安装numpy==1.17.5 torch==1.4.0 torchvision==0.5.0,(为了避免后面其他坑,这里就按照指定版本安装)

如果torch和torchvision提示找不到对应的版本,可以去pip官方源下载对应的whl文件后手动安装

“pip install git+https:……pytube.git --upgrade”是安装一个下载youtobe视频的开源项目,这个可以跳过。

其次如果需要安装,查看pytube项目主页,可以直接使用“pip install pytube”来安装。

最后就是根据“requirement.txt”来安装依赖项。

pip install -r requirements.txt

(本人在上面这一步折腾了很久,,,有很多坑的,但是由于其中一些项目的更新,已经VIBE项目作者在19天前也对该文件做了更新,目前亲测可以一次成功)

如果不成功,按照文件内所列依赖项逐个手动安装,并逐一解决问题即可。

6、测试

模型与示例视频准备:

source scripts/prepare_data.sh

当然参考该文件内容,要下在vibe_data.zip文件,我上传到了csdn,可以手动下载:https://download.csdn.net/download/Raink_LH/12692105

其他步骤参可照上图中的注释进行操作即可。

最后运行demo.py文件

编译器运行需要配置一定的参数,参照官方示例:

# Run on a local video
python demo.py --vid_file sample_video.mp4 --output_folder output/ --display

7、效果

我下载了B站上的舞蹈视频来作测试

该Demo中对3D-pose的预测分三个步骤:

  1. 首先是使用了ffmpeg将视频解析成一帧一帧的图片,在对每张图片使用Yolo进行人物检测,记录检测到人物及区域(框)的信息。
  2. 按照检测结果进行裁减图像,喂入VIBE pose检测模型进行检测,并记录每一帧所对应的结果(包括预测的虚拟相机位置、关节点、人物三角网格数据等)。
  3. 针对每一帧的预测结果,使用pyrender进行渲染,并将渲染结果合并成一个视频。

对与第一个阶段,GPU基本在70%左右,CPU在60%左右,第二阶段CPU和GPU都在很低和100%直接波动,应该是逐帧检测时,每一帧都比较消耗资源的。第三阶段渲染时,GPU使用一般,但CPU持续在95%以上。

我使用的视频是720P的,人物检测才40FPS,3D-pose检测在25FPS

运行输出如下

输出的结果视频,截取了一点,下过如下

总体来说,效果可以,人物在侧向、多人物重叠时效果不佳。

8、补充说明

vibe模型是基于pytorch的,输出的数据包含多个类别。3D-pose结果使用了smplx

结果展示使用的是pyrender,

上文中展示的是使用了输出结果中的三角人物网格数据(verts)。

更为简单直观的可以使用关节点数据(kp_3d),是归一化后的三位坐标,每个人物包含49个关节坐标。


2021年5月26日补充

因为很久没有用到这个项目了,很多地方都记不清了。之前一次补充,提到了三为节点渲染,但是很多人反馈“joints3d”关键字错误。

想来想去,终于想起来了,实在抱歉,之前忘了一点东西

(源码中是针对每一帧图像预测,在对比前后帧,做人物追踪,然后再把每一帧预测的数据转换成正对每一帧中不同人的数据,在做这个数据整理的过程中,原项目只整理了需要用到的两组数据,其他直接抛弃了,所以后面渲染三维节点或者用其他数据时就会报错)

如果还有哪里有遗漏的,欢迎补充!

因此对下文做了一些修改:

8.1关于三维关节点

在官方demo.py中,有关于输出结果的一个字典:

output_dict = {'pred_cam': pred_cam,'orig_cam': orig_cam,'verts': pred_verts,'pose': pred_pose,'betas': pred_betas,'joints3d': pred_joints3d,'joints2d': joints2d,'bboxes': bboxes,'frame_ids': frames,}

同时在其下文,能找到如下的代码:

# prepare results for rendering
frame_results = prepare_rendering_results(vibe_results, num_frames)

吧vibe_result,转换成frame_results,找到这个方法的定义prepare_rendering_results(),

可以看到原项目中只把verts和cam转换过来了,其他的没用到。

所以需要手动增加之后要用的数据,比如joints3d。

def prepare_rendering_results(vibe_results, nframes):frame_results = [{} for _ in range(nframes)]for person_id, person_data in vibe_results.items():for idx, frame_id in enumerate(person_data['frame_ids']):frame_results[frame_id][person_id] = {'verts': person_data['verts'][idx],'cam': person_data['orig_cam'][idx],'joints3d': person_data['joints3d'][idx],  # ---需要把每一帧预测出的结果加入到针对每个人的结果中!需要什么加什么!}

8.2关于关节点渲染图

官方使用pyrender渲染人物,使用的是'verts': pred_verts。

主要代码在demo.py的结尾处:

for frame_idx in tqdm(range(len(image_file_names))):img_fname = image_file_names[frame_idx]img = cv2.imread(img_fname)# …… # 个人省略了一些代码for person_id, person_data in frame_results[frame_idx].items():# 这里 拿到每个人的verts,camera参数,以及每个人的颜色frame_verts = person_data['verts']frame_cam = person_data['cam']mc = mesh_color[person_id]mesh_filename = None# …… # 个人省略了一些代码# 这里就是基于结果对每一帧图像进行渲染的img = renderer.render(img,frame_verts,cam=frame_cam,color=mc,mesh_filename=mesh_filename,)            # …… # 个人省略了一些代码

那么如果需要3D的关节点渲染效果,就需要传入3D节点数据,并重写渲染方法。

首先对上面做小小修改:

for frame_idx in tqdm(range(len(image_file_names))):img_fname = image_file_names[frame_idx]img = cv2.imread(img_fname)# …… # 个人省略了一些代码for person_id, person_data in frame_results[frame_idx].items():# 这里拿到3维关节点数据frame_joints3d = person_data['joints3d']frame_cam = person_data['cam']mesh_filename = None# …… # 个人省略了一些代码# 重写一个渲染方法,传入3D的关节点数据img = renderer.render_s(img,frame_joints3d,cam=frame_cam,mesh_filename=mesh_filename,)# …… # 个人省略了一些代码

接着在render.py中,仿照原有的,实现一个render_s()方法

def render_s(self, img, joints, cam, angle=None, axis=None, mesh_filename=None):    tfs = np.tile(np.eye(4), (len(joints), 1, 1))tfs[:, :3, 3] = jointssx, sy, tx, ty = camcamera = WeakPerspectiveCamera(scale=[sx, -sy],translation=[tx, -ty],zfar=1000.)# 点的半径和颜色sm = trimesh.creation.uv_sphere(radius=0.02)sm.visual.vertex_colors = [0.2, 0.9, 0.2, 1.0]mesh = pyrender.Mesh.from_trimesh(sm, poses=tfs)mesh_node = self.scene.add(mesh, 'mesh')camera_pose = np.eye(4)cam_node = self.scene.add(camera, pose=camera_pose)if self.wireframe:render_flags = RenderFlags.RGBA | RenderFlags.ALL_WIREFRAMEelse:render_flags = RenderFlags.RGBArgb, _ = self.renderer.render(self.scene, flags=render_flags)valid_mask = (rgb[:, :, -1] > 0)[:, :, np.newaxis]output_img = rgb[:, :, :-1] * valid_mask + (1 - valid_mask) * imgimage = output_img.astype(np.uint8)self.scene.remove_node(mesh_node)self.scene.remove_node(cam_node)return image

以上,只是我当时测试的时候临时写的,没有研究过pyrender,参照这官方教程算是勉强能跑,颜色写死的,有需要的可以自己研究对这个方法进行优化。

8.2 关于二维关节点

二维的关节点数据其实在预测接结果中也是有的,

参考8.1中提到的output_dict,其中有:'joints2d': joints2d,以及'bboxes': bboxes两个项,一个是2维关节点数据,一个是检测到人的框的数据。

这两个数据有个特点,都是基于框的中心点的,框的四个数据中,前两个是框中心点,后两个是宽高,关节点坐标貌似也是基于中心点的相对坐标

将二维关节点数据,翻译成图像中绝对坐标:

def get_js2d(image, vibe_results):persons = [] # 当前帧中的所有检测到人的结果i = 0 # 当前帧中检测到几个人,和这个人的person_id是两回事for person_id, pose_data in vibe_results.items():pose = {}    pose["person_id"] = person_idpose["j2ds"] = []          joints_2d = pose_data['joints2d'][i]bbox = pose_data['bboxes'][i]# ---------记录一些常用关节序号# 2、3、4是右胳膊, 5、6、7是左胳膊# 9-右髋关节, 10-右膝盖, 11-右脚, 12-左髋关节, 13-左膝盖, 14-左脚# 37-头顶, 38-脖子# 39-肚脐(12), 40-脖下(13), 41-胸前(14)# -------------------------------------------------------# 可以过滤一些只保留需要的关节点#joints_2d = np.vstack((joints_2d[2:5, :], joints_2d[5:8, :], joints_2d[9:12, :], joints_2d[12:15, :], joints_2d[39:42, :]))   # for j2d in joints_2d:pt = (int(bbox[0] + j2d[0] * (bbox[2] / 2.0)), int(bbox[1] + j2d[1] * (bbox[3] / 2.0)))pose["j2ds"].append(pt)persons.append(pose)i += 1return persons

以上,如有错误和建议,还请告诉我

VIBE:3D人体姿态预测项目复现笔记相关推荐

  1. 视频中的3D人体姿态估计(3D human pose estimation in vide)--------Facebook research: VideoPose3D

    视频中的3D人体姿态估计(3D human pose estimation in video) 解读Facebook AI Research in CVPR2019: <3D human pos ...

  2. 3D人体姿态估计论文汇总(CVPR/ECCV/ACCV/AAAI)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:Vegetabird | 来源:知乎 https://zhuanlan.zhihu.com/p/ ...

  3. 3D人体姿态估计(介绍及论文归纳)

    推荐镜子大佬的知乎 2D 多人姿态估计论文汇总.分类与简介 2D多人姿态估计指南:热图回归与坐标回归流程指南 openmmlab微信公众号里的3DHPE综述 opemmlab框架下的MMPose库,有 ...

  4. 无限想象空间,用Python玩转3D人体姿态估计

    前言 姿态估计,一直是近几年的研究热点. 它就是根据画面,捕捉人体的运动姿态,比如 2D 姿态估计: 再比如 3D 姿态估计: 看着好玩,那这玩应有啥用呢? 自动驾驶,大家应该都不陌生,很多公司研究这 ...

  5. 3D 人体姿态估计简述

    0 前言 3D Human Pose Estimation(以下简称 3D HPE )的目标是在三维空间中估计人体关键点的位置.3D HPE 的应用非常广泛,包括人机交互.运动分析.康复训练等,它也可 ...

  6. PoseFormer:首个纯基于Transformer的 3D 人体姿态估计网络,性能达到 SOTA

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文分享一篇 52CV 粉丝的论文『3D Human Pose Estimation with Spa ...

  7. Python安装FrankMocap实现3D人体姿态估计

    FrankMocap 是港中文联合 Facebook AI 研究院提出的3D 人体姿态和形状估计算法. 不仅仅是估计人体的运动姿态,甚至连身体的形状,手部的动作都可以一起计算出来. 算法很强大,能够从 ...

  8. 姿态估计之3D 人体姿态估计 - 总结(1)【转】

    参考 3D 人体姿态估计简述 - 知乎 3D人体姿态估计(介绍及论文归纳) [2021-CVPR]Graph Stacked Hourglass Networks for 3D Human Pose ...

  9. 3d人体姿态估计资料

    人字姿态估计数据集 - 知乎 SMPL论文解读和相关基础知识介绍 - 知乎 3D人体姿态估计方法 MHFormer:Multi-Hypothesis Transformer - 知乎 论文阅读笔记: ...

最新文章

  1. MYSQL 去除重复 记录
  2. 【Android笔记】如何创建列表视图3
  3. 设计模式(一)预备知识
  4. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 2丨连续出现的数字【难度中等】
  5. oracle 内存分配,Oracle调优修改10g,11g内存分配
  6. keepalived VS zookeeper
  7. DevExpress中获取GridControl排序之后的List
  8. 程序员自救指南:一不小心删库删表怎么办?
  9. jQuery 查找元素节点
  10. Eclipse中使用SVN教程
  11. HTML期末学生大作业:中华传统文化【苏绣手工艺】带psd设计图(15页)
  12. 陕西车牌顺口溜~~~~~~~~~~~
  13. kettle 9.1 连接hadoop clusters (CDH 6.2)
  14. python数据分析实训报告总结_Python实训周总结(精品文档)
  15. Maye v1.3.4.0 类似Rolan简洁小巧易用的快速启动工具
  16. Elixir: Enum函数总结
  17. POS接口与GE接口区别
  18. 同步系统时间与硬件时钟
  19. Tcpdump 命令——筑梦之路
  20. 卸载和安装番茄小助手

热门文章

  1. Improved 3D Object Detector Under Snowfall Weather Condition Based on LiDAR Point Cloud
  2. 2020数学建模国赛(B题)总结
  3. 学插画的线上机构排名
  4. 拉普拉斯金字塔图像融合原理
  5. 关系模式(关系模式必须遵循)
  6. [UER #6]逃跑
  7. 7-3 垃圾分类 (20分)
  8. 【鬼脚七经典电商思路】淘宝卖家的竞争力(2)之迎合容量
  9. ios 简书 获取通讯录信息_ios 各种权限整理
  10. through2.js,xtend.js源码