通过预测3D外观、位置和姿态来跟踪人物
这是论文"通过预测3D外观、位置和姿态来跟踪人物"的代码仓库。 Jathushan Rajasegaran,Georgios Pavlakos,Angjoo Kanazawa,Jitendra Malik。
这个代码仓库为我们的PHALP论文提供了代码实现,包括安装说明、在任何视频上运行的演示代码、数据集准备以及在数据集上进行评估。
这个分支包含支持我们最新工作的代码:4D-Humans。
原始PHALP代码请参见初始发布分支。
安装
安装PyTorch依赖后,您可以直接安装我们的phalp
包:
pip install phalp[all]@git+https://github.com/brjathu/PHALP.git
分步说明
git clone https://github.com/brjathu/PHALP.git
cd PHALP
conda create -n phalp python=3.10
conda activate phalp
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
pip install -e .[all]
演示
要在视频上运行我们的代码,请指定输入视频video.source
和输出目录video.output_dir
:
python scripts/demo.py video.source=assets/videos/gymnasts.mp4 video.output_dir='outputs'
输出目录将包含轨迹的视频渲染和一个包含带有3D姿态和形状的轨迹的.pkl
文件(见下面的结构)。
命令行选项
输入源
您可以指定各种类型的输入源。例如,您可以指定视频文件、YouTube视频或图像目录:
# 对于视频文件
python scripts/demo.py video.source=assets/videos/vid.mp4
# 对于YouTube视频
python scripts/demo.py video.source=\'"https://www.youtube.com/watch?v=xEH_5T9jMVU"\'
# 对于图像目录
python scripts/demo.py video.source=<目录路径>
自定义边界框
除了这些选项,您还可以将图像和边界框作为输入提供,这样模型将只使用给定的边界框进行跟踪。要实现这一点,您需要将video.source
指定为一个.pkl
文件,其中每个键是帧名称,图像的绝对路径通过os.path.join(video.base_path, frame_name)
计算得出。每个键的值是一个包含以下键的字典:gt_bbox
、gt_class
、gt_track_id
。请参见以下示例。gt_boxes
是一个形状为(N, 4)
的np.ndarray
,其中每行是格式为[x1, y1, x2, y2]
的边界框。您还可以提供gt_class
和gt_track_id
以存储在最终输出中。
gt_data[frame_id] = {
"gt_bbox": gt_boxes,
"extra_data": {
"gt_class": [],
"gt_track_id": [],
}
}
以下是如何向模型提供边界框和跟踪ID并获取渲染的示例。
mkdir assets/videos/gymnasts
ffmpeg -i assets/videos/gymnasts.mp4 -q:v 2 assets/videos/gymnasts/%06d.jpg
python scripts/demo.py \
render.enable=True \
video.output_dir=test_gt_bbox \
use_gt=True \
video.base_path=assets/videos/gymnasts \
video.source=assets/videos/gt_tracks.pkl
在部分帧上运行
您可以指定要跟踪的视频的开始和结束,例如从第50帧跟踪到第100帧:
python scripts/demo.py video.source=assets/videos/vid.mp4 video.start_frame=50 video.end_frame=100
在不提取帧的情况下进行跟踪
但是,如果视频太长,提取帧太耗时,您可以设置video.extract_video=False
。这将使用torchvision后端,并且只会在内存中保留视频的时间戳。如果启用此选项,您可以以秒为单位给出视频的开始时间和结束时间。
python scripts/demo.py video.source=assets/videos/vid.mp4 video.extract_video=False video.start_time=1s video.end_time=2s
可视化类型
我们在render.type
中支持多种类型的可视化:HUMAN_MESH
(默认)渲染完整的人体网格,HUMAN_MASK
可视化分割掩码,HUMAN_BBOX
可视化带有跟踪ID的边界框,TRACKID_<id>_MESH
仅渲染跟踪<id>
的完整人体网格:
# 渲染完整人体网格
python scripts/demo.py video.source=assets/videos/vid.mp4 render.type=HUMAN_MESH
# 渲染分割掩码
python scripts/demo.py video.source=assets/videos/vid.mp4 render.type=HUMAN_MASK
# 渲染带有跟踪ID的边界框
python scripts/demo.py video.source=assets/videos/vid.mp4 render.type=HUMAN_BBOX
# 渲染单个跟踪ID,比如0
python scripts/demo.py video.source=assets/videos/vid.mp4 render.type=TRACKID_0_MESH
更多渲染类型
除了这些设置外,对于渲染网格,PHALP使用头部遮罩可视化,它只渲染人体上半身,以便用户可以在同一视频中看到实际人物和轨迹。要启用此功能,请设置 `render.head_mask=True`。# 用于渲染检测到的和被遮挡的人
python scripts/demo.py video.source=assets/videos/vid.mp4 render.head_mask=True
您还可以通过设置 render.show_keypoints=True
来可视化2D投影关键点[待完成]。
跨镜头边界追踪
默认情况下,PHALP不会跨镜头边界进行追踪。要启用此功能,请设置 detect_shots=True
。
# 用于跨镜头边界追踪
python scripts/demo.py video.source=assets/videos/vid.mp4 detect_shots=True
附加说明
- 出于调试目的,您可以设置
debug=True
来禁用富进度条。
输出 .pkl
结构
包含轨迹、3D姿势等的 .pkl
文件存储在 <video.output_dir>/results
下,是一个2级字典:
详细结构
import joblib
results = joblib.load(<video.output_dir>/results/<video_name>.pkl)
results = {
# 每帧的字典。
'vid_frame0.jpg': {
'2d_joints': List[np.array(90,)], # 每个检测的45个2D关节
'3d_joints': List[np.array(45,3)], # 每个检测的45个3D关节
'annotations': List[Any], # 每个检测的自定义注释
'appe': List[np.array(4096,)], # 每个检测的外观特征
'bbox': List[[x0 y0 w h]], # 每个轨迹(检测+幽灵)的2D边界框(左上角和尺寸)
'camera': List[[tx ty tz]], # 每个检测的相机平移(相对于图像)
'camera_bbox': List[[tx ty tz]], # 每个检测的相机平移(相对于边界框)
'center': List[[cx cy]], # 每个检测的边界框2D中心
'class_name': List[int], # 每个检测的类别ID(人类为0)
'conf': List[float], # 每个检测的置信度分数
'frame_path': 'vid_frame0.jpg', # 帧标识符
'loca': List[np.array(99,)], # 每个检测的位置特征
'mask': List[mask], # 每个检测的RLE压缩掩码
'pose': List[np.array(229,)], # 每个检测的姿势特征(连接的SMPL参数)
'scale': List[float], # 每个检测的max(宽度, 高度)
'shot': int, # 镜头编号
'size': List[[imgw imgh]], # 每个检测的图像尺寸
'smpl': List[Dict_SMPL], # 每个检测的SMPL参数:betas (10), body_pose (23x3x3), global_orient (3x3)
'tid': List[int], # 每个检测的轨迹ID
'time': int, # 帧号
'tracked_bbox': List[[x0 y0 w h]], # 每个检测的2D边界框(左上角和尺寸)
'tracked_ids': List[int], # 每个检测的轨迹ID
'tracked_time': List[int], # 每个检测上次被看到的时间
},
'vid_frame1.jpg': {
...
},
...
}
后处理流程
即将推出。
训练和评估
即将推出。
致谢
部分代码取自或改编自以下仓库:
引用
如果您发现此代码对您的研究有用,或者使用了我们方法生成的数据,请考虑引用以下论文:
@inproceedings{rajasegaran2022tracking,
title={Tracking People by Predicting 3{D} Appearance, Location \& Pose},
author={Rajasegaran, Jathushan and Pavlakos, Georgios and Kanazawa, Angjoo and Malik, Jitendra},
booktitle={CVPR},
year={2022}
}