基于深度学习的验证码自动识别(caffe)

2023-10-31

最近在学习使用caffe,然后就想试着玩玩验证码识别,结果非常非常棒,深度学习确实是非常强大的。废话少说,跟我走进验证码自动识别。

caffe安装

此处省略一万字,网上教程千千万,你一定可以找到,接着往下看。

剧情描述

之前对京东的某些数据进行采集,但是总会有验证码挡着,先看个例子:
http://mall.jd.com/showLicence-56803.html
验证码样例
如果我们能够自动识别这样的验证码,那么我们就可以进入到验证码后面的页面了,所以我们就开始搞定它。

数据集准备

下面是后面所述使用的数据地址:
http://download.csdn.net/detail/mj641893086/9895307
http://download.csdn.net/detail/mj641893086/9895307
http://download.csdn.net/detail/mj641893086/9895307

重要的事情说三遍!!!

我们人工标注了1100个验证码图片,其中1000个用作训练,100个用作测试。

未切分数据

下图是未切分的图片(编号-标注),train_notsplit和test_notsplit都是这样的格式:

未切分图片

切分数据

由于图片中包含四个字符,所以我们是肯定需要切分开一个个训练的(当然也可以有非常非常大的训练集整体训练),图片大小是85*26的,切分也比较容易,注意的是左右两边都多扩展一点点像素,可以让完整的字符包含进来,其实不会影响最终的训练效果。可以通过下面的程序进行切分:

#split_verify_code.py

#!/home/cloud/anaconda2/bin/python
#-*-coding:utf-8-*-

import sys
import time
import math
import json
import random
from PIL import Image

reload(sys)
sys.setdefaultencoding('utf8')

# split verify_code image
save_dir = "./"
for line in sys.stdin:
    image_file = line.rstrip('\n')
    img = Image.open(image_file)
    s = image_file
    if image_file.rfind('/')!=-1:
        s = image_file[image_file.rfind('/')+1:]
    part = s.split('-')
    id = part[0]
    #img.size (85,26)
    region = [(0,0,20,26),(16,0,38,26),(34,0,56,26),(52,0,74,26)]
    for i in range(0,len(region)):
        cropImg = img.crop(region[i])
        path = save_dir+'/'+id+'-'+str(i)+'-'+part[1][i:i+1]+'.jpg'
        print path
        cropImg.save(path)

下图是切分的数据图片(编号-第几个字符-标注),train和test都是这样的格式:

这里写图片描述

四个图片大小:20*26, 22*26, 22*26, 22*26。

容易想到的模型就是lenet的手写体数字识别模型,所以模型自己看,很简单,只讲实现的步骤。

实验流程

标签文件生成

也就是train.txt和test.txt生成,第一列是文件名,第二列是对应的标签编号,可以自己设置对应关系,在此给出参考生成方法。

find ./train/ -type f | awk '{print substr($0,length($0)-4,1)}' | sort | uniq > label.uniq

#总共56个label,没有0,o,O,1,l,L(本来是64个的,这几个不方便区分)

find ./train/ -type f | awk '{print $0" "substr($0,length($0)-4,1)}' | cut -f3 -d'/' > train_tmp.txt

awk -F' ' 'BEGIN{id=0}NR==FNR{a[$1]=id;id+=1}NR>FNR{print $1,a[$2]}' label.uniq train_tmp.txt > train.txt

find ./test/ -type f | awk '{print $0" "substr($0,length($0)-4,1)}' | cut -f3 -d'/' > test_tmp.txt

awk -F' ' 'BEGIN{id=0}NR==FNR{a[$1]=id;id+=1}NR>FNR{print $1,a[$2]}' label.uniq test_tmp.txt > test.txt

lmdb格式转换

由于lmdb是caffe爱用的一种数据格式,所以我们需要对原始的数据进行格式转换,使用caffe自带的工具。

build/tools/convert_imageset --shuffle --resize_height=26 --resize_width=22 ./train ./train.txt ./train_lmdb

build/tools/convert_imageset --shuffle --resize_height=26 --resize_width=22 ./test ./test.txt ./test_lmdb

至此,数据已经转换到train_lmdb和test_lmdb目录下了,注意图片大小,全部变成了22*26,主要是针对每个验证码的第一个字符(这个和切割有关)。

均值计算

mean.binaryproto是均值文件,为加快计算的效率和训练的模型准确率而设计的,也通过caffe自带的工具compute_image_mean 来实现,数据集就采用train_lmdb就可以。

build/tools/compute_image_mean ./train_lmdb ./mean.binaryproto

模型训练

该准备的数据都准备好,接下来我们就开始训练,别急,先看下模型定义文件,看看哪里有没有什么需要改动的地方(其实得做一点小修改,否则不能训练哦)。
打开:lenet_train_test.prototxt,注意最后ip2层的num_output,应该和我们最后的标签个数56一致哦,标签数在上面说过。

这里写图片描述

开始训练,同样使用caffe核心模块caffe:

build/tools/caffe train -solver lenet_solver.prototxt

模型测试

大概半个小时左右,模型已经训练好了,就是verify_code_iter_10000.caffemodel,而且已经对测试数据进行了预测,准确率杠杠的99%,可能每次会有少许差别。

准确率

我们现在可以在单个图片上测(嘚)试(瑟)下了,咳咳咳,同样使用caffe自带的工具:
先说下lenet_test.prototxt文件,是基于lenet_train_test.prototxt修改的,主要将输入层变成了Input,输出的Accuracy层去掉。

这里写图片描述

./build/examples/cpp_classification/classification lenet_test.prototxt verify_code_iter_10000.caffemodel mean.binaryproto label.txt test/1100-2-Y.jpg

迫不及待看下结果:

这里写图片描述

到此,基本大功告成,嗨僧吧!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于深度学习的验证码自动识别(caffe) 的相关文章

  • 记录好项目D13

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个宠物商城系统 一 系统介绍 未注册用户 非注册用户 即游客身份 进入宠物官网首页 可以浏
  • redis-cli

    文章目录 集群中手动切换节点 xac xed 问题 查看集群节点 集群中手动切换节点 connect host port xac xed 问题 首先出现这个现象是因为序列化器没设置好 直接 get xac xed x00 x05t x00

随机推荐

  • Python os.walk 遍历指定深度的方法

    用os walk可以遍历多层目录 但是有时需要只遍历指定层数目录 比如 要获取某个目录的1级和2级子目录 可以用下面的方法 coding UTF 8 Python 3 6 import os def get sub dirs root pa
  • xss-labs靶场训练(1~4关)

    第一关 前端F12查看代码 这里只能看到参数test输出在h2里面 可以尝试直接构造payload 成功 后台关键源码 这里是以GET方法获取参数name 并直接输出 没有任何过滤或转义 第二关 尝试上一关的方法 Payload没有执行成功
  • 第四十七节 C++ 匿名函数对象 - lambda 表达式

    函数对象 函数的对象 实现operator 常用于算法中 详见上一节函数对象的讲解 lambda表达式属于函数对象 但其是匿名的 分为 1 一元函数的lambda表达式 不使用捕获列表 使用捕获列表 2 一元谓词的lambda表达式 不使用
  • linux shell脚本双引号转义,Linux Shell脚本中单引号(‘)和双引号(“)的区别

    在Linux操作系统上编写Shell脚本时候 我们是在变量的前面使用 符号来获取该变量的值 通常在脚本中使用 param 这种带双引号的格式 但也有出现使用 param 这种带引号的使用的场景 首先大家看一段例子 root linux na
  • JAVA代码保护工具DashO Pro v10.0.0 Beta 2重磅上线!更新DashO Gradle插件!

    DashO是一个Java和Android的混用程序 它提供企业级应用的加固和屏蔽 大大降低了知识产权盗窃 数据盗窃 盗版和篡改的风险 分层混淆 加密 水印 自动失效 反调试 反篡改 反仿真器 反挂钩 反根设备解决方案 为世界各地的应用程序提
  • 单片机毕业设计 stm32智能电子秤系统设计与实现 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 4 1 STM32F103C8T6 4 2 HX711压力传感器 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目
  • Simulink Simscape基础仿真电路

    在网上找了挺多关于MATLAB Simulink simscape仿真电路的资料都没有自己想要的 大都是Sympowersystem的教程 最后还是上了YouTube观看了一些教程 现在做下学习记录 由于我电脑上安装了2016和2010两个
  • 身份和访问管理解决方案:混合型IAM

    对于依赖于本地 IT 基础结构和传统安全模型的组织 可以更轻松地验证和授权企业网络内的所有内容 包括设备 用户 应用程序和服务器 尝试从公司网络外部获取访问权限的用户使用虚拟专用网络 VPN 和网络访问控制 NAC 进行身份验证 随着云和远
  • java中equals的重写_Java重写equals方法(重点讲解)

    为什么equals 方法要重写 判断两个对象在逻辑上是否相等 如根据类的成员变量来判断两个类的实例是否相等 而继承Object中的equals方法只能判断两个引用变量是否是同一个对象 这样我们往往需要重写equals 方法 我们向一个没有重
  • Hadoop-The variance for this alert is **MB which is 20% of the **MB average (**MB is the limit)

    The variance for this alert is MB which is 20 of the MB average MB is the limit 1 调整如下阀值 2 检查HDFS文件系统使用率 清空HDFS上的 trash垃
  • SpringBoot+ftp 实现文件的上传、下载与删除

    SpringBoot ftp 实现文件的上传 下载与删除 一 引包 二 配置 三 代码 3 1配置类 3 2 接口服务 3 3controller层示例 不做过多解释 可移植 比较简单方便 一 引包 3 8 0是目前最新的 除非重大更新 基
  • Python基础——常见数据类型总结

    在Python中常见的数据类型有以下8个类型 分别是 int 整数类型 整形 float 浮点类型 浮点型 bool 布尔类型 str 字符串类型 list 列表类型 tuple 元组类型 dict 字典类型 set 集合类型 接下来一一展
  • hdd和虚拟服务器区别,Docker容器与虚拟机的区别

    我曾经将Docker容器视为轻量级 精简的虚拟机 进行这种比较是有道理的 因为至少在Docker的最初市场中 总是将其与虚拟机进行比较 例如 Docker花费的启动时间少于VM 等等 但是docker容器不是虚拟机 让我们对Docker容器
  • java redis cluster_Redis的cluster模式

    Redis集群是Redis提供的分布式数据库方案 集群通过分片 Sharding 来进行数据共享 并提供复制和故障转移功能 节点 一个节点就是一个运行在集群模式下的Redis服务器 Redis服务器在启动的时候会根据cluster enab
  • ERROR: Could not build wheels for pycocotools, lap, which is required to install pyproject.toml-base

    python 在windows系统上安装pycocotools lap是出现无法安装的情况 报错如下 原因是缺少C 的编译工具 并且pycocotools需要安装windows版本 解决步骤 1 下载BuildTools 下载地址 Buil
  • Spark学习之机器学习包ML

    Spark的ML软件包 其操作是基于DataFrame的 ML包括转换器 Transformer 评估器 Estimator 管道 Pipeline 1 转换器 Transformer 通常是将一个新列附加到DataFrame来转换数据 从
  • React入门

    目录 React简介 官网 介绍描述 React的特点 React高效的原因 React的基本使用 效果 相关js库 创建虚拟DOM的两种方式 虚拟DOM与真实DOM React JSX XML JSON JSX 渲染虚拟DOM 元素 JS
  • 二进制部署Kubernetes

    操作系统 centos7 5 x86 docker 19ce 软件 Kubernetes 1 18 角色 k8s master1 192 168 31 71 组件 kube apiserver kube controller manager
  • C语言atoi函数将字符串类型转换为整型

    atoi 是C标准库中的一个函数 用于将字符串转换为整数 函数原型如下 int atoi const char str 参数 str 是一个指向要转换的字符串的指针 atoi 函数会尝试将字符串中的数字部分转换为整数 并返回转换后的整数值
  • 基于深度学习的验证码自动识别(caffe)

    最近在学习使用caffe 然后就想试着玩玩验证码识别 结果非常非常棒 深度学习确实是非常强大的 废话少说 跟我走进验证码自动识别 caffe安装 此处省略一万字 网上教程千千万 你一定可以找到 接着往下看 剧情描述 之前对京东的某些数据进行