作为一名卑微的肥宅(本人)或健身新人,你是否有遇到过:
- 好不容易鼓起勇气健身,却发现那些“暴瘦”视频没一个跟得上?
- 为了赶上视频不适合自己的速度拼尽全力,结果动作全部走形,直接白干?
没关系,我们可以用PP-TinyPose搭一个会“等肥宅”的健身助手(其实就是一个播放器),话不多说,看效果:
以打太极为例,我是一个手脚不协调的运动白痴,他会等我把动作摆对才会继续。
当然不仅仅是太极,你也可以方便的导入自己喜欢的视频,然后让程序监督你成为视频中的猛男
依赖都写在了requirements中,一行命令就能帮你装好。
pip install -r requirements.txt
修改开头的文件地址之后
直接运行video_preprocessing.py
处理好的视频与json文件会统一保存在video
文件夹下,方便之后调用
直接运行main.py
就行。
使用PP-TinyPose完成了骨骼关键点的识别,图片来自PP-TinyPose项目页面
使用了很简单的方法,先过滤眼鼻等与健身关系不大的骨骼点数据,之后根据人的检出框进行归一化,然后用余弦距离计算相似度。
camera_res = None
therhold = 0.97
video_KPT = skel_list[peo_area.index(max(peo_area))]
video_box = peo_boxes[peo_area.index(max(peo_area))]
while camera_res is None:
try:
camera_res = json.load(open("temp.json", "r"))
except:
pass
camera_KPT = camera_res[2][0][0]
camera_box = camera_res[1][0]
# camera_KPT = skel_list[peo_area.index(min(peo_area))]
video_vec = np.array(video_KPT)[5:17, 0:2]
camera_vec = np.array(camera_KPT)[5:17, 0:2]
for i in range(len(video_vec)):
video_vec[i][0] = (video_vec[i][0]-video_box[0])/(video_box[2] - video_box[0])
video_vec[i][1] = (video_vec[i][1] - video_box[1]) / (video_box[3] - video_box[1])
camera_vec[i][0] = (camera_vec[i][0] - camera_box[0]) / (camera_box[2] - camera_box[0])
camera_vec[i][1] = (camera_vec[i][1] - camera_box[1]) / (camera_box[3] - camera_box[1])
video_vec = video_vec.reshape(-1)
camera_vec = camera_vec.reshape(-1)
cos_sim = video_vec.dot(camera_vec) / (np.linalg.norm(video_vec) * np.linalg.norm(camera_vec))
- 正在开发windows前端,未来也可能开发安卓与ios前端,尽量做成简单易用的傻瓜软件
- 视频多人场景下骨骼点检测比较混乱,不方便后续处理,以后尝试优化多人场景
- 相似度比较算法比较简单,效果可用,考虑以后换用更准确的评价方式
- 可能部署到intel AIbox上