这次的时间还是比较紧的,主要探索了PaddleHub的一些集成功能,也参阅了一些其他人的代码。
项目的目的是希望将一幅人物图像转换艺术风格,然后扣取出该人物,并融合到另外一幅图中。都是图像处理里面非常常见的功能。
基于该考虑,分析功能。可将本项目分为三步: 第一步:艺术风格迁移,将马云的照片迁移到变形金刚风格; 第二步:图像分割,将变形金刚风格的马云从图像中提取出来; 第三步:图像融合,将提取的变形金刚风格的马云融合到一张联合国的图像中。
第一步:艺术风格迁移。模型使用的是PaddleHub里面的stylepro_artistic模块。该模型StyleProNet整体采用全卷积神经网络架构(FCNs),通过encoder-decoder重建艺术风格图片。StyleProNet的核心是无参数化的内容-风格融合算法Style Projection,模型规模小,响应速度快。模型训练的损失函数包含style loss、content perceptual loss以及content KL loss,确保模型高保真还原内容图片的语义细节信息与风格图片的风格信息。预训练数据集采用MS-COCO数据集作为内容端图像,WikiArt数据集作为风格端图像。
以下是图片读取的代码:
import paddlehub as hub
import cv2
import matplotlib.pyplot as plt
import matplotlib.image as image
##定义显示图像函数
def show_image(image_path):
img = image.imread(image_path)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()
##读取马云图像并显示
original="./data/my.jpg"
show_image(original)
##读取变形金刚图像并显示
style="./data/bxjg.jpg"
show_image(style)
先显示人物的照片:
再显示风格照片
以下是艺术风格转换的代码:
##第一步:利用stylepro_artistic实现艺术风格的转换
stylepro_artistic = hub.Module(name="stylepro_artistic")
results = stylepro_artistic.style_transfer(
images=[{
'content': cv2.imread(original),
'styles': [cv2.imread(style)]
}],
alpha=0.8,
visualization=True)
#转换风格图像显示
for result in results:
result_path = result['save_path']
show_image(result_path)
获得的转换风格的人物图像如下:
第二步:图像分割。模型使用的是PaddleHub里面的deeplabv3p_xception65_humanseg模块。DeepLabv3+ 是Google DeepLab语义分割系列网络的最新作,其前作有 DeepLabv1, DeepLabv2, DeepLabv3。在最新作中,作者通过encoder-decoder进行多尺度信息的融合,同时保留了原来的空洞卷积和ASSP层, 其骨干网络使用了Xception模型,提高了语义分割的健壮性和运行速率,在 PASCAL VOC 2012 dataset取得新的state-of-art performance。该PaddleHub Module使用百度自建数据集进行训练,可用于人像分割,支持任意大小的图片输入。
使用的代码如下:
#第二步:利用deeplabv3p_xception65_humanseg进行人像抠图
humanseg = hub.Module(name="deeplabv3p_xception65_humanseg")
results = humanseg.segmentation(
images=[cv2.imread(result_path)], visualization=True)
#抠图效果显示
for result in results:
tt_path=result['save_path']
show_image(tt_path)
进行抠图后的图像如下:
第三步:图像融合。这里主要是参阅其他人的代码,定义了一个图像融合的函数,效果整体来看还是不错的。
使用的代码如下:
#第三步:将变形金刚风格的马云融入到一张联合国的照片中
from PIL import Image
import numpy as np
def blend_images(fore_image, base_image):
# 读入图片
base_image = Image.open(base_image).convert('RGB')
fore_image = Image.open(fore_image).resize(base_image.size)
# 图片加权合成
scope_map = np.array(fore_image)[:, :, -1] / 255
scope_map = scope_map[:, :, np.newaxis]
scope_map = np.repeat(scope_map, repeats=3, axis=2)
res_image = np.multiply(scope_map, np.array(fore_image)[:, :, :3]) + np.multiply((1 - scope_map),
np.array(base_image))
# 保存图片
res_image = Image.fromarray(np.uint8(res_image))
res_image.save("./blend_res_img.jpg")
blend_images(tt_path,'./data/un.jpg')
show_image("./blend_res_img.jpg")
最后获得的融合图像为:
通过这个项目,发现PaddleHub真的很实用,尤其是对于直接想使用模型的人来说,免去了很多模型搭建的工作,大大减少了代码量。对于新手来说也很不错,可以快速了解深度学习的一些特点,快速上手,为后期模型的改进打下坚实的基础。
流啤了
风格转换
赞
AI Studio项目链接来一个呗~
可以 搞个项目
6哇!
强啊
帅
+1
确实
有意思