5.29学习:

  • 完成实践《使用算法套件快速完成水表读数识别》

  本实验指导利用数据集,通过下载官方的算法套件(ivgSegmentation分割和OCR识别),借助notebook修改代码,来快速适配水表读数任务,并部署为在线服务进行读数预测。可以体验到"需求-数据-代码-训练-推理-上线"的AI开发全流程。

开篇

  本实验是第一个进阶实验,官方教程:使用算法套件快速完成水表读数识别_AI开发平台ModelArts (huaweicloud.com),整体步骤如下:

35d1b86567e803b3f2f913702fd461f

  官方说:本示例围绕真实AI需求场景,介绍算法开发套件在水表表盘读数识别算法开发任务上的使用流程

  Q:什么是算法开发套件?

  A:就是用来解决实际问题的算法和让这些算法落地的配套设施。

  算法开发套件中目前提供自研(ivg系列)和开源(mm系列)两系列,可应用于图片分类、物品检测、图片分割和OCR等任务。本示例中将组合使用自研分割算法IvgSegmentation和**开源OCR算法(mmOCR)**完成水表读数识别项目,并使用算法开发套件将其部署为在线服务。

准备工作

创建OBS桶并下载数据集

  登录对象存储服务-控制台 (huaweicloud.com),创建OBS对象桶 test-bucket-xiaowang,区域选择【华北-北京四】。

  登录ModelArts - Console (huaweicloud.com),选择控制台区域也为【华北-北京四】,需要和OBS相同。

  授权此前已经做过,允许ModelArts模型访问OBS,没有就参考配置访问授权(全局配置)添加授权。

  下载本案例的数据集,水表表盘分割数据集水表表盘读数OCR识别数据集到OBS桶中,下载方式都选择【对象存储服务(OBS)】。需要新建两个文件夹,分别为water_meter_segmentation水表表盘分割数据集和water_meter_crop水表表盘读数OCR识别数据集。

972923f0d85a8e9e6f4c9bd932932ef

  查看两个文件中的文件已经下载完成。

61ee6af69024b29bb7741ea07f058ea a357339fe83445d9e46b17d2608831c

创建开发环境

  在ModelArts - Console (huaweicloud.com)的【开发环境】-【Notebook】页面中,创建基于pytorch1.8-cuda10.2-cudnn7-ubuntu18.04镜像,类型为GPU,规格选择Pnt1Vnt1系列的Notebook。

054a299297861e6ea6672570f21235e

  创建成功后打开JupyterLab的Terminal。

7afbcba610060edcd16a0145a66ba26 387f8642085181171e38951f12ada28

操作过程

创建算法工程

  在JupyterLab的Terminal中,在work目录下执行下面的命令创建工程。

ma-cli createproject

  之后根据提示输入工程名称,这里用water_meter

  然后按回车键选择默认参数(总共连续按5次回车),之后选择跳过资产安装步骤,选择【6】。150600ecb1e0d45f3be685735f9f2d7

  进入工程目录。

cd water_meter

  执行以下命令复制项目数据从OBS到Notebook中。

  本地分割数据集路径./data/raw/water_meter_segmentation

  本地读数OCR识别数据集./data/raw/water_meter_crop

python manage.py copy --source obs://test-bucket-xiaowang/water_meter_crop --dest ./data/raw/water_meter_crop

python manage.py copy --source obs://test-bucket-xiaowang/water_meter_segmentation --dest ./data/raw/water_meter_segmentation
098090deec96adce0622abee875e3d2

水表区域分割

  执行如下命令安装ivgSegmentation套件(自研的分割算法套件)。

python manage.py install algorithm ivgSegmentation==1.0.2
b8028025939ea7a6a6d9747b1e39ef5

  安装套件后,在JupyterLab界面左侧的工程目录中进入water_meter/algorithms/ivgSegmentation/config/sample文件夹,查看目前支持的分割模型。

  以sample为例(sample默认的算法就是deeplabv3),文件夹中包括config.py(算法外壳配置)和deeplabv3_resnet50_standard-sample_512x1024.py(模型结构)。

7b5b2a05a4733fbc29db6ceba379531

  水表表盘分割只需要区分背景和读数区域,因此属于二分类,需要根据项目所需数据集对配置文件进行修改,如下所示。

  修改“config.py”文件。双击点击打开后即可修改。

    ... 
alg_cfg = dict(
...
data_root='data/raw/water_meter_segmentation', # 修改为真实路径本地分割数据集路径
...
)

  修改完后按Ctrl+S保存。

05cf0285fde737ca2e5030db503e6e2

  修改“deeplabv3_resnet50_standard-sample_512x1024.py”文件。

#注意gpu改为0
gpus=[0]
...
data_cfg = dict(

... num_classes=2, # 修改为2类
...
... train_scale=(512, 512), # (h, w)#size全部修改为(512, 512)
... train_crop_size=(512, 512), # (h, w)
... test_scale=(512, 512), # (h, w)
... infer_scale=(512, 512), # (h, w)
)

  修改完按Ctrl+S保存。

6e8d09af10affb44dbf00e0d0720e2d

  在water_meter工程目录下,执行如下命令安装deeplabv3预训练模型。

python manage.py install model ivgSegmentation:deeplab/deeplabv3_resnet50_cityscapes_512x1024
5c06e36abdd9ec2c446830c828fe983

  执行如下命令训练分割模型,使用GPU进行训练。

python manage.py run --cfg algorithms/ivgSegmentation/config/sample/config.py --gpus 0

  跑的过程中GPU资源会占用非常高,需要跑5-10分钟。

b3d46fce743cb70964f1d022e7617ed

  模型训练成功!

3e1feef021fa87ff85d8f52d2c454a6

  训练好的模型会保存在指定位置中,默认为./output/deeplabv3_resnet50_standard-sample_512x1024/checkpoints/

  验证模型效果。模型训练完成后,可以在验证集上计算模型的指标,首先修改配置文件的模型位置。

  修改“config.py”文件,修改完按Ctrl+S保存。

    ...
alg_cfg = dict(
...
load_from='./output/deeplabv3_resnet50_standard-sample_512x1024/checkpoints/checkpoint_best.pth.tar', # 修改训练模型的路径
...
)
47b59e49abe88990e8916d614b25fa6

  执行如下命令计算模型指标。

python manage.py run --cfg algorithms/ivgSegmentation/config/sample/config.py --pipeline evaluate

  这一步也要等一下。

f926f427d68b63aa47f37f03b9c21b4

  模型推理。模型推理能够指定某一张图片,并且推理出图片的分割区域,并进行可视化。

  首先需要指定需要推理的图片路径。

  修改“config.py”文件,修改完按Ctrl+S保存。

alg_cfg = dict(
...
img_file='./data/raw/water_meter_segmentation/image/train_10.jpg' # 指定需要推理的图片路径
...
)
cf3e8fcdcd28869b8cc3821a88cae76

  执行如下命令推理模型。

python manage.py run --cfg algorithms/ivgSegmentation/config/sample/config.py --pipeline infer

2c003954f2c78a3d625b861ee7481af

  推理输出的图片路径在./output/deeplabv3_resnet50_standard-sample_512x1024下。

abdfd500297b4a1b1be528fb14ecd6d 6fcf11e6f118209d7e95fb4fc3a3562

执行如下命令导出算法SDK。

python manage.py export --cfg algorithms/ivgSegmentation/config/sample/config.py --is_deploy
bc62be6ce1a79f5295e22037f0036ca

  算法开发套件支持将模型导出成一个模型SDK,方便进行模型部署等下游任务。

  SDK导出的路径为./export/deeplabv3_resnet50_standard-sample_512x1024/Linux_x86_64_GPU_PyTorch_Common_py

adfca283e093a1f34b8b7e235ec7c3b

水表读数识别

  执行如下命令安装mmocr套件。

python manage.py install algorithm mmocr==0.2.1
908241ad5d99d321ee0bf58b4bae607

  安装完后,“./algorithms/mmocr/config/textrecog”文件夹中包括config.py(算法外壳配置)和robustscanner_r31_academic.py(模型结构),需要根据所需算法和数据集路径修改配置文件。

  以下以robust_scanner算法为例,修改“robustscanner_r31_academic.py”,如下所示:

...
train_prefix = 'data/raw/water_meter_crop/' # 修改数据集路径改为水表ocr识别数据集路径
train_img_prefix1 = train_prefix + 'train'
train_ann_file1 = train_prefix + 'train.txt'

...
test_prefix = 'data/raw/water_meter_crop/'
test_img_prefix1 = test_prefix + 'val/'
test_ann_file1 = test_prefix + 'val.txt'
80d15f8d9ed252ecaef96049115d28d c3caf81e8d4b5ca12e8d5279a5706e3

  执行如下命令安装robust_scanner预训练模型。

python manage.py install model mmocr:textrecog/robust_scanner/robustscanner_r31_academic
0765bfef0a826007400a63763e5e7a0

  训练OCR模型。初次使用mmcv时需要编译mmcv-full,该过程较慢,可以直接使用官方预编译的依赖包。预编译包URL: https://download.openmmlab.com/mmcv/dist/cu102/torch1.6.0/index.html

  依次执行下列命令。

pip uninstall mmcv -y
pip install https://download.openmmlab.com/mmcv/dist/cu102/torch1.6.0/mmcv_full-1.3.9-cp37-cp37m-manylinux1_x86_64.whl
pip install rapidfuzz==2.15.1
pip install numpy -U

  每一步都success就可以。

  修改./algorithms/mmocr/config/textrecog/config.py,将EPOCHS(迭代数量)改为2。

b784788ef760e1a589684fc631bbcb2

  执行如下命令训练OCR模型。(使用GPU进行训练,大概需要几分钟)

python manage.py run --cfg algorithms/mmocr/config/textrecog/config.py
64ba9e05fee17f197ebcb7268c36e28

  训练好的模型会保存在指定位置中,默认为output/robustscanner_r31_academic/文件夹中。

  验证模型效果。模型训练完成后,可以在验证集上计算模型的指标。

  首先修改配置文件的模型位置,修改./algorithms/mmocr/config/textrecog/config.py

...
model_path = './output/robustscanner_r31_academic/latest.pth'
...

  执行如下命令验证模型:

python manage.py run --cfg algorithms/mmocr/config/textrecog/config.py --pipeline evaluate
9d198310afef8807b7ce476318989e3

  模型推理。模型推理能够指定某一张图片,并且推理出图片的分割区域,并进行可视化。

  首先需要指定待推理的图片路径,修改./algorithms/mmocr/config/textrecog/config.py,具体如下。

...
infer_img_file='./data/raw/water_meter_crop/val/train_10.jpg' # 指定需要推理的图片路径
...

  执行如下命令推理。

python manage.py run --cfg algorithms/mmocr/config/textrecog/config.py --pipeline infer

  推理输出的图片路径在output/robustscanner_r31_academic/vis文件夹下。

  最后,执行如下命令导出算法SDK。

python manage.py export --cfg algorithms/mmocr/config/textrecog/config.py
6bd13f77569dc692d4b16c1e4eec9c7

部署为在线服务

  本次展示仅部署OCR服务, 包括本地部署和线上部署两部分, 部署上线后调用部署服务进行本地图片的推理,以获取水表的预测读数。

  首先,部署为在线服务,需要指定OBS桶以便保存部署所需要的文件。

  修改./algorithms/mmocr/config/textrecog/config.py文件,配置为用户的OBS桶。

# 替换为用户自己的OBS桶信息,这里我在OBS桶中新建了一个文件夹water_meter
obs_bucket = 'obs://test-bucket-xiaowang/water_meter'

  导出模型文件并修改rapidfuzz版本,然后本地部署。

python manage.py export --cfg algorithms/mmocr/config/textrecog/config.py --is_deploy  # 导出部署模型所需文件
37278236134f4a0a7cda635395ff8ff

  修改./export/robustscanner_r31_academic/Linux_x86_64_GPU_PyTorch_Common_py/res/requirements.txt,将rapidfuzz版本修改为2.15.1

rapidfuzz==2.15.1
6bdd0af438962ae1e02eea5f6d38ac9

  执行以下命令进行本地部署调试,这需要一段时间。

python manage.py deploy --cfg algorithms/mmocr/config/textrecog/config.py  

  本地部署成功后执行如下命令进行在线部署,大约需要十几分钟。

python manage.py deploy --cfg algorithms/mmocr/config/textrecog/config.py --launch_remote
7a4dd479cd5bf8523d4d6950a7425e8

  部署成功后,任务会提交至ModelArts控制台,在【部署上线】-【在线服务】页面会看到此任务。

c72280efab985fe1ce0f1a0a79ade85

  然后进行预测,这里给几个水表图片,

61f2fa4c2fbbb6ba1260dc8cb752e75 07590a4341bcf43492c8fd449b02063

清除资源和数据

  删除Notebook。

  删除OBS数据。

  停止在线服务。