本文主要是介绍针对Deepfake假脸视频面部细节特征的提取算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
[转载]githubGitHub - Allenem/graduation-design: 本科毕业设计:针对Deepfake假脸视频面部细节特征的提取算法https://github.com/Allenem/graduation-design
1.提取人脸
采用 OpenCV 和 face_recognition 做对比,用15张图片做实验
完善后的代码如 ./DatabasePreprocessing/findfaceCV.py 和 ./DatabasePreprocessing/findfaceFR.py 所示。
代码一带注释最简版
代码二带注释最简版
输出如下:
> python findfaceCV.py Running time using OpenCV is: 6.6083549 Seconds > python findfaceFR.py Running time using Face-recognition is: 9.850284 Seconds
OpenCV
识别率低一点,时间快,脸小,矩形框范围大点儿;Face-recognition
识别率高一点,时间慢一点,脸大,矩形框范围小点儿。综上,我采用第二种方法 Face-recognition
识别。
识别数据库 Celeba devel , Celeba test , PGGAN , DFD
2.视频分帧保存图片处理
代码参考:
python实现批量视频分帧、保存视频帧_EchoPython的博客-CSDN博客_python视频分帧
python 视频分帧保存为图片_是鲤鱼啊-CSDN博客
代码
测试成果:
- Terminal
Video 0 is running ... Video 1 is running ... Video 2 is running ... Running log has been saved here: D:/test_face/log.txt Running time is: 0:00:20.81736
AllVideosFullName Index Frame Picture
01__exit_phone_room 1 306 31
01__hugging_happy 2 788 79
01__kitchen_pan 3 561 57
3.提取DFD视频分帧后的图片中的人脸
完善后的代码如 ./DatabasePreprocessing/findfaceFR_folder.py 所示。
运行代码后,识别的人脸按原先的文件夹存放在新路径下的同名文件夹,每个文件夹都有 log.txt 记录未识别出人脸的文件以及本文件夹人脸未识别率。在新路径下有总的统计数据 log.txt ,包含: 有损图片总数, 未识别图片总数, 未受损图片总数, 总的未识别率。
- 分帧结果
# OUTPUT1(frame images from DFD/original_c23) # Running log has been saved here: G:/DFD_img/original_c23/log.txt # Running time is: 1:05:49.907241# OUTPUT2(frame images from DFD/attack_c23) # Running log has been saved here: G:/DFD_img/attack_c23/log.txt # Running time is: 6:29:04.835291
- 找脸结果
# OUTPUT1(find face from DFD_img/original_c23) # # of folders: 363 # Running time using Face-recognition is: 13:46:29.115011# OUTPUT2(find face from DFD_img/attack_c23) # # of folders: 3068 # Running time using Face-recognition is: 4 days, 4:05:53.688934
原视频人脸识别率:95.4%
生成视频人脸识别率:97.7%
4.PGGAN resize PNG->JPG
代码详见:./DatabasePreprocessing/pngToJpg.py
Celeba&PGGAN&DFD数据集特征提取
代码详见:./DatabaseFeatureExtraction/extract_feature.py
!!!注意:这里的特征提取代码只是将特征提取,然后绘制到图片上保存。后面我们将训练SVM分类器,所以需要用到特征数据,这样才比较方便。因此,后文将首先讲述特征数据的提取并保存至Excel文件,然后训练、测试SVM分类器。
matplotlib中cla() clf() close()用途
import matplotlib.pyplot as pltplt.cla() # Clear axis即清除当前图形中的当前活动轴。其他轴不受影响。 plt.clf() # Clear figure清除所有轴,但是窗口打开,这样它可以被重复使用。 plt.close() # Close a figure window
下图只是一部分 Celeba
和 PGGAN
数据集的对比图
左上:原图,第一排PGGAN假脸,第二排Celeba真脸
右上:三原色直方图,假脸三原色峰值基本重合,真脸三原色峰值错开
左下:SURF特征点,假脸同样的阈值特征点多,真脸少
右下:ELA,假脸ELA图片发亮处较多,真脸基本一色调一致
今天把三个数据集处理(提取人脸,png转jpg)后的所有图片的3种特征都提取了一下。 ✌️
Celeba、PGGAN 特征较好,DFD 效果一般。
输出如下:
# Celeba startTime: 2020-02-25 18:08:30.578360 endTime: 2020-02-25 22:50:47.230785 Running time: 4:42:16.652425# PGGAN startTime: 2020-02-25 18:09:01.274854 endTime: 2020-02-25 22:58:56.398361 Running time: 4:49:55.123507# DFD startTime: 2020-02-25 18:09:41.216839 endTime: 2020-02-26 12:08:03.989166 Running time: 17:58:22.772327
SVM分类器分类
学习参考:
API Reference — scikit-learn 1.0.2 documentation
sklearn.linear_model.SGDClassifier — scikit-learn 1.0.2 documentation
代码参考:
https://blog.csdn.net/weixin_41322458/article/details/94389356
http://sofasofa.io/forum_main_post.php?postid=1001110
文献参考:
支持向量机理论与算法研究综述_丁世飞
特征数据提取
文件夹:./SVM/ExtractFeatureData
文件结构:
ExtractFeatureData # 特征数据提取代码文件夹│ extract_feature_data.py # 特征数据提取主程序│ OUTPUT.txt # 部分运行日志│ test.py # 特征数据提取主程序之前的测试代码│└─CommonFunction # 公用函数,分别提取特征并存入excel的一个sheetextract_color_data.pyextract_SURF_data.pyextract_ELA_data.py
三个特征分别由三个py文件提取并保存到Excel中。一组图片的同一特征存在同一个Excel文件中,每张图片占一个sheet。
① color特征:分bgr3列,每列有256*256=65536行;
② SURF特征:先提取SURF特征,核心代码如下,然后统一每张图选取半径最大的15个点作为特征点,不足则补零;
img = cv2.imread(inputpath) surf = cv2.xfeatures2d.SURF_create(4000) kps, features = surf.detectAndCompute(img, None) kps_data = [] for kp in kps:kps_data.append([kp.pt[0], kp.pt[1], kp.angle, kp.size])
③ ELA特征:首先将图片灰度化,然后提取ELA特征,每张图256行256列共65536像素。
SVM_SGDClassifier的训练和测试
文件夹:./SVM/SVM-SGD
文件结构:
SVM-SGD # SGD(Stochastic Gradient Descent)│ svm_SGD.py # 随机梯度下降分类器主程序(含训练、测试代码)│└─GetData # 从excel中提取数据返回一维列表,3者基本一样get_color.pyget_SURF.py # 3者中最先写的,注释详细get_ELA.py
get_XXX
函数每次提取一个Excel的所有sheet的数据,返回list,每个sheet都展平为1维,占list一个元素位。
svm_SGD.py
调用三个函数获取数据,然后通过以下函数训练数据得到SVM模型、用SVM模型预测数据类别。核心代码如下:
clf = SGDClassifier() clf.partial_fit(X, Y, classes=np.array([0, 1])) joblib.dump(clf, savepath + '/' + 'clf.pkl')clf2 = joblib.load(savepath+'/'+'clf.pkl') Z = clf2.predict(X) accuracy = clf2.score(X, Y)
OUPUT:
Running Time of 训练color特征SVM分类器 : 0:02:31.862390测试数据实际真假:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 测试数据预测真假:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0] color_clf 预测准确率:0.6164383561643836 Running Time of 测试color特征SVM分类器 : 0:02:21.229064Running Time of 训练SURF特征SVM分类器 : 0:00:00.309207测试数据实际真假:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 测试数据预测真假:[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 1 0 0 0] SURF_clf 预测准确率:0.6438356164383562 Running Time of 测试SURF特征SVM分类器 : 0:00:00.271234Running Time of 训练ELA特征SVM分类器 : 0:00:36.909247测试数据实际真假:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 测试数据预测真假:[1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0] ELA_clf 预测准确率:0.6575342465753424 Running Time of 测试ELA特征SVM分类器 : 0:00:33.487409
最终分类器准确率大约为 63% 上下。估计很大原因是由于训练数据较少,所以准确率较低,未来工作将是大量数据训练和测试。
代码 svm_SGD_per100img.py 在训练测试大量文件时准确率不高且三者一样,感觉是代码有点问题
这篇关于针对Deepfake假脸视频面部细节特征的提取算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!