文章目录

  • 1 安装PaddleOCR
    • 1.1 安装docker
    • 1.2 安装PaddleOCR
      • 1.2.1 准备docker环境
      • 1.2.2 安装PaddlePaddle Fluid v2.0
      • 1.2.3 克隆PaddleOCR repo代码
      • 1.2.4 安装第三方库
      • 1.2.5 安装位置
  • 2 启动训练
    • 2.1 X 下载预训练模型
    • 2.2 开始训练
      • 2.2.1 下载和配置文件匹配的预训练模型
      • 2.2.2 本地上传数据集
      • 2.2.3 修改配置文件
      • 2.2.4 执行训练
      • 2.2.5 `2>&1 | tee ` 命令
  • 3 错误解决
    • 3.1 yaml模块错误
    • 3.2. opecv错误
    • 3.3 配置文件导致的错误
    • 3.4 加载预训练模型权重时报错
    • 3.5 报错图片数量太少
    • 3.6 CPU_NUM设置问题
    • 3.7 修改核数后继续报错
    • 3.8 acc为0?
    • 3.9 运行过程记录
    • 3.10 训练样本问题
    • 3.11 评估
  • 4 screen工具
    • 4.1 常见操作
  • 5.模型推理/预测
    • 5.1 直接命令行
    • 5.2 使用streamlit
    • 5.3 设置streamlit服务自启动

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

  • winscp普通用户上传文件没有权限解决进行设置。
  • winSCP报错误码3 服务器返回的错误消息:Permission denied(如何用root帐号登录winscp)
  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: 500pretrain_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,SimpleReadernum_workers: 8img_set_dir: ./train_data/num_datalabel_file_path: ./train_data/num_data/train_labels.txtEvalReader:reader_function: ppocr.data.rec.dataset_traversal,SimpleReaderimg_set_dir: ./train_data/num_datalabel_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 programFile "/home/hsh/paddleOCR/PaddleOCR/tools/program.py", line 23, in <module>from ppocr.utils.utility import create_moduleFile "/home/hsh/paddleOCR/PaddleOCR/ppocr/utils/utility.py", line 18, in <module>import cv2File "/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 maininit_model(config, train_program, exe)File "/home/hsh/paddleOCR/PaddleOCR/ppocr/utils/save_load.py", line 124, in init_modelload_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吧,不然训练太慢了。。。

  • Linux查看物理CPU个数、核数、逻辑CPU个数
  • ubuntu环境变量的三种设置方法
# 查看物理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,SimpleReadernum_workers: 8img_set_dir: ./train_data/ic15_datalabel_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.  # 再去查看的时候就没有了
  • linux 技巧:使用 screen 管理你的远程会话
  • Linux控制台下 screen 命令使用学习笔记

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

  • How can I configure a service to run at startup

    修改rc.local文件(ls)

  • 百度经验-ubuntu设置服务开机自启动:
  • ubuntu16.04设置开机自启服务
  • Ubuntu添加和设置开机自动启动程序的方法
    其他更高级的方法
  • UBUNTU添加开机自动启动程序方法
  • Ubuntu 自定义服务 与设置开机启动

PaddleOCR数字仪表识别——3.paddleocr迁移学习相关推荐

  1. PaddleOCR数字仪表识别——1.字体背景删选

    有一个数字仪表识别的问题,所以要自己先造一些数据,要收集的素材包括字体文件和背景图片文件 1. 字体.背景删选 1.1 字体 1.1.1 标准字体图片 业务场景的字体图片: 1.1.2 删选字体 使用 ...

  2. 计算机视觉系列(七)——迁移学习

    系列文章 \text{\bf 系列文章} 系列文章 计算机视觉系列(一)--CNN基础 计算机视觉系列(二)--AlexNet 计算机视觉系列(三)--VGG与NiN 计算机视觉系列(四)--Goog ...

  3. 迁移学习与图神经网络“合力”模型:用DoT-GNN克服组重识别难题

    作者 | Ziling Huang.Zheng Wang.Wei Hu.Chia-Wen Lin.Shin'ichi Satoh 译者 | 刘畅 编辑 | Jane 出品 | AI科技大本营(ID:r ...

  4. NAACL| 基于标签感知的双迁移学习在医学命名实体识别中的应用

    本期给大家介绍上海交通大学APEX数据和知识管理实验室俞勇教授课题组发表在NAACL的文章"Label-aware Double Transfer Learning for Cross-Sp ...

  5. 人脸识别迁移学习的应用

    https://github.com/jindongwang/transferlearning 关于迁移学习的一些资料 这个仓库包含关于迁移学习一些资料,包括:介绍,综述文章,代表工作及其代码,常用数 ...

  6. 基于双向LSTM和迁移学习的seq2seq核心实体识别

    http://spaces.ac.cn/archives/3942/ 暑假期间做了一下百度和西安交大联合举办的核心实体识别竞赛,最终的结果还不错,遂记录一下.模型的效果不是最好的,但是胜在" ...

  7. keras冻结_【连载】深度学习第22讲:搭建一个基于keras的迁移学习花朵识别系统(附数据)...

    在上一讲中,和大家探讨了迁移学习的基本原理,并利用 keras 基于 VGG16 预训练模型简单了在 mnist 数据集上做了演示.鉴于大家对于迁移学习的兴趣,本节将继续基于迁移学习利用一些花朵数据搭 ...

  8. TensorFlow迁移学习的识别花试验

    最近学习了TensorFlow,发现一个模型叫vgg16,然后搭建环境跑了一下,觉得十分神奇,而且准确率十分的高.又上了一节选修课,关于人工智能,老师让做一个关于人工智能的试验,于是觉得vgg16很不 ...

  9. 深度学习之迁移学习实现神奇宝贝识别

    经过之前深度学习的实践,无论是自己搭建的CNN网络也好,还是通过迁移学习调用官方的网络模型也好,都有其优点以及不足.本次实验通过对各种常用的CNN网络模型进行调用,了解一下它们的特点,对比一下在对于同 ...

最新文章

  1. java值参_Java陷阱之慎用入参做返回值详解
  2. web login do.php,dologin.php
  3. JQuery操作CheckBox和Radio
  4. sql server 多条记录数据合并为一条_如何利用Python实现SQL自动化?
  5. golang mysql大量写入_Golang 实现分片读取http超大文件流和并发控制
  6. UE4 使用VaRest的最佳实践
  7. SSL 的 java 实现
  8. AbstractAutowireCapableBeanFactory 类对容器生成的Bean 添加后置处理器
  9. 基于Wide Deep Learning的推荐系统
  10. here文档 here doc EOF重定向
  11. 电子围栏判断_电子围栏大用处:进出罐箱指定区域自动通知amp;罐箱库存和使用率自动计算...
  12. MySQL高级知识(十四)——行锁
  13. nginx启动时报错:bind() to 0.0.0.0:80 failed
  14. Dart入门—开发环境
  15. 黑莓 QNX 被曝严重的 BadAlloc 漏洞 影响数百万汽车和医疗设备
  16. 再看iOS如何使用SM2/SM3/SM4/SM9 方法二:使用http://gmssl.org这个开源密码箱来实现从编译到使用
  17. Caused by: java.lang.NoSuchMethodError:xxx——依赖冲突的解决
  18. bailian.openjudge 1190:生日蛋糕
  19. python制作七夕礼物_OpenCV+Python制作程序七夕(情人节)礼物
  20. 面试中常考的数学题——截木棍、圆上取点、赛马、红蓝墨水,测试毒药、坐到正确座位问题

热门文章

  1. 06.奇特的一生评语
  2. k8s 之服务发现(service)
  3. 叔本华系列之(一)论独立的思考
  4. python:HTTPX 库的快速开始
  5. Marva Collin's Way
  6. Web端H.265播放器研发解密 1
  7. Linux声卡驱动移植和测试
  8. P7395 弹珠游戏(2021 CoE-I C)
  9. question2answer优化
  10. 教你用单片机表白2019(文末送代码)