Pytorch实战之验证码识别

简介: 笔记

验证码识别与之前的几个任务不同,这是一个多标签的分类的任务,也就是是一个数据对应着几个标签,只有所用的标签都预测对时,才算真正的预测成功了。


一. 数据的准备工作

与以往不同,这次的数据,我们是利用python的第三方库来生成验证码图片,下面进行代码演示,非常简单。

a = ['1','2','3','4']    
img = ImageCaptcha()
captcha=img.generate(a)   #生成图片,根据a中的内容
captcha_image = PIL.Image.open(captcha)    #读取图片
captcha_image.show()        #显示图片

网络异常,图片无法展示
|

2. 基于上面的代码我们可以很轻松装备几万张数据,然后用一个Excel保存图片以及图片对应的标签,这里就不作代码展示了,展示一下Excel文件。

2.png

3. 下面开始读取我们的Excel文件,来构造我们的数据集,标签有4个,这里我们需要one-hot编码一下,弄成长度为40的向量,这也是一个需要特别需要注意的地方。


. 读取csv文件

def read_data():
    data = pd.read_csv("qwe.csv")
    img_path = data["ID"].values
    label = data.iloc[:,data.columns!="ID"].values
    y = []
    for x in label:
        t = one_hot(x)
        y.append(np.array(t))
    return img_path,np.array(y)

进行one-hot编码

def one_hot(x):
    tmp = [0 for i in range(40)]
    for step,i in enumerate(x):
        tmp[i+10*step] = 1
    return tmp


最后构造DataLoader,与显示最后的标签形式,到这里数据的准备工作就基本上完成了。

class DataSet(Dataset):
    def __init__(self):
        self.img_path,self.label = read_data()
    def __getitem__(self, index):
        img_path = self.img_path[index]
        img = cv2.imread(img_path,0)
        img = img/255.
        img = torch.from_numpy(img).float()
        img = torch.unsqueeze(img,0)
        label = torch.from_numpy(self.label[index]).float()
        return img,label
    def __len__(self):
        return len(self.img_path)
data = DataSet()
data_loader = DataLoader(data,shuffle=True,batch_size=64,drop_last=True)

3.png

二. 网络的构建与优化、损失函数的选取以及训练

1.网络的构建和优化函数在这里就不做多的说明了,直接看代码

class CNN_Network(nn.Module):
    def __init__(self):
        super(CNN_Network, self).__init__()
        self.layer1 = nn.Sequential(
            nn.Conv2d(1, 16, stride=1, kernel_size=3, padding=1),
            nn.BatchNorm2d(16),
            nn.ReLU(inplace=True)
        )
        self.layer2 = nn.Sequential(
            nn.Conv2d(16, 32, stride=1, kernel_size=3, padding=1),
            nn.BatchNorm2d(32),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(stride=2, kernel_size=2),  # 30 80
        )
        self.layer3 = nn.Sequential(
            nn.Conv2d(32, 64, stride=1, kernel_size=3, padding=1),
            nn.BatchNorm2d(64),
            nn.ReLU(inplace=True),
            nn.Conv2d(64,128,kernel_size=3,stride=1,padding=1),
            nn.BatchNorm2d(128),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=2,stride=2),   # 15 40
        )
        self.fc = nn.Sequential(
            nn.Linear(128 * 15 * 40, 2048),
            nn.ReLU(inplace=True),
            nn.Linear(2048, 1024),
            nn.ReLU(inplace=True),
            nn.Linear(1024, 40)
        )
    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = x.view(x.size(0), -1)
        x = self.fc(x)
        return x
model = CNN_Network()
optimizer = torch.optim.Adam(model.parameters(),lr=0.001)

2.损失函数我们这里使用的是多标签分类的损失函数,和交叉熵损失函数的公式比较相像,

l o s s ( x , y ) = − ∑ i y [ i ] ∗ l o g ( 11 + e x p ( − x [ i ] ) + ( 1 − y [ i ] ) ∗ l o g ( e x p ( − x [ i ] ) 1 + e x p ( − x [ i ] ) )

,上面是公式,有兴趣的可以自己研究一下。

error = nn.MultiLabelSoftMarginLoss()   #注意输入的数据要是float32类型的,否则会出错。


3.所有的准备工作都完成了,下面就开始训练吧。

for i in range(2):
    for x_index,y in data_loader:
        pass
        x = Variable(x_index)
        optimizer.zero_grad()
        label = Variable(y)
        out = model(x)
        loss = error(out,label)
        print(loss)
        loss.backward()
        optimizer.step()
torch.save(model.state_dict(),"验证码识别.pth")

三. 测试模型

1.训练完成后,来测试一下我们的模型吧.

cnn = CNN_Network()
cnn.load_state_dict(torch.load("验证码识别.pth"))
a = cv2.imread("./data/9354.jpg",0)
b = cv2.resize(a,(200,200))
cv2.imshow('a',b)
cv2.waitKey(0)
a = a/255.
a = torch.from_numpy(a).float()
a = torch.unsqueeze(a,0)
a = torch.unsqueeze(a,0)
pred = cnn(a)
print(pred.size())
a1 = torch.argmax(pred[0,:10],dim=0)    #第一个标签
a2 = torch.argmax(pred[0,10:20],dim=0)  #第二个标签
a3 = torch.argmax(pred[0,20:30],dim=0)  #第三个标签
a4 = torch.argmax(pred[0,30:],dim=0)  #第四的标签
pred = [a1,a2,a3,a4]
print(pred)

预测的图片

4.png


预测结果


5.png

上面就完成了所有的工作了。

github地址.

Thank for your reading !!!

公众号:FPGA之旅

目录
打赏
0
0
0
0
4
分享
相关文章
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
52 5
PyTorch PINN实战:用深度学习求解微分方程
Python实战:搭建短信转发器,实现验证码自动接收与处理
在移动互联网时代,短信验证码是重要的安全手段,但手动输入效率低且易出错。本文介绍如何用Python搭建短信转发器,实现验证码自动接收、识别与转发。通过ADB工具监听短信、正则表达式或ddddocr库提取验证码,并利用Flask框架转发数据。系统支持多设备运行,具备安全性与性能优化功能,适合自动化需求场景。未来可扩展更多功能,提升智能化水平。
37 1
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
【微信小程序 - 工作实战分享】1.微信小程序发送手机短信验证码(阿里云)
730 0
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
【从零开始学习深度学习】38. Pytorch实战案例:梯度下降、随机梯度下降、小批量随机梯度下降3种优化算法对比【含数据集与源码】
Nest.js 实战 (七):如何生成 SVG 图形验证码
这篇文章介绍了使用NestJS实现Session验证的图形验证码功能的具体步骤。首先,通过powershell代码安装依赖pnpmaddsvg-captcha。然后,在控制器中使用TypeScript代码引入相关依赖,创建一个图形验证码的接口,当请求该接口时,返回一张随机图片验证码。最后,进行了效果演示。
137 6
Nest.js 实战 (七):如何生成 SVG 图形验证码
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
在数据驱动时代,Python凭借简洁的语法和强大的库支持,成为数据分析与机器学习的首选语言。Pandas和NumPy是Python数据分析的基础,前者提供高效的数据处理工具,后者则支持科学计算。TensorFlow与PyTorch作为深度学习领域的两大框架,助力数据科学家构建复杂神经网络,挖掘数据深层价值。通过Python打下的坚实基础,结合TensorFlow和PyTorch的强大功能,我们能在数据科学领域探索无限可能,解决复杂问题并推动科研进步。
112 0
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
【PyTorch】PyTorch深度学习框架实战(一):实现你的第一个DNN网络
272 2
解锁Python数据分析新技能,TensorFlow&PyTorch双引擎驱动深度学习实战盛宴
【7月更文挑战第31天】在数据驱动时代,Python凭借其简洁性与强大的库支持,成为数据分析与机器学习的首选语言。**数据分析基础**从Pandas和NumPy开始,Pandas简化了数据处理和清洗,NumPy支持高效的数学运算。例如,加载并清洗CSV数据、计算总销售额等。
94 2
从0到1构建AI帝国:PyTorch深度学习框架下的数据分析与实战秘籍
【7月更文挑战第30天】PyTorch以其灵活性和易用性成为深度学习的首选框架。
115 2
🚀PyTorch实战宝典:从数据分析小白到深度学习高手的飞跃之旅
【7月更文挑战第29天】在数据驱动的世界里, **PyTorch** 作为深度学习框架新星, 凭借其直观易用性和高效计算性能, 助力数据分析新手成为深度学习专家。首先, 掌握Pandas、Matplotlib等工具进行数据处理和可视化至关重要。接着, 安装配置PyTorch环境, 学习张量、自动求导等概念。通过构建简单线性回归模型, 如定义 `nn.Module` 类、设置损失函数和优化器, 进行训练和测试, 逐步过渡到复杂模型如CNN和RNN的应用。不断实践, 你将能熟练运用PyTorch解决实际问题。
146 1

热门文章

最新文章