深度学习应用于图像处理领域应该说有很长一段时间了,相关的研究成果也有很多的积累了,从项目和实践入手是我觉得的最好最快速有效的学习手段,当下很多主流的验证码识别系统大都是基于神经网络设计开发而来的,在处理图像数据方面,神经网络有着无与伦比的优势,本人最开始接触到卷积神经网络也是从验证码是被项目开始入手的。本项目从零开始介绍整体的实践思路,以我们熟知的12306网站验证码为例进行分析实战,从数据采集、图像处理、模型搭建、预测识别、界面开发几个节点进行针对性的设计开发,实现了验证码识别的完整流程,达到了很高的精度要求和速度要求,能够满足基本的调用需求。在模型方面,对比使用了多种经典的神经网络模型来进行实验,选取最优的实验结果来用于界面开发和调用识别。
整个项目基于python3.6开发实现,项目中包含整体项目所使用到的数据、代码脚本、模型文件和界面文件的所有数据文件。项目文件截图如下所示:
上述文件解释说明如下表所示:
文件名称 | 文件说明 |
---|---|
screenshot/ | 软件截图目录 |
getData.py | 图像验证码数据采集模块 |
imageCut.py | 图像验证码数据切分处理模块 |
dataHelper.py | 模型数据加载预处理模块 |
myModel.py | 模型训练模块 |
resnetModel.py | Resnet模块 |
predict.py | 离线模块预测识别模块 |
guiDemo.py | 界面可视化模块 |
texts.txt | 文本标签集合 |
valid_ip_all.json | IP代理池数据,避免爬虫被封禁 |
imageModel.h5 | 训练好的图像识别模型文件 |
textModel.h5 | 训练好的文本识别模块文件 |
接下来针对整个建模流程的各个节点进行详细说明。
一、数据采集
做深度学习的,基础条件就是:数据+算力,想要建模实践,首先就需要把所需的数据给准备好了,下面我们开始本文的第一步工作:源站验证码数据采集,这就是一个单纯地数据爬虫工作,详细的实现原理本来也就没什么,我也就不多讲解了,核心代码部分如下:
#!usr/bin/env python
#encoding:utf-8
from __future__ import division
'''
__Author__:沂水寒城
功能: 网络验证码数据采集模块
'''
def buildProxy():
'''
构建代理信息
'''
header_list=generateRandomUA(num=500)
header={'User-Agent':random.choice(header_list)}
ip_proxy=random.choice(ip_list)
one_type,one_ip,one_port=ip_proxy[0],ip_proxy[1],ip_proxy[2]
proxy={one_type:one_type+'://'+one_ip+':'+one_port}
return header,proxy
def getPageHtml(url,header,proxy,num_retries=3):
'''
多代理形式、超时重试机制,获取数据
'''
try:
response=requests.get(url,headers=header,proxies=proxy,timeout=5)
return response
except Exception as e:
time.sleep(random.randint(3,8))
while num_retries:
num_retries-=1
print('Left tring number is: ', num_retries)
return getPageHtml(url,header,proxy,num_retries)
def getVCPics(img_url,start,end,saveDir):
'''
下载验证码数据
'''
if not os.path.exists(saveDir):
os.makedirs(saveDir)
for i in range(start,end):
print("Downloading",i+1,"......")
header,proxy=buildProxy()
try:
img=getPageHtml(img_url,header,proxy,num_retries=3)
pic_name=saveDir+str(i+1)+'.jpg'
file_pic=open(pic_name,'ab')
file_pic.write(img.content)
file_pic.close()
time.sleep(random.randint(0.1,1))
except:
pass
if __name__ == '__main__':
print('captch