在网络爬虫开发中,获取公共数据时常常会遇到各种验证机制,其中滑块验证码和点击验证码因其复杂性较为棘手。传统方法如使用OpenCV进行特征提取和模板匹配,可以初步定位滑块位置,但当背景图像复杂度较高时,预测结果往往偏差较大,甚至完全错误。为解决这一问题,本项目采用深度学习技术,训练了一个基于Faster R-CNN的模型,利用已知的滑块数据集,实现了更精准的滑块位置预测。
本文模型基于fasterrcnn-resnet50-fpn预训练模型,通过微调预训练权重,将原始的81个类别(COCO数据集)缩减至2类(背景和滑块缺口),取得了令人满意的效果。以下将详细介绍技术细节、模型训练、前后端交互以及Docker部署的全过程。具体部署代码详见我的GitHub仓库,使用我编写的脚本一键安装即可。
一、技术细节
1、深度学习模型:Faster R-CNN with ResNet50-FPN
本项目选用Faster R-CNN(Region-based Convolutional Neural Network),一种强大的目标检测模型,结合ResNet50和FPN(Feature Pyramid Network)作为骨干网络。以下是模型的关键组件和训练细节:
- 模型架构:
- Backbone:ResNet50,50层残差网络,预训练ImageNet,用于提取图像特征。详见ResNet论文:Deep Residual Learning for Image Recognition。
- FPN:特征金字塔网络,增强多尺度特征提取,适用于检测不同大小的滑块缺口。参考论文:Feature Pyramid Networks for Object Detection。
- RPN(Region Proposal Network):生成候选区域,提出可能包含滑块缺口的边界框。
- ROI Pooling:将候选区域的特征映射到固定尺寸,供后续分类和边界框回归。
- 分类与回归:原始模型输出81类(COCO数据集),通过微调替换分类头,仅输出2类(背景和滑块缺口)。
- 预训练权重:使用
FasterRCNN_ResNet50_FPN_Weights.COCO_V1,基于COCO数据集预训练,提供了丰富的特征提取能力。 - 微调:将
roi_heads.box_predictor替换为新的FastRCNNPredictor,输入特征数为in_features,输出类别数设为2。 - 损失函数:结合RPN损失(分类和定位)和ROI损失(分类和边界框回归),通过SGD优化器最小化总损失。
- 外部资源:
2、环境与依赖
- 框架:PyTorch(2.3.1+cpu)、Torchvision(0.18.1+cpu)
- 数据增强:随机水平和垂直翻转,提升模型对复杂背景的鲁棒性
- 硬件:支持GPU(CUDA)加速,兼容CPU运行
- 其他库:Flask、Pillow、NumPy、Gunicorn
二、预览
1、网站体验
您可以直接访问以下网址体验滑块识别功能:https://slider_pre.mengta.link/
2、示例效果
原始图像:

预测结果:

复杂场景对比:
传统OpenCV方法在复杂背景下的预测(大红框,偏差较大):


通过对比可见,本模型在复杂背景图像中表现出色,显著优于传统OpenCV方法。
三、项目结构与实现
1. 模型训练:滑块识别脚本
数据集准备 (slider_dataset.py)
- 功能:自定义SliderDataset类,继承自torch.utils.data.Dataset,用于加载训练数据。
- 输入:
- 图像目录:
dataset/image,存储滑块验证码的背景图像。 - 标注目录:
dataset/info,存储JSON格式的标注文件。
- 图像目录:
- 处理:
- 使用PIL加载RGB图像。
- 从JSON文件中提取边界框坐标(x_min, y_min, x_max, y_max),标签为1(表示“缺口”)。
- 数据增强:转换为Tensor,随机垂直/水平翻转。
- 输出:返回图像Tensor和目标字典,包含:
- boxes:边界框坐标
- labels:类别标签(1为缺口)
- image_id:图像索引
- area:边界框面积
- iscrowd:是否拥挤(默认为0)
- 参考:PyTorch数据集教程:https://pytorch.org/tutorials/beginner/data_loading_tutorial.html
训练脚本 (滑块识别.py)
- 模型:加载
fasterrcnn_resnet50_fpn,预训练于COCO,微调为2类。 - 数据加载:
- 使用
DataLoader,批次大小16,启用随机打乱,多线程加载(num_workers=4)。 - 自定义
collate_fn合并批次数据。
- 使用
- 训练配置:
- 设备:优先GPU(CUDA),否则CPU。
- 优化器:SGD,学习率0.005,动量0.9,权重衰减0.0005。
- 学习率调度:每3轮乘以0.1(gamma=0.1)。
- 训练轮次:10轮。
- 流程:
- 替换分类头,适配2类输出。
- 迭代训练,计算RPN和ROI损失,更新权重,实时显示进度和损失值。
- 保存模型为
slider_fasterrcnn.pth。
- 资源:SGD优化器文档:https://pytorch.org/docs/stable/optim.html
2. 前后端交互
后端:Flask应用 (slider_model.py)
- 初始化:
- 创建Flask实例,模板目录为
page。 - 加载训练好的模型
slider_fasterrcnn.pth,使用CPU运行。 - 额外目录:
Uploads(上传)、static/output(输出)、saved_images(保存图像)、saved_coco_json(保存标注)。
- 创建Flask实例,模板目录为
- 路由:
/:渲染index.html,提供上传界面。/predict:处理POST请求,接收图像,预测缺口位置,使用PIL绘制红框,保存输出图像,返回JSON数据(边界框坐标、置信度分数、图像URL)。/save_result:接收JSON数据,保存预测图像和COCO格式标注,删除临时文件。/static/output/<filename>:提供输出图像。
- 特性:
- 时间戳命名文件,避免冲突。
- 异常处理,返回错误(如未上传文件或未检测到目标)。
- 参考:Flask文档:https://flask.palletsprojects.com/
前端:网页界面 (index.html)
- 功能:简洁的上传界面。
- 结构:
- 文件输入框:选择滑块背景图像。
- 提交按钮:触发
/predict请求。 - 显示区域:动态加载预测结果(边界框坐标、置信度、带红框的图像)。
- 体验:用户上传图像后,立即看到预测结果,便于验证和保存。
- 资源:HTML与JavaScript基础:https://developer.mozilla.org/en-US/docs/Web
3. Docker部署
为确保项目便携性和部署一致性,本项目使用Docker容器化,提供了一键部署脚本和自定义配置文件。
3.1 Dockerfile (dockerfile)
- 基础镜像:基于
debian:latest。 - 功能:
- 设置工作目录为
/flask_app/slider_model。 - 安装Python 3.11、pip、tar等工具。
- 复制并解压
slider_model.tar,包含模型和代码。 - 检查虚拟环境,若缺失则创建并安装依赖:
torch==2.3.1+cpu、torchvision==0.18.1+cpu、flask、pillow、numpy、gunicorn。 - 创建目录:
Uploads、static/output、saved_images、saved_coco_json,设置权限。
- 设置工作目录为
- 运行:使用Gunicorn启动Flask应用,监听
0.0.0.0:5000。 - 参考:Dockerfile文档:https://docs.docker.com/engine/reference/builder/
3.2 Nginx配置 (dockerfile.nginx & slider_model.conf)(非必须,强制https访问才用)
- 基础镜像:
nginx:latest。 - 配置:
- 复制
slider_model.conf和SSL证书(fullchain.pem、privkey.pem)。 - 强制HTTPS,重定向80端口到443。
- SSL协议支持TLSv1.1至TLSv1.3,优化密码套件和会话缓存。
- 代理请求到Flask(
http://172.18.0.2:5000),限制saved_images和saved_coco_json路径访问。 - 日志保存至
/var/log/slider_model_flask.log和error.log。
- 复制
- 资源:Nginx配置指南:https://nginx.org/en/docs/
3.3 Docker Compose (docker-compose.yml)
- 服务:
slider_model_flask:构建Flask容器,挂载图像和JSON保存目录。nginx_flask:构建Nginx容器,挂载配置文件、日志和SSL证书,暴露80和443端口。
- 特性:自动重启,确保高可用性。
- 参考:Docker Compose文档:https://docs.docker.com/compose/
3.4 一键安装脚本 (install_slider_model.sh)(使用这个即可)
- 功能:交互式菜单,简化部署。
- 选项:
- 仅Flask:构建并运行Flask容器,映射端口50000,挂载图像和JSON目录。
- Flask + Nginx:使用Docker Compose部署,创建日志文件,提醒用户添加SSL证书和调整代理IP。
- 手动下载模型:从压缩包中获取
.pth模型文件,自行部署使用。
- 注意:脚本需与Dockerfile等文件同目录,日志和数据路径可自定义。
3.5 部署步骤
- 从GitHub仓库下载本项目所有文件到服务器。
- 从谷歌云盘下载打包好的模型:
https://drive.google.com/file/d/1oJKObrPpepf6urYaYJxJOmyRZn7vE8OU/view?usp=sharing - 以root权限执行
install_slider_model.sh。 - 或者根据
dockerfile和docker-compose.yml自定义安装。
总结
本项目展示了一个完整的滑块验证码识别系统:
- 技术核心:基于Faster R-CNN和ResNet50-FPN的深度学习模型,精准定位滑块缺口,优于传统OpenCV方法。
- 前后端交互:Flask后端处理预测,HTML+JavaScript前端提供直观体验。
- Docker部署:通过Dockerfile、Nginx和Docker Compose,实现安全、可靠的容器化部署。
无论是用于爬虫验证还是其他场景,本文体现了深度学习与Web技术的强大结合。欢迎下载代码,体验网站,或根据需求自定义部署!
更新计划
- 2025年5月16日,正式发布,未来可能更新其他的识别情况(目前识别只能单个落点识别)
还有问题?请在评论区留言,我会尽快回复!
想接收我的项目更新通知?可以去GitHub关注我或者订阅我的博客。
