百度AIStudio之PaddleHub创意赛:你的名字,你的Face

使用《你的名字》动漫中的图片拼出你的人脸。本项目为 PaddleHub:人脸检测主题创意赛。实现自动检测人脸,然后实现人脸拼接。
本次主要使用 PaddleHub 开源的人脸关键点检测模型 face_landmark_localization进行人体关键点识别。
关键点识别参考案例:PaddleHub实战——人像美颜。
之后再以 RGB 颜色均值为标准进行人脸拼图。
NOTE: 本项目在百度AIStudio实现,如果需要在本地运行该项目示例,首先要安装PaddleHub。

其中 face_landmark_localization 使用1.0.2版。
paddlepaddle 环境为1.6.2。
paddlehub 版本为1.6.1。

本项目github链接:luoshutu/YourNameYourFace
百度AIStudio链接:你的名字,你的face

2020-4-28更新 :基于 @意疏 的意见,添加了一些关键性注释,和参数的优化。
其中最大改动为删除了 single_image_area参数以及相关代码。
注:博客和GitHub中的代码在环境配置正确的情况下,只需添加自己的图片链接,就可以在本地直接运行成功。

一、加载图片,检测关键点

使用PaddleHub 开源的人脸关键点检测模型 face_landmark_localization ,检测人脸关键点,并将关键点以红色点状的方式画在原图上,保存并显示。
import cv2
import paddlehub as hub
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import mathsrc_img = cv2.imread('single_face.jpg')module = hub.Module(name="face_landmark_localization")
detection_result = module.keypoint_detection(images=[src_img])tmp_img = src_img.copy()
for index, point in enumerate(detection_result[0]['data'][0]):# cv2.putText(img, str(index), (int(point[0]), int(point[1])), cv2.FONT_HERSHEY_COMPLEX, 3, (0,0,255), -1)cv2.circle(tmp_img, (int(point[0]), int(point[1])), 2, (0, 0, 255), -1)res_img_path = 'face_landmark.jpg'
cv2.imwrite(res_img_path, tmp_img)img = mpimg.imread(res_img_path)
# 展示预测68个关键点结果plt.figure(figsize=(8,8))
plt.imshow(img)
plt.axis('off')
plt.show()

二、准备图片数据集

解压步骤在百度AIStudio环境下每次重启环境都需要重新解压。若在本地运行该项目,就不需要解压步骤,给出自己的图片路径即可。
'''
# 解压图片
import zipfilepath_zip = "./data/data31722/your_name.zip" # 所需图片的存放路径
z = zipfile.ZipFile(path_zip, "r")   # 读取zip文件
num_Image = len(z.namelist()) - 1    # 总的图片数量# 数据解压
path_Image = './data/'
#with zipfile.ZipFile(path_zip, 'r') as zin:
#    zin.extractall(path_Image)
'''
path_Images =  './data/your_name/out'  # 图片集路径
num_Image = 638    # 总的图片数量  # 在本地运行时,按自己需要改变

三、组合图片

计算所有数据集中图片的特征向量,以 R/G/B 三个通道分别求平均值构成一个三维的特征向量。

注:在下面代码中,为了尝试更好看的效果,只计算了其中一个通道的特征


# 参数定义每张图片最后最短边所占的像素长度
single_image_len = 10
#7,13# 压缩图像至固定大小
def pic_compression(src_pic):target_high = src_pic.shape[0]target_weight = src_pic.shape[1]if target_high < target_weight:target_weight = np.ceil(target_weight / (target_high / single_image_len))target_high = single_image_lenelse:target_high = np.ceil(target_high / (target_weight / single_image_len))target_weight = single_image_lenreturn cv2.resize(src_pic,(int(target_weight),int(target_high))), target_high, target_weight# 计算图像的RGB特征
feature_dim = 3 # 特征维度 R、G、B 共三维
pic_feature = np.zeros([num_Image,feature_dim]) # 特征向量
for indexImg in range(3,num_Image+3-1):  # 图片索引由3开始path_pic = path_Images + str(indexImg) +'.png' # 获取每张图片的地址pic = cv2.imread(path_pic)pic_comed,th,tw = pic_compression(pic.copy()) # 计算得到压缩图像# 在此尝试只计算单通道的特征# for idx in range(0,feature_dim):for idx in range(0,3):          pic_feature[indexImg-3,idx] = np.average(pic_comed[:-1,:-1,idx])print(th,tw)
取出目标区域
对检测到的关键点坐标值做一个大小判断,取出待重组的图像区域,为一个包含面部的矩形局域。
points = np.mat(detection_result[0]['data'][0])
# 获取待重组的矩形局域的两个坐标值
point_a = np.floor(np.amin(points, axis=0))
point_d = np.ceil(np.amax(points, axis=0))# 抠出待组合区域图像
left_p = int(point_a[0, 0])
right_p = int(point_d[0, 0])
top_p = int(point_a[0, 1])
bottom_p = int(point_d[0, 1])
# 得到目标图像
temp_Image = src_img.copy()
ROI_Image = temp_Image[top_p:bottom_p, left_p:right_p]
计算脸部各块的RGB特征并贴图
block_feature = np.zeros(feature_dim) # 每一图块的特征
blo_fea_buff = np.zeros(num_Image)  # 缓存每一图块特征到所有图片特征的欧式距离值
for idx_i in range(0, len(ROI_Image)-int(th), int(th)):for idx_j in range(0, len(ROI_Image[1])-int(tw), int(tw)):# 在此尝试只计算单通道的特征# for idx in range(0,feature_dim):for idx in range(2,3):block_feature[idx] = np.average(ROI_Image[idx_i:idx_i+int(th),idx_j:idx_j+int(tw),idx])for img_idx in range(0,num_Image):blo_fea_buff[img_idx] = np.linalg.norm(block_feature - pic_feature[img_idx])pic_idx = np.argmin(blo_fea_buff) + 3 # 获取到最小欧式距离的图片索引path_pic = path_Images + str(int(pic_idx)) +'.png'pic = cv2.imread(path_pic)pic_comed,_,_ = pic_compression(pic.copy()) # 计算得到压缩图像ROI_Image[idx_i:idx_i+int(th),idx_j:idx_j+int(tw)] = pic_comed
将重组得到的脸按形状贴到原图上
def mask(image, face_landmark):"""image: 人像图片face_landmark: 人脸关键点"""image_cp = image.copy()hull = cv2.convexHull(face_landmark)cv2.fillPoly(image, [hull], (0, 0, 0))for idx_i in range(top_p,bottom_p):for idx_j in range(left_p,right_p):if (image[idx_i, idx_j] == [0,0,0]).all():image[idx_i, idx_j] = ROI_Image[idx_i - top_p,idx_j - left_p]#cv2.drawContours(image, [hull], -1, ROI_Image, -1)#cv2.addWeighted(image, 0.2, image_cp, 0.9, 0, image_cp)return image# 获取人脸关键点数据,和原始图像
face_landmark = np.array(detection_result[0]['data'][0], dtype='int')
result_image = mask(src_img.copy(), face_landmark)cv2.imwrite('result.jpg', result_image)img = mpimg.imread('result.jpg')
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()

由于贴图数量不足,故显示效果不是很理想,有大量重复照片。有待改进。

2020-4-28:
改变最后图片所占像素大小,以及特征向量的类别。产生一些更有意思的图片。

下图为每小图7个像素高,只使用第一个通道的颜色特征来计算欧式距离。


总结

早在年初的时候,导师就给我们分享了飞桨的B站直播课程。不过起初忙于项目,并未在意。后来项目进展遇到瓶颈,就想继续学习人工智能。本是去学习换脸教程,想去蹭google的资源,可属实不方便。就想着看看国内有什么相似的平台,然后就发现了AIStudio。于是开始学习基础,趁此就报名了这个新手比赛。同时还参加了AIStudio的基础教学课程,七日打卡营。不得不说,这种产学研的方式着实方便了大众了。比赛和课程主要是为了熟悉这个平台和PaddleHub的使用,PaddleHub是飞桨(PaddlePaddle)一个预训练模型管理工具。我们可以自己开发模型并发布,但最重要的是我们可以通过它很方便的使用其它开发者预训练好的模型,这极大的简化了开发者对于AI开发的基本模型的训练以及维护的工作量。使得开发者可以把更多的精力和时间放在AI的应用与创意之上。比如本次参加的人脸识别创意赛就是如此,实现人脸关键点识别只需两三句代码就足够了,大家的重心自是放在了创意上。这自然给了我们极大的便利。

百度AIStudio之PaddleHub创意赛:你的名字,你的Face相关推荐

  1. Paddlehub创意赛---给人像增加背景

    Paddlehub创意赛---给人像增加背景 Paddlehub创意赛 首先配置环境 导入相关的库 展示原图 使用Paddlehub进行抠图操作 关键点检测 合并背景 Paddlehub创意赛总结 P ...

  2. (记录)PaddleHub创意赛:AI人像抠图及图像合成

    文章目录 PaddleHub创意赛:AI人像抠图及图像合成 一.安装环境(这里面有几个坑) 二.接下来就``开始P图 1. 引入包 2. 加载预训练模型(挺厉害的不得不说) 3. 图像合成 Paddl ...

  3. paddlehub创意赛《王者四大美女--红昭愿》

    楔子 西施沉鱼自苎萝 当为复越首功臣 昭君落雁出边塞 一平烽火即五旬 貂蝉月下邀对酌 离间巧计除奸恶 玉环香消马嵬坡 舍身为国安大唐----<王者四大美女–红昭愿> 目的 将b站很火的4小 ...

  4. 【PaddleHub创意赛】APP评论情感分析

    项目链接 无意中测试了一下paddlehub的情感分析的(唯一的三分类模型)预训练模型emotion_detection_textcnn,发现英文的准确度好像没有中文高? 同一句话的中英文测试: im ...

  5. 创意赛第二季又来了,PaddleHub人脸关键点检测实现猫脸人嘴特效

    前段时间,下班后闲来无事,参加了百度PaddleHub的AI人像抠图创意赛,凭借着大家的阅读量,获得了一个第三名,得了一个小度音响,真香啊! 对,说的是我 小奖品 PaddleHub创意赛第二期又出来 ...

  6. 首届中国高校计算机大赛-人工智能创意赛启动,百度加盟全面赋能

    6 月 11 日,2018 首届中国高校计算机大赛-人工智能创意赛正式启动.本次竞赛由教育部高等学校计算机类专业教学指导委员会.教育部高等学校软件工程专业教学指导委员会.教育部高等学校大学计算机课程教 ...

  7. Mixlab 【AI创造营】 百度飞桨创意赛 参赛项目介绍

    Mixlab [AI创造营] 百度飞桨创意赛 参赛项目介绍 项目名称 个性图腾-灵魂使者 Stand by me 作品简介 Jojo立的具象版,从此路人也能看到灵魂使者了! 不用再担心你熊熊燃烧的中二 ...

  8. Metaverse启动机之重构现世,AI创造营创意赛开启

    ibrandup @shadow 听说最近又有好玩的竞赛啦? Metaverse启动机 2021.7.9 AI创造营 创意赛正式发布 近日,由百度大脑AI Studio平台发布,PaddlePaddl ...

  9. PaddleHub创意项目-制作证件照(抠图换底美颜)

    PaddleHub创意项目-制作证件照(抠图换底美颜) 经过三个星期的百度架构师手把手带你零基础实践深度学习,对paddle有了一定了解,现在利用PaddleHub实践一个对图像进行抠图换底加美颜的小 ...

最新文章

  1. 计算机技术在本专业方面的论文,计算机技术专业论文
  2. Hadoop中-put和-copyFromLocal的区别
  3. 1096 Consecutive Factors (20 分)【难度: 一般 / 爆搜 数论】
  4. PHP——smarty模板(第一天)
  5. java webservice https_WebService的HTTPS访问——解决PKIX错误 | 字痕随行
  6. 不抛弃,不放弃@《士兵突击》
  7. 数据结构与算法专题——第九题 外排序
  8. RocketMQ源码解析-PushConsumer(2)
  9. matlab 人脸识别_MATLAB基于PCALDA模糊神经网络的人脸识别
  10. C#教程第四课:循环控制语句
  11. bch编码c语言有库么,BCH码的译码方法与流程
  12. 安装cmsv7的具体方法
  13. 泛微协同办公平台E-cology8.0版本后台维护手册--组织权限中心
  14. 如何利用matlab做BP神经网络分析(利用matlab神经网络工具箱)
  15. pvp服务器有什么项目,N服PVP服率先回归!压测后未来3-4周正式开服
  16. 【ShaderLab实例笔记】Overwatch Shield - 守望先锋护盾特效制作笔记
  17. http状态码查询表(转载)
  18. python 提取sogou中文语料库
  19. 搭建Centos ,配置网络 以及换源
  20. 【22物联网国赛样题】zigbee点对点呼吸灯,按键长按双击效果,物联网竞赛今年历年国赛样题真题代码

热门文章

  1. optimize求解非线性方程组求解
  2. Android笔记之Android基本控件布局与Activity的生命周期
  3. 风铃发卡网源码最新版-可商用,支持个人码支付,当面付
  4. ios 短信验证码自动填充时总是被复制两遍
  5. linux 软路由 中文,Linux 软路由性能测试及分析-Go语言中文社区
  6. c语言程序报告样例,C语言个人实习报告定稿(样例3)
  7. 特殊的一篇日志——介绍一位大牛Matrix67
  8. 从高通5G最新进展说起,揭秘5G背后的连接技术
  9. php搜索功能实现,PHP 搜索查询功能实现
  10. java webservice调用方式_java语言使用post方式调用webService方式