三星堆文字点选验证码的识别思路和技术方案

三星堆文字点选验证码


抢票过程中往往需要对验证码进行自动识别,本文对三星堆博物馆的抢票验证码进行分析,并训练模型进行识别,准确率可以达到99%对上,基本破解此类验证码。>

在这里插入图片描述



前言

文字点选类的验证码通常选择yolo+siamese孪生神经网络算法进行识别,通过本人多种验证码的实践发现,普通的siamese孪生神经网络算法因为需要逐个对比,耗时较长,因此基于孪生神经网络进行改进,提升推理速度。


一、数据标注

首先在网站上批量采集验证码图像,然后使用标注工具进行标注,注意和普通yolo模型标注不同的是,除了要标注框的类别之外,还需要标注文字,为后续孪生神经网络数据集做准备。
在这里插入图片描述

二、模型训练

1.目标检测模型

当然是大家都熟悉的yolov5了,代码就不放了,网上一大把:

在这里插入图片描述

2.相似度识别模型

代码如下(核心模型部分):

"""
训练模型的时候分为两个部分,特征提取器和分类器
采用组合loss进行训练: Classification Loss 和 Metric learning Loss
"""

import paddle
import paddle.nn as nn


class SiameseNet18(nn.Layer):
    def __init__(self, feature_num, pretrained=True):
        super().__init__()
        self.backbone = paddle.vision.resnet18(pretrained=True)
        self.fc = nn.Linear(512, feature_num)
        self.backbone.fc = self.fc
        self.backbone.relu = nn.Silu()

    def forward(self, inputs):
        x = self.backbone(inputs)
        features = paddle.nn.functional.normalize(x, axis=1)
        return features


# insightface loss
class Classifier(nn.Layer):
    def __init__(self, input_dim, class_nums, margin1=1.0, margin2=0.5, margin3=0.0, scale=64):
        super().__init__()
        self.weight = paddle.normal(0, 0.01, (input_dim, class_nums))
        self.sub_weight = paddle.create_parameter(shape=self.weight.shape, dtype='float32',
                                              default_initializer=paddle.nn.initializer.Assign(self.weight))
        self.sub_weight.stop_gradient = False
        self.margin1 = margin1
        self.margin2 = margin2
        self.margin3 = margin3
        self.logit_scale = scale

    def forward(self, total_feature, total_label):
        norm_weight = paddle.nn.functional.normalize(self.sub_weight, axis=0)
        local_logit = paddle.matmul(total_feature, norm_weight)

        loss, softmax = paddle.nn.functional.margin_cross_entropy(
            local_logit,
            total_label,
            margin1=self.margin1,
            margin2=self.margin2,
            margin3=self.margin3,
            scale=self.logit_scale,
            return_softmax=True,
            reduction='mean', )

        return loss, softmax


if __name__ == '__main__':

    model = SiameseNet18(64)
    paddle.summary(model, (2, 3, 64, 64))



三、模型部署

推理部署和调用方法

使用flask或者fastapi框架进行部署,推理部署采用openvino(只支持Intel CPU)或者onnxruntime(支持CPU和GPU)。
接口URLhttp://127.0.0.1:8050/sxd/
请求方法:POST
请求参数

  1. 参数类型:playload生成验证码后的返回响应,为json格式,示例:
{
    "id": "86d4faecc1bc434c99b0ffc2725a34ea",
    "captcha": {
        "type": "WORD_IMAGE_CLICK",
        "backgroundImage": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJfpWqeo+pnU006kNMoeh+R/p/UUIcb/wDdIoT7r/T+opUHD/7ppiIR1obrR3FB6mgYlFFFAAKcKaKc2Q==",
        "templateImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAR4AAABMCAYAAAC7+NieAAAHcklEQVR42u2du60VSxBFj4s3dUBWwHIrqC9/Ljmaej9I9AgwIQol2Y+gFLmdjGBwQW3hVwNAiRFRydpyPoXKWdDR9Em5QcZAP9aX3g==",
        "backgroundImageTag": "default",
        "templateImageTag": null,
        "backgroundImageWidth": 590,
        "backgroundImageHeight": 360,
        "templateImageWidth": 286,
        "templateImageHeight": 76,
        "data": null
    }
}

响应格式

  1. 响应体:返回json格式
{
    "id": "86d4faecc1bc434c99b0ffc2725a34ea",
    "data": {
        "bgImageWidth": 590,
        "bgImageHeight": 360,
        "startSlidingTime": "2024-07-17T14:34:23.593Z",
        "endSlidingTime": "2024-07-17T14:34:23.613000Z",
        "trackList": [
            {
                "x": 535,
                "y": 145,
                "type": "move",
                "t": 4
            },
.....
            {
                "x": 443,
                "y": 181,
                "type": "click",
                "t": 20
            }
        ]
    }
}
  1. 过验证码:
    将上面得到的json,作为负载发送至https://ticket.sxd.cn/api-api/captcha/check,注意需要带入tk,当得到如下响应时,验证成功;
{
    "code": 200,
    "msg": "OK",
    "data": {
        "id": "5ad886ddc5af44ef907e82cb0bf53c3e"
    },
    "success": true
}
### 使用目标检测技术实现点选验证码 #### 方法概述 对于点选验证码识别,可以采用基于深度学习的目标检测算法。这类算法能够自动定位并分类图像中的特定对象,在此场景下即为需要被点击的文字或图形[^2]。 #### 数据准备与预处理 构建有效的目标检测模型依赖于高质量的数据集。这通常涉及收集大量带有标签的验证码样本。每一张图片都需要人工标记出所有待选位置的确切坐标及其类别信息。例如,在三星堆文字点选验证码案例中,进行了详尽的数据标注工作,确保每个字符都被精确框定,并赋予相应的语义标签[^3]。 #### 模型选择与训练 为了提高识别精度,可以选择性能优越且易于使用的框架来进行定制化开发。Ultralytics YOLO系列因其快速收敛速度良好泛化能力而成为理想的选择之一。具体来说: - **YOLOv8** 是最新版本,提供了更优的基础架构支持; - 利用该工具包提供的API接口轻松导入自定义数据源; - 调整超参数以适应具体的业务需求; 在实际操作过程中,由于初期可能缺乏足够的正负样例分布均衡性,因此建议逐步增加不同难度级别的测试集规模,持续优化网络结构直至达到满意的召回率水平。 #### 推理部署 当模型训练完成后,下一步就是将其集成到生产环境中去执行实时预测任务。一般会考虑以下几个方面: - 将训练好的权重文件导出成适合线上服务的形式; - 编写简洁高效的推理脚本用于接收输入请求并向客户端返回解析后的结果; - 对整个流程进行全面的压力测试,保证系统的稳定性响应效率。 ```python import torch from ultralytics import YOLO def load_model(model_path='best.pt'): model = YOLO(model_path) return model def predict(image, model): results = model.predict(source=image, save=False, conf=0.7) predictions = [] for result in results: boxes = result.boxes.cpu().numpy() for box in boxes: r = box.xyxy[0].astype(int) predictions.append(r) return predictions ``` 上述代码展示了如何加载预先训练完毕的YOLO模型并对单张传入的验证码图片做出推断。`predict()`函数接受一幅PIL Image类型的参数作为输入,经过内部运算后输出一系列矩形框的位置列表,这些位置对应着应当被用户点击的地方。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值