在网络爬虫开发中,获取公共数据时常常会遇到各种验证机制,其中滑块验证码和点击验证码因其复杂性较为棘手。传统方法如使用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(保存标注)。
  • 路由
    • /:渲染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+cputorchvision==0.18.1+cpuflaskpillownumpygunicorn
    • 创建目录:Uploadsstatic/outputsaved_imagessaved_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.pemprivkey.pem)。
    • 强制HTTPS,重定向80端口到443。
    • SSL协议支持TLSv1.1至TLSv1.3,优化密码套件和会话缓存。
    • 代理请求到Flask(http://172.18.0.2:5000),限制saved_imagessaved_coco_json路径访问。
    • 日志保存至/var/log/slider_model_flask.logerror.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)(使用这个即可)

  • 功能:交互式菜单,简化部署。
  • 选项
    1. 仅Flask:构建并运行Flask容器,映射端口50000,挂载图像和JSON目录。
    2. Flask + Nginx:使用Docker Compose部署,创建日志文件,提醒用户添加SSL证书和调整代理IP。
    3. 手动下载模型:从压缩包中获取.pth模型文件,自行部署使用。
  • 注意:脚本需与Dockerfile等文件同目录,日志和数据路径可自定义。

3.5 部署步骤

  1. GitHub仓库下载本项目所有文件到服务器。
  2. 从谷歌云盘下载打包好的模型:
    https://drive.google.com/file/d/1oJKObrPpepf6urYaYJxJOmyRZn7vE8OU/view?usp=sharing
  3. 以root权限执行install_slider_model.sh
  4. 或者根据dockerfiledocker-compose.yml自定义安装。



总结

本项目展示了一个完整的滑块验证码识别系统:

  • 技术核心:基于Faster R-CNN和ResNet50-FPN的深度学习模型,精准定位滑块缺口,优于传统OpenCV方法。
  • 前后端交互:Flask后端处理预测,HTML+JavaScript前端提供直观体验。
  • Docker部署:通过Dockerfile、Nginx和Docker Compose,实现安全、可靠的容器化部署。

无论是用于爬虫验证还是其他场景,本文体现了深度学习与Web技术的强大结合。欢迎下载代码,体验网站,或根据需求自定义部署!

更新计划

  • 2025年5月16日,正式发布,未来可能更新其他的识别情况(目前识别只能单个落点识别)

还有问题?请在评论区留言,我会尽快回复!

想接收我的项目更新通知?可以去GitHub关注我或者订阅我的博客

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注