【部分原创】python实现视频内的face swap(换脸)
1.准备工作,按博主的环境为准
Python 3.5
Opencv 3
Tensorflow 1.3.1
Keras 2
cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装
那就先安装起来,有兴趣的朋友给我个暗示,好让我有动力写下去,想实现整套的功能还是有点复杂的
第一部分,数据采集,及视频内人物脸
import cv2save_path = 'your save path' cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml path') cap = cv2.VideoCapture('your video path') i = 0 while True:ret,frame = cap.read()gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)rect = cascade.detectMultiScale(gray,scaleFactor=1.3,minNeighbors=9,minSize=(50,50),flags = cv2.CASCADE_SCALE_IMAGE)print ("rect",rect)if not rect is ():for x,y,z,w in rect:roiImg = frame[y:y+w,x:x+z]cv2.imwrite(save_path+str(i)+'.jpg',roiImg)cv2.rectangle(frame,(x,y),(x+z,y+w),(0,0,255),2)i +=1cv2.imshow('frame',frame)if cv2.waitKey(1) &0xFF == ord('q'):break cap.release() cv2.destroyAllWindows()
第二部分,国外大神开源代码,用于模型训练
import cv2 import numpyfrom utils import get_image_paths, load_images, stack_images from training_data import get_training_datafrom model import autoencoder_A from model import autoencoder_B from model import encoder, decoder_A, decoder_Btry:encoder .load_weights( "models/encoder.h5" )decoder_A.load_weights( "models/decoder_A.h5" )decoder_B.load_weights( "models/decoder_B.h5" ) except:passdef save_model_weights():encoder .save_weights( "models/encoder.h5" )decoder_A.save_weights( "models/decoder_A.h5" )decoder_B.save_weights( "models/decoder_B.h5" )print( "save model weights" )images_A = get_image_paths( "data/trump" ) images_B = get_image_paths( "data/cage" ) images_A = load_images( images_A ) / 255.0 images_B = load_images( images_B ) / 255.0images_A += images_B.mean( axis=(0,1,2) ) - images_A.mean( axis=(0,1,2) )print( "press 'q' to stop training and save model" )for epoch in range(1000000):batch_size = 64warped_A, target_A = get_training_data( images_A, batch_size )warped_B, target_B = get_training_data( images_B, batch_size )loss_A = autoencoder_A.train_on_batch( warped_A, target_A )loss_B = autoencoder_B.train_on_batch( warped_B, target_B )print( loss_A, loss_B )if epoch % 100 == 0:save_model_weights()test_A = target_A[0:14]test_B = target_B[0:14]figure_A = numpy.stack([test_A,autoencoder_A.predict( test_A ),autoencoder_B.predict( test_A ),], axis=1 )figure_B = numpy.stack([test_B,autoencoder_B.predict( test_B ),autoencoder_A.predict( test_B ),], axis=1 )figure = numpy.concatenate( [ figure_A, figure_B ], axis=0 )figure = figure.reshape( (4,7) + figure.shape[1:] )figure = stack_images( figure )figure = numpy.clip( figure * 255, 0, 255 ).astype('uint8')cv2.imshow( "", figure )key = cv2.waitKey(1)if key == ord('q'):save_model_weights()exit()
第三部分,国外大神开源代码,人脸输出
import cv2 import numpy from pathlib import Pathfrom utils import get_image_pathsfrom model import autoencoder_A from model import autoencoder_B from model import encoder, decoder_A, decoder_Bencoder .load_weights( "models/encoder.h5" ) decoder_A.load_weights( "models/decoder_A.h5" ) decoder_B.load_weights( "models/decoder_B.h5" )images_A = get_image_paths( "data/trump" ) images_B = get_image_paths( "data/cage" )def convert_one_image( autoencoder, image ):assert image.shape == (256,256,3)crop = slice(48,208)face = image[crop,crop]face = cv2.resize( face, (64,64) )face = numpy.expand_dims( face, 0 )new_face = autoencoder.predict( face / 255.0 )[0]new_face = numpy.clip( new_face * 255, 0, 255 ).astype( image.dtype )new_face = cv2.resize( new_face, (160,160) )new_image = image.copy()new_image[crop,crop] = new_facereturn new_imageoutput_dir = Path( 'output' ) output_dir.mkdir( parents=True, exist_ok=True )for fn in images_A:image = cv2.imread(fn)new_image = convert_one_image( autoencoder_B, image )output_file = output_dir / Path(fn).namecv2.imwrite( str(output_file), new_image )
第四部分,人脸替换
#import necessary libraries import cv2 import glob as gb # import numpy#capture video from the webcam cap = cv2.VideoCapture('your video path') fourcc = cv2.VideoWriter_fourcc(*'XVID') out = cv2.VideoWriter('your output video path', fourcc, 20.0, (1920, 1080)) #load the face finder face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_alt.xml path')#load the face that will be swapped in img_path = gb.glob("your image path")#start loop for path in img_path:face_img = cv2.imread(path)while True:ret, img = cap.read() # read imagegray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, 1.3, 3) # find faces# for all the faces found in the framefor (x, y, w, h) in faces:# resize and blend the face to be swapped inface = cv2.resize(face_img, (h, w), interpolation=cv2.INTER_CUBIC)face = cv2.addWeighted(img[y:y + h, x:x + w], .5, face, .5, 1)# swap facesimg[y:y + h, x:x + w] = faceout.write(img)# show the imagecv2.imshow('img', img)key = cv2.waitKey(1)if key == ord('q'):exit() cap.release() cv2.destroyAllWindows()
最后放一张训练一小时后的视频截图,用的是尼古拉斯凯奇的脸
面朝大海--\(˙<>˙)/--落霞与孤鹜齐飞
【部分原创】python实现视频内的face swap(换脸)相关推荐
- h5 换脸 php,【部分原创】python实现视频内的face swap(换脸)
1.准备工作,按博主的环境为准 Python 3.5 Opencv 3 Tensorflow 1.3.1 Keras 2 cudnn和CUDA,如果你的GPU足够厉害并且支持的话,可以选择安装 那就先 ...
- python实现视频ai换脸_【原创】python实现视频内的face swap(换脸)
ruby中excel简单操作以及文件读取操作方法 # -*-coding:utf-8 -*-#author:kanlijunrequire 'win32ole'require 'fileutils'c ...
- [原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作
[原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作 转载请注明出处 一.关于为什么用pymediainfo以及pymediainfo的安装 使用python对视频/音频文件进行详 ...
- Python通过文字生成语音,随机获取视频或图片素材生成伪原创的短视频
前段时间写了一篇<抖音自动引流脚本源码>主要通过语录系统自动生成语句或随机评论,适用于自动评论引流脚本. 今天脑洞大开,想用Python通过文字生成语音,随机获取视频或图片素材生成伪原创的 ...
- python编程实例视屏-使用Python实现视频下载功能实例代码
最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容.如果有一个程序可以把各大视频网站的热门用户最新发布的视频下载下来,不仅方便了观看,还可以将没有版权的视频发布在个人社交网站上,增加自 ...
- python视频-python剪切视频与合并视频的实现
windows10/python3.6环境需安装imageio,ffmpeg(视频中有教下载)文字中不体现太麻烦,看起来也不方便! 剪切代码python代码: import imageio image ...
- AI火爆干货最全整理!五套深度学习和算法学习教程和三套Python学习视频!!!限时无套路免费领取!...
点击蓝色"AI专栏"关注我哟 选择"星标",重磅干货,第一时间送达 这是站长第 31 期免费送丰富宝贵的干货资源与教程 本期绝对是满满的干货! 获取更多资源请关 ...
- Python处理视频文件的实用姿势
Python处理视频文件的实用姿势 感觉这辈子,最深情绵长的注视,都给了手机. 视频是目前最热门的领域之一. 各平台争先推出便捷工具,自带滤镜和玩法,普通人也能轻松制作精美视频. 也有不少团队实现了批 ...
- python将视频像素抓取替换导出mosaic效果的文本视频
python将视频像素抓取替换导出mosaic效果的文本视频 第一次写博客,关于python的. 全网关于这种视频的的合成代码几乎没有,所以我提供了一套这样的思路. 完成过程很痛苦.因为全网类似的太少 ...
最新文章
- 【 karle 专栏 】Android 初探底层知识系列
- gRPC——简介与Hello World
- SDNU 1416.一元三次方程求解(数学)
- 前端学习(983):jquery概念
- mysql 主从备份 全量数据_当主库存在历史数据时如何完成全量Mysql主从复制
- 苹果屏蔽更新_iOS 屏蔽更新的最新方法,完美支持 iOS13 系统
- 华为手机短息没有声音解决方案
- DeFi货币市场协议DMM宣布因监管部门的要求,已停止运营
- c语言合法自定义标识符_c语言合法标识符的要求是什么
- 中国人口增长的数学模型(for数学建模)
- HTML5期末大作业:关于旅游主题网站设计——开心网旅游网页源码(15页) HTML+CSS+JavaScript
- 关闭Dynamipsgui的自动更新
- 综合项目之闪讯破解(二)之 如何用C++建立PPPOE连接
- MySQL索引原理以及查询优化
- pkl形式的数据集读取和可视化
- 20220223换硬盘操作
- win10分辨率不能调整_笔记本电脑如何连接投影仪?MAC OS/Win10/7笔记本和投影仪连接方法...
- 【uni-app】Hbuilder打包h5发行到web服务器
- 简单解决高分屏模糊问题
- GTX960M安装Anaconda+cuda9.0+cudnn v7.6.5+tensorflow-gpu1.8.0