agrawalanshika/Screen-Recapture-Detection
GitHub: agrawalanshika/Screen-Recapture-Detection
基于手工图像特征与随机森林分类器的轻量级屏幕翻拍检测框架,用于区分真实照片与屏幕二次拍摄图像。
Stars: 0 | Forks: 0
# 📸 使用手工图像特征与 Random Forest 的屏幕翻拍检测
屏幕翻拍检测是一个轻量级的机器学习应用程序,用于将输入图像分类为**真实照片**或**屏幕翻拍**。该项目结合了经典的计算机视觉技术与优化的 Random Forest 分类器,以执行快速高效的二分类图像识别。
该应用程序包含一个完整的端到端 pipeline,涵盖数据集创建、特征提取、模型训练、超参数优化、性能评估,以及通过命令行界面和交互式 Flask Web 应用程序进行的实时推理。该系统在保持机器学习工作流可解释性的同时,提供低延迟的预测。
## 🎯 研究动机 数字验证系统越来越依赖于用户提交的照片来验证身份、认证产品、验证文档或确认实际在场。然而,这些系统仍然容易受到屏幕翻拍攻击,攻击者会拍摄手机、平板电脑或电脑显示器上显示的图像,而不是直接拍摄原始场景。 由于两种图像的语义内容可能是相同的,传统的对象识别技术不足以检测这种欺诈行为。
## ✨ 功能 - 📷 通过交互式 Flask Web 应用程序进行实时预测 - 🖼️ 针对单张图像推理的命令行预测(`python predict.py image.jpg`) - 🧠 使用 21 种计算机视觉特征进行手工图像特征提取 - 📈 用于模型可解释性的特征重要性分析 - 🤖 使用 GridSearchCV 和 5 折交叉验证优化的 Random Forest 分类器 - 📊 包含准确率、混淆矩阵和分类指标的综合模型评估 - ⚡ 无需 GPU 或外部 API 的低延迟推理 - 📦 轻量级且可移植的部署,适合资源受限的环境
## 🛠️ 技术栈 | 类别 | 技术 | |-----------|------------| | 编程语言 | Python 3 | | 计算机视觉 | OpenCV, scikit-image | | 机器学习框架 | Scikit-learn | | 分类模型 | Random Forest | | 数据处理 | NumPy, Pandas | | 数据可视化 | Matplotlib | | Web 框架 | Flask | | 模型序列化 | Joblib |
## 📂 项目结构 ``` Screen-Recapture-Detection/ │ ├── predict.py # Single-image prediction script (main deliverable) ├── app.py # Flask web demo — live camera in the browser │ ├── feature_engineering/ │ └── features.py # All 21 feature extraction functions | └── create_dataset.py # Builds features.csv from dataset/Real and dataset/Screen | └── features.csv # Extracted feature vectors for the full dataset │ ├── model_train/ │ ├── model_training.py # Grid search + cross-validation, saves best_random_forest.pkl │ └── best_random_forest.pkl # Final trained model | └── latency.py # Benchmarks per-image inference time │ ├── dataset/ │ ├── Real/ # Genuine photographs │ └── Screen/ # Photographs of a screen displaying an image │ ├── outputs/ │ ├── confusion_matrix.png │ └── feature_importance.png | └── pipeline.png | └── image.png │ └── README.md ```
## 📊 数据集 该模型在一个自收集的包含 **120 张图像**的数据集上进行了训练和评估,这些图像平均分布在两个类别中: - **60 张真实图像** – 在不同的照明条件、视角、距离和背景下,使用智能手机相机直接拍摄的照片。 - **60 张屏幕翻拍图像** – 拍摄显示在手机或笔记本电脑屏幕上的图像的照片,拍摄于不同的视角、距离、显示亮度级别和眩光条件下。 为了确保分类器学习到的是**特定于翻拍的视觉伪影**而不是场景内容的差异,两类图像有意使用了相同或相似的底层场景。这促使模型专注于**莫尔条纹、像素网格纹理、眩光、颜色失真和频域伪影**等特征,这些特征通常是在屏幕翻拍过程中引入的。
## ⚙️ 方法论
## 🧠 特征提取 每个输入图像都被转换为一个 **21 维的手工特征向量**,捕捉通常与屏幕翻拍伪影相关的多种视觉特征。提取的特征分为以下几个类别: ### 🔹 图像质量与纹理 - Blur Score(模糊度评分) - Edge Density(边缘密度) - RMS Contrast(均方根对比度) - Tenengrad Sharpness(Tenengrad 清晰度) - LBP Mean(LBP 均值) - LBP Variance(LBP 方差) ### 🔹 频域特征 - FFT High-Frequency Energy(FFT 高频能量) - FFT Low-Frequency Energy(FFT 低频能量) - Pixel Grid Score(像素网格评分) ### 🔹 颜色统计 - Mean Red, Mean Green, Mean Blue(红色、绿色、蓝色均值) - Standard Deviation of Red, Green, and Blue Channels(红色、绿色和蓝色通道的标准差) - Brightness(亮度) - Saturation Mean(饱和度均值) ### 🔹 梯度特征 - Sobel X Gradient(Sobel X 梯度) - Sobel Y Gradient(Sobel Y 梯度) ### 🔹 统计特征 - Entropy(熵) - Noise Estimate(噪声估计) 这些手工特征捕捉了图像质量、纹理、颜色分布、梯度和频域信息的变化,使分类器能够识别屏幕翻拍过程中通常引入的视觉伪影。 所有特征提取逻辑都在 `features.py` 中实现,并在数据集生成、模型训练和推理过程中一致地复用,从而确保整个 pipeline 中的特征计算完全相同。
## 🤖 模型 为了确定最适合屏幕翻拍检测的分类器,我们使用相同的手工特征集对多种机器学习算法进行了训练和评估。根据它们的分类准确率、鲁棒性、推理效率和可解释性对这些模型进行了比较。 ### 模型对比 | 模型 | 测试准确率 | |-------------------------------|--------------| | Decision Tree | 83.33% | | K-Nearest Neighbors (KNN) | 75.00% | | Support Vector Machine (SVM) | 70.83% | | Gradient Boosting | 79.16% | | Extra Trees | 85.2% | | | **Random Forest** | **87.50%** | **Random Forest** 被选为最终模型,因为它具有出色的泛化性能、对未见样本的鲁棒性、通过特征重要性分析体现的模型可解释性,以及稳定的推理表现。 | 超参数 | 值 | |----------------|-------| | `n_estimators` | 200 | | `max_depth` | 5 | | `max_features` | `sqrt` | | `bootstrap` | `True` | | `min_samples_split` | 2 | | `min_samples_leaf` | 1 | 优化后的模型被序列化为 **`model_train/best_random_forest.pkl`**,并在命令行预测 pipeline(`predict.py`)和 Flask Web 应用程序(`app.py`)之间共享,确保所有部署接口的推理工作流保持一致。
## 📈 结果 | 指标 | 值 | |------------------------------|---------------------------| | 测试准确率 | **87.50%** (80-20 划分)| | CPU 平均推理时间 | **67.01 毫秒/张** | | 吞吐量 | **14.92 张/秒** |
## 🚀 如何运行 **1. 克隆仓库** ``` git clone https://github.com/agrawalanshika/Screen-Recapture-Detection.git cd Screen-Recapture-Detection ``` **2. 安装依赖项** ``` pip install -r requirements.txt ``` **3. 对单张图像运行预测** ``` python predict.py path/to/image.jpg ``` 输出:一个从 0(真实图像)到 1(屏幕翻拍)的单一分数。 **4. 启动实时 Web 演示** ``` python app.py ``` 然后在浏览器中打开 **http://localhost:5000**。 - 授予摄像头权限 —— 您的实时画面将显示在浏览器中 - 点击 **Capture** 然后点击 **Analyse**,或者直接**上传任意图像** - 模型在后端运行,并在几毫秒内返回结果 **5. (可选)从头开始重新构建** ``` python create_dataset.py # extract features → features.csv python model_train/model_training.py # grid search + train → best_random_forest.pkl python latency.py # benchmark inference speed ```
## 📌 未来改进 - 扩充数据集,包含在不同智能手机、显示器、照明条件和视角下拍摄的更大、更多样化的图像集合,以提高模型的泛化能力。 - 评估轻量级的深度学习架构,例如 **MobileNetV2**,并在更大的数据集上比较其与基于手工特征方法的性能。 - 引入额外的纹理和频域描述符(例如 **GLCM**、基于小波的特征),以改善对细微屏幕翻拍伪影的检测。 - 使用诸如 **ONNX** 或 **TensorFlow Lite** 等模型压缩技术,优化推理 pipeline 以便在边缘设备上部署。
## 👩💻 作者 ### Anshika Agrawal
## 🎯 研究动机 数字验证系统越来越依赖于用户提交的照片来验证身份、认证产品、验证文档或确认实际在场。然而,这些系统仍然容易受到屏幕翻拍攻击,攻击者会拍摄手机、平板电脑或电脑显示器上显示的图像,而不是直接拍摄原始场景。 由于两种图像的语义内容可能是相同的,传统的对象识别技术不足以检测这种欺诈行为。
## ✨ 功能 - 📷 通过交互式 Flask Web 应用程序进行实时预测 - 🖼️ 针对单张图像推理的命令行预测(`python predict.py image.jpg`) - 🧠 使用 21 种计算机视觉特征进行手工图像特征提取 - 📈 用于模型可解释性的特征重要性分析 - 🤖 使用 GridSearchCV 和 5 折交叉验证优化的 Random Forest 分类器 - 📊 包含准确率、混淆矩阵和分类指标的综合模型评估 - ⚡ 无需 GPU 或外部 API 的低延迟推理 - 📦 轻量级且可移植的部署,适合资源受限的环境
## 🛠️ 技术栈 | 类别 | 技术 | |-----------|------------| | 编程语言 | Python 3 | | 计算机视觉 | OpenCV, scikit-image | | 机器学习框架 | Scikit-learn | | 分类模型 | Random Forest | | 数据处理 | NumPy, Pandas | | 数据可视化 | Matplotlib | | Web 框架 | Flask | | 模型序列化 | Joblib |
## 📂 项目结构 ``` Screen-Recapture-Detection/ │ ├── predict.py # Single-image prediction script (main deliverable) ├── app.py # Flask web demo — live camera in the browser │ ├── feature_engineering/ │ └── features.py # All 21 feature extraction functions | └── create_dataset.py # Builds features.csv from dataset/Real and dataset/Screen | └── features.csv # Extracted feature vectors for the full dataset │ ├── model_train/ │ ├── model_training.py # Grid search + cross-validation, saves best_random_forest.pkl │ └── best_random_forest.pkl # Final trained model | └── latency.py # Benchmarks per-image inference time │ ├── dataset/ │ ├── Real/ # Genuine photographs │ └── Screen/ # Photographs of a screen displaying an image │ ├── outputs/ │ ├── confusion_matrix.png │ └── feature_importance.png | └── pipeline.png | └── image.png │ └── README.md ```
## 📊 数据集 该模型在一个自收集的包含 **120 张图像**的数据集上进行了训练和评估,这些图像平均分布在两个类别中: - **60 张真实图像** – 在不同的照明条件、视角、距离和背景下,使用智能手机相机直接拍摄的照片。 - **60 张屏幕翻拍图像** – 拍摄显示在手机或笔记本电脑屏幕上的图像的照片,拍摄于不同的视角、距离、显示亮度级别和眩光条件下。 为了确保分类器学习到的是**特定于翻拍的视觉伪影**而不是场景内容的差异,两类图像有意使用了相同或相似的底层场景。这促使模型专注于**莫尔条纹、像素网格纹理、眩光、颜色失真和频域伪影**等特征,这些特征通常是在屏幕翻拍过程中引入的。
## ⚙️ 方法论
## 🧠 特征提取 每个输入图像都被转换为一个 **21 维的手工特征向量**,捕捉通常与屏幕翻拍伪影相关的多种视觉特征。提取的特征分为以下几个类别: ### 🔹 图像质量与纹理 - Blur Score(模糊度评分) - Edge Density(边缘密度) - RMS Contrast(均方根对比度) - Tenengrad Sharpness(Tenengrad 清晰度) - LBP Mean(LBP 均值) - LBP Variance(LBP 方差) ### 🔹 频域特征 - FFT High-Frequency Energy(FFT 高频能量) - FFT Low-Frequency Energy(FFT 低频能量) - Pixel Grid Score(像素网格评分) ### 🔹 颜色统计 - Mean Red, Mean Green, Mean Blue(红色、绿色、蓝色均值) - Standard Deviation of Red, Green, and Blue Channels(红色、绿色和蓝色通道的标准差) - Brightness(亮度) - Saturation Mean(饱和度均值) ### 🔹 梯度特征 - Sobel X Gradient(Sobel X 梯度) - Sobel Y Gradient(Sobel Y 梯度) ### 🔹 统计特征 - Entropy(熵) - Noise Estimate(噪声估计) 这些手工特征捕捉了图像质量、纹理、颜色分布、梯度和频域信息的变化,使分类器能够识别屏幕翻拍过程中通常引入的视觉伪影。 所有特征提取逻辑都在 `features.py` 中实现,并在数据集生成、模型训练和推理过程中一致地复用,从而确保整个 pipeline 中的特征计算完全相同。
## 🤖 模型 为了确定最适合屏幕翻拍检测的分类器,我们使用相同的手工特征集对多种机器学习算法进行了训练和评估。根据它们的分类准确率、鲁棒性、推理效率和可解释性对这些模型进行了比较。 ### 模型对比 | 模型 | 测试准确率 | |-------------------------------|--------------| | Decision Tree | 83.33% | | K-Nearest Neighbors (KNN) | 75.00% | | Support Vector Machine (SVM) | 70.83% | | Gradient Boosting | 79.16% | | Extra Trees | 85.2% | | | **Random Forest** | **87.50%** | **Random Forest** 被选为最终模型,因为它具有出色的泛化性能、对未见样本的鲁棒性、通过特征重要性分析体现的模型可解释性,以及稳定的推理表现。 | 超参数 | 值 | |----------------|-------| | `n_estimators` | 200 | | `max_depth` | 5 | | `max_features` | `sqrt` | | `bootstrap` | `True` | | `min_samples_split` | 2 | | `min_samples_leaf` | 1 | 优化后的模型被序列化为 **`model_train/best_random_forest.pkl`**,并在命令行预测 pipeline(`predict.py`)和 Flask Web 应用程序(`app.py`)之间共享,确保所有部署接口的推理工作流保持一致。
## 📈 结果 | 指标 | 值 | |------------------------------|---------------------------| | 测试准确率 | **87.50%** (80-20 划分)| | CPU 平均推理时间 | **67.01 毫秒/张** | | 吞吐量 | **14.92 张/秒** |
特征重要性
|
混淆矩阵
|
## 🚀 如何运行 **1. 克隆仓库** ``` git clone https://github.com/agrawalanshika/Screen-Recapture-Detection.git cd Screen-Recapture-Detection ``` **2. 安装依赖项** ``` pip install -r requirements.txt ``` **3. 对单张图像运行预测** ``` python predict.py path/to/image.jpg ``` 输出:一个从 0(真实图像)到 1(屏幕翻拍)的单一分数。 **4. 启动实时 Web 演示** ``` python app.py ``` 然后在浏览器中打开 **http://localhost:5000**。 - 授予摄像头权限 —— 您的实时画面将显示在浏览器中 - 点击 **Capture** 然后点击 **Analyse**,或者直接**上传任意图像** - 模型在后端运行,并在几毫秒内返回结果 **5. (可选)从头开始重新构建** ``` python create_dataset.py # extract features → features.csv python model_train/model_training.py # grid search + train → best_random_forest.pkl python latency.py # benchmark inference speed ```
## 📌 未来改进 - 扩充数据集,包含在不同智能手机、显示器、照明条件和视角下拍摄的更大、更多样化的图像集合,以提高模型的泛化能力。 - 评估轻量级的深度学习架构,例如 **MobileNetV2**,并在更大的数据集上比较其与基于手工特征方法的性能。 - 引入额外的纹理和频域描述符(例如 **GLCM**、基于小波的特征),以改善对细微屏幕翻拍伪影的检测。 - 使用诸如 **ONNX** 或 **TensorFlow Lite** 等模型压缩技术,优化推理 pipeline 以便在边缘设备上部署。
## 👩💻 作者 ### Anshika Agrawal
标签:Apex, 反欺诈, 图像分类, 机器学习, 特征工程, 翻拍检测, 计算机视觉, 逆向工具, 随机森林
特征重要性
混淆矩阵