当前位置: 首页 > news >正文

利用深度学习实现验证码识别-4-ResNet18+imagecaptcha

在当今的数字化世界中,验证码(CAPTCHA)是保护网站免受自动化攻击的重要工具。然而,对于用户来说,验证码有时可能会成为一种烦恼。为了解决这个问题,我们可以利用深度学习技术来自动识别验证码,从而提高用户体验。本文将介绍如何使用ResNet18模型来识别ImageCaptcha生成的验证码。
在这里插入图片描述

1. 环境设置与数据准备

首先,我们需要检查CUDA是否可用,以便利用GPU加速训练过程。

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f'Using device: {device}')

接下来,我们定义一个数据生成器CaptchaDataset,它使用imagecaptcha库生成验证码图像。

class CaptchaDataset(Dataset):def __init__(self, length=1000, charset=None, captcha_length=5, transform=None):self.length = lengthself.transform = transformself.charset = charset if charset is not None else string.ascii_letters + string.digitsself.captcha_length = captcha_lengthself.num_classes = len(self.charset)self.image_generator = ImageCaptcha(width=160, height=60)def __len__(self):return self.lengthdef __getitem__(self, idx):text = ''.join(random.choices(self.charset, k=self.captcha_length))image = self.image_generator.generate_image(text)if self.transform:image = self.transform(image)label = [self.charset.index(c) for c in text]return image, torch.tensor(label, dtype=torch.long)
2. 数据增强与预处理

为了提高模型的泛化能力,我们使用了一系列的数据增强和预处理步骤。

transform = transforms.Compose([transforms.Grayscale(),  # 将图像转换为灰度transforms.Resize((40, 100)),transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])
3. 数据集划分与加载

我们将数据集划分为训练集和验证集,并使用DataLoader进行批量加载。

dataset = CaptchaDataset(length=2000, charset=charset, captcha_length=captcha_length, transform=transform)
train_size = int(0.8 * len(dataset))
val_size = len(dataset) - train_size
train_dataset, val_dataset = random_split(dataset, [train_size, val_size])train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=64, shuffle=False)
4. 模型定义与迁移学习

我们使用预训练的ResNet18模型,并对其进行微调以适应验证码识别任务。

class CaptchaModel(nn.Module):def __init__(self, num_classes, captcha_length):super(CaptchaModel, self).__init__()self.captcha_length = captcha_lengthself.resnet = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)self.resnet.conv1 = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)num_ftrs = self.resnet.fc.in_featuresself.resnet.fc = nn.Linear(num_ftrs, num_classes * self.captcha_length)def forward(self, x):x = self.resnet(x)return x.view(-1, self.captcha_length, num_classes)
5. 训练与评估

我们定义了训练函数train_model,并在每个epoch结束时保存模型检查点。

def train_model(epochs, resume=False):start_epoch = 0if resume and os.path.isfile("captcha_model_checkpoint.pth.tar"):checkpoint = load_checkpoint()model.load_state_dict(checkpoint['state_dict'])optimizer.load_state_dict(checkpoint['optimizer'])start_epoch = checkpoint['epoch']scaler = torch.cuda.amp.GradScaler()for epoch in range(start_epoch, epochs):model.train()running_loss = 0.0for images, labels in train_loader:images, labels = images.to(device), labels.to(device)optimizer.zero_grad()with torch.cuda.amp.autocast():outputs = model(images)loss = sum(criterion(outputs[:, i, :], labels[:, i]) for i in range(captcha_length))scaler.scale(loss).backward()scaler.step(optimizer)scaler.update()running_loss += loss.item()val_accuracy = evaluate_accuracy(val_loader)print(f'Epoch [{epoch+1}/{epochs}], Loss: {running_loss / len(train_loader):.4f}, Val Accuracy: {val_accuracy:.4f}')save_checkpoint({'epoch': epoch + 1,'state_dict': model.state_dict(),'optimizer': optimizer.state_dict(),})
6. 可视化预测结果

最后,我们定义了一个函数visualize_predictions来可视化模型的预测结果。

def visualize_predictions(num_samples=16):model.eval()samples, labels = next(iter(DataLoader(val_dataset, batch_size=num_samples, shuffle=True)))samples, labels = samples.to(device), labels.to(device)with torch.no_grad():outputs = model(samples)predicted = torch.argmax(outputs, dim=2)samples = samples.cpu()predicted = predicted.cpu()labels = labels.cpu()fig, axes = plt.subplots(4, 4, figsize=(10, 10))for i in range(16):ax = axes[i // 4, i % 4]ax.imshow(samples[i].squeeze(), cmap='gray')true_text = ''.join([dataset.charset[l] for l in labels[i]])pred_text = ''.join([dataset.charset[p] for p in predicted[i]])ax.set_title(f'True: {true_text}\nPred: {pred_text}')ax.axis('off')plt.show()
7. 训练与可视化

最后,我们调用train_model函数进行模型训练,并使用visualize_predictions函数来可视化模型的预测结果。

train_model(epochs=180, resume=True)
visualize_predictions()

通过上述步骤,我们成功地使用ResNet18模型来识别ImageCaptcha生成的验证码。这种方法不仅提高了验证码识别的准确性,还提升了用户体验。希望本文能为您在验证码识别领域的研究和应用提供有价值的参考。在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 史上最全-经管类国家社科基金立项名单汇总 1991-2024
  • 光伏电站的工程量造价怎么算的
  • 如何优化谷歌排名更有效?
  • 【笔记】408刷题笔记
  • 浅谈C#之ConcurrentQueue
  • 表情迁移大法,LivePortrait 帮你快速处理图片!
  • LabVIEW制系统开发流程介绍
  • Ubuntu报错:正在等待缓存锁:无法获得锁 /var/lib/dpkg/lock-frontend 锁正由进程 7647
  • TypeScript 在前端开发中的规范化应用
  • 一键快速制作和印刷样本册,推荐一个优质网站:FLBOOK
  • 安卓玩机工具-----适合安卓机型的“搞机工具箱” 功能齐全 玩机推荐
  • Leangoo敏捷工具在缺陷跟踪(BUG)管理中的高效应用
  • 软考基础知识之性能指标
  • 【转载】golang内存分配
  • 《JavaEE进阶》----10.<SpringMVC应用分层:【三层架构】>
  • axios 和 cookie 的那些事
  • ES6核心特性
  • HTTP请求重发
  • Invalidate和postInvalidate的区别
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Netty 4.1 源代码学习:线程模型
  • Sass Day-01
  • springMvc学习笔记(2)
  • TCP拥塞控制
  • ViewService——一种保证客户端与服务端同步的方法
  • 关于使用markdown的方法(引自CSDN教程)
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于axios的vue插件,让http请求更简单
  • 码农张的Bug人生 - 初来乍到
  • 前端面试之闭包
  • 使用 @font-face
  • 新手搭建网站的主要流程
  • 一道面试题引发的“血案”
  • 再谈express与koa的对比
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​【经验分享】微机原理、指令判断、判断指令是否正确判断指令是否正确​
  • ‌‌雅诗兰黛、‌‌兰蔻等美妆大品牌的营销策略是什么?
  • #pragma once
  • $jQuery 重写Alert样式方法
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (补)B+树一些思想
  • (二)原生js案例之数码时钟计时
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (七)Knockout 创建自定义绑定
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (转)shell调试方法
  • .gitignore文件设置了忽略但不生效
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 简单实现MD5