文章目录
前言
PaddleHub是飞桨生态下的预训练模型的管理工具,旨在让飞桨生态下的开发者更便捷地享受到大规模预训练模型的价值。用户可以通过PaddleHub便捷地获取飞桨生态下的预训练模型,结合Fine-tune API快速完成迁移学习到应用部署的全流程工作,让预训练模型能更好服务于用户特定场景的应用。
当前PaddleHub已经可以支持文本、图像和视频三大类主流方向,为用户准备了大量高质量的预训练模型,可以满足用户各种应用场景的任务需求,包括但不限于词法分析、情感分析、图像分类、目标检测、视频分类等经典任务。
在PaddleHub获取到人体骨骼关键点模型之后,就可以对这些关键点进行连接,从而形成了人体姿态。然后我们将皮影素材映射到人体姿态身上,让皮影跟随人体姿态进行运动,就达到“皮影戏”的效果。
本文参考来源:
https://aistudio.baidu.com/aistudio/projectdetail/764130?channelType=0&channel=0
一、所需准备
本项目可以通过两种途径实现,一种是线下,一种是线上。线下需要自己装在环境到电脑中,考虑到python版本之间的不兼容,而且自己电脑配置较低,因而为了防止出现错误,本文所使用的是通过线上运行的方式。
1、fork原文
通过fork原文,我们在network会备份出和作者一样的环境

如果还是想要自己在本地运行,建议打开终端查看python库文件版本,然后下载和这个示例里一样的版本

pip list
通过pip list可以看到paddlepaddle和paddlehub等库文件的版本

2、全部运行
看着原文的示例,应该是成功过一次的,我们来全部运行一下

可以看到,这里提示报错了,根据错误提示,需要更新paddlepaddle库

3、更新库文件
paddlepaddle官方文档
根据官方文档提示,我们知道paddlepaddle对环境是有要求的
| python版本 | 3.5.1+/3.6/3.7/3.8 |
|---|---|
| pip版本 | 20.2.2+ |
| 处理器架构 | 第一行输出的是”64bit”,第二行输出的是”x86_64”、”x64”或”AMD64”即可 |
通过python -V我们可以查看当前python版本
python -V

通过pip show pip,我们可以查看到当前的pip版本
pip show pip
通过python -m pip install -U pip,更新pip版本
python -m pip install -U pip
通过pip install -U your module更新库,这里的库就是paddlepaddle
pip install -U paddlepaddle

更新完毕后,再次使用pip list指令查看,发现更新成功

二、正式使用
1、骨骼关键点检测
上传自己想要检测的图片,运行代码

import os
import cv2
import paddlehub as hub
import matplotlib.pyplot as plt
from matplotlib.image import imread
import numpy as np
%matplotlib inline
def show_img(img_path, size=8):
'''
文件读取图片显示
'''
im = imread(img_path)
plt.figure(figsize=(size,size))
plt.axis("off")
plt.imshow(im)
def img_show_bgr(image,size=8):
'''
cv读取的图片显示
'''
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
plt.figure(figsize=(size,size))
plt.imshow(image)
plt.axis("off")
plt.show()
#通过代码获取图片中的结果
pose_estimation = hub.Module(name="human_pose_estimation_resnet50_mpii")
result = pose_estimation.keypoint_detection(paths=['work/imgs/body01.jpg'], visualization=True, output_dir="work/output_pose/")
result
由代码可以知道,检测结果会输出到output_pose这个文件夹中,让我们来看一下检测结果如何,我们可以看到元原来的图片中多出了一些身体上的检测点,可以知道这是成功检测到了骨骼关键点了

2、将皮影素材映射到骨骼关键点上
皮影素材

运行映射python程序
def get_true_angel(value):
'''
转转得到角度值
'''
return value/np.pi*180
def get_angle(x1, y1, x2, y2):
'''
计算旋转角度
'''
dx = abs(x1- x2)
dy = abs(y1- y2)
result_angele = 0
if x1 == x2:
if y1 > y2:
result_angele = 180
else:
if y1!=y2:
the_angle = int(get_true_angel(np.arctan(dx/dy)))
if x1 < x2:
if y1>y2:
result_angele = -(180 - the_angle)
elif y1<y2:
result_angele = -the_angle
elif y1==y2:
result_angele = -90
elif x1 > x2:
if y1>y2:
result_angele = 180 - the_angle
elif y1<y2:
result_angele = the_angle
elif y1==y2:
result_angele = 90
if result_angele<0:
result_angele = 360 + result_angele
return result_angele
def rotate_bound(image, angle, key_point_y):
'''
旋转图像,并取得关节点偏移量
'''
#获取图像的尺寸
(h,w) = image.shape[:2]
#旋转中心
(cx,cy) = (w/2,h/2)
# 关键点必须在中心的y轴上
(kx,ky) = cx, key_point_y
d = abs(ky - cy)
#设置旋转矩阵
M = cv2.getRotationMatrix2D((cx,cy), -angle, 1.0)
cos = np.abs(M[0,0])
sin = np.abs(M[0,1])
# 计算图像旋转后的新边界
nW = int((h*sin)+(w*cos))
nH = int((h*cos)+(w*sin))
# 计算旋转后的相对位移
move_x = nW/2 + np.sin(angle/180*np.pi)*d
move_y = nH/2 - np.cos(angle/180

本文介绍了如何利用PaddleHub进行人体骨骼关键点检测,并将皮影素材映射到检测结果上,创建出类似皮影戏的效果。首先,通过PaddleHub获取预训练模型,检查并更新库文件确保兼容性。接着,运行代码对图片进行骨骼关键点检测,并将皮影素材与检测到的关节对应。最后,将该技术应用于视频,逐帧处理生成皮影动画视频。文章详细阐述了整个过程,适合对深度学习和图像处理感兴趣的读者。
最低0.47元/天 解锁文章
258





