一张图找不到、一段话说不清?免费开源姿势搜索工具 Pose-Search 带你用动作本身找图
2026/8/14 18:29:22 网站建设 项目流程

一张图找不到、一段话说不清?免费开源姿势搜索工具 Pose-Search 带你用动作本身找图

【免费下载链接】pose-searchx6ud.github.io/pose-search项目地址: https://gitcode.com/gh_mirrors/po/pose-search

凌晨两点,健身教练小林还在电脑前翻相册。学员发来一张训练照,问"教练,这个动作我哪里做得不对?"小林盯着照片,想起自己手机里存着三千多张学员动作对比图,可他就是找不到那张姿势几乎一模一样的标准示范图。他试过在相册里搜"深蹲""弓步""髋铰链",搜出来的全是关键词命中的,动作压根不匹配。他叹了口气:图片明明就在库里,用嘴却说不出来它长什么样。

这个场景你是不是也遇到过?想在素材库里找"左臂弯曲45度、右腿向后蹬地"的图,关键词打了三行还是找不到;想在海量照片里挑出投球姿势最标准的一张,眼睛都快看花了。问题不在你的搜索技术,而在于:动作这种信息,本来就不该用文字来描述

一句话定位:这是给人体动作量"姿势标尺"的开源搜索工具

Pose-Search 是一个基于 AI 姿势识别的人体姿势搜索工具。它和你见过的图片搜索完全不同——不需要你输入任何关键词,你只需要给它一张参考图,它就会自动提取图中人物的骨骼动作,然后在你自己的图片库里,按相似度把动作最接近的图片排好序给你。

它的本质,就是把"姿势"变成一串可计算的数字:33 个身体关键点(脸、肩膀、肘、胯、膝盖、脚踝)的位置和角度,然后用这套数字去"量"图库里的每一张照片。仓库地址:https://gitcode.com/gh_mirrors/po/pose-search,MIT 协议,免费开源,拿去商用也没问题。

先看效果:3 分钟跑起来,把第一张图搜出来

别急着了解原理,先动手。这套项目跑起来比想象中快,全程只需要三条命令:

git clone https://gitcode.com/gh_mirrors/po/pose-search cd pose-search npm install npm run dev

浏览器会自动打开本地服务(默认http://localhost:3000)。项目自带一个已经处理好的图片库——左侧是搜索区,中间是三维骨骼模型,右侧是搜索结果列表。

怎么玩?就三步:

  1. 在左侧的骨骼模型上拖拽旋转,把它摆成你想要的姿势(比如举起右手);
  2. 在部位下拉框里选"Right Shoulder"或"Right Elbow",相当于告诉它"我就按肩膀/手肘这个动作为标准搜";
  3. 点击搜索按钮,右侧立刻按相似度从高到低排出结果。

不到三分钟,你就能看到第一版结果:图库里动作最接近的图片全部浮上来,每张缩略图中间还标着一个红点,指向该图人物的关键关节点。这就是整个工具的完整工作流,先看见成果,我们再去拆它背后的零件。

全景功能地图:这个项目到底能干什么

功能它解决什么对应代码位置
姿势识别从图片里提取 33 个身体关键点src/utils/detect-pose.ts
局部动作匹配只比脸、肩、肘、胯、膝等单个部位src/Search/impl/(12 个匹配器)
左右镜像匹配自动识别并兼容左右手的镜像姿势匹配器内置flip逻辑
三维骨骼可视化拖拽旋转一个可交互的人体模型来摆姿势src/components/SkeletonModelCanvas/
图片库管理批量导入照片、标注性别、保存数据库src/Editor/
视角无关模式忽略拍摄角度,只看动作本身src/Search/Search.ts中的cameraUnrelatedMatcher
结果排序与筛选按相似度排序、按性别筛选src/Search/impl/search.ts

逐个说几个最值得玩的部分。

局部匹配是它的杀手锏。它把人体拆成 12 个可独立搜索的部位:Face、Chest、Crotch、左右 Shoulder、左右 Elbow、左右 Hip、左右 Knee。想找"右手抬到头顶"的照片?直接选 Right Shoulder 或 Right Elbow 作为搜索维度,其他部位的动作差异它就不管了,精准锁定你关心的那一段。每个匹配器的完整逻辑都在src/Search/impl/MatchElbow.ts这类文件里,命名即文档。

视角无关匹配值得单独表扬。图库里同一动作可能有人正面拍、有人侧面拍、有人从背后拍,普通匹配会被视角差异干扰。项目给肩、肘、胯、膝四个部位各配了一个"CameraUnrelated"版本(见src/Search/Search.ts第 42~84 行的cameraUnrelatedMatcher配置),切到这个模式,它只比较动作本身的空间关系,跟镜头站在哪儿无关。

三维骨骼模型是真·交互式的。中间那个灰色人形不是摆设,你可以直接用鼠标拖拽它的四肢关节,摆出任何你想搜的姿势,还能点击某个关节快速切换匹配部位。模型由 14 段 OBJ 几何体拼装而成,加载和渲染逻辑在src/components/SkeletonModelCanvas/model/SkeletonModel.ts

阶梯式上手教程:从照抄到改造成自己的搜索库

L1 基础:跑通示例、摸清搜索交互

  • 操作:启动项目后,先随便拖拽右侧模型摆一个姿势,换不同部位反复搜索。
  • 预期结果:你很快会感觉到"搜动作比搜关键词直观得多"——摆姿势本身就是搜索条件,所见即所得。
  • 小技巧:结果缩略图上的红点是该图对应关节的位置,点击任意结果还能看大图对比。

L2 进阶:换一套自己的图片库

  • 操作:编辑public/photos.jsonpublic/landmarks.dat,替换成你自己的图片清单和关键点数据。数据格式很规整:landmarks.dat是二进制文件,每张图 33 个点 × 7 个浮点数(归一化坐标 3 个、世界坐标 3 个、可见度 1 个),读写逻辑都在src/utils/PhotoDataset.ts
  • 预期结果:搜索时用的就是你的私人图库了。
  • 进阶玩法:更省事的路是走编辑器。打开/#/editor,从 Unsplash 申请一个免费 App Key 贴进去,就能边看图边点"Add Record"把图片连同姿态数据一键入库,最后点"Save data.db"落盘。

L3 熟练:调参数、加匹配器

  • 操作:打开src/config.ts,你能看到两个全局开关:
    • LANDMARK_VISIBILITY_ACCEPTABLE_THRESHOLD = 0.4:关键点可见度低于这个值的关节直接跳过,不参与打分。你的图片库如果模糊照片多,可以试着调低到 0.3。
    • MAX_NUM_OF_SEARCH_RESULTS = 100:结果上限,图库大的话可以调高。
  • 预期结果:搜索结果的数量和质量都能按你的数据特点微调。
  • 再进一步:想自定义匹配算法?匹配器只需要实现一个极简接口——prepare(model)负责从参考姿势提取特征,match(photo)负责给每张图打分,返回分数和关键点位置。照着src/Search/impl/里现成的类抄一个,注册进Search.tsmatchers对象即可。

通俗化原理:把算法想成"给身体画了一把角度尺"

这套系统的工作原理,可以拆成三个环环相扣的环节,每个环节都能用生活里的东西打比方。

第一环:给身体点穴。MediaPipe Pose 模型会在每张人像图上标记出 33 个关键点——鼻子、双耳、双肩、双肘、手腕、胯、膝盖、脚踝……就像中医点穴,把身体的"支点"全部标出来。这一步的输出是每个点的三维坐标加一个可见度置信度。注意看src/utils/detect-pose.ts里第 42 行写死了NUM_OF_LANDMARKS = 33,这就是整套系统的骨架起点。

第二环:画角度尺。单看坐标没用,坐标会随拍摄距离、画面大小变化。所以算法把坐标换算成"角度"——比如手肘的弯曲程度,就是上臂方向向量和小臂方向向量之间的夹角。角度这个量天生和远近大小无关,这是它敢说自己"无论怎么拍都能比"的底气。src/Search/impl/math.ts里那一堆向量运算函数,干的就是这活儿。

第三环:算"姿势差"。有了参考姿势的角度,再去量图库里每张图对应关节的角度,差值越小分越高,最后把分数乘起来排序。它比的是"你摆的姿势和参考姿势差了多少度",而不是"图上有没有这个动作的关键词"。这也是为什么它能覆盖"左臂弯曲45度"这种文字根本无法表达的需求——文字描述是离散的、含糊的,角度是连续的、精确的。

真实体验报告:夸它什么、也告诉你它卡在哪

先说优点,都是实测过得出的结论:

  • 搜索直觉性拉满。用姿势当搜索条件是零学习成本的,你拖一下模型、点一下搜索,结果就出来了,比敲三行关键词快得多。
  • 局部精度出乎意料。选 Elbow 就只看肘部,肩、胯的差异完全不干扰排序,对"只关心某一个动作细节"的场景非常对症。
  • 完全本地化、零服务端依赖。推理全部在浏览器里跑(WebGL2),不传图到任何服务器,隐私友好。
  • 代码结构清晰,适合当学习范本。Vue 3 + Vite + TypeScript 组合,匹配器接口只有两个方法,读起来像读文档。

再说局限,丑话说在前面:

  • 图库需要自己积累。项目自带示例数据,但那是演示用的,真正要搜自己的素材,得先通过编辑器批量录入,这一步有工作量。
  • 多人场景不友好。默认按单人姿势处理,一张图里几个人同时出现时,识别结果会互相干扰。
  • 视频不支持。输入是静态图片,逐帧分析视频是未来的事。
  • 对关键点可见度敏感。背对镜头、严重遮挡、肢体被截断的照片,关节没被"点穴"到,匹配效果会明显打折。

横向比一下:常规图片搜索(如按文件名、标签、关键词检索)胜在快,但只能搜到"人话能描述的东西";Pose-Search 走的是一条完全不同的路,它搜索的对象是"语言描述不出来的东西"。二者不是替代关系,而是互补——前者负责粗筛,后者负责精比。

避坑清单:6 个常见错误与解法

常见错误现象解决办法
不装依赖直接跑vite找不到命令先执行npm install,确认node_modules存在再npm run dev
图片中人物被遮挡搜索时该关节直接"失联",结果全空检查src/config.tsLANDMARK_VISIBILITY_ACCEPTABLE_THRESHOLD,从 0.4 降到 0.3 试试
选了部位却没结果图库里没有同时满足"该部位可见"的图先选 Face 或 Chest 这种几乎必然可见的部位验证流程,再切局部关节
结果数量远少于预期MAX_NUM_OF_SEARCH_RESULTS = 100或可见度过滤拦住了确认图库数量、调高结果上限、检查是否误开了性别筛选
编辑页拿不到图编辑器需要 Unsplash App Key在 Unsplash 后台申请 Key 并粘贴到编辑器对应输入框
修改了数据文件不生效搜索用的还是旧数据改完photos.json/landmarks.dat后重启npm run dev,浏览器强刷缓存

去把第一张"按动作找"的图搜出来

回到开头的小林。如果他装了 Pose-Search,流程会变成:把学员的照片喂给系统识别姿势,用三维模型微调出标准示范动作,再一键搜库——三秒钟,那张他翻了半夜都没找到的对比图就会出现在结果第一位。他省下的不是几分钟,而是"看得见却搜不到"的无力感。

而你现在已经知道它怎么用、怎么改、怎么避坑了。下一步很明确:clone 仓库跑起来,先拿自带的示例库摆几个姿势玩一玩,再建一个属于自己的姿势图库。觉得好用,就给这个 MIT 开源项目点个 star,或者把你写的新匹配器提个 PR 贡献回去——毕竟,能让"动作自己说话"的搜索方式多一个人用,就多一分把好工具做大的可能。

【免费下载链接】pose-searchx6ud.github.io/pose-search项目地址: https://gitcode.com/gh_mirrors/po/pose-search

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询