这次试了好几种不同的创意点,包括视频分类,视频换脸,风格转换等。虽然时间比较紧,但我还是体验到了来自于paddlehub的便捷性及创意的乐趣。
首先把项目地址放上:https://aistudio.baidu.com/aistudio/projectdetail/717604
项目的目的是希望将一幅人物图像转换成动画或者动漫风格,然后扣取出该人物,并融合到该动画或者动漫的视频或者背景图中。实现人物一键进入动画或者动漫的功能。
本项目分为四步: 第一步:将人物的面部关键点进行识别。第二步:艺术风格迁移,将人物的照片迁移到名侦探柯南风格; 第三步:图像分割,将名侦探柯南风格的人物图片从图像中提取出来; 第四步:图像融合,将提取的名侦探柯南风格的人物融合到一张名侦探柯南动画的背景图像中。
由于项目时间紧,所以后面的一些尝试基本以失败告终,本来想识别图片人物面部关键点,然后识别动画视频中主角名侦探柯南对应的关键点,然后做一个关键点的匹配映射,达到将动画人物的脸换成人脸的效果。没有实现这样的功能,只有退而求其次,把融合了动漫人物图像的人物照片放到动漫的每一幅背景图中,最后再将这些图进行拼接,达到替换的效果。
重点来说说本项目实现的第二三步,也参考了课上老师所讲的内容:
第2步:艺术风格迁移。模型使用的是PaddleHub里面的stylepro_artistic模块。该模型StyleProNet整体采用全卷积神经网络架构(FCNs),通过encoder-decoder重建艺术风格图片。StyleProNet的核心是无参数化的内容-风格融合算法Style Projection,模型规模小,响应速度快。模型训练的损失函数包含style loss、content perceptual loss以及content KL loss,确保模型高保真还原内容图片的语义细节信息与风格图片的风格信息。预训练数据集采用MS-COCO数据集作为内容端图像,WikiArt数据集作为风格端图像。
以下是图片读取的代码:
##第一步:利用stylepro_artistic实现艺术风格的转换
stylepro_artistic = hub.Module(name="stylepro_artistic")
results = stylepro_artistic.style_transfer(
images=[{
'content': cv2.imread('./humanseg_output/ndarray_time=1597282849943899.png'),
'styles': [cv2.imread('./humanseg_output/test.jpg')]
}],
alpha=0.8,
visualization=True)
##定义显示图像函数
def show_image(image_path):
img = mpimg.imread(image_path)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()
#转换风格图像显示
for result in results:
result_path = result['save_path']
print(result_path)
show_image(result_path)
接着是第3步,图像分割。模型使用的是PaddleHub里面的deeplabv3p_xception65_humanseg模块。DeepLabv3+ 是Google DeepLab语义分割系列网络的最新作,其前作有 DeepLabv1, DeepLabv2, DeepLabv3。在最新作中,作者通过encoder-decoder进行多尺度信息的融合,同时保留了原来的空洞卷积和ASSP层, 其骨干网络使用了Xception模型,提高了语义分割的健壮性和运行速率,在 PASCAL VOC 2012 dataset取得新的state-of-art performance。该PaddleHub Module使用百度自建数据集进行训练,可用于人像分割,支持任意大小的图片输入
图片分割的代码如下:
TP = 1
if TP:
image = cv2.imread('./transfer_result/ndarray_1597288076.684118.jpg')
# execute predict and print the result
# results = module.segmentation(data=input_dict)
results = module.segmentation(images=[image],
paths=None,
batch_size=1,
use_gpu=False, #是否使用cpu,通过gpu_place = fluid.CUDAPlace(0) os.environ["CUDA_VISIBLE_DEVICES"]="0" 来设置
visualization=True,
output_dir='humanseg_output')
for result in results:
print(result)
# # 预测结果展示
#test_img_path = "./humanseg_output/meditation.png"
test_img_path = './humanseg_output/ndarray_time=1597288379402358.png' #最新生成的图片在最小面,可以重命名为big2.png。后期可以优化重命名的代码。另外,经测试,该模型对动漫的分割效果有差异,有时候好,有时候很差
img_seg = mpimg.imread(test_img_path)
plt.figure(figsize=(10,10))
plt.imshow(img_seg)
plt.axis('off')
plt.show()
图像融合后最后获得的融合图像为:
通过这几次实验,发现PaddleHub对于新手来说非常不错,真的很方便简洁,尤其是对于直接想使用模型的人来说,免去了模型搭建及训练这一大块的工作,大大减少了代码量。
最后非常感谢@ybjason89老师,感谢百度深度学习师资训练营的这个机会,下来我会继续尝试将动画视频中的动漫人物替换成照片中的人物。
前排等奥特曼哈哈哈
有创意
非常有趣的项目。
只是小兰好不容易和柯南在月亮下面静静得看星星。。。