项目简介:

本项目通过AI Studio(基于百度深度学习平台飞桨的人工智能学习与实训社区,提供在线编程环境、免费GPU算力、海量开源算法和开放数据,帮助开发者快速创建和部署模型)运行。
感兴趣的小伙伴欢迎访问Fork:https://aistudio.baidu.com/aistudio/projectdetail/750941
随着拍照技术的进步,人们对照片的要求越来越高。慢慢的也出现了一些搞怪照片。本项目实现通过输入一张人像图片,输出该人像的黑板简笔画
主要技术就是人脸关键点检测。通过PaddleHub已经开源了的人脸关键点检测模型face_landmark_localization。人脸关键点检测是人脸识别和分析领域中的关键一步,它是诸如自动人脸识别、表情分析、三维人脸重建及三维动画等其它人脸相关问题的前提和突破口。该模型转换自 https://github.com/lsy17096535/face-landmark ,支持同一张图中的多个人脸检测。它可以识别人脸中的68个关键点。 本项目先通过PaddleHub已经开源了的人脸关键点检测模型获取人脸的关键点数据,再通过这些数据对图像进行加工,得到人脸黑板简笔画。
效果图:

PaddleHub简介

PaddleHub是飞桨生态的预训练模型应用工具,开发者可以便捷地使用高质量的预训练模型结合Fine-tune API快速完成模型迁移到部署的全流程工作。PaddleHub提供的预训练模型涵盖了图像分类、目标检测、词法分析、语义模型、情感分析、视频分类、图像生成、图像分割、文本审核、关键点检测等主流模型。更多详情可查看PaddleHub官网:https://www.paddlepaddle.org.cn/hub
PaddleHub以预训练模型应用为核心具备以下特点:
1.模型即软件: 通过Python API或命令行实现模型调用,可快速体验或集成飞桨特色预训练模型。
2.易用的迁移学习: 通过Fine-tune API,内置多种优化策略,只需少量代码即可完成预训练模型的Fine-tuning。
3.一键模型转服务: 简单一行命令即可搭建属于自己的深度学习模型API服务完成部署。
4.自动超参优化: 内置AutoDL Finetuner能力,一键启动自动化超参搜索。

具体实现

#第一步当然是先安装paddlehub

!pip install paddlehub==1.6.2 -i https://pypi.tuna.tsinghua.edu.cn/simple

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

import cv2
import paddlehub as hub
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import math
#读取图片
src_img = cv2.imread('./test_sample.jpg')
#加载paddlehub模型并通过API一键检测
module = hub.Module(name="face_landmark_localization")
result = module.keypoint_detection(images=[src_img])
print(result)
[{'data': [[[159.30455017089844, 161.5406951904297], [155.98448181152344, 184.37612915039062], [154.5143280029297, 208.08456420898438], [154.6251678466797, 230.1551513671875], [159.8415069580078, 251.63644409179688], [170.23049926757812, 269.10223388671875], [183.05865478515625, 284.2024230957031], [197.1408233642578, 297.01708984375], [212.1311798095703, 304.223876953125], [230.02288818359375, 304.36151123046875], [245.18296813964844, 294.80810546875], [261.17095947265625, 285.1965637207031], [275.7255859375, 272.9986572265625], [285.30010986328125, 255.3640899658203], [292.5657958984375, 237.26429748535156], [299.53167724609375, 218.2264404296875], [303.8143005371094, 197.93377685546875], [177.11863708496094, 159.6382598876953], [189.80667114257812, 152.68289184570312], [204.3644256591797, 153.25462341308594], [218.6627197265625, 159.93360900878906], [231.54922485351562, 168.79400634765625], [255.30337524414062, 174.5740966796875], [267.5892028808594, 172.73550415039062], [279.8527526855469, 172.29034423828125], [291.8857727050781, 177.07102966308594], [299.7391357421875, 186.96981811523438], [239.76458740234375, 188.27572631835938], [237.51950073242188, 203.3531494140625], [234.79452514648438, 217.11427307128906], [232.12869262695312, 232.10086059570312], [215.5321044921875, 234.42172241210938], [222.65936279296875, 239.46875], [229.46038818359375, 243.06199645996094], [236.44935607910156, 242.30455017089844], [243.56353759765625, 241.25534057617188], [191.2951202392578, 176.21156311035156], [201.5207061767578, 174.5267333984375], [212.24559020996094, 178.12451171875], [218.42420959472656, 187.4755401611328], [208.8699951171875, 186.71749877929688], [198.7803192138672, 182.7091064453125], [256.23101806640625, 195.60311889648438], [264.25201416015625, 189.57211303710938], [274.8070373535156, 192.18829345703125], [282.6427307128906, 197.03915405273438], [274.24908447265625, 199.92636108398438], [264.8431091308594, 199.5250244140625], [196.40475463867188, 249.4647216796875], [208.2581329345703, 250.83792114257812], [219.4830322265625, 251.86813354492188], [226.86839294433594, 255.59494018554688], [233.02976989746094, 254.90525817871094], [241.833251953125, 258.72412109375], [250.73390197753906, 262.96441650390625], [239.21388244628906, 270.27239990234375], [229.06674194335938, 274.18896484375], [222.30227661132812, 272.7212219238281], [215.35842895507812, 270.05859375], [205.86260986328125, 263.66827392578125], [200.25833129882812, 251.47845458984375], [218.50205993652344, 259.7375183105469], [224.91644287109375, 262.54290771484375], [231.9678955078125, 261.9854736328125], [245.7952880859375, 262.9068603515625], [230.69363403320312, 263.18017578125], [224.8975830078125, 263.0137939453125], [217.20870971679688, 260.4953918457031]]]}]
# 展示预测68个关键点结果
tmp_img = src_img.copy()
for index, point in enumerate(result[0]['data'][0]):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)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()

# 展示预测17个关键点结果,可以看到前17个点显示了脸部轮廓
tmp_img = src_img.copy()
for index, point in enumerate(result[0]['data'][0]):if(index < 17) :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)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()

# 展示预测17-22个关键点结果,可以看到显示了左边眉毛轮廓
tmp_img = src_img.copy()
for index, point in enumerate(result[0]['data'][0]):if(17 <= index < 22) :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)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()

# 展示预测22-27个关键点结果,可以看到显示了右边眉毛轮廓
tmp_img = src_img.copy()
for index, point in enumerate(result[0]['data'][0]):if(22 <= index < 27) :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)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()

二、通过检测到的关键点画黑板简笔画

#创建新的尺寸与原图相同的全黑图片
new_img = np.zeros((src_img.shape[0],src_img.shape[1],3),dtype=np.uint8)
pts = []     #存脸部轮廓关键点
pts1 = []    #存左边眉毛关键点
pts11 = []   #存右边眉毛关键点
pts2 = []    #存鼻子关键点
pts3 = []    #存左眼关键点
pts4 = []    #存右眼关键点
pts5 = []    #存嘴巴关键点
pts6 = []
for index, point in enumerate(result[0]['data'][0]):if(index<17):pts.append(point)elif(17 <= index < 22) :pts1.append(point)elif(22 <= index < 27) :pts11.append(point)elif(27 <= index < 36) :pts2.append(point)elif(36 <= index < 42) :pts3.append(point)elif(42 <= index < 48) :pts4.append(point)elif(48 <= index < 61) :pts5.append(point)elif(61 <= index < 65) :pts6.append(point)
#将关键点连线
pts=np.array(pts,np.int32)
cv2.polylines(new_img,[pts],False,(255, 255, 255),2)pts1=np.array(pts1,np.int32)
cv2.polylines(new_img,[pts1],False,(255, 255, 255),3)
pts11=np.array(pts11,np.int32)
cv2.polylines(new_img,[pts11],False,(255, 255, 255),3)pts2=np.array(pts2,np.int32)
cv2.polylines(new_img,[pts2],False,(255, 255, 255),2)pts3=np.array(pts3,np.int32)
cv2.polylines(new_img,[pts3],True,(255, 255, 255),2)
#计算眼珠中心坐标
center1 = (int((pts3[1][0]+pts3[2][0])/2),int((pts3[1][1]+pts3[5][1])/2))
#计算眼珠半径
radius1 = int((pts3[2][0]-pts3[1][0])/2)
cv2.circle(new_img, center1, radius1, (255, 255, 255), -1)pts4=np.array(pts4,np.int32)
cv2.polylines(new_img,[pts4],True,(255, 255, 255),2)
center2 = (int((pts4[1][0]+pts4[2][0])/2),int((pts4[1][1]+pts4[5][1])/2))
radius2 = int((pts4[2][0]-pts4[1][0])/2)
cv2.circle(new_img, center2, radius2, (255, 255, 255), -1)pts5=np.array(pts5,np.int32)
cv2.polylines(new_img,[pts5],True,(0, 0, 150),3)
pts6=np.array(pts6,np.int32)
cv2.polylines(new_img,[pts6],False,(0, 0, 255),1)new_img_path = 'black_white.jpg'
cv2.imwrite(new_img_path, new_img)img = mpimg.imread(new_img_path)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()

三.封装转换函数

import cv2
import paddlehub as hub
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
import mathdef transform_to_blackboard_img(img_path,new_img_path):src_img = cv2.imread(img_path)#加载paddlehub模型并通过API一键检测module = hub.Module(name="face_landmark_localization")result = module.keypoint_detection(images=[src_img])new_img = np.zeros((src_img.shape[0],src_img.shape[1],3),dtype=np.uint8)pts = []pts1 = []pts11 = []pts2 = []pts3 = []pts4 = []pts5 = []pts6 = []for index, point in enumerate(result[0]['data'][0]):if(index<17):pts.append(point)elif(17 <= index < 22) :pts1.append(point)elif(22 <= index < 27) :pts11.append(point)elif(27 <= index < 36) :pts2.append(point)elif(36 <= index < 42) :pts3.append(point)elif(42 <= index < 48) :pts4.append(point)elif(48 <= index < 61) :pts5.append(point)elif(61 <= index < 65) :pts6.append(point)pts=np.array(pts,np.int32)cv2.polylines(new_img,[pts],False,(255, 255, 255),2)pts1=np.array(pts1,np.int32)cv2.polylines(new_img,[pts1],False,(255, 255, 255),3)pts11=np.array(pts11,np.int32)cv2.polylines(new_img,[pts11],False,(255, 255, 255),3)pts2=np.array(pts2,np.int32)cv2.polylines(new_img,[pts2],False,(255, 255, 255),2)pts3=np.array(pts3,np.int32)cv2.polylines(new_img,[pts3],True,(255, 255, 255),2)center1 = (int((pts3[1][0]+pts3[2][0])/2),int((pts3[1][1]+pts3[5][1])/2))radius1 = int((pts3[2][0]-pts3[1][0])/2)cv2.circle(new_img, center1, radius1, (255, 255, 255), -1)pts4=np.array(pts4,np.int32)cv2.polylines(new_img,[pts4],True,(255, 255, 255),2)center2 = (int((pts4[1][0]+pts4[2][0])/2),int((pts4[1][1]+pts4[5][1])/2))radius2 = int((pts4[2][0]-pts4[1][0])/2)cv2.circle(new_img, center2, radius2, (255, 255, 255), -1)pts5=np.array(pts5,np.int32)cv2.polylines(new_img,[pts5],True,(0, 0, 150),3)pts6=np.array(pts6,np.int32)cv2.polylines(new_img,[pts6],False,(0, 0, 255),1)new_img_path = new_img_pathcv2.imwrite(new_img_path, new_img)img = mpimg.imread(new_img_path) plt.figure(figsize=(10,10))plt.imshow(img) plt.axis('off') plt.show()

测试

img = mpimg.imread('blackman.jpg')
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()transform_to_blackboard_img('blackman.jpg','black_blackman_img.jpg')


img = mpimg.imread('shou.jpg')
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off')
plt.show()transform_to_blackboard_img('shou.jpg','black_shou_img.jpg')


PaddleHub实战——人脸黑板简笔画相关推荐

  1. 人脸美颜——飞桨PaddleHub实战

    基于PaddleHub的人脸美颜 随着各种美颜相机的出现,我们可以拍出各种胜似明星的照片,我们可以瘦脸.大眼.红唇以及增白,但这背后是如何实现的,你又了解多少呢? AI美颜核心技术之一就是人脸关键点检 ...

  2. 保护环境的画用计算机怎么画,保护环境的画简笔画

    简笔画是由成人创造的概念化的造型符号,是对物的形的高度概括与夸张.许多家长及老师在儿童初学绘画时经常引导其学习简笔画,其目的正如一位家长所言:"简笔画简单,孩子容易掌握".事实并非 ...

  3. 用计算机如何画柳条,柳条简笔画

    风轻轻拂过,柳絮漫天飘飞,请飘落水手中,漾开一圈圈涟漪,惊到水中嬉戏的鱼儿,婀娜的柳丝轻舞飘飞.惬意的风景中两位沉默的人儿面上浮现一丝伤悲,无阻的眼神让人心生怜悯,发丝被风吹起,紧紧绕.天下没有不散之 ...

  4. paddlepaddle测试安装_PaddlePaddle升级解读 | 十余行代码完成迁移学习,PaddleHub实战篇...

    迁移学习 (Transfer Learning) 是属于深度学习的一个子研究领域,该研究领域的目标在于利用数据.任务.或模型之间的相似性,将在旧领域学习过的知识,迁移应用于新领域中.迁移学习吸引了很多 ...

  5. resnet50代码_十余行代码完成迁移学习,百度PaddleHub实战解读

    机器之心专栏 来源:百度 PaddlePaddle 迁移学习 (Transfer Learning) 是属于深度学习的一个子研究领域,该研究领域的目标在于利用数据.任务.或模型之间的相似性,将在旧领域 ...

  6. 怎么把一副图片用PS调成简笔画?

    现在很多人对简笔画比较感兴趣,如何用PS将自己的彩色相片调成简笔画呢,今天的敬仰我就跟大家一起分享 工具/原料 Photoshop,彩色图片 方法/步骤 准备一张照片,最好是轮廓线条分明些的. 在菜单 ...

  7. 关于计算机网络简笔画,玩电脑简笔画图片

    现在科技的发展,电脑越来越普遍.每一个人都会玩电脑了,你见过玩电脑的简笔画吗?今天先和学习啦小编一起欣赏这些玩电脑简笔画图片,希望你会有所收获的. 玩电脑简笔画图片欣赏 玩电脑简笔画图片1 玩电脑简笔 ...

  8. 学习可爱彩色线条PS极简马克笔简笔画:鞋子篇

    这篇文章里,我将演示用PS马克笔笔刷,采用和谐的色彩方案,十秒之类轻松画一幅简单出彩的马克笔简笔画,无论作为插画设计还是平时手账素材都显得简单而实用,文章还会讲到笔刷下笔时色彩表现的技法,和我所写的其 ...

  9. 计算机画图怎么画荷花图片简笔画,画荷花最简单的画法 荷花画图片简单画法...

    本次小编给大家分享的是关于荷花简笔画的涂色,我们给大家整理很多荷花图片简笔画带颜色的图,一起参考临摹下吧.... 很多朋友都喜欢荷花,洁白好看,小编特意整理了荷花简笔画图片大全,教给大家怎么画荷花图片 ...

最新文章

  1. Sql server Insert执行的秘密(下) 带外键的INSERT分析
  2. 如何创建自己的docker image并上传到DockerHub上
  3. springMVC 前后台日期格式传值解决方式之一(共二) @DateTimeFormat的使用和配置...
  4. iNeuOS工业互联网操作系统,提升分布式云端控制安全策略和增加实时日志功能...
  5. 如何用研发流程搞垮一个团队?
  6. 华为Java开发编程最新军规,谁违反谁滚蛋!
  7. mysql无法授权问题
  8. spring实战笔记6---springMVC的请求过程
  9. mysql高性能学习笔记03_《高性能MySQL》学习笔记——第三章 服务器性能剖析
  10. 计算机一级ps教程自学网,ps教程自学网
  11. 算法练习, 红白花放置方法数
  12. 非线性优化库NLopt简介
  13. 微信公众平台开发(PHP)(二) 微信公众平台示例代码分析
  14. 六 R语言barplot条形图之带误差棒的对称条形图及相关性分析结果分布
  15. 手上长有透明液体的小疙瘩并脱皮怎么办?
  16. img取消无图片时的默认边框
  17. 3 万字 + 100 张图带你彻底搞懂 TCP 面试题(强烈建议收藏)
  18. 4、隐私计算--可信计算
  19. 联想服务器TS130主板芯片组,【ThinkServer TS130配置】ThinkServer TS130塔式服务器配置-ZOL中关村在线...
  20. xorm reverse

热门文章

  1. 透明表盘 指南针 app_指南:在Web设计中使用透明度(不透明度)
  2. JMeter类比loadrunner断言、参数化、集合点、关联、事务——学习笔记
  3. ssh 隧道 mysql_利用SSH隧道方式连接远程MySQL
  4. Mac版本有道云笔记 同步失败问题
  5. python中复制n次字符串_Python 字符串操作方法大全
  6. HFSS NFC 13.56MHz 天线仿真(3)-线圈各种参数对等效电感的影响
  7. 如何才能成为一名架构师?
  8. [Mugeda HTML5技术教程之1] HTML5: 生存还是毁灭
  9. c++的一些工具库介绍
  10. 中国超融合厂商三甲出炉,华为、华云数据、新华三再次稳居中国超融合市场领导者