人工智能学习之使用百度大脑在线AI Studio实现人体皮影戏

本文主要是介绍人工智能学习之使用百度大脑在线AI Studio实现人体皮影戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、项目背景
  • 二、效果展示
  • 三、实现步骤
    • 1.安装依赖库
    • 2.目录和资源
    • 3. 查看单张图片的人体骨骼关键点检测效果
    • 4.实现思路
    • 5. 让皮影动起来
      • 5.1 准备素材
      • 5.2 将视频中每一帧保存成图片
      • 5.3 分析图片中的人体姿势, 并转换为皮影姿势,保存输出
      • 5.4 合并图像到视频
  • 四、总结


前言

资源来自BaiDu大脑AI Studio,本文在弘扬传统文化同时,能让读者学习AI知识。

https://aistudio.baidu.com/aistudio/projectdetail/1907782


提示:以下是本篇文章正文内容,下面案例可供参考

一、项目背景

领略千年皮影戏魅力,传承正在消失的艺术。
皮影戏的神奇,在于小小皮影在指尖上飞舞,时而刀光剑影、时而策马扬鞭、时而缠绵悱恻,千军万马是他,单打独斗也是他。皮影戏可谓是闻名中外,它是把光影声色做到极致的一门古老艺术。

在这里插入图片描述
在这里插入图片描述

先辈门通过手艺演绎着皮影戏,同样我们也可以通过AI方式来实现。为了实现皮影戏,可以通过PaddleHub提供的人体骨骼关键点检测库完成将人体姿态检测,同时映射到皮影身上,让皮影动起来。

二、效果展示

通过PaddleHub完成人体骨骼关键点检测,将人体骨骼关键点进行连接,就可以获取到人体的肢体骨骼,在骨骼肢体上覆盖皮影素材,就可以得到皮影人了。将视频中连续帧进行转换,就可以实现“皮影戏”的效果. 下面我们一起来看一下整体效果吧:

  • 对单张图片的转换,左边是原始图片,通过人体骨骼关键点检测后标注出了关键点位置,右边就是我们实现皮影素材叠加的效果:
    在这里插入图片描述
  • 在实现单张图片转换之后,我们就可以对视频中的每一帧进行处理,通过视频中的人物运动,让皮影动起来! 我b站上找了一个可爱的小姐姐进行转换(别只看小姐姐哦!),效果如下:
    在这里插入图片描述

NOTE: 如果您在本地运行该项目示例,需要首先安装PaddleHub。如果您在线运行,需要首先fork该项目示例。之后按照该示例操作即可。

三、实现步骤

1.安装依赖库

  • aistudio默认安装了PaddleHub, 本地运行的同学需要自行安装,可以到飞桨官网查看安装步骤:https://www.paddlepaddle.org.cn PaddleHub
  • PaddleHub 的人体骨骼关键点检测库 官方地址
 ! hub install human_pose_estimation_resnet50_mpii==1.1.1! mkdir work/output_pose#测试是否安装成功! hub run human_pose_estimation_resnet50_mpii --input_path "work/imgs/body01.jpg" --visualization True --output_dir "work/output_pose"

2.目录和资源

所有资源在work目录下

  • work/imgs 目录下是从网上找的图片资源
  • work/output_pose 是人体骨骼关键点识别后的图片目录
  • work/shadow_play_material 是皮影的素材图片
  • work/mp4_img 是视频导出的图片
  • work/mp4_img_analysis 视频图片分析结果
! mkdir work/mp4_img
! mkdir work/mp4_img_analysis
! mkdir work/shadow_play_material# 解压皮影素材
!unzip -q -o /home/aistudio/data/data53265/shadow_play_material.zip -d /home/aistudio/work/shadow_play_material/

3. 查看单张图片的人体骨骼关键点检测效果

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() 
show_img('work/imgs/body01.jpg')

在这里插入图片描述

#通过代码获取图片中的结果
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
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py:130: DeprecationWarning: Creating a LegacyVersion has been deprecated and will be removed in the next major releaseDeprecationWarning,
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/pip/_vendor/packaging/version.py:130: DeprecationWarning: Creating a LegacyVersion has been deprecated and will be removed in the next major releaseDeprecationWarning,
[2021-05-07 20:50:41,355] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
image saved in work/output_pose/body01time=1620391842.jpg[{'path': 'work/imgs/body01.jpg','data': OrderedDict([('left_ankle', [192, 679]),('left_knee', [203, 521]),('left_hip', [213, 347]),('right_hip', [291, 347]),('right_knee', [307, 521]),('right_ankle', [307, 672]),('pelvis', [255, 347]),('thorax', [255, 166]),('upper_neck', [255, 120]),('head_top', [255, 22]),('right_wrist', [161, 354]),('right_elbow', [182, 264]),('right_shoulder', [192, 166]),('left_shoulder', [317, 166]),('left_elbow', [333, 271]),('left_wrist', [348, 362])])}]

从上面可以得到每个人体骨骼关键点的具体坐标,我们通过可视化查看前面图片分析出的结果。

show_img('work/output_pose/body01.jpg')

在这里插入图片描述

4.实现思路

要实现皮影戏的效果我们首先要解析,人体各个骨骼关键点的位置信息,通过关节点的信息计算皮影的肢体位置,和旋转方向,从而达到肢体同步。

  • 首先解析某个部位骨骼关键点的,这里以手臂进行举例:

通过PaddleHub中解析结果,获取手臂具体位置,我们可以通过肩膀(shoulder)和肘(elbow)得到,那么就可以获取对应的坐标点信

  • 通过2个骨骼关键点可以确认肢体的长度和旋转角度,根据长度就可以对素材进行缩放,根据旋转角度,可以先对素材进行中心旋转,再计算旋转后图片的位移信息,就可以得到最终映射骨骼关键点位置。将各个素材图片映射到对应的肢体上,便可以达到动作映射的效果。
    在这里插入图片描述
  • 将动作映射后的“皮影”,合并到背景图像中进行输出。

5. 让皮影动起来

具体实现步骤如下:

准备素材
将视频中每一帧保存成图片
分析图片中的人体姿势, 并转换为皮影姿势,输出结果
合并图像到视频,得到最终的结果

5.1 准备素材

含有人体动作视频,需要各位自行下载,本教程已经下载好(work/001.mp4)

PS:视频素材可以到b站舞蹈区进行下载

# 素材图片位置
input_video = 'work/001.mp4'

5.2 将视频中每一帧保存成图片

def transform_video_to_image(video_file_path, img_path):'''将视频中每一帧保存成图片'''video_capture = cv2.VideoCapture(video_file_path)fps = video_capture.get(cv2.CAP_PROP_FPS)count = 0while(True):ret, frame = video_capture.read() if ret:cv2.imwrite(img_path + '%d.jpg' % count, frame)count += 1else:breakvideo_capture.release()print('视频图片保存成功, 共有 %d 张' % count)return fps
# 将视频中每一帧保存成图片
fps = transform_video_to_image(input_video, 'work/mp4_img/')

5.3 分析图片中的人体姿势, 并转换为皮影姿势,保存输出

def analysis_pose(input_frame_path, output_frame_path, is_print=True):'''分析图片中的人体姿势, 并转换为皮影姿势,输出结果'''file_items = os.listdir(input_frame_path)file_len = len(file_items)for i, file_item in enumerate(file_items):if is_print:print(i+1,'/', file_len, ' ', os.path.join(output_frame_path, file_item))combine_img = get_combine_img(os.path.join(input_frame_path, file_item))cv2.imwrite(os.path.join(output_frame_path, file_item), combine_img)
# 分析图片中的人体姿势, 并转换为皮影姿势,输出结果
analysis_pose('work/mp4_img/', 'work/mp4_img_analysis/', is_print=False)

5.4 合并图像到视频

def combine_image_to_video(comb_path, output_file_path, fps=30, is_print=False):'''合并图像到视频'''fourcc = cv2.VideoWriter_fourcc(*'MP4V')    file_items = os.listdir(comb_path)file_len = len(file_items)# print(comb_path, file_items)if file_len > 0 :temp_img = cv2.imread(os.path.join(comb_path, file_items[0]))img_height, img_width = temp_img.shape[0], temp_img.shape[1]out = cv2.VideoWriter(output_file_path, fourcc, fps, (img_width, img_height))for i in range(file_len):pic_name = os.path.join(comb_path, str(i)+".jpg")if is_print:print(i+1,'/', file_len, ' ', pic_name)img = cv2.imread(pic_name)out.write(img)out.release()
# 合并图像到视频
combine_image_to_video('work/mp4_img_analysis/', 'work/mp4_analysis.mp4', fps)
# 添加音频 mp4_analysis_result.mp4为最终输出文件
! ffmpeg -i work/mp4_analysis.mp4 -i  work/001.mp4 -c:v copy -c:a copy work/mp4_analysis_result.mp4 -y

OK, 最后我们得到动起来的皮影戏了!!!
在这里插入图片描述

四、总结

本文在弘扬传统文化同时,能让读者学习AI知识,体会到 PaddleHub 的强大, 可谓一举两得!

这篇关于人工智能学习之使用百度大脑在线AI Studio实现人体皮影戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/202635

相关文章

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统