图像篡改检测 python
针对Deepfake假脸视频面部细节特征的提取算法
目录
一、仓库说明
.
│ LICENSE # 许可说明
│ README.md # 简介
│
├─References # 参考文献
├─FeatureExtractionLearning # 学习特征提取 代码文件夹
├─DatabasePreprocessing # 数据库预处理:图片提取人脸,视频分帧存图提取人脸
├─DatabaseFeatureExtraction # 提取 Celeba PGGAN DFD 数据集人脸特征 代码文件夹
├─SVM # 学习SVM分类器,分类器实现人脸判别 代码文件夹
├─screenshots # 一些截图
└─Paper # 我的论文
二、工作计划
1.数据库分配
学生
真脸
GAN假脸数据库
Deepfake数据库
JYT
FFHQ(0-35000)
styleGAN2
TIMIT
XJ
Celeba(train)
styleGAN
DFDC
ZS
FFHQ(35001-70000)
starGAN
faceforensic
PY
Celeba(validation,test)
PGGAN
DeepfakeDetection
2.特征分配
学生
特征
JYT
1、局部二值模式LBP 2、方向梯度直方图HOG 3、SRM残差图像
XJ
1、共生矩阵 2、光流场 3、LPQ特征
ZS
1、直方图/共生矩阵 2、拉普拉斯变换均方差 3、小波变换频率直方图
PY
1、颜色直方图 2、Surf 3、错误级别分析(Error level analysis,ELA)
3.工作计划
起止时间
工作内容
备注
2020.01-2020.02
调研和资料分析
2020.01-2020.02
数据库预处理
视频分帧、人脸提取及定位
2020.02-2020.03
提取人脸特征、检测GAN真假脸图像差异
隐写分析特征或者图像篡改特征
2020.03-2020.04
Deepfake换脸视频检测算法实现
SVM分类器等不同分类器
2020.04-2020.05
完成毕业论文
三、调研和资料分析
1.参考文献
……
2.我自己的中文翻译
3.Python学习和人脸检测学习
OpenCV,dlib,face_recognition 实现人脸检测,标志检测等实验小测试:
四、学习特征提取
1、颜色直方图
1.1 matplotlib画图像变色问题
在使用opencv配合jupyter notebook调试,其中常常使用matplotlib来显示图像
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("image.jpg")
# 后面的方法都从此处开始更改
plt.subplot(),plt.imshow(image),plt.title('Input')
plt.show()
但是在实际使用过程中,我们会发现plt.imshow()后出现的图形变成了负片,这是因为cv2.imshow()与plt.imshow()的通道顺序不同产生的,前者BGR,后者RGB。
解决方法一:
b, g, r = cv2.split(image)
image_new = cv2.merge([r, g, b])
plt.subplot(),plt.imshow(image_new),plt.title('Input')
plt.show()
解决方法二:
image_new = np.flip(original_img,axis = 2)
plt.subplot(),plt.imshow(image_new),plt.title('Input')
plt.show()
解决方法三:
image_new = image[:,:,::-1]
plt.subplot(),plt.imshow(image_new),plt.title('Input')
plt.show()
当然cv2自己显示没有问题,它的颜色顺序是BGR
import cv2
import numpy as np
image = cv2.imread("image.jpg")
cv2.imshow("Img", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 histogram.py 和 histogram3lines.py 效果图
2、Surf
2.1 SURF简介
SURF(Speeded Up Robust Features) 加速鲁棒特征。正如其名,它是加速版本的 SIFT(Scale-invariant feature transform) 尺度不变特征转换。
它善于处理具有模糊和旋转的图像,但是不善于处理视角变化和光照变化。在SIFT中使用高斯微分 DoG(Difference of Gaussian) 对高斯拉普拉斯算子 LoG(Laplacian of Gaussian) 进行近似,而在SURF中使用盒子滤波器 Box Filter 对 LoG 进行近似,这样就可以使用积分图像了(计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关)。总之,SURF最大的特点在于采用了 Haar特征 以及 积分图像 的概念,大大加快了程序的运行效率。
2.2 SURF小实验和效果图
① 创建一个SURF对象
cv2.xfeatures2d.SURF_create(, hessianThreshold, nOctaves, nOctaveLayers, extended, upright)
hessianThreshold:默认100,关键点检测的阈值,越高监测的点越少
nOctaves:默认4,金字塔组数
nOctaveLayers:默认3,每组金子塔的层数
extended:默认False,扩展描述符标志,True表示使用扩展的128个元素描述符,False表示使用64个元素描述符。
upright:默认False,垂直向上或旋转的特征标志,True表示不计算特征的方向,False-计算方向。
之后也可以通过类似getHessianThreshold(),setHessianThreshold()等函数来获取或修改上述参数值,例如
surf.setHessianThreshold(True) 表示将HessianThreshold参数修改为True。
② 绘制特征点
cv2.drawKeypoint(image, keypoints, outImage, color, flags)
或:
outImage = cv2.drawKeypoint(image, keypoints, None, color, flags)
image:输入图像
keypoints:上面获取的特征点
outImage:输出图像
color:颜色,默认为随机颜色,顺序为BGR
flags:绘制点的模式,有以下四种模式
cv2.DRAW_MATCHES_FLAGS_DEFAULT:
默认值,只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:
绘制特征点的时候绘制的是带有方向的圆,这种方法同时显示图像的坐标,size,和方向,是最能显示特征的一种绘制方式。
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:
只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT:
单点的特征点不被绘制
③ 调试
由于如下报错:
surf = cv2.xfeatures2d.SURF_create(30000)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\surf.cpp:1029: error: (-213:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'cv::xfeatures2d::SURF::create'
所以采取如下措施:
pip uninstall opencv-python
pip uninstall opencv-contrib-python
pip install opencv-python==3.4.2.16 -i "/"
pip install opencv-contrib-python=&
图像篡改检测 python
针对Deepfake假脸视频面部细节特征的提取算法
目录
一、仓库说明
.
│ LICENSE # 许可说明
│ README.md # 简介
│
├─References # 参考文献
├─FeatureExtractionLearning # 学习特征提取 代码文件夹
├─DatabasePreprocessing # 数据库预处理:图片提取人脸,视频分帧存图提取人脸
├─DatabaseFeatureExtraction # 提取 Celeba PGGAN DFD 数据集人脸特征 代码文件夹
├─SVM # 学习SVM分类器,分类器实现人脸判别 代码文件夹
├─screenshots # 一些截图
└─Paper # 我的论文
二、工作计划
1.数据库分配
学生
真脸
GAN假脸数据库
Deepfake数据库
JYT
FFHQ(0-35000)
styleGAN2
TIMIT
XJ
Celeba(train)
styleGAN
DFDC
ZS
FFHQ(35001-70000)
starGAN
faceforensic
PY
Celeba(validation,test)
PGGAN
DeepfakeDetection
2.特征分配
学生
特征
JYT
1、局部二值模式LBP 2、方向梯度直方图HOG 3、SRM残差图像
XJ
1、共生矩阵 2、光流场 3、LPQ特征
ZS
1、直方图/共生矩阵 2、拉普拉斯变换均方差 3、小波变换频率直方图
PY
1、颜色直方图 2、Surf 3、错误级别分析(Error level analysis,ELA)
3.工作计划
起止时间
工作内容
备注
2020.01-2020.02
调研和资料分析
2020.01-2020.02
数据库预处理
视频分帧、人脸提取及定位
2020.02-2020.03
提取人脸特征、检测GAN真假脸图像差异
隐写分析特征或者图像篡改特征
2020.03-2020.04
Deepfake换脸视频检测算法实现
SVM分类器等不同分类器
2020.04-2020.05
完成毕业论文
三、调研和资料分析
1.参考文献
……
2.我自己的中文翻译
3.Python学习和人脸检测学习
OpenCV,dlib,face_recognition 实现人脸检测,标志检测等实验小测试:
四、学习特征提取
1、颜色直方图
1.1 matplotlib画图像变色问题
在使用opencv配合jupyter notebook调试,其中常常使用matplotlib来显示图像
import cv2
import numpy as np
import matplotlib.pyplot as plt
image = cv2.imread("image.jpg")
# 后面的方法都从此处开始更改
plt.subplot(),plt.imshow(image),plt.title('Input')
plt.show()
但是在实际使用过程中,我们会发现plt.imshow()后出现的图形变成了负片,这是因为cv2.imshow()与plt.imshow()的通道顺序不同产生的,前者BGR,后者RGB。
解决方法一:
b, g, r = cv2.split(image)
image_new = cv2.merge([r, g, b])
plt.subplot(),plt.imshow(image_new),plt.title('Input')
plt.show()
解决方法二:
image_new = np.flip(original_img,axis = 2)
plt.subplot(),plt.imshow(image_new),plt.title('Input')
plt.show()
解决方法三:
image_new = image[:,:,::-1]
plt.subplot(),plt.imshow(image_new),plt.title('Input')
plt.show()
当然cv2自己显示没有问题,它的颜色顺序是BGR
import cv2
import numpy as np
image = cv2.imread("image.jpg")
cv2.imshow("Img", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
1.2 histogram.py 和 histogram3lines.py 效果图
2、Surf
2.1 SURF简介
SURF(Speeded Up Robust Features) 加速鲁棒特征。正如其名,它是加速版本的 SIFT(Scale-invariant feature transform) 尺度不变特征转换。
它善于处理具有模糊和旋转的图像,但是不善于处理视角变化和光照变化。在SIFT中使用高斯微分 DoG(Difference of Gaussian) 对高斯拉普拉斯算子 LoG(Laplacian of Gaussian) 进行近似,而在SURF中使用盒子滤波器 Box Filter 对 LoG 进行近似,这样就可以使用积分图像了(计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关)。总之,SURF最大的特点在于采用了 Haar特征 以及 积分图像 的概念,大大加快了程序的运行效率。
2.2 SURF小实验和效果图
① 创建一个SURF对象
cv2.xfeatures2d.SURF_create(, hessianThreshold, nOctaves, nOctaveLayers, extended, upright)
hessianThreshold:默认100,关键点检测的阈值,越高监测的点越少
nOctaves:默认4,金字塔组数
nOctaveLayers:默认3,每组金子塔的层数
extended:默认False,扩展描述符标志,True表示使用扩展的128个元素描述符,False表示使用64个元素描述符。
upright:默认False,垂直向上或旋转的特征标志,True表示不计算特征的方向,False-计算方向。
之后也可以通过类似getHessianThreshold(),setHessianThreshold()等函数来获取或修改上述参数值,例如
surf.setHessianThreshold(True) 表示将HessianThreshold参数修改为True。
② 绘制特征点
cv2.drawKeypoint(image, keypoints, outImage, color, flags)
或:
outImage = cv2.drawKeypoint(image, keypoints, None, color, flags)
image:输入图像
keypoints:上面获取的特征点
outImage:输出图像
color:颜色,默认为随机颜色,顺序为BGR
flags:绘制点的模式,有以下四种模式
cv2.DRAW_MATCHES_FLAGS_DEFAULT:
默认值,只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS:
绘制特征点的时候绘制的是带有方向的圆,这种方法同时显示图像的坐标,size,和方向,是最能显示特征的一种绘制方式。
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG:
只绘制特征点的坐标点,显示在图像上就是一个个小圆点,每个小圆点的圆心坐标都是特征点的坐标。
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINT:
单点的特征点不被绘制
③ 调试
由于如下报错:
surf = cv2.xfeatures2d.SURF_create(30000)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv_contrib\modules\xfeatures2d\src\surf.cpp:1029: error: (-213:The function/feature is not implemented) This algorithm is patented and is excluded in this configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function 'cv::xfeatures2d::SURF::create'
所以采取如下措施:
pip uninstall opencv-python
pip uninstall opencv-contrib-python
pip install opencv-python==3.4.2.16 -i "/"
pip install opencv-contrib-python=&
发布评论