社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

辣鸡Python,毁我女神!

数据与算法之美 • 6 年前 • 754 次点击  

全世界只有3.14 % 的人关注了

数据与算法之美


前段时间,有网友把《射雕英雄传》里的朱茵换成了杨幂,引起众多网友惊叹:居然还有这种操作?!



反正数据汪是觉得毫无违和感 ↓


有了这个“换脸技术”,看来以后随便一个流量明星都能摇身一变成为演技派,人均老戏骨不再是梦。


其实国外也有这么一个喜欢“恶搞”的视频制作人,仗着一款叫作“Deepfake”的工具,换尽天下人的脸,人称“换脸哥”。


起初“换脸哥”把一部成人电影女主的脸换成了《神奇女侠》主演盖尔·加朵的脸,在娱乐圈引起了极大的轰动。

好莱坞女星斯嘉丽·约翰逊曾表示:“任何人都可能成为这项技术的攻击对象,只是时间问题而已。”



后来,“换脸哥”把美国总统川普的脸也换了...


川普换脸后怎么有一种美颜的错觉?


当时这视频一发出来,美国国防部就把这项换脸技术誉为“人类对于AI的军备竞赛的一个开端”,因为经过Deepfake的处理后,视频中的人脸不仅能保持脸部肌肉运动和谐,而且口型还能与声音相匹配。


但是别看美国国防部把Deepfake夸得那么高大上,其实它的原理还蛮简单的。


第一步,收集大量的照片、视频素材,包括换脸者和被换脸者的。


第二步,把收集的素材打包丢给系统深度学习,其中一个很关键的环节就是,它会从大量的素材中提取面部图像,然后生成谱图。



第三步,Deepfake会自动生成对抗网络(GAN),而GAN中有两个机器学习模型,一个负责在“造假”,一个负责“打假”,而且这两个模型每次的对抗结果都会生成网络制作时使用到的参数。



直到“打假”模型区分不出真假脸的时候,就说明换脸成功了。



但由于一些不法分子的滥用,导致如今Deepfake工具已经臭名远扬了,甚至有些地区已经明令禁止使用Deepfake了。


不过,数据汪最近也学到了一种全新的换脸玩法,仅供参考,不可滥用,如有意外,后果自负。


一. 准备工作


首先,登录Face++官网(若是新用户,先注册一个账号),然后创建应用,获取 key 和 secret。


网址:https://www.faceplusplus.com.cn/


最后再下载 simplejson 模块 ,准备工作就完成了。

pip install simplejson


二. 程序思路


第一步,使用decect接口,获取人脸关键点。


这里我们要注意的是:return_landmark 参数不能为0,不然不会返回人脸关键点。


接口详细文档:https://console.faceplusplus.com.cn/documents/4888373


核心代码 ↓

def find_face(imgpath):
   print("finding")
   http_url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
   data = {"api_key": key, "api_secret": secret, "image_url": imgpath, "return_landmark": 1}
   files = {"image_file": open(imgpath, "rb")}
   response = requests.post(http_url, data=data, files=files)
   req_con = response.content.decode('utf-8')
   req_dict = JSONDecoder().decode(req_con)

   this_json = simplejson.dumps(req_dict)
   this_json2 = simplejson.loads(this_json)

   faces = this_json2['faces']
   list0 = faces[0]
   rectangle = list0['face_rectangle']
   # print(rectangle)
   return rectangle


第二步,使用 mergeface 接口,合成脸部图像。


这里我们需要注意的是,图片文件大小不超过 2 MB。

接口详细文档:
https://console.faceplusplus.com.cn/documents/20813963


核心代码 ↓

# 模板图片地址 合成图片地址 生成图片地址 合成指数0-100
def add_face(image_url_1,image_url_2,image_url,number):

   ff1 = find_face(image_url_1)
   ff2 = find_face(image_url_2)

   rectangle1 = str(str(ff1['top']) + "," + str(ff1['left']) + "," + str(ff1['width']) + "," + str(ff1['height']))
   rectangle2 = str(ff2['top']) + "," + str(ff2['left']) + "," + str(ff2['width']) + "," + str(ff2['height'])

   # print(rectangle1)
   # print(rectangle2)

   url_add = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface"

   f1 = open(image_url_1, 'rb')
   f1_64 = base64.b64encode(f1.read())
   f1.close()
   f2 = open(image_url_2, 'rb')
   f2_64 = base64.b64encode(f2.read())
   f2.close()

   data = {"api_key": key, "api_secret": secret, "template_base64": f1_64, "template_rectangle": rectangle1,
           "merge_base64": f2_64, "merge_rectangle": rectangle2, "merge_rate": number}

   response = requests.post(url_add, data=data)
   req_con = response.content.decode('utf-8')
   req_dict = JSONDecoder().decode(req_con)
   print(req_dict)
   result = req_dict['result']
   imgdata = base64.b64decode(result)
   file = open(image_url, 'wb')
   file.write(imgdata)
   file.close()


第三步,示例运行代码




    
# 单独两张照片的合成示例

image_url_1 = r"C:\Users\1.jpg"
image_url_2 = r"C:\Users\2.jpg"
image_url = r'C:\Users\result.jpg'
add_face(image_url_1,image_url_2,image_url,50)


第四步,封装一个多张照片的合成函数。


用列表List 储存图片地址,先以最开始的两张进行合成,然后将合成后的图片与列表中的其他图像依次合成。


注意事项:程序没有做List的长度验证,注意边界特殊情况。

def add_many(list_face):

 print("正在合成第1-2张")
 image_now = r'C:\Users\now.jpg'
 add_face(list_face[0], list_face[1], image_now, 50)

 for index in range(2,len(list_face)):
     print("正在合成第"+str(index+1)+"张")
     add_face(image_now, list_face[index], image_now, 50)


第五步,大功告成,展示成果。


首先来看一下我们最初选取的两张素材照片,“神仙姐姐”刘亦菲和“京城第一美女”高圆圆:


合成之后成了“京城第一神仙姐姐”


看这暧昧眼神,俏皮而不失温柔的歪头,微微露齿的笑容却又带一丝执着,虽然还有改进的空间,算了编不下去了...


堂堂“京城第一美女”和“神仙姐姐”居然被一个破Python搞歪了脸,只求刘亦菲和高圆圆的粉丝不要举报数据汪。



温馨提示:君子爱玩,当取之有道,用之有度。


部分素材来源于网络,侵权删

转载请在公众号中,回复“转载”

超模君准备了几份 数学思维好物

《超模定制笔记本》《数学原来会说谎》

《数学的故事》《简单微积分》......

免费 送给大家,参与就有机会获得


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/29812