bd旋转验证码识别训练带模型

转验证码识别概述

这次我将带着大家实现旋转验证码的识别,当然当前时间点上识别教程有很多,我的教程会有自己优化的点(主要在损失函数上),使准确率更加高,需要的数据集更加少。

项目开源地址

https://github.com/2833844911/Rotate-the-verification-code-pytorch/

定义模型

下面我们使用的是resnet50模型进行分类

class CustomResNet50(nn.Module):
    def __init__(self, num_classes=num_classes):
        super(CustomResNet50, self).__init__()
        # 加载ResNet50模型
        resnet50 = models.resnet50(pretrained=True)
        self.resnet_layers = nn.Sequential(*list(resnet50.children())[:-1])
        self.flatten = nn.Flatten()
        self.fc = nn.Linear(2048, 360) #把结果输出为360个类别
        self.sfm = nn.Sigmoid()

    def forward(self, x):
 
        x = self.resnet_layers(x)
        x = self.flatten(x)
        x = self.fc(x)
        x = self.sfm(x)
        return x

损失函数实现

看网上教程他们用的损失函数大部分就是直接使用交叉熵损失函数,但这样子的效果其实不是很好,会导致模型偏差太大
使用交叉熵损失函数最优输出【假设目标角度为90度】
在这里插入图片描述
当使用交叉熵损失函数时 需要达到效果最好时目标角度输出数据应当为1,其他角度都要为0,这样子才可以让损失最小,但是这样子我们可以发现角度93的损失和角度91的损失所带来的效果是一样的,其实我们应该最大当预测角度为91时其实损失应该更加小,那要怎么设计损失函数呢?
接下来我们开始来实现
首先我们也画一张图来表示我们是最佳输出
使用自定义函数最优输出【假设目标角度为90度】
在这里插入图片描述
由图可以看出我们输出的结果应当为
88度为0.8
89度为0.9
90度为1
91度为0.9
92度为0.8
93度为0.7
这样子我们就可以体现出91度和93度的区别,这样子当模型预测角度不为90度,那也会有更大的可能会预测到89度或者91度
下面是实现的代码


class CustomClassificationLoss(nn.Module):
    def __init__(self, num_classes, alpha=18):
        super(CustomClassificationLoss, self).__init__()

    def forward(self, logits, targets):
        ce_loss = 0
        for i in range(logits.shape[0]):
            wz = targets[i].item()
            kj = wz
            lossOne = (1-logits[i][wz])
            for r in range(1, 180):
                wz -= 1
                if wz <0:
                    wz = 359
                lossOne += torch.abs((0.98 ** r) - logits[i][wz])
            for r in range(1, 180):
                kj += 1
                if kj >359:
                    kj = 0
                lossOne += torch.abs((0.98 ** r) - logits[i][kj])
            ce_loss += lossOne
        loss = ce_loss/targets.shape[0]
        return loss, 0, loss.item()

训练好的模型下载地址

链接:https://pan.baidu.com/s/1mcz58nquhL0DA8tCX5f_ww
提取码:39ev
需要配合我github的代码使用

星球 https://t.zsxq.com/0fLP2ulsk 【有魔改node, 魔改浏览器,等分析】

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的有终端约束的模型预测控制(MPC)的 Matlab 代码示例。此示例使用了 Quadprog 函数进行优化。 首先,我们需要定义系统的动态模型和约束条件。在此示例中,我们使用一个简单的二次型系统: ``` % System model A = [1.1, 0.4; 0.2, 1.3]; B = [1; 0.5]; C = [1, 0]; D = 0; % Constraints u_min = -1; u_max = 1; y_min = -1; y_max = 1; ``` 接下来,我们定义 MPC 控制器的参数。在此示例中,我们使用一个预测时间步长为 5,控制时间步长为 1,预测模型为系统模型的离散时间版本: ``` % MPC parameters N = 5; % Prediction horizon T = 1; % Control horizon Q = eye(2); % State cost R = 1; % Control cost x0 = [0; 0]; % Initial state ``` 现在我们可以开始实现 MPC 控制器。首先,我们定义一个状态向量 `x`,并将其初始化为初始状态 `x0`。然后,我们进入一个循环,在每个时间步骤中求解一个优化问题,以计算下一个时间步骤的最优控制输入 `u`。优化问题的目标是最小化预测误差的平方和,同时满足约束条件。 ``` % MPC control loop x = x0; for t = 1:T % Build prediction model [Ad, Bd] = c2d(A, B, t); [x_min, x_max, u_min_t, u_max_t] = compute_constraints(x, u_min, u_max, y_min, y_max, C, D, Ad, Bd); [H, f, Aeq, beq, lb, ub] = build_qp_matrices(Ad, Bd, N, Q, R, x, x_min, x_max, u_min_t, u_max_t); % Solve QP problem options = optimoptions('quadprog', 'Display', 'off'); u = quadprog(H, f, [], [], Aeq, beq, lb, ub, [], options); u = u(1); % Update state x = Ad*x + Bd*u; % Print results fprintf('Time step %d: u = %f, x = [%f, %f]\n', t, u, x(1), x(2)); end ``` 在每个时间步骤中,我们需要重新计算约束条件。由于终端约束是动态的,因此需要在每个时间步骤中重新计算。我们定义了一个名为 `compute_constraints` 的辅助函数来执行此操作。 ``` function [x_min, x_max, u_min_t, u_max_t] = compute_constraints(x, u_min, u_max, y_min, y_max, C, D, Ad, Bd) x_min = [y_min - C*x; -inf]; x_max = [y_max - C*x; inf]; u_min_t = u_min - D*x; u_max_t = u_max - D*x; for i = 2:size(Ad, 1) x_min = [x_min; y_min - C*Ad^(i-1)*x - C*Ad^(i-2)*Bd*u_min_t]; x_max = [x_max; y_max - C*Ad^(i-1)*x - C*Ad^(i-2)*Bd*u_max_t]; u_min_t = [u_min_t; u_min - D*Ad^(i-2)*Bd*u_min_t]; u_max_t = [u_max_t; u_max - D*Ad^(i-2)*Bd*u_max_t]; end end ``` 最后,我们定义一个名为 `build_qp_matrices` 的辅助函数来构建优化问题的矩阵形式。 ``` function [H, f, Aeq, beq, lb, ub] = build_qp_matrices(Ad, Bd, N, Q, R, x, x_min, x_max, u_min, u_max) n = size(Ad, 1); m = size(Bd, 2); % Build cost matrices Q_bar = kron(eye(N), Q); R_bar = kron(eye(N), R); H = Bd'*kron(eye(N+1), Ad)*Q_bar*kron(eye(N+1), Ad')*Bd + R_bar; f = 2*Bd'*kron(ones(N+1, 1), Ad')*Q_bar*(Ad*x) + 2*R_bar*kron(ones(N, 1), u_min); % Build constraint matrices Aeq = [kron(eye(N), -Bd), kron(eye(N+1), Ad) - eye(n*(N+1))]; beq = [-Ad*x; zeros(n*N, 1)]; lb = [kron(ones(N, 1), u_min); u_min]; ub = [kron(ones(N, 1), u_max); u_max]; for i = 1:N+1 lb = [lb; x_min]; ub = [ub; x_max]; end end ``` 这就完成了一个简单的有终端约束的 MPC 控制器的 Matlab 代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值