需求:需要对手写图片进行识别 勾,叉,圈,识别成对于的 v,x,o 其他的符号识别成 e
搭建环境: win10 gpu模式(用cpu搭建过一版,但是cpu训练太慢,搭建cpu期间的问题比gpu问题的少)
使用gpu的需要有一块N卡(英伟达)。我使用的是2060s,显卡算力需要超过3.5。( 第一次训练使 用i5—1135G7 cpu模式 需要两天多时间,第二次训练使用2060s 需要两个小时)
python环境:3.7
cuda:11.6
cudnn:8.8.0.121
pycharm:2020.1.5
pip也要更新到最新版本
安装PaddleOCR前,需要把环境先搭建好
官方代码库(gitee):PaddleOCR: 基于飞桨的OCR工具库,包含总模型仅8.6M的超轻量级中文OCR,单模型支持中英文数字组合识别、竖排文本识别、长文本识别。同时支持多种文本检测、文本识别的训练算法。
过程:本次识别模型建立,使用识别素材850张图片,验证素材446张图片,通过PaddleOCR算法成功建立了一个手写符号识别模型。
PaddlePaddle安装
安装PaddleORC前,需要先安装好PaddlePaddle
我东西下载完后,期间验证的时候报错了,错误没有截图
主要问题是 显卡驱动——》cuda驱动——》cudnn驱动,三个的版本关系没有对应好。
首先要确定显卡的驱动,然后根据显卡驱动来选择cuda的驱动,然后根据cuda驱动选择cudnn驱动。
PaddleOCR安装
PaddlePaddle安装好后,可以安装PaddleOCR了
地址:doc/doc_ch/quickstart.md · PaddlePaddle/PaddleOCR - Gitee.com
(如果是win搭建的话,图中的python3命令都可以换成python)
其中 win运行这个命令,下载一堆东西后,会报错的,原因有些包下载不下来。官方提供的额外安装包也不够用
主要是“lanms_neo-1.0.2”这个包下载不下来
可以手动下载,解压,地址:
下载下来是whI结尾的文件,可以把后缀名改成zip压缩包的形式,进行解压。解压地址:python安装包里的/lib/sit-packages里面
其他的包应该就可以手动pip进行下载了,如果还是不行。可能需要下载C++的环境,参考:
解决PaddleOCR安装lanms-neo时报错,Could not build wheels for lanms-neo ..._樱阙诗汀的博客-优快云博客
然后就可以下载官方的图片包了,切换路径后,识别图片
我当时这里出现了问题,原因是没有装cudnn和cuda驱动里少了zlibwapi。zlibwapi需要手动进行下载然后放入cuda里面
到此图片就可以正常识别了。
模型训练
地址:
doc/doc_ch/recognition.md · PaddlePaddle/PaddleOCR - Gitee.com
首先建立素材库,文档中给出来的素材库结构不正确,和代码中的不对应。
这个需要注意
我是训练新的内容,所以我这边要新建立一个字典。
我是将原先的字典复制一个,然后在这个字典上修改
然后还修改了这个文件的地址路径,后续用的上(应该,忘了为啥改这里了):
启动训练:
训练模型自己下载下来放在pretrain_models包里然后解压就行了,地址:https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_rec_train.tar
我这边是进行单卡训练的:
python tools/train.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=./pretrain_models/en_PP-OCRv3_rec_train/best_accuracy
但是单卡训练应该要改参数,文档中没有说,改之前,我一直训练不成功
batch_size_per_card: 128 num_workers: 4
改成了:
batch_size_per_card: 64 num_workers: 1
然后就跑起来了,跑了两个小时,模型生成了出来
生成的模板在/output/v3_en_mobile里面,best_accuracy表示最好的模型
然后用这个命令,导出模型: python tools/export_model.py -c configs/rec/PP-OCRv3/en_PP-OCRv3_rec.yml -o Global.pretrained_model=./output/v3_en_mobile/best_accuracy Global.save_inference_dir=./inference/en_PP-OCRv3_rec/
导出的模型在/inference/en_PP-OCRv3_rec里面
然后新建测试图片集合:
用命令进行测试: python tools/infer/predict_rec.py --image_dir="./ppocr_img/imgs_en/1.jpg" --rec_model_dir="./inference/en_PP-OCRv3_rec" --rec_image_shape="3, 48, 320" --rec_char_dict_path="ppocr/utils/en_dict.txt"
我这边放了50张图片进行测试,前30张为较正常的勾,叉,圈。全部识别出来。后20张为离谱的勾,叉,圈,识别出来17张,错了3张。
图片名称 | 真实符号 | 检测符号 | 确认率 | 识别图片 |
1 | v | v | 0.99 | |
2 | v | v | 0.99 | |
3 | v | v | 0.99 | |
4 | v | v | 0.81 | |
5 | v | v | 0.99 | |
6 | v | v | 0.99 | |
7 | v | v | 0.99 | |
8 | v | v | 0.99 | |
9 | v | v | 0.98 | |
10 | v | v | 0.99 | |
11 | x | x | 0.99 | |
12 | x | x | 0.99 | |
13 | x | x | 0.69 | |
14 | x | x | 0.99 | |
15 | x | x | 0.99 | |
16 | x | x | 0.98 | |
17 | x | x | 0.99 | |
18 | x | x | 0.99 | |
19 | x | x | 0.99 | |
20 | x | x | 0.99 | |
21 | o | o | 0.99 | |
22 | o | o | 0.99 | |
23 | o | o | 0.99 | |
24 | o | o | 0.99 | |
25 | o | o | 0.99 | |
26 | o | o | 0.99 | |
27 | o | o | 0.99 | |
28 | o | o | 0.99 | |
29 | o | o | 0.99 | |
30 | o | o | 0.99 | |
31 | e | e | 0.94 | |
32 | e | e | 0.80 | |
33 | x | x | 0.99 | |
34 | x | e | 0.99 | |
35 | e | e | 0.99 | |
36 | v | v | 0.99 | |
37 | e | e | 0.99 | |
38 | e | e | 0.87 | |
39 | e | o | 0.42 | |
40 | o | o | 0.99 | |
41 | o | o | 0.99 | |
42 | v | v | 0.59 | |
43 | e | e | 0.99 | |
44 | e | e | 0.99 | |
45 | e | e | 0.99 | |
46 | o | o | 0.99 | |
47 | e | e | 0.96 | |
48 | v | v | 0.97 | |
49 | x | x | 0.99 | |
50 | e | o | 0.98 | |
注:标色的为识别错误符号。