做一组深蹲,练一会儿开合跳,常常会遇到一件小事:动作还在继续,刚才数到第几个却记不清了。
如果让电脑看着画面,帮我们记录重复动作的次数,会是什么体验?
最近,我把这个想法做成了一个 Windows 桌面小工具------运动计数工坊。
它可以导入已有的运动视频,也可以接入摄像头。选中画面里的运动者后,程序会持续分析动作,更新计数,并把统计记录保存下来。
这次的 r2 版本,还加入了 YOLO11n 人员检测和 DirectML GPU 加速。从自动找人,到连续计数,再到结果校正,已经有了一套可以实际操作的界面。
打开软件,可以怎么玩?
软件保留了两种使用方式。
一种是分析已经拍好的视频。
比如,拍下一段运动过程,导入软件,选择需要分析的时间段,框住运动者,再点击开始分析。完成后,可以查看累计次数曲线,定位到某个时间回看,也可以手动修正漏计或多计的次数。
整理好结果,还能导出统计表,或者生成带有计数字幕的 MP4 视频,方便保存和分享。

运动计数工坊 r2 主界面
主界面:视频导入、CPU/GPU 选择、YOLO 找人、片段分析与结果导出。配图为程序真实空载界面。
另一种是边看画面,边持续计数。
点击顶部的"GPU 实时计数...",可以选择摄像头,也可以让一段已有视频按照正常速度播放。
程序会画出人员检测框。默认首次选择画面里最大的人员框,也支持自己点击目标。计数过程中,可以看到当前次数、人员检测耗时、动作分析耗时,以及丢帧等运行状态。

GPU 实时运动计数界面
第一次使用,几步就能开始
先把完整运行包解压到一个新文件夹,双击 RepNet.Workshop.exe。
运行环境为 Windows 10/11 64 位,需要 .NET Framework 4.8;GPU 模式还需要可用的 DirectX 12 显卡和驱动。
已有 r1 的朋友,建议为 r2 单独新建目录,配套 DLL、模型和程序一起使用。
如果想分析已有视频:
- 点击"选择视频",导入 MP4、MOV、MKV 等文件。
- 在顶部选择 CPU 或自己的独立显卡。
- 点击"YOLO 找人",也可以直接拖动鼠标框选运动者。
- 设置开始、结束时间,再点击"开始分析"。
- 回看结果,需要时用"此处 +1 / −1"校正,最后导出 CSV、JSON 或带计数的 MP4。
如果想体验连续计数:
- 打开"GPU 实时计数..."窗口。
- 选择"摄像头"或"视频按原速播放"。
- 选择对应设备和 GPU,点击"开始连续计数"。
- 等待积累动作画面,观察计数变化。
- 结束后点击"打开统计记录",查看自动保存的 CSV 和 JSON。
这里有个实用细节:GPU 0 不一定是独立显卡。
例如我的测试笔记本,GPU 0 是核显,RTX 4060 Laptop 对应的是 GPU 1。选择时看显卡名称,比只看编号更直观。
第一次建议使用十几秒的片段,固定机位、单人、全身入镜,从深蹲这类重复过程比较明显的动作开始试。实际效果会受到角度、遮挡和动作节奏影响。
GPU 加速,实际快了多少?
这次使用 RTX 4060 Laptop、约 8 GB 显存进行了测试。
在完整运行包解压后的验证中,对同一个 64 帧 RepNet 模型窗口,预热后各运行 3 次,得到下面的平均耗时:
| 推理方式 | 平均耗时 |
|---|---|
| CPU,4 线程 | 约 570.2 毫秒 |
| DirectML GPU | 约 49.4 毫秒 |
这一组模型窗口测试,GPU 速度约为 CPU 的 11.6 倍。
我们还检查了执行记录,确认 RepNet 的主要计算确实在 GPU 上运行,并对照了 CPU、GPU 的输出数值。
另一个 12 秒深蹲示例,离线 GPU 分析约用了 3.3 秒,显示估计 4 次。这个耗时包含视频采样、模型加载和推理,没有包含最后的 MP4 编码。
整条流程还会受到视频解码、人员检测、裁剪、显示和编码的影响,实际速度需要结合设备和素材来看。单个片段的计数结果,也不能代替不同运动场景的准确率评估。
背后是怎样工作的?
可以把它理解成几个模块在配合:
摄像头/视频 → 找到运动者 → 裁剪运动区域 → 分析重复动作 → 累计次数 → 显示与保存。
其中,YOLO11n 负责找人。
我们采用 Ultralytics 官方的 COCO 预训练检测权重,保留人员类别的检测结果。找到目标后,再适当扩大、平滑裁剪区域,给手臂、腿部等动作留出空间。
RepNet 负责分析重复的节奏。
它会比较一段连续画面之间的特征相似性,估计动作重复的周期,再把这些估计累计成次数。这样的思路可以用于探索多种重复动作,具体效果仍然要按运动和拍摄条件验证。
DirectML 负责把模型计算交给 GPU。
运行时通过 ONNX Runtime 调用,因此使用完整运行包时,无需自行安装 Python、PyTorch、CUDA 或 cuDNN。GPU 模式需要可用的 DirectX 12 显卡和驱动;软件也保留了 CPU 选项。
还有一个容易忽略的细节:实时分析会不断使用重叠的画面窗口。程序会记录已经统计到哪个采样位置,后续只提交新增时间段,防止同一段动作被重复累计。
实时计数,也需要观察动作的时间
RepNet 每次需要读取连续的 64 帧。
按默认 16 fps 采样,第一次大约需要 4 秒积累动作画面。之后,程序通常每增加 8 帧就调度一次分析,持续更新结果。
GPU 缩短的是计算耗时,动作观察窗口仍然需要保留。对于较慢的动作,程序会随着画面积累,逐步尝试更长的时间步长。
人员暂时离开画面时,程序会暂停统计并重新积累上下文;长时间丢失目标,或者人员交叉难以明确匹配时,需要重新点选。点击换人会建立新的计数段,历史记录保留在 CSV 中。
这版主要围绕一个选定目标的重复动作计数展开。动作是否做到位,仍然需要使用者判断;复杂遮挡、多人交错和高速动作,还需要进一步打磨。
目前,已有视频的连续计数、窗口去重、目标丢失、人工校正和界面操作都做了验证。摄像头完成了短时采集和停止检查,摄像头下不同运动的计数效果,还需要更多实际测试。
给普通使用者,也给喜欢 C# 的朋友
我把软件整理成了两个包:
- 完整运行包:约 193 MiB,包含程序、模型、推理运行库和 FFmpeg。
- 完整 VS2022 源码包:约 195 MiB,方便打开项目、学习和继续修改。
界面使用 C# WinForms + .NET Framework 4.8 ,两个窗体都保留独立的 .Designer.cs,可以在设计器里调整布局。源码包已经做过解压到新目录、独立编译的检查。
工作区默认放在 EXE 旁边的 workspace 目录,同盘业务路径优先使用相对路径,搬动整个软件目录比较方便。
实时模式默认保存统计记录,摄像头原视频、图片和音频不会自动落盘。离线模式则可以在确认结果后,主动导出带计数的视频。
对于想学习桌面 AI 部署的朋友,这个项目也包含了人员检测后处理、视频管道、滑动窗口、有界队列、GPU 后端选择,以及取消任务后释放资源等工程细节。
项目用到了公开模型和第三方组件,感谢原作者的工作。RepNet(github.com/google-rese... 和 ONNX Runtime DirectML(onnxruntime.ai/docs/execut... 的官方资料,都可以作为进一步学习的入口。YOLO11 的代码和权重适用 AGPL-3.0/企业许可,对外分发和商业使用请按官方许可条款(www.ultralytics.com/license)处理。
如果你对运动计数、C# 桌面开发或 AI 模型本地部署感兴趣,欢迎一起交流,也欢迎反馈实际使用中的素材和问题。
QQ群名称:天天代码码天天
群号码:264292622
我们一起继续把这些有意思的想法,做成用得上的小软件。