尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
MMPose Webcam API 快速上手:基于 ViTPose 构建摄像头实时姿态估计交互应用
人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载导读MMPose Webcam API 是一套面向摄像头输入视频的交互式应用开发接口它把 MMPose 及 OpenMMLab 系列算法库中的目标检测、姿态估计、可视化等功能封装成可自由组合的节点通过一个配置文件即可搭建出完整的实时应用。本文将以 ViTPose 仓库中的tools/webcam模块为对象从运行官方 Demo 出发深入讲解 Config 结构、Runner 与 Node 两大核心概念、基于 Buffer 的数据流机制并结合源码揭示其多线程异步运行原理。读完本文你将能够独立运行、分析并改造摄像头姿态应用为后续自定义 Node 开发打下基础。什么是 MMPose Webcam APIMMPose Webcam API 是一套简单的应用开发接口目标是帮助用户方便地调用 MMPose 以及其他 OpenMMLab 算法库中的算法实现基于摄像头输入视频的交互式应用。它位于仓库的 tools/webcam 目录下由三部分构成启动脚本run_webcam.py命令行入口读取配置文件并启动应用应用框架webcam_apis包括 Runner 主体、Node 基类与各类内置功能节点、以及 Buffer/消息/事件等底层工具示例配置configs覆盖姿态估计、眼睛特效、换脸、赛亚人、新年烟花等多种现成应用。根据 tools/webcam/README.md 的记录该模块的运行环境要求为 Python 3.7.0、MMPose 0.23.0、MMDetection 2.21.0。其核心思路是一切功能皆由配置文件驱动用户无需编写主程序逻辑只需要组合节点、连接数据流即可。运行一个 Demo我们将从一个简单的 Demo 开始了解 MMPose Webcam API 的功能与特性并看清它是如何一步步运转起来的。准备工作使用 MMPose Webcam API 只需要做简单的准备一台计算机最好有 GPU 和 CUDA 环境但这并不是必须的CPU 也能运行一个摄像头。计算机自带摄像头或者外接 USB 摄像头均可安装好 MMPose。安装步骤可以参考仓库内的 安装文档。启动命令完成准备工作后在命令行进入仓库根目录执行以下指令即可运行 Demopython tools/webcam/run_webcam.py --config tools/webcam/configs/examples/pose_estimation.py该 Demo 实现了目标检测、姿态估计和可视化三项功能先用检测器在画面中找到人和常见动物再对每个目标估计关键点最后把骨骼与检测框实时绘制到画面上。运行后屏幕上会弹出一个名为 Pose Estimation 的窗口并支持若干快捷键交互按v切换姿态结果可视化、按h显示帮助信息、按m显示诊断信息、按q退出程序。Demo 里面有什么从 Config 说起成功运行 Demo 后我们来看一下它是怎样工作的。打开启动脚本 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) # 构建 runnerWebcamRunner类的实例 runner WebcamRunner(**cfg.runner) # 调用 run()方法启动程序 runner.run()从源码run_webcam.py可以看到启动脚本还额外支持一个--cfg-options参数用于在不修改文件的前提下覆盖 config 中的任意设置例如--cfg-options runner.camera_id1 runner.synchronousTrue可以切换摄像头并开启同步模式。我们先不深究 runner 为何物接着看一下 config 文件的内容。以 pose_estimation.py 为例省略掉细节和注释可以发现 config 的结构大致包含两部分Runner 的基本参数如name、camera_id、camera_fps等。这部分比较好理解是在读取视频时的必要设置一系列节点Node每个节点属于特定的类型type并有对应的一些参数。runner dict( # runner的基本参数 namePose Estimation, camera_id0, camera_fps20, # 定义了若干节点(Node) Nodes[ dict( typeDetectorNode, # 节点类型 nameDetector, # 节点名字 input_buffer_input_, # 节点数据输入 output_bufferdet_result, # 节点数据输出 ...), # 节点其他参数 dict( typeTopDownPoseEstimatorNode, # 节点类型 nameHuman Pose Estimator, # 节点名字 input_bufferdet_result, # 节点2数据输入 output_bufferpose_result, # 节点2数据输出 ...), # 节点参数 ...] # 更多节点 )核心概念Runner 和 Node到这里我们已经引出了 MMPose Webcam API 的 2 个最重要的概念Runner 和 Node。RunnerRunner 类是程序的主体提供了程序启动的入口runner.run()方法并负责视频读入、输出显示等功能。此外runner 中会包含若干个 Node分别负责在视频帧的处理中执行不同的功能。NodeNode 类用来定义功能模块例如模型推理、可视化、特效绘制等都可以通过定义一个对应的 Node 来实现。如上面的 config 例子中2 个节点的功能分别是做目标检测Detector和姿态估计TopDownPoseEstimator。从源码 webcam_runner.py 看WebcamRunner在初始化时依次完成以下工作注册_exit_及同步模式下的_idle_事件 → 注册_frame_、_input_、_display_三个默认 buffer → 遍历 config 中的nodes列表通过 NODES 注册表 构建每个 Node 实例并注册其输入/输出 buffer 与事件 → 最后把 runner 自身绑定给每个节点。整个 runner 是配置驱动的组装工厂本身不包含任何业务逻辑。而 node.py 中的Node类继承自 Python 标准库的Thread即每个节点都是独立线程在run()方法中循环执行检查输入 → 调用process()/bypass()→ 发送输出的标准流程。这正是 Runner 和 Node 的关系runner 负责全局编排与视频 I/O节点在线程中异步执行各自功能。数据流一个重要的问题是当一帧视频数据被 runner 读取后会按照怎样的顺序通过所有的 Node 并最终被输出显示呢答案就是 config 中每个 Node 的输入输出配置。如示例 config 中可以看到每个 Node 都有input_buffer、output_buffer等参数用来定义该节点的输入输出。通过这种连接关系所有的 Node 构成了一个有向无环图DAG结构。图中的每个 Data Buffer 就是一个用来存放数据的容器。用户不需要关注 buffer 的具体细节只需要将其简单理解成 Node 输入输出的名字即可。用户在 config 中可以任意定义这些名字不过要注意有以下几个特殊的名字_input_存放 runner 读入的视频帧用于模型推理_frame_存放 runner 读入的视频帧用于可视化_display_存放经过所有 Node 处理后的结果用于在屏幕上显示。当一帧视频数据被 runner 读入后会被放进_input_和_frame_两个 buffer 中然后按照 config 中定义的 Node 连接关系依次通过各个 Node最终到达_display_并被 runner 读出显示在屏幕上。在 pose_estimation.py 中这条数据流链路的完整形态是_input_ → DetectorNode → det_result → TopDownPoseEstimatorNode(人) → human_pose → TopDownPoseEstimatorNode(动物) → animal_pose _frame_ → ModelResultBindingNode(绑定最新推理结果) → frame → PoseVisualizerNode → vis → NoticeBoardNode → vis_notice → MonitorNode → display → RecorderNode → _display_其中ModelResultBindingNode负责把较慢的推理结果与当前帧画面绑定在一起PoseVisualizerNode负责绘制骨骼与检测框NoticeBoardNode显示帮助信息MonitorNode显示诊断信息默认关闭按m开启RecorderNode把输出视频保存到record.mp4。各节点还有enable_key快捷键开关与enable默认开关状态参数例如 Visualizer 按v开关、Helper 按h开关。同步模式与异步模式WebcamRunner的synchronous参数决定了两种不同的运行节奏webcam_runner.py异步模式synchronousFalse示例 config 的默认值读帧线程按camera_fps限速持续读取视频帧并放入 buffer显示线程从_display_取结果实时刷新。各节点线程彼此独立、无需等待画面流畅但推理结果可能与画面存在微小时间差同步模式synchronousTrue读帧线程会等待上一帧被处理完毕通过_idle_事件后才读取下一帧保证显示即推理所对应的那一帧代价是帧率受限于最慢节点。ModelResultBindingNode会依据 runner 的synchronous设置动态决定自己必需输入是推理结果还是帧画面见 helper_node.py从而适配两种模式。Get Advanced: 关于 bufferBuffer 本质是一个有限长度的队列在 runner 中会包含一个 BufferManager 实例见 buffer.py来生成和管理所有 buffer。Node 会按照 config 从对应的 buffer 中读出或写入数据。从 webcam_runner.py 可看到默认容量_frame_与_input_均为 1_display_为 0无限用户自定义 buffer 默认为 1均可在buffer_sizes参数中覆盖当一个 buffer 已满达到最大长度时写入数据的操作通常不会被 block而是调用put_force将 buffer 中已有的最早一条数据挤出去见 buffer.py从而保证各节点线程永远不会因下游未消费而卡死为什么有_input_和_frame_两个输入呢因为有些 Node 的操作较为耗时如目标检测、姿态估计等需要模型推理的 Node。为了保证显示的流畅我们通常用_input_来作为这类耗时较大的操作的输入而用_frame_来实时绘制可视化的结果。因为各个节点是异步运行的这样就可以保证可视化的实时和流畅。源码级原理消息、事件与节点线程节点间通信的载体Message节点输入输出以及 buffer 中存储的元素都是 message.py 中定义的Message及其子类实例。其中FrameMessage用来存储视频中 1 帧的信息除了get_image()/set_image()获取和设置图像外还提供了结构化存取模型结果的方法add_detection_result()/get_detection_results()管理目标检测结果add_pose_result()/get_pose_results()管理姿态估计结果均支持用tag区分来自不同节点的结果。此外Message还带有route_info路由信息记录该消息依次经过的所有节点及其 FPS、时延等状态这正是MonitorNode显示诊断信息的来源。当输入视频结束时runner 会向 buffer 中写入一个特殊的VideoEndingMessage节点收到后会原样转发并触发退出流程。键盘交互与事件机制Runner 的_display()方法在显示窗口的同时通过cv2.waitKey(1)捕获键盘输入按q/Q/Esc会设置_exit_事件退出程序其他按键则通过 event.py 中的EventManager广播为键盘事件内部命名形如_keyboard_v。节点在初始化时可用enable_key注册快捷键并绑定_toggle_enable处理器事件监听线程收到按键后即切换节点的开关状态被关闭的节点会调用bypass()方法直接把输入原样转发node.py。内置 Node 一览通过 nodes/init.py 可以确认框架目前已内置以下可直接在 config 中使用的节点节点类型所属文件功能DetectorNodemmdet_node.py调用 MMDetection 模型做目标检测TopDownPoseEstimatorNodemmpose_node.py调用 MMPose 自顶向下模型做姿态估计并带跟踪track id功能ModelResultBindingNodehelper_node.py将最新推理结果与当前帧绑定MonitorNodehelper_node.py在画面上显示节点路由与系统状态CPU、内存RecorderNodehelper_node.py将输出视频写入本地文件PoseVisualizerNodeframe_effect_node.py绘制检测框与关键点骨骼SunglassesNode/BugEyeNode/HatNode/MoustacheNode等frame_effect_node.py基于关键点位置叠加各类趣味特效BackgroundNodeframe_effect_node.py实例分割抠图换背景SaiyanNodeframe_effect_node.py赛亚人特效NoticeBoardNodeframe_effect_node.py在画面上显示提示信息板FaceSwapNodefaceswap_node.py换脸特效XDwenDwenNode/ValentineMagicNodexdwendwen_node.py、valentinemagic_node.py冰墩墩装扮、情人节特效这些节点绝大多数继承自 node.py 的Node基类或 frame_drawing_node.py 的FrameDrawingNode后者进一步封装process()只要求子类实现draw()绘制接口并通过NODES.register_module()注册到注册表从而可在 config 中按类型名被实例化。进一步探索改配置与自定义 Node常用配置调整除了示例 config仓库 configs 下还提供了眼睛特效eyes、换脸face_swap、背景替换background、新年烟花newyear等多个现成应用可以直接运行。在此基础上常用的自定义手段包括选择摄像头/输入源通过camera_id指定摄像头默认摄像头 id 为 0多个则依次增大也可以把camera_id设置为一个本地视频文件路径从而用视频文件作为输入选择模型通过推理节点如DetectorNode、TopDownPoseEstimatorNode的model_config与model_checkpoint参数配置根据目标类别与硬件情况选用合适的模型例如示例中人体姿态用的是 vipnas_mbv3_coco_wholebody_256x192_dark.py动物姿态用的是 hrnet_w32_animalpose_256x256.py设置快捷键通过节点的enable_key快捷键与enable默认开关状态参数控制提示信息通过NoticeBoardNode的content_lines参数在运行时显示应用说明与操作指引。自定义 Node 开发当内置节点无法满足需求时可以参照 example_cn.md 中的给猫咪戴上太阳镜教程开发新节点其核心步骤是继承Node或FrameDrawingNode基类 → 在__init__()中注册输入/输出 buffer → 实现process()及需要开关功能时的bypass()或draw()方法 → 用NODES.register_module()注册 → 在 config 中加入该节点即可运行。这也是 MMPose Webcam API 最具扩展性的设计模型推理、可视化、特效绘制等一切功能都可以通过定义一个对应的 Node 来接入整个数据流。赞分享人工智能计算机视觉深度学习【免费下载链接】ViTPoseThe official repo for [NeurIPS22] ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation and [TPAMI23] ViTPose: Vision Transformer for Generic Body Pose Estimation项目地址https://gitcode.com/gh_mirrors/vi/ViTPose点击查看免费下载相关推荐ViTPose人体姿态估计零基础快速上手实战指南ViTPose人体姿态估计零基础快速上手实战指南 还在为复杂的人体姿态估计项目头疼吗ViTPose通过革命性的Vision Transformer架构让骨人工智能计算机视觉深度学习Sapiens 摄像头推理实战指南MMPose Inferencer 与 Demo 脚本的 Webcam 姿势估计方案Sapiens 摄像头推理实战指南MMPose Inferencer 与 Demo 脚本的 Webcam 姿势估计方案 SapiensHigh resolu人工智能基础模型计算机视觉预训练深度学习颠覆AI开发体验AI Toolkit for Visual Studio Code完全指南颠覆AI开发体验AI Toolkit for Visual Studio Code完全指南 想要快速上手AI开发工具却苦于复杂的配置和部署流程AI Too人工智能推理引擎本地部署模型优化深度学习上一篇从有线束缚到无线自由如何用ALVR重新定义你的PC VR体验下一篇CsvHelper v28 迁移至 v29注入防护配置升级与分隔符自动检测扩展创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

科研全流程效率实测:把Codex auth.json改到TaoToken的6个月数据复盘

科研全流程效率实测:把Codex auth.json改到TaoToken的6个月数据复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/10/15 20:55:49
U-Boot移植实战:fastboot刷机与EMMC启动链路解析

U-Boot移植实战:fastboot刷机与EMMC启动链路解析

移植 u-boot-2020.07 到 iTOP-4412(八)fastboot & boot from EMMC,前七篇的串口、网络、SD 卡启动都打通之后,剩下两块最硬的骨头就是本篇要处理的 fastboot 刷机通道和 EMMC 启动链路。fastboot 管的是“怎么把系统装进板子”…

📅 2026/10/15 20:55:49
NDIS小端口驱动开发实战:从Miniport注册到NBL收发路径详解

NDIS小端口驱动开发实战:从Miniport注册到NBL收发路径详解

简介:这是一份面向Windows内核网络驱动开发者的NDIS 6.0小端口驱动实例源码,针对Realtek 8111/8168/8169/8110等PCI千兆以太网控制器编写。由于DDK中可参考的miniport示例仅有E100BEX,学习NDIS 6.0网卡驱动的资料相当稀缺,本资源正…

📅 2026/10/15 20:55:49
MORE NEWS

更多资讯

📰

MFC GDI+ 图层控件实现:解决透明叠加与交互渲染难题

简介:本资源是一套基于VS2010 MFC平台的GDI图层控件开发实践项目,面向C桌面图形开发初学者与中级工程师,解决传统MFC绘图缺乏图层管理、难以实现分层绘制与混合显示的核心痛点。项目通过封装多图层Bitmap与Graphics对象,提供图层创…

📰

Linux网卡驱动r8168源码编译与DKMS实战指南

简介:这份资源面向在 CentOS 7(内核 3.10)环境下需要为 Realtek 网卡安装 r8168 驱动的运维与 Linux 学习者,重点解决系统自带 r8169 驱动兼容性不佳、网卡无法正常识别或联网的问题。压缩包共 40 个文件,约 1.37MB&am…

📰

SAP ABAP DDIC DDL 中 DEFINE STRUCTURE 的 ext_annos 设计,C0 扩展契约下如何控制字段后缀、字段配额与字节容量

在 ABAP Dictionary 里创建一个 Structure,本身并不是什么新鲜事。传统项目里,我们很熟悉 SE11,也知道 Structure 可以被程序、Function Module、BAPI、数据库表 Include、接口参数乃至整个应用层的数据模型反复引用。 到了 ABAP Cloud、SAP S/4HANA Cloud 和 Clean Core 体…

📰

AI评测独立性:评测员入局后,如何守住可验证的中立边界

1. 评测员进场之后,独立性为什么反而成了新问题各家AI实验室这两年都在干同一件事:把评测员请进来。不是远程派单、外包打分那种松散合作,而是让评测团队常驻实验室,跟模型研发坐同一个工位、提同一个迭代节奏、甚至共享同一份模型…

📰

DeepSeek API成本优化指南:中转接口省钱的真相与避坑实操

最近后台收到不少私信,都在问同一个问题:"DeepSeek的API能不能再省点?" 问的人多了,我发现大家其实不是嫌模型能力不行,而是被token账单吓到了。尤其做个人项目、接私活、跑批量脚本的朋友,每调一…

📰

第158篇 Compose 重组原理:何时执行何时跳过

先把结论放在前面:Compose 的重组能跳过,靠的是"参数稳定性判定 + 编译器插入的依赖追踪"两件事。 编译器在编译期给每个 Composable 算出"读了哪些状态"的依赖集合,运行时状态变化时只把依赖它的重组作用域放进待执行队列;而"能否跳过整个 Compo…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬