PaddleOCR数字仪表识别——3.paddleocr迁移学习
3. 迁移学习主要还是使用PaddleOCR的模型来迁移,文本检测和识别主要参考以下内容:https://github.com/PaddlePaddle/PaddleOCR/blob/develop/README_ch.md3.1 安装PaddleOCR3.1.1 安装docker以前配置CVAT的时候就安装过,参考https://www.jianshu.com/p/07e405c01880最简单
主要还是使用PaddleOCR的模型来迁移,文本检测和识别主要参考以下内容:
https://github.com/PaddlePaddle/PaddleOCR/blob/develop/README_ch.md
1 安装PaddleOCR
1.1 安装docker
以前配置CVAT的时候就安装过,参考https://www.jianshu.com/p/07e405c01880
最简单的方式就是使用阿里云的景象直接安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
安装后,大概显示
很方便,比较快捷
1.2 安装PaddleOCR
https://github.com/PaddlePaddle/PaddleOCR/blob/develop/doc/doc_ch/installation.md
1.2.1 准备docker环境
如果是docker的话,就是
# 切换到工作目录下
cd /home/Projects
# 首次运行需创建一个docker容器,再次运行时不需要运行当前命令
# 创建一个名字为ppocr的docker容器,并将当前目录映射到容器的/paddle目录下
如果您希望在CPU环境下使用docker,使用docker而不是nvidia-docker创建docker
sudo docker run --name ppocr -v $PWD:/paddle --network=host -it hub.baidubce.com/paddlepaddle/paddle:latest-gpu-cuda9.0-cudnn7-dev /bin/bash
我是没有GPU的,所以选择cpu环境,看情况要等很久
安装完了之后就变成这样了。。。。
根据提示使用 Ctrl+P+Q
退出docker,
重新进入docker使用如下命令(为什么我要进入docker??? 有正当用途?)
sudo docker container exec -it ppocr /bin/bash
1.2.2 安装PaddlePaddle Fluid v2.0
我觉得我这个服务器真的有点问题,新建文件夹都需要sudo,不使用sudo su命令切换到管理员权限,基本什么都干不了。
pip3 install --upgrade pip
// 更新pip
由于之前服务器安装的python版本是3.8,直接安装的话,报错找不到相应的版本,所以还是专门创建一个python3.7的环境吧。
python3 -m pip install paddlepaddle==2.0.0b0 -i https://mirror.baidu.com/pypi/simple
// 安装paddlepaddle
切换到py37的环境就没问题了
然后构建过程中报错了
是因为没有安装 gcc
去安装gcc (其实安装文档一开始就说了经测试PaddleOCR可在glibc 2.23上运行
,gcc就包括在glibc中) How to Install GCC Compiler on Ubuntu 18.04
sudo apt update
sudo apt install glibc-source // 执行上面这两条命令没什么用,下面的才有用。。
sudo apt update
sudo apt install build-essential // 这条命令就会安装包括 gcc, g++ and make.在内的包
安装好 glibc,再去执行上面PaddleOCR的命令,就没什么问题了
1.2.3 克隆PaddleOCR repo代码
git clone https://github.com/PaddlePaddle/PaddleOCR
要记得文件夹地址,新建了PaddleOCR文件夹放了docker,然后在这个文件夹里执行了上面的git clone,所以这个应该就是 ../PaddleOCR/PaddleOCR/
类似这样了。。。
1.2.4 安装第三方库
cd PaddleOCR
pip3 install -r requirments.txt
网速很重要,顺利的话后几步就比较快。
1.2.5 安装位置
(py37) root@hsh:/home/hsh/paddleOCR/PaddleOCR#
确定一下最后安装的位置,方便以后寻找
2 启动训练
主要参考的是 PaddleOCR文档-文本识别-启动训练
2.1 X 下载预训练模型
给出的示例使用的预训练模型是MobileNetV3:
根据算法介绍-文本识别,用的是下面这个预训练模型
cd PaddleOCR/
# 下载MobileNetV3的预训练模型
wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/rec_mv3_none_bilstm_ctc.tar
# 解压模型参数
cd pretrain_models
tar -xf rec_mv3_none_bilstm_ctc.tar && rm -rf rec_mv3_none_bilstm_ctc.tar
注意,下载下来的模型解压后只有三个文件,没有配置文件的,配置文件要自己另外拷贝
|- rec_mv3_none_bilstm_ctc
|- best_accuracy.pdmodel
|- best_accuracy.pdopt
|- best_accuracy.pdparams
2.2 开始训练
2.2.1 下载和配置文件匹配的预训练模型
上面那个不算,下面这个才是,上面就是看看,下面才是真的用于训练的模型。
重点是训练部分配置文件的选择和修改,
提示: 可通过 -c 参数选择 configs/rec/ 路径下的多种模型配置进行训练,PaddleOCR支持的识别算法有:
配置文件和预训练模型不是一一对应的,但还是有一些可以对应起来的,所以我这里选择这个叫 SRN的模型。
下载解压文件到 ./pretrain_models文件夹(反正几乎都要加sudo,我太难了)
cd PaddleOCR/
# 下载SRN Resnet50_vd_fpn的预训练模型
sudo wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/SRN/rec_r50fpn_vd_none_srn.tar
# 解压模型参数
cd pretrain_models
sudo tar -xf rec_r50fpn_vd_none_srn.tar && sudo rm -rf rec_r50fpn_vd_none_srn.tar
大致看了下rec_r50fpn_vd_none_srn
这个文件的内容,(似乎和示例给的 MobileNetV3 不太一样。。要不还是求稳一点,用示例的来训练吧。。)
|- rec_r50fpn_vd_none_srn
|- best_accuracy.pdparams
|- paper_weights
|- batch_norm_0.b_0
|- batch_norm_0.b_1
|- ....
很多很多。。。
求稳,用给的例子 来弄
cd PaddleOCR/
# 下载MobileNetV3的预训练模型
sudo wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/rec_mv3_none_bilstm_ctc.tar
# 解压模型参数
cd pretrain_models
sudo tar -xf rec_mv3_none_bilstm_ctc.tar && sudo rm -rf rec_mv3_none_bilstm_ctc.tar
2.2.2 本地上传数据集
sudo apt-get install lrzsz
sudo rz -E
然后即便安装了这个lrzsz,拖动文件到xshell界面的时候,也依然报错,文件传输失败。。。
可能是权限的问题,参考
- 找到SFTP服务器地址
$ cat /etc/ssh/sshd_config | grep sftp Subsystem sftp /usr/lib/openssh/sftp-server #就是这个了
- 允许普通用户可以使用sftp服务。(我的电脑上没有这个 sudoers文件,而且根据winSCP上传文件到服务器失败,提示permission denied,返回码3,似乎不需要进行这步,pass)
vim /etc/sudoers user: ALL=NOPASSWD:/usr/libexec/openssh/sftp-server 并且注释掉 #Defaults requiretty
- 配置winscp
注意,这里SFTP服务器地址要加 sudo
然后就ok了,就直接把本地生成的数据集拖到服务器相应位置就好了
2.2.3 修改配置文件
根据训练启动的命令,
python3 tools/train.py -c configs/rec/rec_icdar15_train.yml 2>&1 | tee train_rec.log
默认是训练icdar15英文数据 并将训练日志保存为 tain_rec.log
所以需要对配置文件进行以下修改,
PS:根据之前在生成数据集中的观察,不仅要改rec_icdar15_train.yml,还要改对应的reader.yml文件
(为了防止不必要的错误,最好在原来这个文件的基础上改,保留一份原文件的副本就好了)
rec_icdar15_train 关于train文件的修改
- GPU/CPU训练支持
"rec_icdar15_train.yml"
use_gpu: false #不使用gpu 小写即可 不需要大写
- 数据增强
PaddleOCR提供了多种数据增强方式,如果您希望在训练时加入扰动,请在配置文件中设置 distort: true。
默认的扰动方式有:颜色空间转换(cvtColor)、模糊(blur)、抖动(jitter)、噪声(Gasuss noise)、随机切割(random crop)、透视(perspective)、颜色反转(reverse)。
训练过程中每种扰动方式以50%的概率被选择,具体代码实现请参考:img_tools.py
由于OpenCV的兼容性问题,扰动操作暂时只支持Linuxdistort: true // 默认就是true 这个可以不改 训练时提示: Distort operation can only support in GPU.Distort will be set to False. 数据增强只有在有GPU的时候才支持,所以即便设置了true,如果用CPU,这个选项也会被改为False
- 训练相关
PaddleOCR支持训练和评估交替进行, 可以在 configs/rec/rec_icdar15_train.yml 中修改eval_batch_step
设置评估频率,默认每500个iter
评估一次。- 评估过程中默认将最佳acc模型,保存为 output/rec_CRNN/best_accuracy 。
如果验证集很大,测试将会比较耗时,建议减少评估次数,或训练完再进行评估。
eval_batch_step: 500 pretrain_weights: ./pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy
- 其他修改
// 修改image_shape以适应长文本(我的数据目前看起来,最大的长度是200) image_shape: [3, 32, 200] // 修改字符类型 en→ch 因为做的是数字 和中英文无关,所以这个无所谓 character_type: en //添加自定义字典,如修改字典请将路径指向新字典 character_dict_path: ./ppocr/utils/num_dict.txt (这个就直接传到默认的这个./ppocr/utils/文件夹里好了 注意下,这里这个文件在服务器上的权限是rw-r--r-- ,上传的文件(非文件夹)也都是这个权限。。) reader:路径不用改了,直接去reader里改训练集和测试集路径 epoch_num: 1000 # Global里的这个轮数 total_epoch: 1000 # Optimizer里的这个总的轮数 # 上面这两个要一致。。。 忘改了
rec_icdar15_train 关于reader文件的修改
"rec_icdar15_reader.yml"
TrainReader:
reader_function: ppocr.data.rec.dataset_traversal,SimpleReader
num_workers: 8
img_set_dir: ./train_data/num_data
label_file_path: ./train_data/num_data/train_labels.txt
EvalReader:
reader_function: ppocr.data.rec.dataset_traversal,SimpleReader
img_set_dir: ./train_data/num_data
label_file_path: ./train_data/num_data/test_labels.txt
注意,预测/评估时的配置文件请务必与训练一致。
2.2.4 执行训练
sudo su
conda activate py37
// 记得切换python环境,PaddleOCR只在python3.7下弄
export CPU_NUM=1
python3 tools/train.py -c configs/rec/rec_icdar15_train.yml 2>&1 | tee train_rec.log
2.2.5 2>&1 | tee
命令
关于这里训练的 2>&1 | tee
命令,意思如下
参考中文博客:
Linux shell中2>&1的含义解释 (全网最全,看完就懂)
所以 2>&1 就是标准输出和标准错误输出
参考菜鸟教程-linux tee
参考英语博客:
What does 2>&1 | tee mean?
3 错误解决
3.1 yaml模块错误
import yaml
ModuleNotFoundError: No module named 'yaml'
直接pipi 无效
(py37) root@XXX:/home/XXX/paddleOCR/PaddleOCR$ pip install yaml
ERROR: Could not find a version that satisfies the requirement yaml (from versions: none)
ERROR: No matching distribution found for yaml
根据How do I install the yaml package for Python?
3.2. opecv错误
Traceback (most recent call last):
File "tools/train.py", line 39, in <module>
import tools.program as program
File "/home/hsh/paddleOCR/PaddleOCR/tools/program.py", line 23, in <module>
from ppocr.utils.utility import create_module
File "/home/hsh/paddleOCR/PaddleOCR/ppocr/utils/utility.py", line 18, in <module>
import cv2
File "/root/anaconda3/envs/py37/lib/python3.7/site-packages/cv2/__init__.py", line 3, in <module>
from .cv2 import *
ImportError: libSM.so.6: cannot open shared object file: No such file or directory
参考ImportError: libSM.so.6: cannot open shared object file: No such file or directory
直接输入:
pip install opencv-python
apt update && apt install -y libsm6 libxext6
apt-get install -y libxrender-dev
3.3 配置文件导致的错误
AssertionError: Nonsupport type of the character: None
后来发现是因为上面配置的 字符类型,我改成了 cn(中文应该是ch)
// 修改字符类型 en→ch 因为做的是数字 和中英文无关,所以这个无所谓
character_type: en
大致的意思应该就是配置文件中不支持None类型吧,
其他train.yml中有一项很奇怪,pretrain_weights在yml默认文件中是空的,但是根据可选参数列表-config.md:
所以配置文件里,应该要给出那个 预训练模型的路径。。。就是自己下载解压之后得到的东西,给个路径
pretrain_weights:./pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy
但是 rec_icdar15_train
配置文件里这项就是上面这个样子,预制就是这样。
3.4 加载预训练模型权重时报错
查看了一下,是自己的目录有问题
Traceback (most recent call last):
File "tools/train.py", line 131, in <module>
main()
File "tools/train.py", line 88, in main
init_model(config, train_program, exe)
File "/home/hsh/paddleOCR/PaddleOCR/ppocr/utils/save_load.py", line 124, in init_model
load_params(exe, program, path)
File "/home/hsh/paddleOCR/PaddleOCR/ppocr/utils/save_load.py", line 73, in load_params
"exists.".format(path))
ValueError: Model pretrain path ./pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy does not exists.
改一下,
..paddleOCR/PaddleOCR/pretrain_models/pretrain_models$ mv rec_mv3_none_bilstm_ctc/ ../
//移动后 切换到上级pretrain_models 删除那个多余的pretrain_models文件夹
cd ../
rm -rf pretrain_models
3.5 报错图片数量太少
Exception: The number of the whole data (800) is smaller than the batch_size * devices_num * num_workers (2048)
----------------------
Error Message Summary:
----------------------
FatalError: Blocking queue is killed because the data reader raises an exception.
[Hint: Expected killed_ != true, but received killed_:1 == true:1.] (at /paddle/paddle/fluid/operators/reader/blocking_queue.h:154)
[operator < read > error]
搜索FatalError: Blocking queue is killed because the data reader raises an exception.
发现报这个错的还不少。。。我的应该就是因为上面所说的 整体数据量太小了导致的,重新导一遍数据好了,多产一些,产2400张好了。
3.6 CPU_NUM设置问题
import ujson error: No module named 'ujson' use json
2020-09-29 06:24:37,367-INFO: places would be ommited when DataLoader is not iterable
2020-09-29 06:24:37,367-INFO: Distort operation can only support in GPU.Distort will be set to False.
2020-09-29 06:24:37,746-INFO: Loading parameters from ./pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy...
// 加载预训练模型参数
2020-09-29 06:24:37,821-WARNING: variable ctc_fc_b_attr not used
2020-09-29 06:24:37,821-WARNING: variable ctc_fc_w_attr not used
2020-09-29 06:24:37,878-INFO: Finish initing model from ./pretrain_models/rec_mv3_none_bilstm_ctc/best_accuracy
// 初始化模型完成
W0929 06:24:37.938328 116973 build_strategy.cc:170] fusion_group is not enabled for Windows/MacOS now, and only effective when running with CUDA GPU.
!!! The CPU_NUM is not specified, you should set CPU_NUM in the environment variable list.
CPU_NUM indicates that how many CPUPlace are used in the current task.
And if this parameter are set as N (equal to the number of physical CPU core) the program may be faster.
export CPU_NUM=8 # for example, set CPU_NUM as number of physical CPU core which is 8.
!!! The default number of CPU_NUM=1.
根据github-issue_Add warning info If CPU_NUM is not set可知,使用之前需要设置一个 CPU_NUM系统变量。
但是这只是一个警告信息,其实不影响程序运行。。。
然后等了很久很久。。。。才出现第一行 训练结果:
2020-09-29 06:30:16,110-INFO: epoch: 1, iter: 10, lr: 0.000500, 'loss': 22621.375, 'acc': 0.0, time: 30.381
考虑改一下那个CPU_NUM吧,不然训练太慢了。。。
# 查看物理CPU个数
[root@AAA ~]$ cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1
# 查看每个物理CPU中core的个数(即核数)
[root@AAA ~]$ cat /proc/cpuinfo| grep "cpu cores"| uniq
8
# 查看逻辑CPU的个数
[root@AAA ~]$ cat /proc/cpuinfo| grep "processor"| wc -l
8
# 逻辑cpu个数=物理cpu个数*每个cpu中core的个数
(py37) root@XX:/home/XXX/paddleOCR/PaddleOCR$ cd
(py37) root@XX:~$ vim ~/etc/profile
(py37) root@XX:~$ cd ../
(py37) root@XX:/$ ls
bin boot dev etc home initrd.img initrd.img.old lib lib64 lost+found media mnt opt proc root run sbin snap srv sys tmp usr var vmlinuz vmlinuz.old
(py37) root@XX:/$ vim etc/profile
$ vim /etc/profile
在里面加入:
export CPU_NUM=1
使生效
source profile
查看是否生效
echo $CPU_NUM
但是很奇怪,即便是在 root权限下修改etc/profile 但是切换到conda py37环境下的时候,echo $CPU_NUM
无结果,也就是没设置到。。。
3.7 修改核数后继续报错
修改后,又报错
Exception: The number of the whole data (2400) is smaller than the batch_size * devices_num * num_workers (16384)
考虑去修改 batch_size 还有num_workers 这个报错太奇怪了。。。
-
batch_size 参数:
"rec_icdar15_train.yml中" train_batch_size_per_card: 256 test_batch_size_per_card: 256
-
devices_num参数:就是所设置的CPU_NUM=8
- 参考cpu_places
CPU_NUM indicates that how many CPUPlace are used in the current task. And if this parameter are set as N (equal to the number of physical CPU core) the program may be faster
. 需要的是物理核数 所以物理核数的话,对于我的服务器,就是1,和每个cpu有几个核无关。。。- How many physical and logical CPU cores in your computer,直接看英语可能更明确些:
所以我应该设置CPU_NUM=1,而不是8
- 参考cpu_places
-
num_workers参数:
"rec_icdar15_reader.yml" TrainReader: reader_function: ppocr.data.rec.dataset_traversal,SimpleReader num_workers: 8 img_set_dir: ./train_data/ic15_data label_file_path: ./train_data/ic15_data/rec_gt_train.txt
-
所以直接去
rec_icdar15_reader.yml
中把num_workers
改改就好了
3.8 acc为0?
Github某issue:crnn 算法训练 acc 一直是0
看了一下官方标配给的例子里的 icdar15数据集,训练集大约4500(4468)张,测试集大约2100(2077)张.。。 难不成是因为测试集也太少了,所以acc是0?
根据 PaddleOCR-数据集部分的Q&A
3.9 运行过程记录
只有一块物理CPU,训练速度极其感人,哈哈哈。
2020-09-29 08:47:10,054-INFO: epoch: 1, iter: 10, lr: 0.000500, 'loss': 22632.477, 'acc': 0.0, time: 29.944
// 可能因为是用的Azure 所以显示的是外国的时间? 我本地时间是2020.9.29.16:46.。。
// 一个epoch 5分钟。。。1000个epch就是 5000/60
5分钟一个epoch,24小时是24×12,差不多300轮,改一下,把配置文件里的改成300轮,这样一天可以跑的完。。。
测试集数量太小,导致出错。。
这次就把text_render配到服务器上好了,不然确实不方便。
可以看到,这个准确率一开始的时候很低,但是后面越来越高,而且基本是指数型增长的那种。
到后面一句99%了。。。。这样下去,得过拟合吧,数据量只有2400张,训练了300轮,好像确实训练的多了些
查看配置文件之后发现,设置训练轮数的有两个参数,我只改了一个。。。尴尬
3.10 训练样本问题
根据 PaddleOCR-数据集部分的Q&A
此外,关于样本大小的问题,(我这个不算fine-tune,算重新训练。。。???)
3.11 评估
评估数据集可以通过 configs/rec/rec_icdar15_reader.yml 修改EvalReader中的 label_file_path 设置。
注意 评估时必须确保配置文件中 infer_img 字段为空(这个字段在rec_icdar15_train.yml里配置,默认就是空的)
export CUDA_VISIBLE_DEVICES=0
# 没有GPU就还是CPU
export CPU_NUM=1
# GPU 评估, Global.checkpoints 为待测权重
python3 tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy
'{path/to/weights}'是存放模型文件的地方,在
'rec_icdar15_train.yml'文件中的
'save_model_dir: ./output/rec_CRNN'这个地方配置了
# 我实际运行的命令如下
python3 tools/eval.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints=output/rec_CRNN/best_accuracy
差不多95,好像还可以???
4 screen工具
为了防止断电啥的,导致 xshell关闭,从而造成服务器训练停止,使用了一个叫screen的工具。
(base) root@hsh:/home/hsh$ screen -ls
There is a screen on:
120516.train (09/29/20 08:56:56) (Attached)
1 Socket in /run/screen/S-root.
(base) root@hsh:/home/hsh$ screen -r train
- 新建窗口
可直接通过命令screen新建一个窗口,并进入窗口。但通过这种方式新建的窗口没有名字,只有系统分配给它的一个id。当需要恢复窗口时,只能通过id号来恢复。 - 通过命令screen -S name,这样就可以新建一个名字为name的窗口,同样系统也会分配给它一个id,当恢复该窗口时既可以通过id号也可以通过窗口名。
- 分离会话
退出当前新建的窗口,通过快键键Ctrl+a+d实现分离,此时窗口会跳出[detached]的提示,并回到主窗口。 - 恢复会话窗口
首先查看当前有哪些screen窗口,通过命令:
screen -ls 将列出窗口列表
screen -ls
就可以看到
(base) root@XXX:/home/hsh$ screen -ls
There is a screen on:
120516.train (09/29/20 08:56:56) (Detached)
1 Socket in /run/screen/S-root.
想要恢复这个窗口
screen -r train
想杀死这个窗口
kill -9 train
注意此处只能通过id号来杀死窗口
清除死去窗口
通过命令screen -wipe
这个命令将自动清除所有处于dead状态的窗口
然后退出xshell,重启,再试试输入上面的命令,依然在,OK,开心
sudo su
screen -ls
4.1 常见操作
> screen -S trainCRNN
# 创建一个新的窗口并切换到这里,然后之后执行的内容就会记录在这个名为trainCRNN的窗口环境里
> screen -ls
# 查看当前存在哪些进程
12309.trainCRNN
如果有某些进程坏了,或者状态是Attached而不是 Deattached,则可以直接kill
kill -9 12309
杀完之后,可以看到状态变成 dead
然后清理dead窗口
> screen -wipe
(注意,有短横线的,不是直接 screen wipe)
类似下面这样
>(base) root@hsh:/home/hsh$ screen -ls
There are screens on:
15975.trainCRNN (09/21/20 08:19:11) (Dead ???)
120516.train (09/21/20 08:19:11) (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /run/screen/S-root.
(base) root@hsh:/home/hsh$ screen -wipe
There are screens on:
15975.trainCRNN (09/21/20 08:19:11) (Removed)
120516.train (09/21/20 08:19:11) (Removed)
2 sockets wiped out.
No Sockets found in /run/screen/S-root.
(base) root@hsh:/home/hsh$ screen -ls
No Sockets found in /run/screen/S-root.
screen -S train
然后会新开一个名为train的session 然后在当前命令行下输入类似
python train.py XXX等
然后直接关闭xshell
或者
> screen -d train 这就是把train这个session挂起
然后打开xshell,
> sudo su
> screen -r train 就看到关闭之前的东西继续跑之后的样子 之后还是直接关闭xshell或使用
当train的东西执行完毕后,你最后一次进入train后,自动命令行出现一个
> screen -D -d train 没有搜到相关的内容
如果该session(比如train的训练任务已经执行完成,需要关闭该session),可以直接
> exit
> [screen is terminating] # 然后会显示这个 然后就好了 就表示关闭了
> screen -ls
No Sockets found in /run/screen/S-root. # 再去查看的时候就没有了
5.模型推理/预测
5.1 直接命令行
默认预测图片存储在 infer_img 里(这个参数也是在configs/rec/rec_icdar15_train.yml文件里配置的),下面是直接在命令行里传入了这个参数的值(而不是在yml文件里直接修改)
虽然可以直接使用
python3 tools/infer_rec.py -c configs/rec/rec_icdar15_train.yml -o Global.checkpoints={path/to/weights}/best_accuracy Global.infer_img=doc/imgs_words/en/word_1.png
-c 配置文件路径
-o 权重文件路径
Global_infer_img 要预测的图片路径(具体到图片 而不是图片所在目录 一次一张。。)
可以去github的doc文件夹里看看,里面确实很多文件夹里都放的是图片。
我实际使用的命令(我把测试图片放在了doc文件夹下新建的一个叫digit的文件夹里)
python3 tools/infer_rec.py
-c configs/rec/rec_icdar15_train.yml
-o Global.checkpoints=output/rec_CRNN/best_accuracy
Global.infer_img=doc/digit/000000013.jpg
产出信息
2020-10-09 01:37:06,524-INFO: infer_img:doc/digit/000000013.jpg
2020-10-09 01:37:06,625-INFO: index: [5 8 3 5]
2020-10-09 01:37:06,626-INFO: word : 5835
2020-10-09 01:37:06,626-INFO: score: 0.9518853425979614
好像还可以啊
5.2 使用streamlit
Streamlit是一个开源的Python库,利用Streamlit可以快速构建机器学习应用的用户界面,之前也看过,但是没有认真使用过。这次刚好上手练习一下
参考另一个博文 streamlit安装及使用
配置好后,测试了一下业务场景的实际数字,很差。。。哎
- 可能是因为没有对输入进行预处理,
- 或者是因为不是使用模型得到数字区域,而是直接使用截图工具?
- 还是因为我直接png格式强制改为jpg导致图片产生了问题?
5.3 设置streamlit服务自启动
每次去服务器启动一下其实很麻烦
> streamlit run XXX.py
可以考虑将streamlit设置为开机自启动的服务,参考以下:
更多推荐
所有评论(0)