Skip to content

Commit 57ce1c7

Browse files
committed
🎉 提交代码
1 parent 464b1dd commit 57ce1c7

35 files changed

+6781
-0
lines changed

.gitignore

+5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ __pycache__/
33
*.py[cod]
44
*$py.class
55

6+
# 模型和视频文件忽略
7+
train/instance_segmentation.tar.gz
8+
notebook/test.mp4
9+
notebook/test.jpg
10+
611
# C extensions
712
*.so
813

README.md

+158
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
# 基于 ModelArts 平台模型部署预测 —— Mask R-CNN 模型
2+
3+
## 介绍
4+
5+
项目使用华为云 `ModelArts` AI 开发平台进行训练部署,采用 `Mask R-CNN` 算法模型进行识别预测。`Mask R-CNN` 源于 2018 年论文《Mask R-CNN》,是何恺明团队作品。`Mask R-CNN` 指的是在检测出图片中物体的同时为每一实例产生高质量的分割掩码(segmentation mask),算法基于 `Faster R-CNN`,在其中添加了实例掩码功能。
6+
7+
模型识别预测结果处理:
8+
9+
- 统一识别同种物体类别的颜色
10+
- 自定义绘制实线边框和标签牌
11+
- 统计识别结果的输出物体框坐标和颜色标识
12+
13+
>可以自己本机运行,需要安装 `tf1.13.1``pycocotools`
14+
>COCO数据集训练需要用到 `pycocotools` 这个第三方库
15+
>Windows电脑下安装出问题,建议Linux运行。
16+
17+
## 目录结构
18+
19+
将目录文件夹上传至已创建的桶中,文件过多可能上传失败,建议分目录选择上传。
20+
21+
```text
22+
ma-mask-rcnn
23+
24+
┌── infer 模型推理
25+
│ ├── mrcnn
26+
│ ├── config.json
27+
│ ├── customize_service.py
28+
│ └── draw.py
29+
├── log 模型训练其他日志
30+
├── model 模型训练版本输出
31+
├── notebook 开发环境模型调试
32+
│ ├── detect_image.py
33+
│ ├── detect_video.py
34+
│ ├── run.ipynb
35+
│ ├── test.jpg
36+
│ └── test.mp4
37+
├── train 模型训练
38+
│ ├── instance_segmentation.tar.gz
39+
│ ├── mask_rcnn.py
40+
│ └── pip-requirements.txt
41+
├── web 在线服务API展示界面项目(自己本机运行)
42+
│ ├── static
43+
│ ├── templates
44+
│ ├── main.py
45+
│ └── requirements.txt
46+
└── README.md
47+
```
48+
49+
## 使用前提
50+
51+
拥有一个华为云账号
52+
53+
- EI 企业智能 —— ModelArts
54+
- 存储 —— 对象存储服务 OBS
55+
56+
`ModelArts` 平台需要在全局配置中添加访问密钥才能使用的自动学习、数据管理、Notebook、训练作业、模型和服务可能需要使用对象存储功能,若没有添加访问密钥,则无法使用对象存储功能。
57+
58+
`对象存储服务 OBS` 创建一个桶进行文件的存储。
59+
60+
选择服务地区:**华北-北京四**
61+
62+
## 创建开发环境
63+
64+
`ModelArts` 平台中使用 _开发环境>Notebook_ 创建一个工作环境(Python3 | GPU)和选择对象存储服务(OBS)桶内的已创建或已上传的文件夹进行创建,之后可以启动已创建 `notebook` 进行在线的开发调试和具体的模型训练。使用一些关联文件需要同步到开发环境 `work` 文件夹内,注意同步文件大小存在指定大小内。
65+
66+
## 训练模型
67+
68+
`ModelArts` 平台中使用 _训练管理>训练作业_ 创建:
69+
70+
1. 算法来源为常用框架(TensorFlow | TF-1.13.1-python3.6)
71+
2. 代码目录,选择已上传的 `train` 目录
72+
3. 启动文件,选择 `train` 目录内的 `mask_rcnn.py` 文件
73+
4. 数据来源为数据存储位置,选择已创建桶中已上传的 `train` 数据文件夹
74+
5. 训练输出位置,选择已上传或创建名为 `model` 的文件夹
75+
6. 作业日志路径,选择已上传或创建名为 `log` 的文件夹
76+
7. 选择 **公共资源池>GPU** 训练更佳
77+
8. 运行参数,参考下表:
78+
79+
| 名称 | 类型 | 说明 |
80+
| :-------------: | :----: | :----------------------------------------: |
81+
| data_url | string | 已创建桶中已上传的数据来源文件夹 |
82+
| train_url | string | 已上传或已创建名为 `model` 的文件夹/V 版本 |
83+
| image_dim | number | 训练统一图片大小 320/480/512/1024 |
84+
| epochs_step | number | 每轮训练载入图片张数,默认 100 |
85+
| validation_step | number | 每轮训练后验证张数,默认 20 |
86+
| max_epochs | number | 训练迭代次数,默认 10 |
87+
| num_gpus | number | 拥有 GPU 数,默认固定为 1 |
88+
89+
数据来源数据文件会复制到目录代码下。
90+
91+
## 模型推理
92+
93+
在完成上面的模型训练后,你可以在已上传或已创建名为 `model` 的文件夹/V 版本内看到模型文件,但是还不能直接部署,还需要编写平台的模型包规范。因为使用的是 `TF-1.13.1-python3.6` 环境训练,所以使用 `TensorFlow` 模型推理代码进行编写。
94+
95+
使用已经上传的 `infer` 文件夹中的推理文件:
96+
97+
- 方法一:使用开发环境 `notebook` 进行复制 `infer` 文件夹中的推理文件到对应版本模型的 `model` 文件夹内。
98+
- 方法二:直接在 `对象存储服务 OBS` 桶内目录选择对应版本模型的 `model` 文件夹,选择上传对象上传 `infer` 文件夹内的推理文件。
99+
100+
完成上传后,就可以在 `ModelArts` 平台中使用 _模型管理>模型_ 导入:
101+
102+
1. 元模型来源,选择 **从训练中选择****从对象存储服务(OBS)中选择**
103+
2. 根据元模型来源选择对应的模型版本,**选择训练作业****选择元模型**
104+
3. 部署类型,选择在线服务即可
105+
106+
推理模型参数如下:
107+
108+
**输入参数**
109+
110+
| 名称 | 类型 | 说明 |
111+
| :------------: | :----: | :--------------------------------------------------: |
112+
| image | file | 上传图片文件 |
113+
| min_score | number | 最小显示分数,默认 0.2 |
114+
| show_image | number | 是否输出带覆盖物结果 base64 输出图,默认 1 |
115+
| show_box_label | number | 结果图是否显示框和文字,默认 1 |
116+
| image_size | number | 图片尺寸统一处理大小识别 320/480/512/1024,默认 1024 |
117+
118+
**输出参数**
119+
120+
| 名称 | 类型 | 说明 |
121+
| :-------------: | :----: | :-----------------------------------------------: |
122+
| predicted_image | string | 识别绘制图片 base64,根据输入参数 show_image 输出 |
123+
| recognizer_data | object | 识别物体框和颜色标识数据 |
124+
125+
## 模型部署
126+
127+
在完成上面的模型推理后,就可以在 `ModelArts` 平台中使用 _部署上线>在线服务_ 部署。选择模型及配置是你导入训练推理编写后得到的模型和对应的模型版本号,选好 **CPU 规格**下一步直接提交,等待服务启动完成。
128+
129+
服务启动后,可以直接使用服务提供的预测进行图片的预测查看。
130+
131+
## 在线服务 API 展示界面项目
132+
133+
在自己的机器上安装依赖后运行,使用的预测识别服务来自上面的模型部署服务启动。
134+
135+
1. 使用前提是部署模型的在线服务并启动预测。
136+
2. 修改界面项目的 `main.py` 里修改预测的 API 接口地址和获取 Token 的地区用户名和密码。
137+
138+
界面项目对在线服务预测接口进行预测调用实现功能:
139+
140+
- 显示预测结果图
141+
- 对预测图片进行物体分割小图
142+
- 对预测结果物体进行统计
143+
- 对视频媒体文件进行取帧预测统计
144+
145+
## 建议阅读
146+
147+
`ModelArts` 平台:
148+
149+
- [模型包规范介绍](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0091.html)
150+
- [ModelArts 平台常见问题](https://support.huaweicloud.com/modelarts_faq/modelarts_05_0014.html)
151+
- [MoXing 开发指南](https://support.huaweicloud.com/moxing-devg-modelarts/modelarts_11_0001.html)
152+
153+
`Mask R-CNN` 算法模型:
154+
155+
- [Mask R-CNN 论文](http://cn.arxiv.org/pdf/1703.06870v3)
156+
- [Mask R-CNN GitHub 仓库](https://github.com/matterport/Mask_RCNN)
157+
- [Mask R-CNN 训练自己的数据集](https://blog.csdn.net/l297969586/article/details/79140840)
158+
- [Mask R-CNN 算法及其实现详解](https://blog.csdn.net/remanented/article/details/79564045)

infer/README.md

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# 模型管理 - 推理文件夹
2+
3+
[模型包规范介绍](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0091.html)
4+
5+
- 模型包里面必须包含 `model` 文件夹,`model` 文件夹下面放置模型文件,模型配置文件,模型推理代码。
6+
- 模型配置文件必需存在,文件名固定为 `config.json` , 有且只有一个,模型配置文件编写请参见[模型配置文件编写说明](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0092.html)
7+
- 模型推理代码文件是可选的。推荐采用相对导入方式(Python import)导入自定义包。如果需要此文件,则文件名固定为 `customize_service.py` , 此文件有且只能有一个,模型推理代码编写请参见[模型推理代码编写说明](https://support.huaweicloud.com/engineers-modelarts/modelarts_23_0093.html)
8+
9+
## 推理文件上传
10+
11+
```text
12+
你创建并上传的到OBS桶内的文件夹
13+
14+
├── infer 模型推理文件
15+
│ ├── mrcnn MaskRonn 模型识别所需文件
16+
│ ├── config.json 模型配置文件
17+
│ ├── customize_service.py 模型推理代码文件
18+
│ └── draw.py Mask R-CNN 识别所需文件
19+
...
20+
```
21+
22+
将该文件夹内的文件上传至对应训练输出的模型版本文件夹里的 `model` 文件夹下。
23+
24+
## 推理模型参数
25+
26+
**输入参数**
27+
28+
| 名称 | 类型 | 说明 |
29+
| :------------: | :----: | :--------------------------------------------------: |
30+
| image | file | 上传图片文件 |
31+
| min_score | number | 最小显示分数,默认 0.2 |
32+
| show_image | number | 是否输出带覆盖物结果 base64 输出图,默认 1 |
33+
| show_box_label | number | 结果图是否显示框和文字,默认 1 |
34+
| image_size | number | 图片尺寸统一处理大小识别 320/480/512/1024,默认 1024 |
35+
36+
**输出参数**
37+
38+
| 名称 | 类型 | 说明 |
39+
| :-------------: | :----: | :-----------------------------------------------: |
40+
| predicted_image | string | 识别绘制图片 base64,根据输入参数 show_image 输出 |
41+
| recognizer_data | object | 识别物体框和颜色标识数据 |

infer/config.json

+128
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
{
2+
"model_type": "TensorFlow",
3+
"metrics": {
4+
"f1": 0.345294,
5+
"accuracy": 0.462963,
6+
"precision": 0.338977,
7+
"recall": 0.351852
8+
},
9+
"runtime": "tf1.13-python3.6-cpu",
10+
"model_algorithm": "image_classification",
11+
"dependencies": [
12+
{
13+
"installer": "pip",
14+
"packages": [
15+
{
16+
"restraint": "EXACT",
17+
"package_version": "1.15.4",
18+
"package_name": "numpy"
19+
},
20+
{
21+
"restraint": "EXACT",
22+
"package_version": "0.11.1",
23+
"package_name": "pyarrow"
24+
},
25+
{
26+
"restraint": "ATLEAST",
27+
"package_version": "0.2.9",
28+
"package_name": "imgaug"
29+
},
30+
{
31+
"restraint": "ATLEAST",
32+
"package_version": "0.14.5",
33+
"package_name": "scikit-image"
34+
},
35+
{
36+
"restraint": "ATLEAST",
37+
"package_version": "0.13.2",
38+
"package_name": "ipdb"
39+
},
40+
{
41+
"restraint": "ATLEAST",
42+
"package_version": "3.4.1.15",
43+
"package_name": "opencv-python"
44+
},
45+
{
46+
"restraint": "EXACT",
47+
"package_version": "2.2.2",
48+
"package_name": "keras"
49+
},
50+
{
51+
"restraint": "ATLEAST",
52+
"package_version": "0.4",
53+
"package_name": "absl-py"
54+
}
55+
]
56+
}
57+
],
58+
"apis": [
59+
{
60+
"procotol": "http",
61+
"url": "/",
62+
"method": "post",
63+
"request": {
64+
"Content-type": "multipart/form-data",
65+
"data": {
66+
"type": "object",
67+
"required": [
68+
"image"
69+
],
70+
"properties": {
71+
"image": {
72+
"type": "file",
73+
"description": "上传图片文件"
74+
},
75+
"min_score": {
76+
"type": "number",
77+
"default": 0.2,
78+
"maximum": 0.99,
79+
"minimum": 0.01,
80+
"description": "最小分数"
81+
},
82+
"show_image": {
83+
"type": "number",
84+
"default": 1,
85+
"maximum": 1,
86+
"minimum": 0,
87+
"description": "是否输出带覆盖物结果base64输出图"
88+
},
89+
"show_box_label": {
90+
"type": "number",
91+
"default": 1,
92+
"maximum": 1,
93+
"minimum": 0,
94+
"description": "结果图是否显示框和文字"
95+
},
96+
"input_size": {
97+
"type": "number",
98+
"default": 1024,
99+
"maximum": 1024,
100+
"minimum": 320,
101+
"description": "图片尺寸统一处理大小识别"
102+
}
103+
}
104+
}
105+
},
106+
"response": {
107+
"Content-type": "multipart/form-data",
108+
"data": {
109+
"type": "object",
110+
"required": [
111+
"recognizer_data"
112+
],
113+
"properties": {
114+
"predicted_image": {
115+
"type": "string",
116+
"description": "识别绘制图片base64"
117+
},
118+
"recognizer_data": {
119+
"type": "object",
120+
"roperties": {},
121+
"description": "识别物体数据"
122+
}
123+
}
124+
}
125+
}
126+
}
127+
]
128+
}

0 commit comments

Comments
 (0)