caffe训练验证码识别

跟着参考博客,把数据集的准备和制作、深度网络模型的设计、训练和测试的流程走一遍。

博主是用深度学习做多任务分类的思路来识别验证码。多任务学习是针对数据给出多个监督信息(标签)进行学习,例如识别一张图像中的脸是否是人脸、脸部表情、性别、年龄等,识别图像中车的颜色、车型、姿态等,都属于多任务分类。项目用深度学习做多标签分类,是用深度神经网络对整张验证码图片进行多标签学习,来完成多任务分类,端到端的识别出验证码中的所有字符。这种思路同样可以用于车牌识别中。
用深度学习来做验证码识别,优势在于,只需要找一个合适的网络模型稍加修改,再给网络送入足够的有标签样本进行训练,就能达到很好的识别效果,无论验证码里面是白的黑的正的歪的、何种字体、粘不粘连都可以,也没必要做去噪、二值化、纠正和调各种阈值等各种处理(不然验证码风格稍微一变,你的处理方法就得改),直接端到端识别验证码的效果完全不比先做字符分割再做识别差。但其劣势也很明显,对不同手段生成的不同风格的验证码,都需要收集、爬取或模仿其验证码风格自己写代码生成大量样本,以维持较高的识别率。
第一个验证码数据集条件比较理想,在生成时做了添加随机噪声点、字符变形、旋转缩放、随机赋色等处理。训练集64536张,验证集9096张(验证模型好坏),另外有714张用于做测试(测试模型效果),图片大小为88x28,共有数字0~9和大写字母A~Z共36类,每张验证码图像中包含四个字符,数据集下载。经过训练,该验证集图像上四个字符单个字符的识别准确率都达到了99.5%。而用于测试的714张验证码中,有15个识别出错,验证码整体识别结果准确率接近98%,主要是对0和O比较容易搞混。

1 数据准备

下载得到的数据集中的前三个文件夹,包括captcha_train、captcha_val和test_images,分别是验证码图像训练集、验证集和用于测试的图片文件夹。

 captcha_train.txt和captcha_val.txt分别是captcha_train和captcha_val数据集对应的多标签文本文件,可以由matlab实现,生成captcha_train.txt和captcha_val.txt的create_captcha_train_val_txt.m代码如下。

%create_captcha_train_val_txt.m
%创建验证码的多标签标签txt文件
%验证码类别数为36,包括0~9和a~z(a~z的ascii码范围为97~122,减去87对应10~35,构成0~35共36类)
datadir = 'D:\data\Captcha2\captcha_train'; %train数据集
fp=fopen('D:\data\Captcha2\captcha_train.txt','w'); %新建一个txt文件存放结果
% datadir = 'D:\data\Captcha2\captcha_val'; %test数据集
% fp = fopen('D:\data\Captcha2\captcha_val.txt','w'); %新建一个txt文件存放结果
imagefiles = dir(datadir); %列出目录下所有文件
for i = 3:length(imagefiles) %windows系统下所有文件夹下都有两个隐藏文件排在最前面,跳过
    filename = imagefiles(i).name; %获取某张图像文件名
    fprintf(fp,'%s ',filename); %打印文件名
    for j=1:5 %打印多标签(5个)
        if abs(filename(j)) >= 97 && abs(filename(j)) <= 122 %如果是a~z,则97~122 -> 10~35
            label = abs(filename(j)) - 87;
            fprintf(fp,'%d ',label);       
        elseif abs(filename(j)) > 122 || abs(filename(j)) < 97 %如果是0~9,保持不变
            fprintf(fp,'%s ',filename(j));
        end
    end
    fprintf(fp,'\n');   
end
fclose(fp); 

由于很久不用matlab,转用python了,所以下面是python生成标签的代码

# -*- coding : UTF-8 -*-
# @file   : gen_label.py
# @Time   : 2021/4/3 18:50
# @Author : wmz


import os


def get_filelist(path):
    Filelist = []
    for home, dirs, files in os.walk(path):
        for filename in files:
            if ".jpg" in filename:
                # filename list, with full path
                #Filelist.append(os.path.join(home, filename))
                # filename list with filename
                Filelist.append(filename)
    return Filelist


if __name__ == "__main__":
    filePath = r"G:\BaiduNetdiskDownload\验证码数据集1\Captcha\captcha_train"
    # set save dir
    output_path = "./captcha_train.txt"
    # get all files
    Filelist = get_filelist(filePath)
    file_lineinfo = open(output_path, 'w', encoding='utf-8')
    # index = 0

    for filename in Filelist:
        print(filename)
        # read the filename and generate label
        org_label = filename[:-4]
        org_label = ' '.join(org_label) + ' '
        length = len(org_label)
        label = []
        for i, c in enumerate(org_label):
            if 65 <= ord(c) <= 90:
                c = str(ord(c) - 55)
            label.append(c)
        label = ''.join(label)
        line_info = [filename, ' ', label, '\n']

        file_lineinfo.writelines(line_info)
        # index += 1
        # if index == 4:
        #     break
    file_lineinfo.close()

然后在caffe的data\目录下新建captcha文件夹,并将这些文件/文件夹都拷贝到captcha目录下。

2 修改caffe源码使其支持多标签输入和训练

caffe源码对hdf5支持多标签,但lmdb格式只支持单标签输入和训练,但lmdb读取效率更高。对caffe源码做以下修改使得caffe对lmdb格式满足多标签输入和训练。这里提供修改后的相应文件下载 多标签修改

打开caffe目录下src\caffe\proto\caffe.proto,找到Datum如下可以发现label是不可重复(单个)int32型变量,这里不要注释掉它,在后面新增可重复(多个)的float型变量labels,然后在caffe目录下找到并删除src\caffe\proto\caffe.pb.cc和include\caffe\proto\caffe.pb.h这两个文件,再重新编译caffe。注:红框表示需要注意或待修改的部分,绿框为新增或修改后的内容。

然后对convert_imageset.cpp(项目convert_imageset中)进行如下修改,修改后可以读取五个标签值。不过修改后也导致后面的ReadImageToDatum函数也要进行修改,转到ReadImageToDatum函数定义处,即在io.hpp(项目libcaffe中include\util\下)中,重载函数ReadImageToDatum并添加新的ReadFileLabelsToDatum函数,然后在io.cpp(项目libcaffe中src\util\下)给出上述两个函数的实现代码,分别参考原来的ReadImageToDatum和ReadFileToDatum进行修改。

度学习caffe实战(一)验证码识别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值