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

对,说的是我

小奖品

PaddleHub创意赛第二期又出来了,这次要做什么呢?

「人脸检测主题创意赛」,爱搞事的我肯定是少不了搞一波事情的,想想这能玩出什么花样来?

下班路上刷知乎,看见有人用dlib + 猫脸检测器 + 泊松融合实现了抖音猫脸人嘴的特效,瞬间……

程序主要结合PaddleHub的人脸关键点模型截取人嘴位置,opencv猫脸检测器定位猫脸(没找到猫脸关键点检测模型)和opencv泊松融合函数实现图像的融合,共三部分。猫脸人嘴视频效果,一睹为快。

人脸关键点检测

PaddleHub关键点检测模型face_landmark_localization,该模型转换自 https://github.com/lsy17096535/face-landmark ,支持同一张图中的多个人脸检测。它可以识别人脸中的68个关键点。

「NOTE:」 如果您在本地运行该项目示例,需要首先安装PaddleHub。如果您在线运行,可以去底部阅读原文的百度AI Studio fork该项目。之后按照该示例操作即可。

用《青春有你2》的小姐姐们测试一下。

import cv2
import paddlehub as hub
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import math
%matplotlib inlinesrc_img = cv2.imread('images/youngni2.jpg')module = hub.Module(name="face_landmark_localization")
result = module.keypoint_detection(images=[src_img])tmp_img = src_img.copy()
for face in result[0]['data']:for index, point in enumerate(face):# print(point)# 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=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()

人脸关键点检测结果

猫脸检测

猫脸检测使用OpenCV自带的猫脸检测器(感觉喵星人真的是要统治世界了????),主要通过detectMultiScale函数对图像金字塔进行多尺度检测。

import cv2
import numpy as np# 猫脸检测器
cat_path = "haarcascade_frontalcatface_extended.xml"
facecascade = cv2.CascadeClassifier(cat_path)cat = cv2.imread('cat3.jpg')cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_face_loc = facecascade.detectMultiScale(cat_gray,scaleFactor = 1.1,minNeighbors=3,minSize=(100,100),flags=cv2.CASCADE_SCALE_IMAGE)
cat_face_loc = np.array(cat_face_loc[0])
# 猫嘴中心位置
center = (int(cat_face_loc[0] + cat_face_loc[2] / 2), int(cat_face_loc[1] + cat_face_loc[3]*0.8))cv2.rectangle(cat, (cat_face_loc[0], cat_face_loc[1]), (cat_face_loc[0] + cat_face_loc[2], cat_face_loc[1] + cat_face_loc[3]), (0, 255, 0), 2, 8)
cv2.circle(cat, center, 2,  (0, 0, 255), 3)
cv2.imwrite('cat_face.jpg', cat)
cv2.imshow('result', cat)
cv2.waitKey(0)

猫脸检测结果

泊松融合

泊松融合是2004年论文《Poisson Image Editing》提出的方法,已经集成在OpenCV中,函数名为:seamlessClone()

泊松融合是将一个源图融合到目标图像中,放置位置根据目标图像中P点为中心的一个前景mask大小范围内。融合过程会改变源图像中颜色以及梯度,实现无缝融合效果,具体算法可以去看论文或者文末参考文献。

论文截图

话不多说,下面用代码实现将人眼贴到手心上,人眼mask没有很精准,效果一般,胆小勿看????

import cv2
import numpy as nphand = cv2.imread('hand.jpg')
eye = cv2.imread('eye.jpg')
h, w, c = eye.shape
mask = np.ones((h, w, c)) * 255center = (hand.shape[1] // 2 + 50, hand.shape[0] // 2 + 250)
normal_clone = cv2.seamlessClone(eye, hand, mask.astype(eye.dtype), center, cv2.NORMAL_CLONE)
cv2.imwrite('res.jpg', normal_clone)
cv2.imshow('res', normal_clone)
cv2.waitKey(0)

综合上面三部分,我们可以将人嘴定位并截取融合到猫脸嘴巴位置,由于检测视频中猫脸会出现漏检情况,效果不是很好(找一只不爱动的猫片实在太难了),于是我用了一张静态的图片进行替换,另外唱歌视频也来自网络。

import cv2
import numpy as np
import paddlehub as hub# 人脸关键点检测器
module = hub.Module(name="face_landmark_localization")
# 猫脸检测器
cat_path = "data/model/haarcascade_frontalcatface_extended.xml"
facecascade = cv2.CascadeClassifier(cat_path)cat = cv2.imread('data/images/cat3.jpg')
cat_gray = cv2.cvtColor(cat, cv2.COLOR_BGR2GRAY)
cat_face_loc = facecascade.detectMultiScale(cat_gray, scaleFactor=1.1, minNeighbors=3, minSize=(100, 100),flags=cv2.CASCADE_SCALE_IMAGE)
cat_face_loc = np.array(cat_face_loc[0])
# 猫嘴中心位置
center = (int(cat_face_loc[0] + cat_face_loc[2] / 2), int(cat_face_loc[1] + cat_face_loc[3] * 0.8))def human_mouth_paste_to_cat(human_frame, cat_frame):result = module.keypoint_detection(images=[human_frame])landmarks = result[0]['data'][0]landmarks = np.array(landmarks, dtype=np.int)mouth_landmark = landmarks[48:, :]# 扩个边border = 8mouth = human_frame[int(np.min(mouth_landmark[:, 1])) - border: int(np.max(mouth_landmark[:, 1]) + border),int(np.min(mouth_landmark[:, 0])) - border: int(np.max(mouth_landmark[:, 0])) + border, :]mouth_landmark[:, 0] -= (np.min(mouth_landmark[:, 0]) - border)mouth_landmark[:, 1] -= (np.min(mouth_landmark[:, 1]) - border)# 制作用于泊松融合的maskmask = np.zeros((mouth.shape[0], mouth.shape[1], 3)).astype(np.float32)for i in range(mouth_landmark.shape[0]):  # 先画线cv2.line(mask, (mouth_landmark[i, 0], mouth_landmark[i, 1]), (mouth_landmark[(i + 1) % mouth_landmark.shape[0], 0], mouth_landmark[(i + 1) % mouth_landmark.shape[0], 1]),(255, 255, 255), 10)mask_tmp = mask.copy()for i in range(6, mask.shape[0] - 6):  # 将线内部的范围都算作mask=255for j in range(6, mask.shape[1] - 6):if (np.max(mask_tmp[:i, :j, :]) == 0 or np.max(mask_tmp[i:, :j, :]) == 0 or np.max(mask_tmp[:i, j:, :]) == 0 or np.max(mask_tmp[i:, j:, :]) == 0):mask[i, j, :] = 0else:mask[i, j, :] = 255normal_clone = cv2.seamlessClone(mouth, cat_frame, mask.astype(mouth.dtype), center, cv2.NORMAL_CLONE)return normal_clone# 合成视频
human_video_cap = cv2.VideoCapture("data/video/human2.mp4")
fourcc = cv2.VideoWriter_fourcc('m', 'p', '4', 'v')
video_writer = cv2.VideoWriter('cat_with_humanmouth2.MP4', fourcc, 25, (1080, 2340))index = 0
while True:index += 1human_ret, human_frame = human_video_cap.read()if human_ret:human_frame = cv2.resize(human_frame, dsize=None, fx=2, fy=2)cat_with_human_mouth = human_mouth_paste_to_cat(human_frame, cat)video_writer.write(cat_with_human_mouth.astype(np.uint8))# cv2.imwrite("frame/%d.jpg" % index, cat_with_human_mouth)else:breakvideo_writer.release()

输出效果看文章最前面视频,音频是后来自己加上的。

参考:

  1. 猫脸人嘴:https://zhuanlan.zhihu.com/p/61590075

  2. Seamless cloning泊松克隆: https://blog.csdn.net/hjimce/article/details/45716603

  3. opencv猫脸检测器:

    https://github.com/opencv/opencv/tree/master/data/haarcascades

往期阅读

  • PaddleHub人像分割模型:AI人像抠图及图像合成

  • 【推荐】一下令人惊艳的的网站,绝对会让你爱上历史

  • 蹭一波热度,对《青春有你2》109位漂亮小姐姐下手了

  • Scrapy爬取姓名大全,看看那个名字最受父母青睐

  • PyTorch模型微调:汽车图片分类

长按二维码关注我们

有趣的灵魂在等你

戳“阅读原文”看AI Studio原项目,为我增加人气!!!

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

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

    百度AIStudio之PaddleHub创意赛:你的名字,你的Face 使用<你的名字>动漫中的图片拼出你的人脸.本项目为 PaddleHub:人脸检测主题创意赛.实现自动检测人脸,然后实 ...

  2. 飞桨创意赛火热进行中,总有一款AI时代Chatbot适合你

    点击左上方蓝字关注我们 PaddlePaddle × Wechaty × Mixlab 创意赛再升级!人工智能时代的ChatBot需要具备哪些能力?由你来定义!参赛的小伙伴们果然各显神通,快来pick ...

  3. 五分钟快速搭建一个实时人脸口罩检测系统(OpenCV+PaddleHub 含源码)

    导读 本文主要介绍如何使用OpenCV和PaddleHub实现一个实时人脸口罩检测系统.(公众号:OpenCV与AI深度学习) 背景介绍 从19年疫情爆发到现在,佩戴口罩对大家来说已是常态.应运而生的 ...

  4. 中国东极岛,“挑战吧净味君第二季之一级带货王”巅峰成团赛,名单揭晓!

    618零点钟声敲响,万人疯抢,千挑万选的心仪好物瞬间被抢光是什么感受?不让用户重复这的"悲惨"经历,剁手的速度慢人一步!美的冰箱发起了"挑战吧净味君第二季",爆 ...

  5. 乐山计算机学校新歌王,星歌王第二季乐山市计算机学校专场赛决赛完美落幕!...

    原标题:星歌王第二季乐山市计算机学校专场赛决赛完美落幕! 此前,为进一步建设各高校校园文化.丰富校园生活,中国校园星歌王组委会再次走进乐山市计算机学校,一场集专业.规模.权威于一体的校园音乐赛事就此开 ...

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

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

  7. 旁观天使湾Demo Day第二季:创意亮闪闪,运营苦哈哈

    6月2日,杭州人的特有的节日之一."62″在杭州土话里,是笨蛋的意思.也许有激情的笨蛋才可能在这波移动互联网时代掘金.反正在这个很适合一起2的日子,庞小伟找了个很有情调的山庄,让他的天使湾d ...

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

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

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

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

最新文章

  1. puppet(1.7-2.1)
  2. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地
  3. ActiveMQ –经纪人网络解释–第5部分
  4. 分布式计算 MapReduce与yarn工作机制
  5. Android Service LifeCycle
  6. 有线网卡驱动_WDS如何为boot.wim或install.wim添加驱动
  7. redis+php微博,redis+php实现微博(三)微博列表功能详解
  8. JS:ES6-2 const 关键字
  9. “加密解密专区”的“滚动”广告太老了
  10. 2019php面试题
  11. Atitit.guice3 ioc 最佳实践 o9o
  12. [软件更新]LeadBBS 6.0正式发布(更新日志和下载)
  13. 利用匈牙利法求解指派问题
  14. 计算机桌面我是电脑丢失,计算机修改用户后,桌面文件丢失. 电脑桌面
  15. Android用户注册界面设计
  16. 使用EXCEL计算并绘制RSI指标
  17. python输出集合中的所有子集_python列出集合中所有子集
  18. 用WeX5制作PPT
  19. Cocos2dx游戏开发系列笔记7:一个简单的跑酷游戏《萝莉快跑》的消化(附下载)
  20. 合理利用for循环遍历查找数据库数据

热门文章

  1. 串行异步通信_单片机串行口介绍
  2. 计算机视觉招聘_香港理工大学人工智能设计实验室科研招聘
  3. 学会对mysql的增删改查_Go实现对MySQL的增删改查
  4. C语言main()函数详解
  5. C语言数组清空的几种方法比较
  6. VC导入导出二维数组到 .txt
  7. SQLite学习手册(锁和并发控制)
  8. Java基础day17
  9. tensorflow随笔 -QueueRunner
  10. 【机器学习】机器学习实践中的 7 种常见错误