MMPose WebcamAPI 是一套简单的应用开发接口,可以帮助用户方便的调用 MMPose 以及其他 OpenMMLab 算法库中的算法,实现基于摄像头输入视频的交互式应用。
我们将从一个简单的 Demo 开始,向您介绍 MMPose WebcamAPI 的功能和特性,并详细展示如何基于这个 API 搭建自己的应用。为了使用 MMPose WebcamAPI,您只需要做简单的准备:
完成准备工作后,请在命令行进入 MMPose 根目录,执行以下指令,即可运行 demo:
python tools/webcam/run_webcam.py --config tools/webcam/configs/examples/pose_estimation.py
这个 demo 实现了目标检测,姿态估计和可视化功能,效果如下:
成功运行 demo 后,我们来看一下它是怎样工作的。在启动脚本 tools/webcam/run_webcam.py
中可以看到,这里的操作很简单:首先读取了一个 config 文件,接着使用 config 构建了一个 runner ,最后调用了 runner 的 run()
方法,这样 demo 就开始运行了。
# tools/webcam/run_webcam.py
def launch():
# 读取 config 文件
args = parse_args()
cfg = mmcv.Config.fromfile(args.config)
# 构建 runner(WebcamRunner类的实例)
runner = WebcamRunner(**cfg.runner)
# 调用 run()方法,启动程序
runner.run()
if __name__ == '__main__':
launch()
我们先不深究 runner 为何物,而是接着看一下这个 config 文件的内容。省略掉细节和注释,可以发现 config 的结构大致包含两部分(如下图所示):
runner = dict(
# runner的基本参数
name='Pose Estimation',
camera_id=0,
camera_fps=20,
# 定义了若干节点(Node)
Nodes=[
dict(
type='DetectorNode', # 节点1类型
name='Detector', # 节点1名字
input_buffer='_input_', # 节点1数据输入
output_buffer='det_result', # 节点1数据输出
...), # 节点1其他参数
dict(
type='TopDownPoseEstimatorNode', # 节点2类型
name='Human Pose Estimator', # 节点2名字
input_buffer='det_result', # 节点2数据输入
output_buffer='pose_result', # 节点2数据输出
...), # 节点2参数
...] # 更多节点
)
到这里,我们已经引出了 MMPose WebcamAPI 的2个最重要的概念:runner 和 Node,下面做正式介绍:
Runner 和 Node 的关系简单来说如下图所示:
一个重要的问题是:当一帧视频数据被 runner 读取后,会按照怎样的顺序通过所有的 Node 并最终被输出(显示)呢?
答案就是 config 中每个 Node 的输入输出配置。如示例 config 中,可以看到每个 Node 都有input_buffer
,output_buffer
等参数,用来定义该节点的输入输出。通过这种连接关系,所有的 Node 构成了一个有向无环图结构,如下图所示:
图中的每个 Data Buffer 就是一个用来存放数据的容器。用户不需要关注 buffer 的具体细节,只需要将其简单理解成 Node 输入输出的名字即可。用户在 config 中可以任意定义这些名字,不过要注意有以下几个特殊的名字:
当一帧视频数据被 runner 读入后,会被放进 input 和 frame 两个 buffer 中,然后按照 config 中定义的 Node 连接关系依次通过各个 Node ,最终到达 display ,并被 runner 读出显示在屏幕上。