Article / 文章中心

OCR通用验证码识别SDK免费开源版-ddddocr

发布时间:2022-06-21 点击数:14099

今天ddddocr又更新啦!

当前版本为1.4.3

本次升级的主要原因为,dddd_trainer 的开源进行适配,使dddd_trainer 训练出的模型可以直接无缝导入到ddddocr里面来使用

使用ddddocr调用dddd_trainer 训练后的模型

dddd_trainer 训练后会在models目录里导出charsets.json和onnx模型

如下所示,import_onnx_path为onnx所在地址,charsets_path为onnx所在地址

 

1.4.0版本更新内容

本次更新新增了两种滑块识别算法,算法非深度神经网络实现,仅使用opencv和PIL完成。

算法1

小滑块为单独的png图片,背景是透明图,如下图

Test

然后背景为带小滑块坑位的,如下图

Test

  det = ddddocr.DdddOcr(det=False, ocr=False)
  
  with open('target.png', 'rb') as f:
      target_bytes = f.read()
  
  with open('background.png', 'rb') as f:
      background_bytes = f.read()
  
  res = det.slide_match(target_bytes, background_bytes)
  
  print(res)

提示:如果小图无过多背景部分,则可以添加simple_target参数, 通常为jpg或者bmp格式的图片

    slide = ddddocr.DdddOcr(det=False, ocr=False)
    
    with open('target.jpg', 'rb') as f:
        target_bytes = f.read()
    
    with open('background.jpg', 'rb') as f:
        background_bytes = f.read()
    
    res = slide.slide_match(target_bytes, background_bytes, simple_target=True)
    
    print(res)

算法2

一张图为带坑位的原图,如下图

Test

一张图为原图,如下图

Test

  slide = ddddocr.DdddOcr(det=False, ocr=False)

  with open('bg.jpg', 'rb') as f:
      target_bytes = f.read()
  
  with open('fullpage.jpg', 'rb') as f:
      background_bytes = f.read()
  
  img = cv2.imread("bg.jpg")
  
  res = slide.slide_comparison(target_bytes, background_bytes)

  print(res)

更新内容2

添加全局ocr关闭参数,初始化时传入

dddd = ddddocr.DdddOcr(ocr=False)

则为关闭ocr功能,如果det = True,则会自动关闭ocr

1.3.1版本更新内容

想必很多做验证码的新手,一定头疼碰到点选类型的图像,做样本费时费力,神经网络不会写,训练设备太昂贵,模型效果又不好。

市场上常见的点选类验证码图片如下图所示

Test

Test

Test

Test

那么今天,他来了,ddddocr带着重磅更新大摇大摆的走来了。

简介

ddddocr是由sml2h3开发的专为验证码厂商进行对自家新版本验证码难易强度进行验证的一个python库,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。

ddddocr奉行着开箱即用、最简依赖的理念,尽量减少用户的配置和使用成本,希望给每一位测试者带来舒适的体验

项目地址: 点我传送

更新说明

本次更新其实分为两部分,其中有一部分是在1.2.0版本就已经更新了,但是在这里还是有必要提一下的。

第一部分 OCR识别部分

在1.2.0开始,ddddocr的识别部分进行了一次beta更新,主要更新在于网络结构主体的升级,其训练数据并没有发生过多的改变,所以理论上在识别结果上,原先可能识别效果的很好的图形在1.2.0上有一小部分概率会有一定程度的下降,也有可能原本识别不好的图形在1.2.0之后效果却变得特别好。 测试代码:

import ddddocr

ocr = ddddocr.DdddOcr()

with open("test.jpg", 'rb') as f:
    image = f.read()

res = ocr.classification(image)
print(res)

由于事实上确实在一些图片上老版本的模型识别效果比新模型好,特地这次更新把老模型也加入进去了,通过在初始化ddddocr的时候使用old参数即可快速切换老模型

import ddddocr

ocr = ddddocr.DdddOcr(old=True)

with open("test.jpg", 'rb') as f:
    image = f.read()

res = ocr.classification(image)
print(res)

OCR部分应该已经有很多人做了测试,在这里就放一部分网友的测试图片。

Test Test Test Test Test Test Test Test Test Test Test Test 等等更多图片等你测试哟~

第二部分 目标检测部分

在本次1.3.0的更新中,目标检测部分隆重登场! 目标检测部分同样也是由大量随机合成数据训练而成,对于现在已有的点选验证码图片或者未知的验证码图片都有可能具备一定的识别能力,适用于文字点选和图标点选。 简单来说,对于点选类的验证码,可以快速的检测出图片上的文字或者图标。

import ddddocr
import cv2

det = ddddocr.DdddOcr(det=True)

with open("test.jpg", 'rb') as f:
    image = f.read()

poses = det.detection(image)
print(poses)

im = cv2.imread("test.jpg")

for box in poses:
    x1, y1, x2, y2 = box
    im = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)

cv2.imwrite("result.jpg", im)

举些例子:

Test Test Test Test Test Test Test

以上只是目前我能找到的点选验证码图片,做了一个简单的测试。

安装

环境支持

python <= 3.9

Windows/Linux/Macos..

暂时不支持Macbook M1(X),M1(X)用户需要自己编译onnxruntime才可以使用

安装命令

pip install ddddocr

以上命令将自动安装符合自己电脑环境的最新ddddocr

 

 

dddd_trainer 带带弟弟OCR训练工具

带带弟弟OCR所用的训练工具今天正式开源啦! ddddocr

项目仅支持N卡训练,A卡或其他卡就先别看啦

项目基于Pytorch进行开发,支持cnn与crnn进行训练、断点恢复、自动导出onnx模型,并同时支持无缝使用ddddocr 与 ocr_api_server 的无缝部署

训练环境支持

Windows/Linux

Macos仅支持cpu训练

1、深度学习必备环境配置(非仅本项目要求,而是所有深度学习项目要求,cpu训练除外)

开始本教程前请先前往pytorch 官网查看自己系统与硬件支持的pytorch版本,注意30系列之前的N卡,如2080Ti等请选择cuda11以下的版本(例:CUDA 10.2),如果为30系N卡,仅支持CUDA 11版本,请选择CUDA 11以上版本(例:CUDA 11.3),然后根据选择的条件显示的pytorch安装命令完成pytorch安装,由于pytorch的版本更新速度导致很多pypi源仅缓存了cpu版本,CUDA版本需要自己在官网安装。

安装CUDA和CUDNN

根据自己显卡型号与系统选择

cuda

cudnn

注意cudnn支持的cuda版本号要与你安装的cuda版本号对应,不同版本的cuda支持的显卡不一样,20系无脑选择10.2版本cuda,30系无脑选择11.3版本cuda,这里有啥问题就百度吧,算是一个基础问题。

2、训练部分

  • 以下所有变量均以 {param} 格式代替,表示可根据自己需要修改,而使用时并不需要带上{},如步骤创建新的训练项目,使用时可以直接写

python app.py create test_project

  • 1、Clone本项目到本地

git clone https://github.com/sml2h3/dddd_trainer.git

  • 2、进入项目目录并安装本项目所需依赖

pip install -r requirements.txt -i https://pypi.douban.com/simple

  • 3、创建新的训练项目

python app.py create {project_name}

如果想要创建一个CNN的项目,则可以加上--single参数,CNN项目适用于图片宽高是一个确定值和识别结果位数一定的情况

python app.py create {project_name} --single

project_name 为项目名称,尽量不要以特殊符号命名

  • 4、准备数据

    项目支持两种形式的数据

    A、从文件名导入

    图片均在同一个文件夹中,且命名为类似,其中/root/images_set为图片所在目录,可以为任意目录地址

    /root/images_set/
    |---- abcde_随机hash值.jpg
    |---- sdae_随机hash值.jpg
    |---- 酱闷肘子_随机hash值.jpg
    
    

    如下图所示

    image

    那么图片命名可以是

    mkGu_000001d00f140741741ed9916240d8d5.jpg

    为考虑各种情况,dddd_trainer不会自动去处理大小写问题,如果想训练大小写,则在样本标注时就需要自己标注好大小写,如上面例子

    B、从文件中导入

    受限于可能样本组织形式或者特殊字符,本项目支持从txt文档中导入数据,数据集目录必须包含有labels.txt文件和images文件夹, 其中/root/images_set为图片所在目录,可以为任意目录地址

    labels.txt文件中包含了所有在/root/images_set/images目录下基于/root/images_set/images的图片相对路径,/root/images_set/images下可以有目录。

    当然,在这种模式下,图片的文件名随意,可以有具体label也可以没有,因为咱们不从这里获取图片的label

    如下所示

  • a.images下无目录的形式

    /root/images_set/
    |---- labels.txt
    |---- images
          |---- 随机hash值.jpg
          |---- 随机hash值.jpg
          |---- 酱闷肘子_随机hash值.jpg
    
    labels.txt文件内容为(其中\t制表符为每行文件名与label的分隔符)
    随机hash值.jpg\tabcd
    随机hash值.jpg\tsdae
    酱闷肘子_随机hash值.jpg\t酱闷肘子
    

    b.images下有目录的形式

    /root/images_set/
    |---- labels.txt
    |---- images
          |---- aaaa
                |---- 随机hash值.jpg
          |---- 酱闷肘子_随机hash值.jpg
    
    labels.txt文件内容为(其中\t制表符为每行文件名与label的分隔符)
    aaaa/随机hash值.jpg\tabcd
    aaaa/随机hash值.jpg\tsdae
    酱闷肘子_随机hash值.jpg\t酱闷肘子
    
    

    为了新手更好的理解本部分的内容,本项目也提供了两套基础数据集提供测试

  • 5、修改配置文件

Model:
    CharSet: []     # 字符集,不要动,会自动生成
    ImageChannel: 1 # 图片通道数,如果你想以灰度图进行训练,则设置为1,彩图,则设置为3。如果设置为1,数据集是彩图,项目会在训练的过程中自动在内存中将读取到的彩图转为灰度图,并不需要提前自己修改并且该设置不会修改本地图片
    ImageHeight: 64 # 图片自动缩放后的高度,单位为px,高度必须为16的倍数,会自动缩放图像
    ImageWidth: -1  # 图片自动缩放后的宽度,单位为px,本项若设置为-1,将自动根据情况调整
    Word: false     # 是否为CNN模型,这里在创建项目的时候通过参数控制,不要自己修改
System:
    Allow_Ext: [jpg, jpeg, png, bmp]  # 支持的图片后缀,不满足的图片将会被自动忽略
    GPU: true                         # 是否启用GPU去训练,使用GPU训练需要参考步骤一安装好环境
    GPU_ID: 0                         # GPU设备号,0为第一张显卡
    Path: ''                          # 数据集根目录,在缓存图片步骤会自动生成,不需要自己改,除非数据集地址改了
    Project: test                     # 项目名称 也就是{project_name}
    Val: 0.03                         # 验证集的数据量比例,0.03就是3%,在缓存数据时,会自动选则3%的图片用作训练过程中的数据验证,修改本值之后需要重新缓存数据
Train:
    BATCH_SIZE: 32                                    # 训练时每一个batch_size的大小,主要取决于你的显存或内存大小,可以根据自己的情况,多测试,一般为16的倍数,如16,32,64,128
    CNN: {NAME: ddddocr}                              # 特征提取的模型,目前支持的值为ddddocr,effnetv2_l,effnetv2_m,effnetv2_xl,effnetv2_s,mobilenetv2,mobilenetv3_s,mobilenetv3_l
    DROPOUT: 0.3                                      # 非专业人员不要动
    LR: 0.01                                          # 初始学习率
    OPTIMIZER: SGD                                    # 优化器,不要动
    SAVE_CHECKPOINTS_STEP: 2000                       # 每多少step保存一次模型
    TARGET: {Accuracy: 0.97, Cost: 0.05, Epoch: 20}   # 训练结束的目标,同时满足时自动结束训练并保存onnx模型,Accuracy为需要满足的最小准确率,Cost为需要满足的最小损失,Epoch为需要满足的最小训练轮数
    TEST_BATCH_SIZE: 32                               # 测试时每一个batch_size的大小,主要取决于你的显存或内存大小,可以根据自己的情况,多测试,一般为16的倍数,如16,32,64,128
    TEST_STEP: 1000                                   # 每多少step进行一次测试

配置文件位于本项目根目录下projects/{project_name}/config.yaml

  • 6、缓存数据

python app.py cache {project_name} /root/images_set/

如果是从labels.txt里面读取数据

python app.py cache {project_name} /root/images_set/ file

  • 7、开始训练或恢复训练

python app.py train {project_name}

  • 8、部署

你们先训练着,我去适配ddddocr和ocr_api_server了,适配完我再继续更新文档