关于后端:基于华为云ModelArts的水表读数识别开发实践华为云至简致远

47次阅读

共计 15672 个字符,预计需要花费 40 分钟才能阅读完成。

【摘要】这是水表读数辨认我的项目,实现了如何端到端实现水表读数辨认我的项目。波及畛域包含图像分类、语义宰割、OCR 文本检测、OCR 文本辨认。

水表读数辨认我的项目简介:这里实现了如何端到端实现水表读数辨认我的项目。波及畛域包含图像分类、语义宰割、OCR 文本检测、OCR 文本辨认。本案例提供的办法较多,波及多个模型,但不须要运行所有的模型。如果都测试一遍,默认创立的 5GB 磁盘规格可能不够用。
磁盘空间不够时能够将不须要的数据和模型文件删除,腾出空间;或者创立 NoteBook 时将磁盘规格减少到 10GB。解决方案流程:一、应用语义宰割或者 OCR 文本检测算法辨认水表读数所在的四边形区域,并对四边形进行仿射变换转换成矩形,保留成新的图片数据。二、如果文本区域的图片翻转重大,那第一步抠图生成的数据可能会有 180 度的翻转。因为文本辨认的算法对翻转 180 度的场景成果不佳,所以再训练一个辨认文本翻转的分类模型(本案例图片旋转角度渺小,不须要此步骤,内容可供参考)。三、利用步骤一中检测并抠图进去的文本数据训练 OCR 文本辨认算法,辨认图片中的文本内容,即数字。数据集为华为云 AI Gallery 上提供的数据集。详情可参见本案例的关联资产。下载该我的项目依赖脚本:!wget –no-check-certificate https://modelarts-cnnorth4-ma… -O deps.zip
!unzip -qo deps.zip
!rm -f deps.zip
!ls

该案例效果图如下 import cv2
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10))
plt.imshow(cv2.imread(‘./imgs/result1.PNG’))
plt.show()

教程目录筹备环境筹备数据数据下载数据切分文本检测宰割算法 (举荐) 数据筹备下载预训练模型训练推理 + 四边形定位 + 改正文本检测算法数据筹备下载预训练模型训练推理抠图文本翻转检测(可选)数据筹备下载预训练模型训练推理文本辨认数据筹备下载预训练模型训练推理端到端辨认宰割算法文本辨认算法 1. 筹备环境请在本页面的右上角确认您所抉择的 kernel 是 PyTorch-1.4,抉择的规格是 GPU,如下图所示:

如果没有 V100,也能够抉择 P100,如图所示,看看配置:

运行时依赖 moxing>=2.0.1torch>=1.41.4.0>mmcv-full>=1.3.8 (如果环境中没有 mmcv-full,装置可能会耗费 10 几分钟)tensorboard 将环境中的 pycocotools 替换成 mmpycocotools 其余依赖装置 lanms 装置!pip uninstall -y moxing
!pip install –upgrade pip
!pip install “mmcv-full>=1.3.8,<=1.4.0” -I
!wget –no-check-certificate https://modelarts-cnnorth1-ma… -O moxing-2.0.1rc0-py2.py3-none-any.whl
!pip install moxing-2.0.1rc0-py2.py3-none-any.whl
!pip install future tensorboard
!pip uninstall -y pycocotools
!pip install mmpycocotools
!pip install –upgrade opencv-python
!pip install –ignore-installed imageio
!pip install imgaug
!pip install prettytable lmdb Polygon3 rapidfuzz pyclipper iopath yacs submitit

lanms 装置:!wget http://repo.myhuaweicloud.com…
!tar -zxf lanms-1.0.2.tar.gz # 解压到 lanms-1.0.2 文件夹
%cd lanms-1.0.2

将 Makefile 文件第一行的内容批改为:CXXFLAGS = -I include -std=c++11 -O3 -I/home/ma-user/anaconda3/include/python3.6m/

with open(‘Makefile’, “r+”) as f:

read_data = f.read()
f.seek(0)
f.truncate()   #清空文件
f.write(read_data.replace('$(shell python3-config --cflags)', '-I/home/ma-user/anaconda3/include/python3.6m/'))

!python setup.py install
import sys
sys.path.insert(0, ‘/home/ma-user/work/lanms-1.0.2’)
%cd ../
2. 筹备数据 2.1. 数据下载能够登录 https://www.datafountain.cn/c… 进行下载(须要报名参赛才能够下载)。或者应用备用下载地址下载并解压:!wget https://modelarts-cnnorth1-ma… -O ./data.zip
!mkdir -p ./data/raw
!unzip -qo data.zip -d ./data/raw
!rm -f data.zip
!ls ./data/raw
数据格式如下(如果数据格式不统一,请解决成统一的格局,放入./data/raw 目录下):./data/raw

├── train_imgs ------------------------ 训练集图片目录
│     ├── train_1.jpg
│     ├── ...
│     ├── train_1000.jpg
├── train_labels ---------------------- 训练集图片标签目录
│     ├── label 阐明.docx
│     ├── labels
│     │     ├── train_1.txt
│     │     ├── ...
│     │     ├── train_1000.txt
├── test_imgs -------------------------- 测试集图片目录
│     ├── test_1.jpg
│     ├── ...
│     ├── test_500.jpg    

train_labels 中的 txt 标签文件阐明可参考./data/raw/train_labels/label 阐明.docx,如果 notebook 无奈关上能够下载到本地再关上。以其中一个文件内容为例:95 423 286 319 314 366 126 472 00093 00092
标签中前八个值,为水表表盘的四个角点(x1, y1, x2, y2, x3, y3, x4, y4),别离为:左上、右上、右下、左下。前面的值为表盘的数值,因为最初一位呈现半字符的状况,所以有两个数值,如果没有半字符则只有一个数值。参考如下图片:import cv2
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10))
plt.imshow(cv2.imread(‘./imgs/label.png’))
plt.show()

2.2. 数据切分为了不便训练模型时察看模型的训练成果,将数据集切分成训练集和验证集,默认切分比例 训练集: 验证集 =9:1,保留在./data/train.txt 和./data/eval.txt。from util import split_data

img_dir = ‘./data/raw/train_imgs’ # 原始图片门路
save_dir = ‘./data/’ # 切分后果保留门路
split_data(img_dir, save_dir) # 开始切分
print(‘Finished!’)
!ls ./data
3. 文本检测本案例尝试了两种算法辨认度数区域。别离是语义宰割算法 deeplabv3 和文本检测算法 dbnet。比照之后宰割算法后果更佳。宰割算法和文本检测算法两者抉择其一即可,举荐宰割算法。3.1. 宰割算法(举荐) 与文本检测算法二选一即可。3.1.1. 数据筹备宰割算法的数据标签通常为单通道的 PNG 图片。所以咱们须要通过原始的 txt 标签文件生成 PNG 图片。保留在./data/segmentation/labels 目录下。from segmentation.data_util import create_labels

img_dir = ‘./data/raw/train_imgs/’ # 原始图片门路
anno_dir = ‘./data/raw/train_labels/labels’ # 原始标注文件门路
save_dir = ‘./data/segmentation/labels’ # 宰割标签保留门路

create_labels(img_dir, anno_dir, save_dir) # 生成标签
print(‘Finished!’)
标签可视化:import cv2
import numpy as np
import matplotlib.pyplot as plt
def show(img_path, label_path):

# 读取原始图片
img = cv2.imread(img_path)
# 读取标签图片
label = cv2.imread(label_path)
# 标注后果图片的背景像素值为 0,物体的像素值为 1,均显示为彩色。# 为了可视化成果显著,突出物体的标注区域,这里将物体的像素值 1(彩色)替换为 255(红色)。label[label==1] = 255
# 原始图片和标签图片像素交融
merge = img * 0.5 + label * 0.5
merge = merge.astype(np.uint8)

images_to_observe = [img, label, merge]
titles = ['原始图片','标签图片','原始图片 + 标签图片交融']

# 后果可视化
fig = plt.figure(figsize=(30, 30))
for i in range(len(images_to_observe)):
    fig.add_subplot(1, len(images_to_observe), i + 1).set_title(titles[i], fontsize=18, color='r')
    imgplot = plt.imshow(images_to_observe[i])

plt.show()

if name == ‘__main__’:

# 以其中一张图片为例
img_path = './data/raw/train_imgs/train_10.jpg'
label_path = './data/segmentation/labels/train_10.png'
show(img_path, label_path)

3.1.2. 下载预训练模型执行以下命令下载预训练模型并保留到./pretrained_model/deeplabv3plus_r50-d8.pth:!mkdir -p ./pretrained_model
!wget –no-check-certificate https://download.openmmlab.co… -O ./pretrained_model/deeplabv3plus_r50-d8.pth
3.1.3. 训练训练时加载预训练模型:./pretrained_model/deeplabv3plus_r50-d8.pth
为了节俭训练工夫,默认训练 1000 步,每一步训练 8 个样本,每 200 步验证一次精度,每 200 步保留一次模型。如果要进一步晋升精度,能够尝试批改./segmentation/train.py 脚本中的配置参数,将训练步数增大。训练好的模型保留在./train_url/segmentation 目录下。训练时默认加载./data/train.txt 和./data/eval.txt 中保留的样本作为训练集和验证集。请参考./segmentation/train.py。单卡训练:单卡大概耗时 15 分钟左右。!python ./segmentation/train.py \
–num_classes=2 \
–data_url=./data/ \
–eval_data_url=./data/ \
–img_dir=raw/train_imgs \
–ann_dir=segmentation/labels \
–work_dir=./train_url/segmentation \
–load_from=./pretrained_model/deeplabv3plus_r50-d8.pth

num_classes:数据类别数

data_url:训练集根目录

eval_data_url:验证集根目录

img_dir:根目录下寄存图片的目录名称

ann_dir:根目录下寄存标签的目录名称

work_dir:保留输入模型的门路

load_from:预置模型文件门路

多卡训练:NoteBook 创立多卡环境时可应用,用来减速。!python -m torch.distributed.launch \
–nproc_per_node=$(/usr/local/nvidia/bin/nvidia-smi -L | wc -l) \
–master_port=7000 \
./segmentation/train.py \
–launcher=pytorch \
–num_classes=2 \
–data_url=./data \
–eval_data_url=./data \
–img_dir=raw/train_imgs \
–ann_dir=segmentation/labels \
–work_dir=./train_url/segmentation \
–load_from=./pretrained_model/deeplabv3plus_r50-d8.pth

nproc_per_node:每个节点启动的过程数(GPU 数)

launcher:分布式启动形式

num_classes:数据类别数

data_url:训练集根目录

eval_data_url:验证集根目录

img_dir:根目录下寄存图片的目录名称

ann_dir:根目录下寄存标签的目录名称

work_dir:保留输入模型的门路

load_from:预置模型文件门路

3.1.4. 推理 + 四边形定位 + 改正
训练实现后,应用训练好的宰割模型对图片进行推理,宰割模型返回的推理后果是个 2 维数组,保留了预测图片每个像素点的标签值。而后对推理后果做四边形的定位,再将四边形改正成矩形,最初将矩形区域保留成新的图片数据。这部分数据用来训练前面的文本辨认算法。保留在./data/textrecog/images_from_seg 门路下。对原始图片./data/raw/train_imgs 进行推理:!python ./segmentation/infer_and_crop.py \
–num_classes=2 \
–img_path=./data/raw/train_imgs \
–checkpoint=./train_url/segmentation/latest.pth \
–save_dir=./data/textrecog/images_from_seg

num_classes:类别数

img_path:要推理的图片目录

checkpoint:模型文件

save_path:推理后果保留门路

推理后果可视化:from util import show_pair
img_dir = ‘./data/raw/train_imgs’ # 训练集原始图片
result_dir = ‘./data/textrecog/images_from_seg’ # 训练集推理后果
show_pair(img_dir, result_dir, show_num=2)
3.2. 文本检测算法
与宰割算法二选一即可。3.2.1. 数据筹备
将数据的元信息保留在 json 文件中。文本检测的标签默认只有一类 text,只有对文本区域进行标注并训练,辨认出文本区域即可,和宰割算法一样,不须要辨认文本中的内容。训练文件保留在./data/textdet/instances_training.json,验证文件保留在./data/textdet/instances_test.json。import os
from textdet.data_util import create_water_json

base_dir = ‘./data’
annotation_dir = os.path.join(base_dir, ‘raw/train_labels/labels’)
img_dir = os.path.join(base_dir, ‘raw/train_imgs’)

train

create_water_json(img_dir=img_dir, # 图片门路

              anno_dir=annotation_dir,  # 标注文件门路
              save_file=os.path.join(base_dir, 'textdet/instances_training.json'),  # 训练文件保留门路
              split=os.path.join(base_dir, 'train.txt'))  # 保留训练样本的文件

eval

create_water_json(img_dir=img_dir, # 图片门路

              anno_dir=annotation_dir,  # 标注文件门路
              save_file=os.path.join(base_dir, 'textdet/instances_test.json'),  # 验证文件保留门路
              split=os.path.join(base_dir, 'eval.txt'))  # 保留验证样本的文件

生成的 json 文件格式如下:{
‘images’: [{‘file_name’: ‘train_1.jpg’, ‘height’: 960, ‘width’: 540, ‘segm_file’: None, ‘id’: 0},

        {'file_name': 'train_2.jpg', 'height': 540, 'width': 960, 'segm_file': None, 'id': 1}, 
        ...]},

‘categories’: [{‘id’: 1, ‘name’: ‘text’}],
‘annotations’: [{‘iscrowd’: 0, ‘category_id’: 1, ‘bbox’: [126, 283, 241, 147], ‘area’: 13363,

                    'segmentation': [[126, 379, 345, 283, 367, 333, 144, 430]], 'image_id': 0, 'id': 0},
             {'iscrowd': 0, 'category_id': 1, 'bbox': [430, 159, 204, 67], 'area': 10316, 
                    'segmentation': [[445, 159, 634, 170, 630, 226, 430, 205]], 'image_id': 1, 'id': 1},
             ...]

}
images:file_name:图片名称 height:图片的高 width:图片的宽 id:图片的索引 categories:id:标签的索引 name:标签值 annotations:iscrowd:默认值为 0,segmentation 应用 polygon 格局,。area:四边形的面积。segmentation:四边形的四个角点的坐标。image_id:图片的索引。id:文本框的索引 3.2.2. 下载预训练模型!wget –no-check-certificate https://download.pytorch.org/… -O ./pretrained_model/resnet50-19c8e357.pth
!wget –no-check-certificate https://download.openmmlab.co… -O ./pretrained_model/dbnet_r50dcnv2_fpnc_sbn_2e_synthtext.pth
3.2.3. 训练训练的数据集、模型、优化器等均已保留在配置文件./textdet/water_meter_textdet_config.py 和./textdet/base_config.py 中。
base_config.py 文件是根底配置,可不用改变。
water_meter_textdet_config.py 文件是针对该案例的配置,例如数据门路、预训练模型门路、epoch 数、学习率等可间接在此文件中批改。为了节省时间,默认训练 10 个 epoch,每 2 个 epoch 验证一次,保留一次模型。如果精度不够,能够批改 water_meter_textdet_config.py 中的训练参数。将 epoch 数调大,可调至 30-100 之间,epoch 越大,训练工夫越久。训练的模型保留在./train_url/textdet 门路下。单卡训练:单卡训练较慢,大概耗时 15 分钟左右。!python textdet/train.py ./textdet/water_meter_textdet_config.py –work-dir=./train_url/textdet
多卡训练:NoteBook 创立多卡环境时可应用,可减速训练。!python -m torch.distributed.launch \
–nproc_per_node=$(/usr/local/nvidia/bin/nvidia-smi -L | wc -l) \
–master_port=7000 \
textdet/train.py \
./textdet/water_meter_textdet_config.py \
–launcher=pytorch \
–work-dir=./train_url/textdet

nproc_per_node:每个节点启动的过程数(GPU 数)

launcher:分布式启动形式

work-dir:模型保留的门路

3.2.4. 推理推理生成的后果保留在./data/textdet/results 门路下,该门路下蕴含两个文件夹 out_vis_dir 和 out_txt_dir。
out_vis_dir 目录下寄存每张图片推理的可视化后果,保留为 jpg 文件。out_txt_dir 目录下寄存每张图片推理出的四边形区域的坐标值,保留为 txt 文件。!python textdet/infer.py \
./data/raw/train_imgs \
./textdet/water_meter_textdet_config.py \
./train_url/textdet/latest.pth \
–out-dir=./data/textdet/results

第 1 个参数: 推理的图片门路

第 2 个参数: 模型的配置文件

第 3 个参数: 训练好的模型文件

第 4 个参数: 推理后果保留门路

out_txt_dir 目录下 txt 文件的内容如下:393,180,615,177,616,241,394,244,1
393,180,615,177,616,241,394,244:代表 4 个角点的坐标,别离是左上角,右上角,右下角,左下角。1:标签索引,1 代表是文本区域。out_vis_dir 目录下为图片,可间接进入./data/textdet/results/out_vis_dir 目录下关上图片查看,或者应用上面的可视化接口查看:from util import show
img_dir = ‘./data/textdet/results/out_vis_dir’
show(img_dir, show_num=3)
3.2.5. 抠图依据下面的推理后果,将文本区域抠出来保留成新的图片,用于训练文本辨认模型。保留门路为./data/textrecog/images_from_textdet。from textdet.data_util import cutout
img_dir = ‘./data/raw/train_imgs’ # 推理时的原始图片门路

cutout(img_dir,

   ann_dir='./data/textdet/results/out_txt_dir/',   # 推理后果 txt 文件
   save_dir='./data/textrecog/images_from_textdet'  # 抠图后果保留门路
  )

print(‘Finished’)
抠图后果可视化:from util import show_pair
img_dir = ‘./data/raw/train_imgs’ # 训练集原始图片
result_dir = ‘./data/textrecog/images_from_textdet’ # 训练集推理后果
show_pair(img_dir, result_dir, show_num=2)
4. 文本翻转检测(可选)本案例数据集物体歪斜角度较小,不须要进行翻转辨认,如果遇到随机翻转重大的数据集能够参考这部分代码训练一个辨认翻转的模型。文本检测算法中曾经将须要辨认的文本区域抠图并保留。接下来利用这部分数据训练一个文本辨认算法。因为文本区域做了角度的改正。然而无奈辨别翻转 0 度和 180 度的图片,而文本辨认的算法对翻转 180 度的场景成果不佳。所以咱们又训练了一个专门辨认翻转的模型。用来做 180 度翻转的改正。4.1. 数据筹备可将文本检测抠出来的图片做 180 度翻转的离线裁减。依据文本检测抠出的图片以及离线裁减后的数据进行人工标注失常或翻转。然而本案例图片歪斜角度较小,抠图的后果均为正向,不须要人工标注。原始图片均为正向 0 度翻转,离线裁减进行 180 度翻转后的均为 180 度翻转的图片。离线裁减:宰割模型的精度较高,后果较精确,咱们应用宰割模型的推理后果进行离线裁减 import os
from PIL import Image
import moxing as mox

def flip_upside_down(img_dir, save_dir):

mox.file.make_dirs(save_dir)
imgs_list = os.listdir(img_dir)
for img_name in imgs_list:
    img = Image.open(os.path.join(img_dir, img_name))
    img.rotate(180).save(os.path.join(save_dir, img_name))  # 图片旋转 180 度并保留
        

if name == ‘__main__’:

img_dir = './data/textrecog/images_from_seg'  
flip_save_dir = './data/detect_180/flip_180'  # 翻转数据的保留门路,保留在./data/detect_180 目录下
flip_upside_down(img_dir, flip_save_dir)  # 进行翻转解决
mox.file.copy_parallel(img_dir, './data/detect_180/normal')  # 将失常数据拷贝一份到./data/detect_180 目录下,用于训练翻转模型
print('Finished!')

离线后果可视化:from util import show
img_dir = ‘./data/detect_180/flip_180’
show(img_dir, show_num=5)
4.2. 下载预训练模型执行以下命令下载模型,模型保留到./pretrained_model/mobilenet_v2.pth。!wget –no-check-certificate https://download.openmmlab.co… -O ./pretrained_model/mobilenet_v2.pth
4.3. 训练辨认图片翻转能够应用小点的模型,这里咱们以 mobilenet_v2 为例,如果精度不够能够换稍大点的模型。应用后面下载的预训练模型,./pretrained_model/mobilenet_v2.pth。为了节省时间,默认训练 25 个 epoch,每一步训练 64 个样本,每 2 个 epoch 验证一次精度,每 2 个 epoch 保留一次模型。大概耗时 2 - 3 分钟左右。如果想要更高的精度,能够批改./code/detect_180/train.py 脚本中的配置参数。或者换大点的模型。模型较小,应用单卡训练即可。多卡训练可参考其余模型的多卡训练。这里没有将数据切分成训练集和验证集,可自行切分,指定 eval_data_url。!python ./detect_180/train.py \
–num_classes=2 \
–data_url=./data/detect_180 \
–work_dir=./train_url/detect_180 \
–load_from=./pretrained_model/mobilenet_v2.pth

–eval_data_url=./data/detect_180

num_classes:数据类别数

data_url:训练集寄存门路

eval_data_url:验证集寄存门路

work_dir:保留输入模型的门路

load_from:预置模型文件门路

4.4. 推理训练的模型保留在./train_url/detect_180 门路下,加载该门路下的模型进行推理。就以训练集门路下的翻转图片为例。!python ./detect_180/infer.py \
–num_classes=2 \
–img_path=./data/detect_180/flip_180 \
–checkpoint=./train_url/detect_180/latest.pth
5. 文本辨认 5.1. 数据筹备依据文本检测后的抠图数据和原始的 txt 标注文件创建文本内容辨认的标签文件。水表中有的度数转到一半,会同时呈现两个数字。原始标注文件中也标注了多个 label,从理论状况登程,咱们抉择符合实际状况的标签(如果转到一半,抉择小的那个度数)。有一些非凡的图片,须要人工过滤一下:例如 train_19.jpg 这张图片。import cv2
import matplotlib.pyplot as plt
imgplot = plt.imshow(cv2.imread(‘./data/raw/train_imgs/train_19.jpg’))
plt.show()
该图片的原始标签有四个[‘00069’, ‘00070’, ‘00060’, ‘00079’],但从理论状况登程,符合条件的应该是 00069 和 00070。咱们抉择度数小的那个作为标签值,即 00069。还有几张图片的标注格局与其余标注文件不同,例如 train_140.jpg 这张图片标注的标签格局是 00470.00479,其余文件都是空格分隔 00470 00479。这种图片只有几张咱们也进行人工过滤。上面依据原始的标注文件生成文本辨认须要的标注文件格式。from textrecog.data_util import gen_label_file
ann_dir = ‘./data/raw/train_labels/labels’

train

train_split_path = ‘./data/train.txt’
train_save_path = ‘./data/textrecog/train_label.txt’
gen_label_file(train_split_path, ann_dir, train_save_path)

eval

eval_split_path = ‘./data/eval.txt’
eval_save_path = ‘./data/textrecog/eval_label.txt’
gen_label_file(eval_split_path, ann_dir, eval_save_path)

print(‘Finished!’)
print(‘ 标注文件内容如下,文本图片名称 + 文本数字内容 ’)
!head -n 5 ./data/textrecog/train_label.txt
5.2. 下载预训练模型执行以下命令下载模型,模型保留到./pretrained_model/crnn_academic-a723a1c5.pth。!wget –no-check-certificate https://download.openmmlab.co… -O ./pretrained_model/crnn_academic-a723a1c5.pth
5.3. 训练训练的数据集、模型、优化器等均已保留在配置文件./textrecog/water_meter_textrecog_config.py 和./textrecog/base_config.py 中。
base_config.py 文件是根底配置,可不用改变。
water_meter_textrecog_config.py 文件是针对该案例的配置,例如数据门路、预训练模型门路、epoch 数、学习率等可间接在此文件中批改。默认训练 50 个 epoch,精度不够,能够批改 water_meter_textrecog_config.py 中的训练参数进行调参。训练生成的模型保留在./train_url/textrecog 门路下。大概耗时 2 - 3 分钟左右:!python ./textrecog/train.py \
./textrecog/water_meter_textrecog_config.py \
–work-dir=./train_url/textrecog
5.4. 推理生成推理文件列表:将须要推理的文件名称保留在 txt 文件中。import os
img_root_path = ‘./data/textrecog/images_from_seg’
with open(‘./data/textrecog/infer_imgs_list.txt’, ‘w’) as f:

f.write('\n'.join(os.listdir(img_root_path)))

!head -n 5 ./data/textrecog/infer_imgs_list.txt # 查看生成文件的前 5 行样本
推理:利用训练好的模型进行推理并保留推理后果。后果保留在./data/textrecog/infer_results 目录下。该目录下会有多个文件和目录生成。咱们只需查看 out_vis_dir 和 result.txt 即可。!mkdir ./data/textrecog/infer_results # 创立推理后果的保留门路
!python ./textrecog/infer.py \
./data/textrecog/images_from_seg \
./data/textrecog/infer_imgs_list.txt \
./textrecog/water_meter_textrecog_config.py \
./train_url/textrecog/latest.pth \
–out_dir=./data/textrecog/infer_results

第 1 个参数: 推理的图片根目录

第 2 个参数: 图片根目录下的推理文件列表

第 3 个参数: 模型配置文件

第 4 个参数: 训练好的模型文件

第 5 个参数: 推理后果保留门路

推理后果可视化:from util import show
img_dir = ‘./data/textrecog/infer_results/out_vis_dir’
show(img_dir, show_num=5)
6. 端到端辨认以上咱们曾经实现了水表辨认的整个流程。当初咱们将上述算法串联在一起,实现端到端的预测。输出数据为原始拍摄的图片。输入为水表的度数。6.1 宰割算法与文本辨认算法算法二选一。如果文本检测局部应用的是宰割算法,参考 infer_end2end_with_seg.py 脚本,模型门路,数据门路都配置在了该脚本中,可批改该脚本。如果后面的模型或者数据有改变局部,该脚本请同步批改。!python infer_end2end_with_seg.py \
–num_classes=2 \
–img_path=./data/raw/test_imgs \
–out=./outputs_with_seg \
–detect_180=False

num_classes:类别数

img_path:推理图片门路

out:推理后果保留门路

detect_180:如果训练了辨认翻转的模型,设置 detect_180=True 即可,默认值为 False

推理后果可视化:from util import show_pair
img_dir = ‘./data/raw/test_imgs’
res_dir = ‘./outputs_with_seg’
show_pair(img_dir, res_dir, show_num=2)
6.2 文本辨认算法与宰割算法算法二选一。如果文本检测局部应用的是文本辨认算法,参考 infer_end2end_with_textdet.py 脚本,模型门路,数据门路都配置在了该脚本中,可批改该脚本。如果后面的模型或者数据有改变局部,该脚本请同步批改。!python infer_end2end_with_textdet.py \
–num_classes=2 \
–img_path=./data/raw/test_imgs \
–out=./outputs_with_textdet \
–detect_180=False

num_classes:类别数

img_path:推理图片门路

out:推理后果保留门路

detect_180:如果训练了辨认翻转的模型,设置 detect_180=True 即可,默认值为 False

推理后果可视化:from util import show_pair
img_dir = ‘./data/raw/test_imgs’
res_dir = ‘./outputs_with_textdet’
show_pair(img_dir, res_dir, show_num=2)
【华为云至简致远】有奖征文炽热进行中:https://bbs.huaweicloud.com/b…【版权申明】本文为华为云社区用户原创内容,转载时必须标注文章的起源(华为云社区),文章链接,文章作者等根本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌剽窃的内容,欢送发送邮件至:cloudbbs@huaweicloud.com 进行举报,并提供相干证据,一经查实,本社区将立即删除涉嫌侵权内容。

正文完
 0