请先使用原版本Demo来验证环境部署成功:Video Avatars
这个部分,我们将利用自摄的视频来进行的建模尝试,首先需要有一段如原论文视频相同的自摄视频,提供我的格式:
项目 | 格式 |
---|---|
分辨率 | 1080*1080 |
帧率 | 24FPS |
身体姿态 | A形姿态旋转3圈 |
之后你可以使用 frame_get.py
来获取到所有视频帧,以供下一步处理。
这一步中,我们需要获得每一视频帧中,如下图形式的人体区域的二值图像:
在这一步中,我采用了百度AI开放平台的人像分割API来进行,你也可以采用其他AI开放平台的API,或者使用自己的语义分割实现。这一部分脚本在 human_mask.py
中可以找到。
受限于一些图像干扰,以及语义分割本身问题,获取到的mask
图像往往还需要进一步处理:
可以看到,有一些无意义的区域,为了提升准确率,需要对mask进行取最大连通域的处理,之后可以再进行一次形态学膨胀操作消除空洞。这部分工作在mask_process.py
中实现。
至此,我们就完成了mask的处理工作,之后,利用video_avatars/prpare_data/mask2hdf5.py
即可将其转化为HDF5文件。
这一步需要将每一帧的关节点及其坐标转换为Jason格式,这里直接使用,Openpose来进行关节点识别。同样你也可以使用自己的实现或其他途径来进行关节点识别,只需符合COCO模型的关节点模式:
Openpose具体安装和使用可以参考这里,我就不再详细介绍。
获取到所有的关节点的json文件后,使用video_avatars/prpare_data/2djoints2hdf5.py
可将其转化为HDF5文件。
在video_avatars/prpare_data
下,还有 create_camera.py
来进行相机相关参数的序列化。
parser.add_argument('out', type=str, help="Output file (.pkl)")
parser.add_argument('width', type=int, help="Frame width in px")
parser.add_argument('height', type=int, help="Frame height in px")
parser.add_argument('-f', type=float, nargs='*', help="Focal length in px (2,)")
parser.add_argument('-c', type=float, nargs='*', help="Principal point in px (2,)")
parser.add_argument('-k', type=float, nargs='*', help="Distortion coefficients (5,)")
主要参数是分辨率以及像素焦距(Focal length in pixels ),由于我使用手机拍摄,其他参数难以获取,如果你能获取到准确数据可以将相应数据加入。
对于像素焦距(Focal length in pixels ),有以下公式可以计算:
$$ Focal length in pixels = (image width in pixels) * (focal length on earth) / (CCD width on earth)
$$
与之前的Demo相同,可以在这里找到具体命令。
mail:[email protected]