引言
在人机交互安全领域,区分真实用户与自动化脚本是一项关键挑战。传统方法通常依赖规则引擎或统计特征来检测异常行为,但这些方法在面对日益复杂的自动化工具时逐渐力不从心。本文提出了一种将鼠标轨迹转换为图像、再利用深度学习模型进行分类的创新方法,将时序行为检测问题转化为计算机视觉问题,从而充分借鉴成熟的图像分类架构。
本系统已完整实现从数据生成、模型训练、推理评估到 API 服务部署的全链路,支持 CNN、ResNet、U-Net 三种架构的对比与选择。
一、设计思想
1.1 核心洞察:轨迹即图像
鼠标轨迹本质上是一组带有时间戳的坐标序列 (x, y, t)。传统做法通常将其视为时间序列,使用 RNN 或 Transformer 处理。然而我们观察到一个重要特征:真实人类的鼠标轨迹与机器生成的轨迹在视觉形态上存在显著差异------人类轨迹自然、有弧度、速度渐变;机器轨迹则往往过于直线、均匀或呈现数学曲线的规律性。

基于此洞察,我们提出将轨迹光栅化为灰度图像的方案:
- 空间信息:轨迹的坐标映射到 256×256 的画布上
- 时间信息:通过灰度值编码(早期点 120→晚期点 40),越晚的轨迹越暗
- 形态信息:曲线的弧度、转折、停顿等全部以视觉形态保留
这种转换将时序分析问题转化为图像分类问题,使我们能够直接使用成熟的 CNN 架构。
1.2 模块化设计原则
系统遵循高内聚、低耦合的设计原则,划分为五个核心模块:
数据生成 → 轨迹转图像 → 模型训练 → 推理评估 → API 服务

每个模块独立可运行,通过标准化接口衔接:
| 模块 | 输入 | 输出 | 关键类/函数 |
|---|---|---|---|
| 数据生成 | 算法参数 | 轨迹文本文件 | 5种生成器 |
| 轨迹转图像 | 坐标+窗口信息 | 256×256 灰度图 | TraceToImage |
| 模型训练 | 图像数据集 | 模型权重+ONNX | BaseTrainer + 子类 |
| 推理评估 | 模型+数据 | 预测结果+指标 | predict.py |
| API 服务 | JSON 请求 | 分类结果 | Flask + MultiModelManager |
1.3 多模型对比策略
我们没有预设"最佳模型",而是实现了三种不同复杂度的架构,通过实验对比选择最优方案。这种策略的优势在于:
- 不同模型对数据特征的敏感度不同,实验验证优于理论推断
- 模型可互换部署,支持 A/B 测试和模型热切换
- 复合评分机制(
0.5×AUC + 0.3×F1 + 0.2×Acc)确保多维度评估
二、实现方法
2.1 轨迹到图像的转换
TraceToImage 类是整个系统的关键桥梁,它将原始轨迹数据转换为标准化图像:

转换流程:
- 绝对坐标还原:将相对坐标转换为绝对位置
- 窗口偏移计算 :使用
ox = (ow - iw) / 2将轨迹居中到窗口 - Min-Max 归一化:将坐标拉伸到 0, 1 区间
- 时间灰度编码:将时间戳映射为灰度值 120→40(浅→深)
- 画布映射:将归一化坐标映射到 256×256 画布,保留 30px 边距
- 光栅化:在白色(255)背景上绘制灰度轨迹点
这种编码方式使得:
- 轨迹的空间形态一目了然
- 时间先后通过明暗区分
- 每条轨迹都归一化到相同的尺寸和范围
2.2 合成数据生成
为了获得充足的负样本(伪造轨迹),系统实现了五种合成轨迹生成算法:
| 生成器 | 原理 | 特点 |
|---|---|---|
LinearInterpolationTrajectory |
线性/二次/三次插值 | 最简单,直线或低阶曲线 |
BezierTrajectory |
Bernstein 多项式曲线 | 平滑曲线,可控弧度 |
SplineTrajectory |
SciPy 样条插值 | 数学系曲线,支持多阶 |
SpringMassTrajectory |
胡克定律+阻尼模拟 | 物理仿真,有振荡特征 |
BezierBrownianTrajectory |
Bezier + 布朗运动噪声 | 混合模型,兼具规律与随机 |
所有生成器支持随机窗口尺寸(500-2000px)、随机起终点、可配置 FPS 和噪声级别、多点路径等功能,确保合成数据的多样性。
2.3 模型架构

2.3.1 MouseCNN --- 基线模型
最直接的实现,5 层卷积逐步提取特征:
输入(1×256×256) → Conv+ReLU+Pool × 5 → AdaptiveAvgPool → FC → 输出
通道变化: 1 → 32 → 64 → 128 → 256 → 256
分类器: 256 → 64(ReLU+Dropout) → num_classes
- 参数量:约 1M
- 特点:简单快速,适合作为基线
- 不足:缺少残差连接和注意力机制,深层特征提取能力有限
2.3.2 MouseResNet --- 深层特征提取
基于 ResNet18 架构,引入残差连接解决梯度消失:
输入(1×256×256) → 7×7Conv+BN+ReLU+MaxPool → 4个残差层 → AdaptiveAvgPool → Dropout(0.5) → FC
通道变化: 64 → 128 → 256 → 512
残差块: [2, 2, 2, 2] BasicBlock
- 参数量:约 11M
- 特点:残差连接使深层网络可训练,BN 加速收敛
- 不足:参数量大,小数据集上易过拟合
2.3.3 MouseUNetLite --- 推荐架构
专为轨迹检测优化的轻量 U-Net,融合了三种关键机制:
深度可分离卷积(DWConv):将标准卷积拆分为逐通道卷积和逐点卷积,大幅减少参数量:
python
# DWConv: groups=channels, 用膨胀卷积扩大感受野
dilation_rates = [1, 2, 4, 8] # 逐层指数增长
双重注意力门(AttentionGate):同时关注"哪些通道重要"和"哪些空间位置重要":

通道注意力: AvgPool → Conv → ReLU → Conv → Sigmoid (SE 机制)
空间注意力: Concat(Mean, Max) → 7×7Conv → Sigmoid
输出 = 输入 × 通道权重 × 空间权重
膨胀卷积:逐层指数增长膨胀率(1→2→4→8),在不增加参数的情况下扩大感受野:

编码器结构:
4级编码器: [16, 32, 64, 128] 通道
每级: ConvBNReLU → DWConv(膨胀) → AttentionGate
全局平均池化 → Dropout(0.3) → FC(128→64→num_classes)
- 参数量:约 0.5M(三者中最少)
- 特点:注意力机制聚焦轨迹区域,膨胀卷积捕获长距离依赖,参数效率极高
为什么 U-Net 适合轨迹检测?
- 轨迹图像的稀疏性:大部分区域是白色背景,注意力机制能自动忽略背景、聚焦轨迹
- 多尺度特征需求:轨迹既有局部细节(转折点、停顿),也有全局模式(整体弧度),膨胀卷积 (1→2→4→8) 逐级扩大感受野
- 参数效率:深度可分离卷积使模型仅 0.5M 参数,小数据集上过拟合风险低
2.4 训练框架
BaseTrainer 提供统一的训练流程,子类只需实现 create_model():
关键训练策略:
- 复合评分 :
Composite = 0.5×AUC + 0.3×F1 + 0.2×Acc,兼顾排序能力和分类精度 - 双模型保存:同时保存 composite-best(推荐推理用)和 AUC-best(参考用)
- Warm-up 机制:前 5 个 epoch 不触发早停,给模型充分的学习空间
- 混合精度训练:CPU 用 BFloat16,GPU 用 Float16,降低计算开销
- ONNX 自动导出:每次模型改善时自动导出 ONNX 格式,支持跨平台部署
- INT8 量化:可选的动态量化,进一步压缩模型体积,适合 CPU 推理
- 断点续训:完整保存模型、优化器、调度器状态,支持从任意 checkpoint 恢复
2.5 推理与评估
推理管线自动检测模型架构和数据格式,支持批量预测,输出完整评估指标:
- 准确率、精确率、召回率、F1 分数
- 混淆矩阵(TN/FP/FN/TP)
- 每类概率统计
- JSON 格式的预测结果和评估报告
三、部署方式
3.2 API 服务
基于 Flask + Flask-CORS 构建,支持多模型管理:
核心组件:
MouseTracePredictor:加载模型,处理轨迹到图像的转换和预测MultiModelManager:管理多个模型的加载、切换和降级
API 端点:
| 端点 | 方法 | 功能 |
|---|---|---|
/health |
GET | 服务健康状态、已加载模型列表 |
/models |
GET | 所有模型元信息 |
/predict |
POST | 轨迹真实性预测 |
预测请求示例:
bash
curl -X POST http://localhost:8081/predict \
-H "Content-Type: application/json" \
-d '{
"wd": {"ow": 1920, "oh": 1080, "iw": 800, "ih": 600},
"mt": [[100, 200, 0], [150, 250, 16], [200, 300, 32]]
}'
响应:
json
{
"succ": true,
"predict": 1,
"confidence": 0.92,
"score": {"0": 0.08, "1": 0.92}
}
3.3 ONNX 跨平台推理
训练完成后自动导出 ONNX 格式,支持:
- 跨语言调用(Python、C++、Java、Go)
- CPU 优化推理(INT8 量化后模型更小、推理更快)
- 边缘设备部署
四、实验结果与分析
4.1 三模型对比
| 指标 | MouseCNN | MouseResNet | MouseUNetLite |
|---|---|---|---|
| 参数量 | ~1M | ~11M | ~0.5M |
| 测试准确率 | 50.3% | 50.3% | 待验证 |
| 架构特点 | 5层纯卷积 | 残差连接+BN | 注意力+DWConv+膨胀卷积 |
| 过拟合风险 | 低 | 高 | 最低 |
| 推理速度 | 最快 | 较慢 | 快 |
当前结果显示所有模型的测试准确率接近随机猜测(50.3%),表明数据集具有较高挑战性。分析原因:
- 负样本多样性不足:合成轨迹与真实机器轨迹存在分布差异
- 正样本质量:真实轨迹中可能包含异常样本
- 特征编码局限:灰度编码可能丢失了部分时序信息
4.2 为什么 U-Net 潜力最大
尽管当前指标接近,U-Net 在架构层面具有最大优化潜力:
- 注意力机制可解释性:注意力图可以可视化模型关注的区域,帮助诊断问题
- 参数效率:0.5M 参数意味着在小数据集上更容易收敛
- 膨胀卷积:指数增长的感受野(1→2→4→8)天然适配轨迹的多尺度特征
- 数据增强兼容:配合弹性变形、透视变换等增强手段效果更佳
4.3 优化方向
基于当前实验结果,后续优化方向包括:
- 数据层面:引入更多样化的负样本生成策略(高斯过程、HMM 等),增加真实机器轨迹样本
- 特征编码:尝试 RGB 多通道编码(X/Y坐标+时间分通道),保留更丰富的信息
- 模型层面 :利用 U-Net 的
get_attention_maps()进行可视化分析,指导模型调优 - 训练策略:调整复合评分权重,增加 F1 的比重以改善类别不平衡场景
- 集成学习:结合多个模型的预测结果,提升整体鲁棒性
五、总结
本文介绍了一种将鼠标轨迹检测转化为图像分类问题的深度学习方案。系统的核心创新在于:
- 轨迹光栅化:将时序行为数据转化为图像,利用成熟的视觉模型
- 时间灰度编码:在单通道图像中同时保留空间和时间信息
- 多模型对比:从简单到复杂的三种架构,实验驱动选择最优方案
- 注意力机制:U-Net 的双重注意力天然适配轨迹图像的稀疏性
- 端到端工程化:从数据生成到 Docker 部署的完整实现
这套方案不仅适用于鼠标轨迹检测,其"行为→图像→分类"的思路也可推广到其他行为分析场景,如触屏手势识别、键盘节奏分析等。