主要还是使用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界面的时候,也依然报错,文件传输失败。。。
可能是权限的问题,参考

  1. 找到SFTP服务器地址
    $ cat /etc/ssh/sshd_config  | grep sftp
    Subsystem sftp	/usr/lib/openssh/sftp-server  #就是这个了
    
  2. 允许普通用户可以使用sftp服务。(我的电脑上没有这个 sudoers文件,而且根据winSCP上传文件到服务器失败,提示permission denied,返回码3,似乎不需要进行这步,pass)
    vim /etc/sudoers
    user:  ALL=NOPASSWD:/usr/libexec/openssh/sftp-server
    并且注释掉 #Defaults    requiretty
    
  3. 配置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文件的修改

  1. GPU/CPU训练支持
"rec_icdar15_train.yml"
use_gpu: false  #不使用gpu 小写即可 不需要大写
  1. 数据增强
    PaddleOCR提供了多种数据增强方式,如果您希望在训练时加入扰动,请在配置文件中设置 distort: true。
    默认的扰动方式有:颜色空间转换(cvtColor)、模糊(blur)、抖动(jitter)、噪声(Gasuss noise)、随机切割(random crop)、透视(perspective)、颜色反转(reverse)。
    训练过程中每种扰动方式以50%的概率被选择,具体代码实现请参考:img_tools.py
    由于OpenCV的兼容性问题,扰动操作暂时只支持Linux
    distort: true  
    // 默认就是true 这个可以不改
    训练时提示:
     Distort operation can only support in GPU.Distort will be set to False. 数据增强只有在有GPU的时候才支持,所以即便设置了true,如果用CPU,这个选项也会被改为False
    
  2. 训练相关
    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
    
  3. 其他修改
    // 修改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
  • 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

根据ubuntu下screen的使用:

  1. 新建窗口
    可直接通过命令screen新建一个窗口,并进入窗口。但通过这种方式新建的窗口没有名字,只有系统分配给它的一个id。当需要恢复窗口时,只能通过id号来恢复。
  2. 通过命令screen -S name,这样就可以新建一个名字为name的窗口,同样系统也会分配给它一个id,当恢复该窗口时既可以通过id号也可以通过窗口名。
  3. 分离会话
    退出当前新建的窗口,通过快键键Ctrl+a+d实现分离,此时窗口会跳出[detached]的提示,并回到主窗口。
  4. 恢复会话窗口
    首先查看当前有哪些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.

参考Ubuntu - screen 命令工具

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设置为开机自启动的服务,参考以下:

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐