找回密码
 立即注册
查看: 592|回复: 2

百度飞桨 paddlepaddle 初体验

[复制链接]

14

主题

0

回帖

57

积分

版主

积分
57
发表于 2023-5-4 18:41:24 | 显示全部楼层 |阅读模式
这几天报名参加了百度的免费培训 深度学习7日入门-CV疫情特辑,学到了好多东西,本来是有 Python 基础的,但是对算法不熟,磕磕绊绊的也都学了下来,感觉百度的 PaddlePaddle、PaddleHub、AI Studio 都还不错。
百度 AI Studio 深度学习平台是针对AI学习者的在线一体化开发实训平台。平台调集了AI教程, 深度学习样例工程, 各范围的经典数据集, 云端的超强运算及存储资源, 以及比赛平台和社区,从而解决学习者在AI学习过程中的一系列难题, 例如教程程度纷歧, 教程和样例代码难以衔接, 高质量的数据集不易获得, 以及当地难以使用大体量数据集进行模型训练。
PaddlePaddle安装文档 AI Studio 提供了免费的 CPU、GPU 运行环境,只不外 GPU 经常抢不到,只能本身当地安装,没有显卡的同学,最好还是本身买一个显卡,当地安装 PP 随时便利的进行学习。
重点说一下使用 PaddleHub 的模型进行图像措置。
PaddleHub是飞桨预训练模型打点和迁移学习东西,通过PaddleHub开发者可以使用高质量的预训练模型结合Fine-tune API快速完成迁移学习到应用部署的全流程工作。其提供了飞桨生态下的高质量预训练模型,涵盖了图像分类、方针检测、词法分析、语义模型、感情分析、视频分类、图像生成、图像分割、文本审核、关键点检测等主流模型。
一个简单的例子



比如上图 test_image.jpg,用下面两行代码即可完成对人体部件的识别
  1. $ hub run ace2p --input_path test_image.jpg
  2. $ hub run deeplabv3p_xception65_humanseg --input_path test_image.jpg
复制代码
下面是识别成果,可以看到头发、脸部、身体、四肢、都很好的识别出来。


视频措置

下面的代码参考自 Github
第一步:把视频所有帧转换成图片

这里使用了 cv2 这个库
  1. def CutVideo2Image(video_path, img_path):
  2.     """从视频中提取每一帧图像
  3.     """
  4.     cap = cv2.VideoCapture(video_path)
  5.     index = 0
  6.     while(True):
  7.         ret,frame = cap.read()
  8.         if ret:
  9.             cv2.imwrite('%s/%d.jpg' % (img_path, index), frame)
  10.             index += 1
  11.         else:
  12.             break
  13.     cap.release()
  14.     print('Video cut finish, all %d frame' % index)
复制代码
第二步:抠图
  1. def GetHumanSeg(in_path, out_path):
  2.     """抠图,把图片转换成只有任务的 png 格式
  3.     """
  4.     # load model
  5.     module = hub.Module(name="deeplabv3p_xception65_humanseg")
  6.     # config
  7.     frame_path = in_path
  8.     test_img_path = [os.path.join(frame_path, fname) for fname in os.listdir(frame_path)]
  9.     input_dict = {"image": test_img_path}
  10.     results = module.segmentation(data=input_dict, output_dir=out_path, use_gpu=True)
复制代码
第三步:给图片加上新的布景
  1. def BlendImg(fore_image, base_image, output_path):
  2.     """
  3.     将抠出的人物图像换布景
  4.     fore_image: 前景图片,抠出的人物图片
  5.     base_image: 布景图片
  6.     """
  7.     # 读入图片
  8.     base_image = Image.open(base_image).convert('RGB')
  9.     fore_image = Image.open(fore_image).resize(base_image.size)
  10.     # 图片加权合成
  11.     scope_map = np.array(fore_image)[:,:,-1] / 255
  12.     scope_map = scope_map[:,:,np.newaxis]
  13.     scope_map = np.repeat(scope_map, repeats=3, axis=2)
  14.     res_image = np.multiply(scope_map, np.array(fore_image)[:,:,:3]) + np.multiply((1-scope_map), np.array(base_image))
  15.    
  16.     #保留图片
  17.     res_image = Image.fromarray(np.uint8(res_image))
  18.     res_image.save(output_path)
复制代码
第四步:把图片帧合并成视频

cv2.VideoWriter 里面的 30.0 是视频的帧率,要按照原视频改一下,否则生成的视频时长会和本来纷歧样,下面的合并音频也会出问题。
  1. def CombVideo(in_path, out_path, size):
  2.     fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  3.     out = cv2.VideoWriter(out_path,fourcc, 30.0, size)
  4.     files = os.listdir(in_path)
  5.     for i in range(len(files)):
  6.         img = cv2.imread(in_path + '%d.png' % i)
  7.         out.write(img)#保留帧
  8.     out.release()
复制代码
还有一步

上一步合成的视频是没有声音的,接下来用 ffmpeg 抽取原视频的音频,合并到新的视频里
  1. # 提取音频为 audio.mp3
  2. ffmpeg -i video/原视频.flv video/audio.mp3
  3. # 合并第四步的成果 outpu.mp4 和 audio.mp3 最终文件为 final.mp4
  4. ffmpeg -i output.mp4 -i video/audio.mp3 -c copy video/final.mp4
复制代码
成果展示

图片对比:

原图:


抠图后:


添加绿幕布景:

视频对比:

唱、跳、Rap
https://www.zhihu.com/video/1232341090910187520
原视频 https://www.bilibili.com/vide...
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-5-4 18:41:56 | 显示全部楼层
啊啊啊蔡徐坤,啊啊啊[流泪][流泪]
回复

使用道具 举报

0

主题

1

回帖

14

积分

新手上路

积分
14
发表于 2023-5-4 18:42:41 | 显示全部楼层
PaddleHub比paddlex好在哪里呢?PaddleX也很方便。所谓的迁移学习,如果在paddlex上载入已经训练过的模型,不也是迁移学习吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|T9AI - 深度人工智能平台 ( 沪ICP备2023010006号 )

GMT+8, 2024-11-23 20:43 , Processed in 0.055422 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表