一张图找不到、一段话说不清?免费开源姿势搜索工具 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)。项目自带一个已经处理好的图片库——左侧是搜索区,中间是三维骨骼模型,右侧是搜索结果列表。
怎么玩?就三步:
- 在左侧的骨骼模型上拖拽旋转,把它摆成你想要的姿势(比如举起右手);
- 在部位下拉框里选"Right Shoulder"或"Right Elbow",相当于告诉它"我就按肩膀/手肘这个动作为标准搜";
- 点击搜索按钮,右侧立刻按相似度从高到低排出结果。
不到三分钟,你就能看到第一版结果:图库里动作最接近的图片全部浮上来,每张缩略图中间还标着一个红点,指向该图人物的关键关节点。这就是整个工具的完整工作流,先看见成果,我们再去拆它背后的零件。
全景功能地图:这个项目到底能干什么
| 功能 | 它解决什么 | 对应代码位置 |
|---|---|---|
| 姿势识别 | 从图片里提取 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.json和public/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.ts的matchers对象即可。
通俗化原理:把算法想成"给身体画了一把角度尺"
这套系统的工作原理,可以拆成三个环环相扣的环节,每个环节都能用生活里的东西打比方。
第一环:给身体点穴。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.ts的LANDMARK_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),仅供参考