文章目录

  • 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. python opencv 凸包
  2. python 动态规划例子
  3. 无法在流的结尾之外进行读取_IO流,字节流,字符流
  4. Swift - 类型属性(类静态属性)和类方法(类静态方法)
  5. linux下代码写错了怎么更改_AWS全面上市开源Linux发行版,专为容器操作系统设计...
  6. ubuntu14.04的键盘失灵解决方案
  7. 59-混沌操作法感悟2.(2015.2.25)
  8. 未打清分标识处理方式
  9. 实测!让M1芯片版mac也能写入NTFS格式磁盘,完整教程附上!
  10. 海姆霍兹获3000万元A轮融资,投资方为国科嘉和
  11. 电子元器件检测与维修从入门到精通视频教程
  12. 安装ps提示重新启动计算机,安装Service Pack或执行DCPROMO后,出现错误或服务器重新启动 - Product Support Quick Note (PSQN) - 276184...
  13. 前端学习之路, 记录前端小白成长历程, 学习总结, 工具汇总, 打造开箱即用的学习体验
  14. 微信小程序加载第三方字体
  15. 用MATLAB将bilibili缓存视频批量转换成MP4的方法
  16. 老牌ERP厂商集体沉沦之谜(转)
  17. php生成PDF文件
  18. JAVA实现微博财神卡自动换卡,秒福卡
  19. android获取定位并标点,Android Studio 中实现高德定位并获取相应信息
  20. qt中QPixmap和QImage使用

热门文章

  1. 【渝粤教育】电大中专计算机职业素养 (14)作业 题库
  2. Deep Crisp Boundaries(CED)论文学习笔记
  3. 专科毕业五年,我进腾讯了!
  4. 这一篇TCP总结,请务必收下!
  5. 基于人脸识别的智能服饰搭配小程序
  6. 测试枕头软件,360度模拟人体睡眠测试,选对枕头让睡眠一步到位
  7. 单机斗地主java下载_java单机斗地主
  8. java项目斗地主介绍_详解java_ 集合综合案例:斗地主
  9. 乐学python靠得住吗_乐学python答案
  10. 王者荣耀皮肤壁纸爬取