待开发
数据集
- Human3.6M测试
- mpi-inf-3dhp测试
- Panoptic测试
format
- 相机参数里应该包含图像的长度和宽度
算法
- iMocap
- 关节点直接输出SMPL参数
- 2D关键点的真假判断,剔除掉明显错误的2D关键点
- 地面接触的检测(单人站着的情况)
- 重力方向的动力学
- 增加地面约束
Datasest设计
现在的Dataset分为两个部分,一个部分是实时所使用的,单帧读取所有人的,直接返回所有视角的所有人的。一个是离线优化时使用的,每一帧读取所有视角下的指定id的,然后组合起来当做一个人的处理。
代码
- 在线训练
模型
- 修正SMPLX的body25的regressor
- 实现一个纯骨架驱动的模型
拟合
- 拟合过程增加在线的可视化,监控优化过程的变化
调参心得
- 好的2D胜于算法调参
- 对于当前不能解决的问题,需要确保在当前的2D的情况可以解决这个问题
- 首先要不考虑速度的去解决问题,在确保跑满性能的情况下问题可以解决,再考虑速度提升
- 对于一些小问题,首先确保可以通过全手动的方式解决,再逐步替换掉其中可以自动化的步骤。
- 对于时序的输入,先确认在单帧的输入下没问题,再延伸到时序的
Log
0.2.0
0. 问题划分改进
原有的代码划分比较初步,在不同的问题下切换时不能直接泛化,因此重新对问题进行了划分。
按视角数划分:
- mv: 多视角,指>6个相机,一般用于LightStage场景,或6个相机覆盖半圈的场景,这部分的特征是视角非常充足,可以通过鲁棒三角化去除异常点,因此可以预先计算3D关键点位置,用于优化过程中的初始化。
- sv: 稀疏视角:指只有少数几个相机,例如双目场景。这个的特征是视角不充足,无法通过三角化剔除异常点。因为一般可见的视角只有2/3个,无法通过投票的方式去掉错误的。因此这部分的初始化无法通过3D关键点计算,需要使用单独的CNN进行估计。
- 1v: 单视角:指只有单个相机的场景。同样需要CNN进行估计获得初始化
按输出内容划分:
- skel: 只输出骨架,一般指实时的场景,通过鲁棒三角化获得关键点与匹配上的2D点。
- SMPL:只优化身体参数
- SMPLH:包含身体参数与手部参数
- SMPLH-upper: 只包含上半身的SMPLH,这部分的特征是下半身的参数需要固定
- SMPLH-hand: 输出是一个SMPLH模型的参数,但是输入中只包含手部,用于把一个SMPLH模型注册到拍摄的手的数据上
- manol/manor:输出是左手/右手的MANO模型参数
根据上述划分方法,目前需要维护的功能有:
- mv-1p-skel: 多视角->单人骨架
- mv-mp-skel: 多视角->多人骨架,区别于上一点在于需要考虑多人的匹配
- mv-1p-SMPL: 多视角->单人SMPL,后续内容的基础版本
- mv-1p-SMPLH: 比上一点增加手部优化
- mv-1p-SMPLH-upper,与前面的区别在于只优化上半身,同时朝向确定
- mv-mp-SMPLH: 多视角->多人SMPLH。与上上一点的区别在于手部的2D关键点需要SMPL-guided detection,无法直接检测
- sv-1p-SMPL: 稀疏视角->单人SMPL,与基础版本区别在于视角少,无法使用3D点初始化,2D噪声更多
- sv-1p-SMPLH: 稀疏视角->单人SMPLH,用于双目场景,与上一点区别在于2D手部关键点检测不准
- sv-1p-SMPLH-upper
- 1v-1p-SMPL: 单目骨架SMPL参数,与基础版本区别在于完全没有3D信息,只能依赖于初始化
- 1v-1p-SMPLH:缺少手部的初始化信息、以及大致的2D位置,难以剔除错误的检测
- 1v-1p-SMPLH-upper: 单目优化SMPLH
- 1v-1p-SMPLH-hand: 拍摄的单目的手的视频,优化SMPLH参数,只包含手的
- 1v-1p-mano: 单目 -> MANO
- 1v-1p-mano-fix: 单目 -> MANO,与上一点区别是手部姿态固定
1. 优化流程改进
现有的优化框架下,优化变量的输入只能是一整个tensor。例如poses
参数是一个(N, 72)维的tensor。传给优化器的时候只能一整个tensor传进去。
原有的优化过程是
- 优化身体的R, T
- 使用身体部分关键点的loss进行优化 => 这里会优化所有参数,因为无法单独控制
- 优化身体部分+手部分关键点优化 => 同样同时优化身体和手的参数 这样的问题是,第3步中由于最开始的时候 手的部分的梯度较大,会把身体部分的参数优化到错误的地方去。导致整体会比较扭曲。
将pose参数拆分成躯干部分pose+左手参数+右手参数,支持更加细粒度的优化,例如只优化左手参数,只优化右手参数
拆分参数后的优化过程
- 优化身体的R, T
- 使用身体部分关键点的loss进行优化 => 只优化身体部分的参数
- 优化身体部分+手部分关键点优化 => 只优化手的参数
- 优化身体部分+手部分关键点优化 => 同时优化身体+手的参数
目前仍存在的问题1:手部分的旋转与身体部分的手肘旋转耦合,按现在的优化方式会导致手腕处扭曲,视觉上目前不是很明显,可以暂时不考虑这个问题。
可能的解决办法:优化框架的优化细粒度需要进一步提升,实现只优化身体的某个关节的旋转角度。
目前仍存在的问题2:2Dloss修改为点到射线距离之后,没有使用到相机RT,如果后面要考虑优化相机RT的话,就不好实现
可能的解决办法2:增加每个视角的刚性变换
目前存在的问题3:测试smooth loss换成加速度的
2. 相机标定改进
之前对于相机有畸变的场景,
TODO
- 时间上的多人一起优化:可以同时优化整个场景的时间差
- 空间上的:可以同时优化相机参数、镜子参数
- 人与人的:可以同时优化人与人的碰撞
新手调参指南
对于一个数据需要跑的过程有:
- 拟合对应问题的
- 基础SMPL
- 基础SMPLH(对于有手的)
观察渲染结果,如果渲染结果明显抖动,说明smooth项太小。
- 能在输入侧解决的问题,就不要留到优化的地方解决。优化步骤的smooth只能稍微平滑,而不能平滑非常噪声的数据