CNN搭建端到端的验证码识别系统

卷积神经网络验证码识别

深度学习大行其道的一个重要原因,是算力的提升,技术的进步允许我们每个人都自由地使用个人PC训练强大的神经网络。神经网络的强大能力有效地辅助了我们开发各类新式软件,举个例子,原本的一整套语音识别系统,需要一个pipeline的多种算法协同工作才能发挥作用。我们要先预处理语音,过滤噪声和背景;然后把语音分割成一个一个音节;然后使用HMM等模型识别语音。而如果使用深度学习的方法,我们只需要把语音信号丢入一个LSTM,使用端到端的训练方法,就能得到一个效果更好的语音识别系统。
这种端到端的设计理念震撼了每个曾经致力于传统CV算法和NLP算法的研究者,今天的图像和自然语言处理领域,深度学习神经网络已经占据了重要的地位。这里我们做一个非常简单的例子,来实现一个验证码的识别系统。

数据集速览与任务目标

我们使用的验证码数据集是一种有噪声的5位数字+字母验证码数据集,共1k余张有标签图片。
在这里插入图片描述
在这里插入图片描述
虽然对人类来说,辨识出这些字符比较容易,但是对机器来说还是有些困难的。对机器而言最困难的一步,就是分割字符;如果字符之间无粘连,我们或许可以靠连通域搜索完成图片分割。而这里的图片总有一条额外的线条连接各字符,让我们无法顺利完成分割。除此之外,有些字符被实施了虚化的效果,这也让这些字符对机器而言是更加难以理解的。
综上,使用传统的pipeline(滤波去噪-二值化-分割-识别)完成字符识别是相当困难的。但是如果我们用神经网络做这个事情,任务将不那么困难。
我们将搭建一个CNN,它的输入就是我们上面的这些图片,输出将是5*(10+26)=180的向量,表示5个字符,分别为0~9,a ~z的几率。

模型与损失函数

这里使用简单的8层卷积ResNet架构,不了解ResNet是什么的同学可以自行搜索。

class CNN(nn.Module):
    def conv_block(self, in_channels,out_channels):
        return nn.Sequential(
            nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=3,stride=1,padding=1),
            nn.ReLU(inplace=True),
            nn.BatchNorm2d(out_channels),
            nn.Conv2d(in_channels=out_channels,out_channels=out_channels,kernel_size=3,stride=1,padding=1),
            nn.ReLU(inplace=True),
        )
    
    def upsample_block(self, in_channels,out_channels):
        return nn.Conv2d(in_channels=in_channels,out_channels=out_channels,kernel_size=1)
    
    def  __init__(self, residual = True):
        super().__init__()
        # 1*64*200
        self.conv1 = self.conv_block(1,32)
        self.upsample1 = self.upsample_block(1,32)
        # 32*32*100
        self.conv2 = self.conv_block(32,64)
  
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值