需求:需要对手写图片进行识别 勾,叉,圈,识别成对于的 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”这个包下载不下来
可以手动下载,解压,地址:
https://download.csdn.net/download/kobe24livemvp/87369709?utm_medium=distribute.pc_relevant_download.none-task-download-2~default~OPENSEARCH~Rate-2-87369709-download-87429869.pc_dl_relevant_base1&depth_1-utm_source=distribute.pc_relevant_download.none-task-download-2~default~OPENSEARCH~Rate-2-87369709-download-87429869.pc_dl_relevant_base1&dest=https%3A%2F%2Fdownload.csdn.net%2Fdownload%2Fkobe24livemvp%2F87369709&spm=1003.2020.3001.6616.2
下载下来是whI结尾的文件,可以把后缀名改成zip压缩包的形式,进行解压。解压地址:python安装包里的/lib/sit-packages里面
其他的包应该就可以手动pip进行下载了,如果还是不行。可能需要下载C++的环境,参考:
解决PaddleOCR安装lanms-neo时报错,Could not build wheels for lanms-neo ..._樱阙诗汀的博客-CSDN博客
然后就可以下载官方的图片包了,切换路径后,识别图片
我当时这里出现了问题,原因是没有装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 |
|
注:标色的为识别错误符号。