最近突发奇想,想研究一下中文识别。因为之前研究过简单数字,字母类的识别,这种识别种类很少,数字就10个,字母顶多就26个。但是一到中文,常用字就有3000多个,数量级有了巨大提升。不知道传统的方法还是否有效,所以想研究一下。
于是找到了一个比较好的研究对象,江苏省电子税务局中文点选验证码。识别对象样例如下:
由于从来没有接触过中文识别,所以我首先百度了一下,有没有现成的,可以直接调用的,免费的识别方法。
ddddocr(带带弟弟OCR)首先进入了我的视野,根据介绍这是一个非常不错的通用识别,不仅可以识别数字,还可以识别中文。我看别人的测试,识别极验的中文点选效果非常好。于是我马上进行测试,效果不是很好。
这是 ddddocr 的识别效果,5个汉字就对了1个,完全不能使用的状态。看样子一个模型只针对一种识别,应该是我的图片和他的训练样本差异太大,所以效果不好。
解决办法
只有自己针对性的训练这一个中文识别了。
第一步:标记数据
这是一项非常枯燥的工作,必须非常有耐心才行,我一个人标记了两个月。
第二步:搭建模型、训练模型
首先划分训练集与测试集,训练集取90%数据量,测试集取10%数据量。我这里首先对图片预处理,去除颜色等无效特征,让文字更加清晰。最后构建深度学习神经网络训练这些数据。
第三步:测试验证
训练好的模型测试集ACC可以达到95%。识别效果如下:
识别代码如下:
__author__ = "dengxinyan"import requests
import base64
from PIL import Image
from io import BytesIO#PIL图片保存为base64编码
def PIL_base64(img, coding='utf-8'):img_format = img.formatif img_format == None:img_format = 'JPEG'format_str = 'JPEG'if 'png' == img_format.lower():format_str = 'PNG'if 'gif' == img_format.lower():format_str = 'gif'if img.mode == "P":img = img.convert('RGB')if img.mode == "RGBA":format_str = 'PNG'img_format = 'PNG'output_buffer = BytesIO()# img.save(output_buffer, format=format_str)img.save(output_buffer, quality=100, format=format_str)byte_data = output_buffer.getvalue()base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding)return base64_str# 接口地址
url = "https://www.detayun.cn/tool/verify_code_identify/"
# 请求头,需要使用自己的Cookie
header = {"Host": "www.detayun.cn","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:72.0) Gecko/20100101 Firefox/72.0","Accept": "application/json, text/javascript, */*; q=0.01","Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2","Accept-Encoding": "gzip, deflate, br","Referer": "https://www.detayun.cn/tool/verifyCodeIdentifyPage/?verify_idf_id=15&_=1662691208701","Content-Type": "application/x-www-form-urlencoded; charset=UTF-8","X-Requested-With": "XMLHttpRequest","Content-Length": "66159","Origin": "https://www.detayun.cn","Connection": "keep-alive","Cookie": 'Hm_lvt_3eecc7feff77952670b7c24e952e8773=1662376740,1662514492,1662616792,1662642119; token="MTY2MjY5NDgxNS45MzY1NTczOjA2NGU2NzM0M2ZiY2Z0ODRiN2U4MmJkMzFjOTZmNDI4ZWRmYThiZWE="; sessionid=nyqsx4g4h2uvjh1xxuyvmcl5cuob4vqe',"TE": "Trailers",
}
# 请求参数
data = {'verify_idf_id':'15','img_base64': None, #需要识别的图片'words':'润疲狗', # 需要识别的文字'_':'1662691244530'
}
# 打开需要识别的图片
img = Image.open(r'E:\Python\learning\江苏省电子税务局验证码\big_img\1657696065-润疲狗.jpg')
# 图片转为base64格式
img_base64 = PIL_base64(img)
# 配置图片到请求参数中
data['img_base64'] = img_base64# 发送请求
response = requests.post(url=url, headers=header, data=data)response_data = response.json()
if response_data['code'] == 200:print('文字坐标:',response_data['data']['res_str'])
else:print('请完成登录,登录地址:https://www.detayun.cn')