用pytorch实现crnn+ctc来识别验证码

pytorch 实现crnn+ctc来识别验证码

说明

利用crnn和ctc来进行验证码识别是现在主流的机器学习的方式,本文期望利用pytorch来实现单个验证码的识别,同时整合多个训练样本,期望能通过增量识别的方式,最终通过一个模型来识别多个验证码。
本文采用的是阿里云的gpu的服务器。
源码地址:https://github.com/linlihuiyang/ocr-python

环境搭建

服务器购买,从阿里云购买gpu服务器,可以选择抢占式实例,ubuntu系统选择16.04,自动安装cuda驱动。服务器配置ecs.gn5-c8g1.2xlarge。系统会自动带一个数据盘,需要手动完成挂载。参考文档https://yq.aliyun.com/articles/226592?spm=a2c4e.11153940.0.0.52033583F02HO4

远程连接上服务器,默认已经安装好了python和pip
1.安装virtualenv
pip install virtualenv
virtualenv --system-site-packages -p python2.7 ./venv
source /root/venv/bin/activate
2.安装warp-ctc
git clone https://github.com/SeanNaren/warp-ctc.git
cd warp-ctc
mkdir build; cd build
cmake …
make
cd pytorch_binding
python setup.py install
3.安装lmdb
apt-get install python-dev
build-essential libssl-dev libffi-dev
libxml2-dev libxslt1-dev zlib1g-dev
python-pip
pip install lmdb
4.安装opencv
pip install opencv-python
5.安装torch
pip install https://download.pytorch.org/whl/cu80/torch-1.0.1.post2-cp27-cp27mu-linux_x86_64.whl
pip install torchvision

验证torch

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)

期望结果类似如下

tensor([[0.3380, 0.3845, 0.3217],
        [0.8337, 0.9050, 0.2650],
        [0.2979, 0.7141, 0.9069],
        [0.1449, 0.1132, 0.1375],
        [0.4675, 0.3947, 0.1426]])

验证cuda驱动是否正常安装

import torch
torch.cuda.is_available()

训练

下载代码到服务器路径/home/ocr-python/
source /root/venv/bin/activate
单个验证码识别

#tool目录下执行,会在datasets下面生成ydShop目录,下面有train和val两个文件夹,比例为9比1
python create_dataset_Plus.py --imagePath=/home/pics/ydshop/success --head=ydshop
#/home/ocr-python/crnn_pytorch目录下执行,默认会在expr下面生成训练的结果,如果开始打印epoch: 0, step: 则表示正在训练,数据集没问题,之后看到日志,accuray表示成功率,达到一定成功率即可kill掉进程,或者等待迭代次数完成(默认100次)
nohup python crnn_main_plus.py  --trainPath=/home/ocr-python/crnn_pytorch/ydshop/train --valPath=/home/ocr-python/crnn_pytorch/datasets/ydshop/val --saveInterval=2000 &

如果运行完成还没达到预期成功率,可能是样本量不够,可以增加样本,继续训练。
注:如果继续训练,跟原来的图片路径分开,新建一个文件夹,或者执行如下脚本:

python create_dataset_Plus.py --imageDirPath=/home/pics/ydshop2/success --head=ydshop

整合验证码识别
整合的方式是通过把datasets里面的train的样本,整合到一个统一的目录如tmpLmdb,脚本如下,reset为true会清空tmpLmdb目录。
如果datasets新增了文件夹,srcPath传入精确的文件路径,reset传入False。

python integrate_dataset.py --result=/home/ocr-python/crnn_pytorch/tmpLmdb  --srcPath=/home/ocr-python/crnn_pytorch/datasets/  --reset=False

整合完成之后,训练脚本跟单个一样,trainPath改为到tmpLmdb就行,系统会自动遍历transets下面的验证集进行验证。

nohup python crnn_main_plus.py  --trainPath=/home/ocr-python/crnn_pytorch/tmpLmdb --valPath=/home/ocr-python/crnn_pytorch/datasets/ --saveInterval=2000 &

训练完成后,把生成的模型文件拷贝到ocr-python/data/model下
重命名文件 格式为 crnn_{id}_{成功率}_model.pth
如 crnn_163209_96_model.pth

服务搭建

/home/ocr-python/server目录,可以修改config来制定对外端口,
默认会读取在上级目录下的data/model/下面的模型文件。
阿里云开通外网端口访问

#启动服务
nohup python server.py &

调用方式Post,requestBody,格式为json,site为上面的模型文件名中的{id}

{
"site":"163209",
"image":"图片的base64格式的字符串"
}

附 命令行把图片转换为base64格式

openssl base64 -e  -in 1516160605925_kcxs.png > text.json

正确返回格式

{
    "result": "kcxs", //识别结果
    "success": true
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值