说明
利用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
}