百度PaddlePaddle飞浆实现多图像人像抠图

文章目录

  • 前言
  • 一、程序整体流程
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
    • 3.显示图像
    • 4.调用飞浆训练模型
    • 5.显示抠图后的图像
    • 5.完整代码
  • 总结


前言

安装了很久的百度飞浆终于安装好了,这心情是真的激动啊,所以迫不及待的就想做点什么事情。这不,来了。


一、程序整体流程

  1. 获取需要抠图的图像文件地址
  2. 显示所有原图像
  3. 调用飞浆的deeplabv3p_xception65_humanseg模型 该模型能够用于人像抠图
  4. 存储抠图人像(方便保存数据,也可下载图像)
    废话就不说了具体的看下面:

二、使用步骤

1.引入库

代码如下(示例):
没安装的库赶紧安装,不然跑不起来:
pip install 库名称(安装库)
百度飞浆库安装指南

import os
import paddlehub as hub
import numpy as np
import cv2
import matplotlib.pyplot as plt

2.读入数据

代码如下(示例):

# 因为用到了matplotlib显示中文 所以加上这两句避免显示乱码
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 图像文件目录地址
path = r'./img/'
# 遍历获取每张图像的地址
files = [path + i for i in os.listdir(path)]

3.显示图像

代码如下(示例):

# 创建画布  定义大小
plt.figure(figsize=(8, 6))
# 遍历获取每张图像数据
for i, img_fine in enumerate(files):
    # 通过opencv获取图像数据并添加到列表
    img.append(cv2.imread(img_fine))
    # 由于opencv打开的图像格式为BGR 所以需要转换为RGB格式
    img[i] = cv2.cvtColor(img[i], cv2.COLOR_BGR2RGB)
    # 显示图像大小
    # print(img[i].shape)
    # 创建子视图
    plt.subplot(2, len(files), i + 1)
    # 显示图像
    plt.imshow(img[i])
    plt.title("原图")

4.调用飞浆训练模型

代码如下(示例):

# 调用飞浆的deeplabv3p_xception65_humanseg模型 该模型能够用于人像抠图
module = hub.Module(name="deeplabv3p_xception65_humanseg")
# 图像地址 (固定格式,不要更改)
input_dict = {"image": files}
# 训练模型并预测模型,打印结果(获取到抠图人像)
results = module.segmentation(data=input_dict)

5.显示抠图后的图像

代码如下(示例):

newimgs = []
for i in range(len(files)):
    # 提取抠图人像数据
    prediction = results[i]["data"]
    # 显示抠图后的轮廓图像
    # plt.imshow(prediction)
    # 根据图像成像还原数据(具体原理我也不知道)
    newimg = np.zeros(img[i].shape)
    newimg[:, :, 0] = img[i][:, :, 0] * (prediction > 0)
    newimg[:, :, 1] = img[i][:, :, 1] * (prediction > 0)
    newimg[:, :, 2] = img[i][:, :, 2] * (prediction > 0)

    # 添加到列表 newimg.astype(np.uint8)修改数据类型为uint8
    newimgs.append(newimg.astype(np.uint8))
    # 显示图像
    plt.subplot(2, len(files), i + 1 + len(files))
    plt.imshow(newimgs[i])
    plt.xlabel("抠图后图像")

5.完整代码

代码如下(示例):

import os
import paddlehub as hub
import numpy as np
import cv2
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

# 获取需要抠图的图像文件地址
# 图像文件目录地址
path = r'./img/'
# 遍历获取每张图像的地址
files = [path + i for i in os.listdir(path)]

# 显示所有原图像
# 保存图像数据列表
img = []
# 创建画布  定义大小
plt.figure(figsize=(8, 6))
# 遍历获取每张图像数据
for i, img_fine in enumerate(files):
    # 通过opencv获取图像数据并添加到列表
    img.append(cv2.imread(img_fine))
    # 由于opencv打开的图像格式为BGR 所以需要转换为RGB格式
    img[i] = cv2.cvtColor(img[i], cv2.COLOR_BGR2RGB)
    # 显示图像大小
    # print(img[i].shape)
    # 创建子视图
    plt.subplot(2, len(files), i + 1)
    # 显示图像
    plt.imshow(img[i])
    plt.title("原图")


# 调用飞浆的deeplabv3p_xception65_humanseg模型 该模型能够用于人像抠图
module = hub.Module(name="deeplabv3p_xception65_humanseg")
# 图像地址 (固定格式,不要更改)
input_dict = {"image": files}
# 训练模型并预测模型,打印结果(获取到抠图人像)
results = module.segmentation(data=input_dict)

# 列表存储抠图人像(方便保存数据,也可下载图像)
newimgs = []
for i in range(len(files)):
    # 提取抠图人像数据
    prediction = results[i]["data"]
    # 显示抠图后的轮廓图像
    # plt.imshow(prediction)
    # 根据图像成像还原数据(具体原理我也不知道)
    newimg = np.zeros(img[i].shape)
    newimg[:, :, 0] = img[i][:, :, 0] * (prediction > 0)
    newimg[:, :, 1] = img[i][:, :, 1] * (prediction > 0)
    newimg[:, :, 2] = img[i][:, :, 2] * (prediction > 0)

    # 添加到列表 newimg.astype(np.uint8)修改数据类型为uint8
    newimgs.append(newimg.astype(np.uint8))
    # 显示图像
    plt.subplot(2, len(files), i + 1 + len(files))
    plt.imshow(newimgs[i])
    plt.xlabel("抠图后图像")

# 总图像显示(少了这个就没图像了,千万别少了)
plt.show()

效果

百度PaddlePaddle飞浆实现多图像人像抠图_第1张图片


总结

本次学习其实还有很不足,我们还可以继续改进,这也算是不用低成本学习图像处理了。我也借鉴了很多文章,最好的一篇是sansa666的,也非常感谢百度飞浆的开源学习。

你可能感兴趣的:(开源项目,OpenCV,paddlepaddle,百度,opencv)