文章目录
一、项目背景
各位小哥哥小姐姐们是不是很烦恼该怎么选女朋友/男朋友呢?
为了帮助各位解决长久以来的烦恼!
本文特地基于 PaddleHub 研制了一个身材打分系统,为您的选择提供充分的依据!!!
AI studio 项目地址:
https://aistudio.baidu.com/aistudio/projectdetail/755096
PaddleHub 介绍
现在 AI 的各种算法日新月异,一般人只知道这东西很厉害,但是能做什么,怎么做基本都是一头雾水。即使对于很多从事该领域研究的人来说,不同类别的算法之间的差别也是犹如隔山,所以一个人想要精通所有算法基本是不可能的,学习速度可赶不上新算法出来的速度。
那我们有没有什么捷径去尝试这些新时代的产物,或者有没有办法把这些前沿的算法直接拿来用做应用和创意呢?
传统的做法下,即使原来的作者来源了算法的代码,你会复现你还是需要非常强的技术功底才有机会去做应用:
- 首先你要会 Python 吧
- 然后你需要在本地搭建算法学习环境吧
- 当然还有个前提是你有一台能跑得起来模型训练的电脑
- 然后你还需要能理解模型的各个层面,从数据读取处理,到算法框架,到结果展示,因为每个环境都可能由于本地环境的不同而出问题
- 所以即使有开源,普通人也用不了最前沿的这些东西
然而现在我们有了 PaddleHub,飞桨平台为了方便用户使用各种机器学习的前沿模型,于是把这些模型进行了打包封装,真正做到了可以拿来直接用的程度,比如本文中所涉及的模型 human_pose_estimation_resnet50_mpii,仅仅需要 2 行代码即可调用执行!!!
PaddleHub 可以让开发者便捷地获取 PaddlePaddle 生态下的预训练模型,完成模型的管理和一键预测。配合使用Fine-tune API,可以基于大规模预训练模型快速完成迁移学习,让预训练模型能更好地服务于用户特定场景的应用。
目前 PaddleHub 中有 3 个大类模型,包含:文本,图像,和视频。
图像类别下有:图像分类,关键点检测,文字识别,目标检测,图像生成,人脸检测,图像分割。包含了几十个常用的前沿模型,而且还在不断增加中~,大家跟兴趣的可以上官网去看看:
https://www.paddlepaddle.org.cn/hub
二、效果展示
得分一目了然,一键解决你的选择恐惧症! !
三、实现思路
说到人的身材比例,其实会看几个方面,比如:几头身,头肩比,腰臀比等,而要很好的测量这种类型的比例数据,人体关键点检测就是最好的工具!
所以本次使用了 PaddleHub 的 human_pose_estimation_resnet50_mpiiv 来进行实验。
根据检测出来的不同点位,测算人体整体的比例特征,然后进行打分和对比!
四、具体步骤
1. 安装 PaddleHub 到最新版本
pip install paddlehub --upgrade -i https://mirror.baidu.com/pypi/simple
2. 新建目录
- img 为待评价的图片
- results 内存放关键点检测的结果图片
- 确保程序运行前 results 文件夹内为空
- 图片需要 .jpg 格式,如果不是的话,需要在下面的程序做对应修改
3. 完成关键点检测
import cv2
import paddlehub as hub
from glob import glob
import os
pose_estimation = hub.Module(name="human_pose_estimation_resnet50_mpii")
img_list = glob(os.path.join('img','*.jpg'))
img_list.sort()
print(img_list)
result = pose_estimation.keypoint_detection(paths=img_list,output_dir='results',visualization=True)
4. 比例测算及打分
def body(head,neck,l_ankle,r_ankle):
head_size = (head[0]-neck[0])**2 + (head[1]-neck[1])**2
body_size_1 = (neck[0]-l_ankle[0])**2 + (neck[1]-l_ankle[1])**2
body_size_2 = (neck[0]-r_ankle[0])**2 + (neck[1]-r_ankle[1])**2
if body_size_1 > body_size_2:
body_size = body_size_1
else:
body_size = body_size_2
baseline = 6
score = (body_size/head_size)**0.5/baseline*100
return score
scores = []
for i in range(len(result)):
score = body(
result[i]['data']['head_top'],
result[i]['data']['upper_neck'],
result[i]['data']['left_ankle'],
result[i]['data']['right_ankle'])
scores.append(score)
print(scores)
5. 结果展示
# 显示图片
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
%matplotlib inline
def show_image_grid(results_dir, scores):
plt.figure(num='排行榜',figsize=(10.0,10.0),dpi=100,frameon=False)
img_list = glob(os.path.join(results_dir,'*.jpg'))
img_list.sort()
num = len(img_list)
for i, image in enumerate(img_list):
#print(num)
if scores[i]==max(scores):
plt.subplot(1,num,i+1).set(title='Winner',xlabel=('Score:%d'%scores[i]))
else:
plt.subplot(1,num,i+1).set(xlabel=('Score:%d'%scores[i]))
plt.imshow(mpimg.imread(image))
plt.show()
show_image_grid(results_dir='results', scores=scores)
五、总结与展望
本文纯属娱乐,请勿当真,旨在让读者感受 PaddleHub 的无限可能性!
后续版本会考虑加入更多维度的测试指标,让测试更完整,选择更坚定!!!
来AI Studio互粉吧: https://aistudio.baidu.com/aistudio/personalcenter/thirdview/204753
欢迎大家fork喜欢评论三连,感兴趣的朋友也可互相关注一下啊~