Link Search Menu Expand Document

待开发

  1. 数据集
  2. format
  3. 算法
  4. Datasest设计
  5. 代码
  6. 模型
  7. 拟合
  8. 调参心得
  9. Log
    1. 0.2.0
      1. 0. 问题划分改进
      2. 1. 优化流程改进
      3. 2. 相机标定改进
    2. TODO
      1. 新手调参指南

数据集

  • 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传进去。

原有的优化过程是

  1. 优化身体的R, T
  2. 使用身体部分关键点的loss进行优化 => 这里会优化所有参数,因为无法单独控制
  3. 优化身体部分+手部分关键点优化 => 同样同时优化身体和手的参数 这样的问题是,第3步中由于最开始的时候 手的部分的梯度较大,会把身体部分的参数优化到错误的地方去。导致整体会比较扭曲。

将pose参数拆分成躯干部分pose+左手参数+右手参数,支持更加细粒度的优化,例如只优化左手参数,只优化右手参数

拆分参数后的优化过程

  1. 优化身体的R, T
  2. 使用身体部分关键点的loss进行优化 => 只优化身体部分的参数
  3. 优化身体部分+手部分关键点优化 => 只优化手的参数
  4. 优化身体部分+手部分关键点优化 => 同时优化身体+手的参数

目前仍存在的问题1:手部分的旋转与身体部分的手肘旋转耦合,按现在的优化方式会导致手腕处扭曲,视觉上目前不是很明显,可以暂时不考虑这个问题。

可能的解决办法:优化框架的优化细粒度需要进一步提升,实现只优化身体的某个关节的旋转角度。

目前仍存在的问题2:2Dloss修改为点到射线距离之后,没有使用到相机RT,如果后面要考虑优化相机RT的话,就不好实现

可能的解决办法2:增加每个视角的刚性变换

目前存在的问题3:测试smooth loss换成加速度的

2. 相机标定改进

之前对于相机有畸变的场景,

TODO

  • 时间上的多人一起优化:可以同时优化整个场景的时间差
  • 空间上的:可以同时优化相机参数、镜子参数
  • 人与人的:可以同时优化人与人的碰撞

新手调参指南

对于一个数据需要跑的过程有:

  1. 拟合对应问题的
  • 基础SMPL
  • 基础SMPLH(对于有手的)

观察渲染结果,如果渲染结果明显抖动,说明smooth项太小。

  1. 能在输入侧解决的问题,就不要留到优化的地方解决。优化步骤的smooth只能稍微平滑,而不能平滑非常噪声的数据