# 基于 CNN 的手机屏幕花屏检测模型
**Repository Path**: yuan-fanghao/cnn-screen-glitch-detector
## Basic Information
- **Project Name**: 基于 CNN 的手机屏幕花屏检测模型
- **Description**: 本项目基于 CNN(卷积神经网络)构建图像异常分类模型,用于解决手机花屏识别问题,通过对手机屏幕图像的分析判断,实现正常屏幕与花屏屏幕的自动分类。
- **Primary Language**: Python
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-09-10
- **Last Updated**: 2025-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# README
## 前言
本文档主要用于介绍实习期间完成的基于深度学习框架的手机花屏异常检测项目,包括项目部署、模型训练、推理及评估等内容,旨在为日后项目改进与工程化落地提供参考。
### 项目概述
本项目基于 CNN(卷积神经网络)构建图像异常分类模型,用于解决手机花屏识别问题,通过对手机屏幕图像的分析判断,实现正常屏幕与花屏屏幕的自动分类。
### 运行平台
- 操作系统:Windows 10/11, Linux等可以运行python的环境
- 编程语言:python版本>=3.10
- 硬件要求:首选cuda运行,次选cpu运行
## 一、部署
### 环境部署
安装 Python:从 Python 官网下载并安装符合版本要求(≥3.10)的 Python 环境。
- 验证 Python 安装:
1. 打开命令提示符(Windows)或终端(Linux)
2. 输入命令:python --version
3. 若显示类似Python 3.10.12的版本信息,则安装成功
4. 若提示 "命令未找到",需检查 PATH 环境变量配置或重新安装
- pip 通常随 Python 自动安装,验证方法:
1. 打开命令提示符 / 终端
2. 输入命令:pip --version
3. 若显示类似pip 22.3.1 from ... (python 3.10)的信息,且 Python 版本与安装版本一致,则安装正常
4. 若 pip 未安装或版本过低,执行升级命令:python -m pip install --upgrade pip
### 仓库克隆与相关库安装
请克隆本项目仓库于本地
- 请在Gitee中克隆develop分支:https://gitee.com/yuan-fanghao/cnn-screen-glitch-detector/tree/develop
1. 在项目根目录创建requirements.txt文件,包含所有需要的库,内容如下:
```markdown
numpy
pillow
torch
torchvision
matplotlib
tqdm
scikit-learn
seaborn
scipy
```
2. 建立并激活虚拟环境(可选但推荐)。
- 执行 pip install pipenv 以安装pip虚拟环境管理器
- 安装完成后, 执行 pipenv shell, 只要没有报错, 就成功进入了pipenv环境
- 在虚拟环境中执行以下命令安装所有依赖库:
```bash
pip install -r requirements.txt
```
### 项目目录结构
```
项目根目录/
├── misclassified_samples.txt # 误分类样本记录
├── test_confusion_matrix.png # 测试集混淆矩阵图像
├── test_CNN.py # CNN测试相关代码
├── normal_test_generator.py # 正常测试集生成代码
├── normal_dataset_generator.py # 正常数据集生成代码
├── abnormal_test_generator.py # 异常测试集生成代码
├── abnormal_dataset_generator.py # 异常数据集生成代码
├── pytorch_screen_glitch_detector.py# 模型训练代码
├── glitch_generator_png.py # 随机生成透明背景花屏图片代码
├── training_history.png # 训练过程历史图表
├── screen_glitch_detector.pth # 训练好的模型参数文件
├── .vscode/ # VSCode配置文件夹
├── glitch_patterns/ # 存放生成的花屏图案图片
├── masks/ # 掩码文件目录
├── phone_screen_dataset/ # 训练&验证集目录
| ├── normal/ # 正常屏幕数据集
| └── abnormal/ # 异常屏幕数据集
└── CNN_test/ # 测试集数据目录
├── normal/ # 正常屏幕测试数据
└── abnormal/ # 异常屏幕测试数据
```
### 检测流程
1. 按照数据集制作规范准备训练、验证和测试数据。
2. 运行训练脚本在训练集和验证集上完成模型训练,得到训练好的模型文件。
3. 使用训练好的模型对手机屏幕图像进行花屏检测,输出检测结果。
## 二、数据集准备与生成
### 原始数据收集
正常屏幕图像:
- 从不同型号手机截屏获取
- 图像清晰,包含各种常见屏幕内容(应用界面、照片、纯色背景等)
- 统一图像尺寸为 1080×2340 像素
- 保存于phone_screens_origin/normal_screens文件夹中

花屏样本生成:
- 方法一:收集真实花屏手机的屏幕图像,保存于phone_screens_origin/abnormal_screens/目录,以备抠图或者通过强化真实异常样本获取更多异常样本
- 方法二:使用花屏生成工具自动生成,可生成多种类型的花屏效果:
条纹干扰
高斯模糊斑块
随机色块
像素级噪点
混合类型花屏
- 方法三:Photoshop等制图软件直接绘制
本项目采用方法一与方法二结合,一方面引入真实花屏案例,一方面使用正常屏幕图片和透明背景局部花屏图片批量合成异常样本。

### 花屏生成工具
一个用于生成带有透明背景的各类型花屏图片的Python程序,所有生成的图片均采用 RGBA 格式,背景保持透明,方便后续与其他图像叠加使用。
目前支持以下几种干扰效果:
- 高斯模糊块(Gaussian Blur Patches)
- 马赛克(Mosaic)
- 彩色条纹干扰(Stripes)
- 椒盐噪点(Salt-and-Pepper Noise)
- 色偏区域(Color Tint)
- 线条干扰(Lines Interference)
- 屏幕撕裂(Screen Tearing)
生成参数:
- 图像尺寸:1080×2340(适配手机屏幕分辨率)
- 输出路径:默认保存至桌面的CNN_model/glitch_patterns目录
- 每种模式生成数量:默认 5 个(可通过修改主函数参数调整)

后续可选自定义修改项:
- 如需调整生成数量,修改主函数中的num_per_type参数
- 如需启用更多效果,增加函数或取消目前generate_all_patterns函数中对应方法的注释
- 可通过修改各生成函数中的随机范围参数(如大小、颜色、透明度等)调整效果风格
- 如需更改输出尺寸,修改WIDTH和HEIGHT变量
### 数据集增强与处理
- 训练与验证数据集应放在{桌面路径}/CNN_model/phone_screen_dataset目录下
- 测试数据集应放在{桌面路径}/CNN_model/CNN_test目录下
- 两个数据集均需包含两个子文件夹:
- normal: 存放正常屏幕图像
- abnormal: 存放花屏屏幕图像
- 支持的图像格式:.png, .jpg, .jpeg, .bmp
#### 数据集准备步骤:
1. 运行glitch_generator_png.py随机生成类型、颜色、大小、位置随机的透明背景png格式花屏;
3. 运行normal_dataset_generator.py通过旋转、放缩、裁剪、亮度调整等随机增强手段使用原始正常图片批量生成正常图片数据集;
5. 运行abnormal_dataset_generator.py,在正常图片数据集中每张图片随机从花屏文件夹中抽一张花屏叠加在任意位置,同时生成异常样本及其对应掩码;
6. 重新运行glitch_generator_png.py生成新一批花屏,运行normal_test_generator.py和abnormal_test_generator.py,根据原始数据集和新生成花屏集合生成测试集,测试集图片名称带有“正常”和“异常”标识,便于测试结果统计。
## 三、模型训练
### 模型配置参数
在训练前配置以下关键参数(位于pytorch_screen_glitch_detector.py中):
```python
class Config:
# 数据参数
IMAGE_SIZE = (180, 320) # 输入图像尺寸 (高, 宽)
BATCH_SIZE = 32 # 批处理大小
VALIDATION_SPLIT = 0.2 # 验证集比例
# 训练参数
EPOCHS = 50 # 最大训练轮数
LEARNING_RATE = 1e-4 # 初始学习率
WEIGHT_DECAY = 1e-5 # 权重衰减(L2正则化)
PATIENCE = 5 # 早停机制容忍轮数
MOMENTUM = 0.9 # 动量因子
# 设备配置
DEVICE = "cuda" if torch.cuda.is_available() else "cpu"
# 保存路径
MODEL_SAVE_PATH = "parameters/screen_glitch_detector.pth"
HISTORY_SAVE_PATH = "results/training_history.png"
```
### 模型结构
模型采用 4 层卷积提取特征,3 层全连接进行分类:
```python
class ScreenGlitchCNN(nn.Module):
def __init__(self):
super(ScreenGlitchCNN, self).__init__()
# 特征提取部分
self.features = nn.Sequential(
# 卷积块1
nn.Conv2d(3, 32, kernel_size=3, padding=1),
nn.BatchNorm2d(32),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 卷积块2
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.BatchNorm2d(64),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 卷积块3
nn.Conv2d(64, 128, kernel_size=3, padding=1),
nn.BatchNorm2d(128),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2),
# 卷积块4
nn.Conv2d(128, 256, kernel_size=3, padding=1),
nn.BatchNorm2d(256),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=2, stride=2)
)
# 分类部分
self.classifier = nn.Sequential(
nn.Linear(256 * 11 * 20, 1024), # 输入维度根据卷积输出计算
nn.ReLU(inplace=True),
nn.Dropout(0.5),
nn.Linear(1024, 512),
nn.ReLU(inplace=True),
nn.Dropout(0.5),
nn.Linear(512, 1),
nn.Sigmoid() # 二分类输出
)
```
### 训练过程执行
打开命令提示符 / 终端,进入项目目录
执行训练命令:`python pytorch_screen_glitch_detector.py --train`
训练过程中会实时显示以下信息:
- 当前轮次(Epoch)和总轮次,
- 训练集损失(Loss)和准确率(Accuracy),
- 验证集损失(Val Loss)和准确率(Val Accuracy),
- 每轮训练耗时
训练过程自动应用以下机制:
- 学习率动态调整:当验证损失停止下降时,学习率自动减半
- 早停机制:连续5轮验证损失未改善则停止训练
- 最佳模型保存:仅保存验证集性能最佳的模型参数
### 训练可视化
训练完成后,程序会自动生成训练历史图表(results/training_history.png),包含:
- 训练集与验证集的损失曲线
- 训练集与验证集的准确率曲线
- 训练集与验证集的精确率、召回率和 F1 分数曲线

## 四、模型评估
### 评估指标说明
模型评估将输出以下关键指标:
- 准确率(Accuracy):(TP + TN) / (TP + TN + FP + FN)
含义:正确分类的样本占总样本的比例
- 精确率(Precision):TP / (TP + FP)
含义:预测为花屏的样本中实际为花屏的比例
- 召回率(Recall):TP / (TP + FN)
含义:实际为花屏的样本中被正确识别的比例
- F1 分数(F1 Score):2 * (Precision * Recall) / (Precision + Recall)
含义:精确率和召回率的调和平均,综合评价模型性能
- 混淆矩阵(Confusion Matrix):展示真阳性 (TP)、真阴性 (TN)、假阳性 (FP)、假阴性 (FN) 的数量分布
### 执行评估过程
- 执行评估命令`python test_CNN.py --evaluate --model_path parameters/screen_glitch_detector.pth`
- 评估结果示例:
```
使用设备: cpu
加载测试集...
测试集加载完成 - 总样本数: 400
正常屏幕样本: 200
花屏样本: 200
加载模型...
模型已从 \Desktop\CNN_model\screen_glitch_detector.pth 加载
开始在测试集上评估模型...
===== 推理速度评估 =====
总推理时间: 6.9760 秒
平均单张图片判断时间: 0.017440 秒
平均每秒可处理图片数: 57.34 张/秒
===== 测试集评估结果 =====
准确率 (Accuracy): 0.8900
精确率 (Precision): 0.8679
召回率 (Recall): 0.9200
F1分数 (F1 Score): 0.8932
混淆矩阵:
[[172 28]
[ 16 184]]
真阴性(TN): 172 (正常识别为正常)
假阳性(FP): 28 (正常误判为花屏)
假阴性(FN): 16 (花屏误判为正常)
真阳性(TP): 184 (花屏识别为花屏)
错误分类样本数: 44
前10个错误分类样本信息已保存至 misclassified_samples.txt
测试完成
```
评估结果将保存为:
- 部分错误样本信息:results/misclassified_samples.txt
- 混淆矩阵图表:results/confusion_matrix.png
