Skip to content
Snippets Groups Projects
Unverified Commit c49e90d9 authored by i-robot's avatar i-robot Committed by Gitee
Browse files

!3656 [东北大学][高校贡献][Mindspore][retinanet]-迁移训练模型提交

Merge pull request !3656 from 高慧茹/test
parents 81be5074 02fa864d
No related branches found
No related tags found
No related merge requests found
<!-- TOC -->
- [retinanet 描述](#retinanet-描述)
- <span id="content">[Retinanet 描述](#Retinanet-描述)</span>
- [模型架构](#模型架构)
- [数据集](#数据集)
- [环境要求](#环境要求)
......@@ -21,19 +22,18 @@
- [推理过程](#推理过程)
- [用法](#usage)
- [运行](#running)
- [在onnx执行推理](#span-idonnxrunning在onnx执行推理)
- [结果](#outcome)
- [Onnx结果](#span-idonnxoutcomeonnx结果)
- [模型说明](#模型说明)
- [性能](#性能)
- [训练性能](#训练性能)
- [推理性能](#推理性能)
- [训练性能](#训练性能)
- [推理性能](#推理性能)
- [随机情况的描述](#随机情况的描述)
- [ModelZoo 主页](#modelzoo-主页)
- [迁移学习](#迁移学习)
<!-- /TOC -->
## [retinanet 描述](#content)
## [Retinanet 描述](#content)
RetinaNet算法源自2018年Facebook AI Research的论文 Focal Loss for Dense Object Detection。该论文最大的贡献在于提出了Focal Loss用于解决类别不均衡问题,从而创造了RetinaNet(One Stage目标检测算法)这个精度超越经典Two Stage的Faster-RCNN的目标检测网络。
......@@ -55,7 +55,16 @@ MSCOCO2017
- 数据集大小: 19.3G, 123287张80类彩色图像
- 训练:19.3G, 118287张图片
- 测试:1814.3M, 5000张图片
- 数据格式:RGB图像.
- 注意:数据将在src/dataset.py 中被处理
face-mask-detection(迁移学习使用)
- 数据集大小: 397.65MB, 853张3类彩色图像
- 数据格式:RGB图像.
- 注意:数据将在src/dataset.py 中被处理
......@@ -85,10 +94,11 @@ MSCOCO2017
├─run_distribute_train_gpu.sh # 使用GPU环境八卡并行训练
├─run_single_train_gpu.sh # 使用GPU环境单卡训练
├─run_infer_310.sh # Ascend推理shell脚本
├─run_onnx_eval.sh # onnx推理的shell脚本
├─run_onnx_eval_gpu.sh # 使用GPU环境运行onnx推理的shell脚本
├─run_eval.sh # 使用Ascend环境运行推理脚本
├─run_eval_gpu.sh # 使用GPU环境运行推理脚本
├─config
├─finetune_config.yaml # 迁移学习参数配置
└─default_config.yaml # 参数配置
├─src
├─dataset.py # 数据预处理
├─retinanet.py # 网络模型定义
......@@ -106,8 +116,9 @@ MSCOCO2017
├─export.py # 导出 AIR,MINDIR模型的脚本
├─postprogress.py # 310推理后处理脚本
└─eval.py # 网络推理脚本
└─onnx_eval.py # 用于onnx推理
└─create_data.py # 构建Mindrecord数据集脚本
└─data_split.py # 迁移学习数据集划分脚本
└─quick_start.py # 迁移学习可视化脚本
└─default_config.yaml # 参数配置
```
......@@ -318,7 +329,7 @@ Epoch time: 164531.610, per step time: 359.239
### [评估过程](#content)
#### 用法
#### <span id="usage">用法</span>
使用shell脚本进行评估。shell脚本的用法如下:
......@@ -336,7 +347,7 @@ bash scripts/run_eval_gpu.sh [DEVICE_ID] [DATASET] [MINDRECORD_DIR] [CHECKPOINT_
> checkpoint 可以在训练过程中产生.
#### 结果
#### <span id="outcome">结果</span>
计算结果将存储在示例路径中,您可以在 `eval.log` 查看.
......@@ -382,17 +393,17 @@ mAP: 0.34852168035724435
### [模型导出](#content)
#### 用法
#### <span id="usage">用法</span>
导出模型前要修改config.py文件中的checkpoint_path配置项,值为checkpoint的路径。
```bash
```shell
python export.py --file_name [RUN_PLATFORM] --file_format[EXPORT_FORMAT] --checkpoint_path [CHECKPOINT PATH]
```
`EXPORT_FORMAT` 可选 ["AIR", "MINDIR", "ONNX"]
`EXPORT_FORMAT` 可选 ["AIR", "MINDIR"]
#### 运行
#### <span id="running">运行</span>
```运行
python export.py --file_name retinanet --file_format MINDIR --checkpoint_path /cache/checkpoint/retinanet_550-458.ckpt
......@@ -420,7 +431,7 @@ python export.py --file_name retinanet --file_format MINDIR --checkpoint_path /
### [推理过程](#content)
#### 用法
#### <span id="usage">用法</span>
在推理之前需要在昇腾910环境上完成模型的导出。推理时要将iscrowd为true的图片排除掉。在ascend310_infer目录下保存了去排除后的图片id。
还需要修改config.py文件中的coco_root、val_data_type、instances_set配置项,值分别取coco数据集的目录,推理所用数据集的目录名称,推理完成后计算精度用的annotation文件,instances_set是用val_data_type拼接起来的,要保证文件正确并且存在。
......@@ -430,36 +441,17 @@ python export.py --file_name retinanet --file_format MINDIR --checkpoint_path /
bash run_infer_310.sh [MINDIR_PATH] [DATA_PATH] [ANN_FILE] [DEVICE_ID]
```
#### 运行
#### <span id="running">运行</span>
```运行
bash run_infer_310.sh ./retinanet.mindir ./dataset/coco2017/val2017 ./image_id.txt 0
```
#### 在onnx执行推理
在执行推理前,onnx文件必须通过 `export.py`脚本导出,通过config_path选择适用于不同平台的config文件。以下展示了使用onnx模型执行推理的示例。
```shell
# Onnx inference
python export.py --file_name [RUN_PLATFORM] --file_format[EXPORT_FORMAT] --checkpoint_path [CHECKPOINT PATH] --config_path [CONFIG PATH]
```
EXPORT_FORMAT 选择 ["ONNX"]
使用shell脚本进行评估。shell脚本的用法如下:
```bash
GPU:
bash scripts/run_onnx_eval_gpu.sh [DEVICE_ID] [DATASET] [MINDRECORD_DIR] [ONNX_PATH] [ANN_FILE PATH] [CONFIG_PATH]
# example: bash scripts/run_onnx_eval_gpu.sh 0 coco ./MindRecord_COCO/ /home/retinanet/retinanet.onnx ./cocodataset/annotations/instances_{}.json ./config/default_config_gpu.yaml
```
#### 结果
#### <span id="outcome">结果</span>
推理的结果保存在当前目录下,在acc.log日志文件中可以找到类似以下的结果。
```log
```mAP
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.350
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.509
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.385
......@@ -478,63 +470,40 @@ bash scripts/run_onnx_eval_gpu.sh [DEVICE_ID] [DATASET] [MINDRECORD_DIR] [ONNX_P
mAP: 0.3499478734634595
```
#### Onnx结果
推理的结果保存在当前目录下,在log.txt日志文件中可以找到类似以下的结果。
```text
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.350
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.508
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.387
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.133
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.365
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.517
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.304
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.415
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.417
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.151
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.433
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.614
========================================
mAP: 0.35043225294034314
```
## [模型说明](#content)
### [性能](#content)
#### 训练性能
| 参数 | Ascend | GPU |
| --------------- | ------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| 模型名称 | Retinanet | Retinanet |
| 运行环境 | Ascend 910;CPU 2.6GHz,192cores;Memory 755G;系统 Euler2.8 | Rtx3090;Memory 512G |
| 上传时间 | 10/01/2021 | 17/02/2022 |
| MindSpore 版本 | 1.2.0 | 1.5.0 |
| 数据集 | 123287 张图片 | 123287 张图片 |
| Batch_size | 32 | 32 |
| 训练参数 | src/config.py | config/default_config_gpu.yaml |
| 优化器 | Momentum | Momentum |
| 损失函数 | Focal loss | Focal loss |
| 最终损失 | 0.582 | 0.57 |
| 精确度 (8p) | mAP[0.3475] | mAP[0.3499] |
| 训练总时间 (8p) | 23h16m54s | 51h39m6s |
| 脚本 | [链接](https://gitee.com/mindspore/models/tree/master/official/cv/retinanet) | [链接](https://gitee.com/mindspore/models/tree/master/official/cv/retinanet) |
| 参数 | Ascend |GPU|
| -------------------------- | ------------------------------------- |------------------------------------- |
| 模型名称 | Retinanet |Retinanet |
| 运行环境 | Ascend 910;CPU 2.6GHz,192cores;Memory 755G;系统 Euler2.8 | Rtx3090;Memory 512G |
| 上传时间 | 10/01/2021 |17/02/2022 |
| MindSpore 版本 | 1.2.0 |1.5.0|
| 数据集 | 123287 张图片 |123287 张图片 |
| Batch_size | 32 |32 |
| 训练参数 | src/config.py |config/default_config_gpu.yaml
| 优化器 | Momentum |Momentum |
| 损失函数 | Focal loss |Focal loss |
| 最终损失 | 0.582 |0.57|
| 精确度 (8p) | mAP[0.3475] |mAP[0.3499] |
| 训练总时间 (8p) | 23h16m54s |51h39m6s|
| 脚本 | [链接](https://gitee.com/mindspore/models/tree/master/official/cv/retinanet) |[链接](https://gitee.com/mindspore/models/tree/master/official/cv/retinanet) |
#### 推理性能
| 参数 | Ascend | GPU |
| -------------- | ------------------------------------------------------------ | ---------------------- |
| 模型名称 | Retinanet | Retinanet |
| 运行环境 | Ascend 910;CPU 2.6GHz,192cores;Memory 755G;系统 Euler2.8 | Rtx3090;Memory 512G |
| 上传时间 | 10/01/2021 | 17/02/2022 |
| MindSpore 版本 | 1.2.0 | 1.5.0 |
| 数据集 | 5k 张图片 | 5k 张图片 |
| Batch_size | 32 | 32 |
| 精确度 | mAP[0.3475] | mAP[0.3499] |
| 总时间 | 10 mins and 50 seconds | 13 mins and 40 seconds |
| 参数 | Ascend |GPU|
| ------------------- | --------------------------- |--|
| 模型名称 | Retinanet |Retinanet |
| 运行环境 | Ascend 910;CPU 2.6GHz,192cores;Memory 755G;系统 Euler2.8|Rtx3090;Memory 512G |
| 上传时间 | 10/01/2021 |17/02/2022 |
| MindSpore 版本 | 1.2.0 |1.5.0|
| 数据集 | 5k 张图片 |5k 张图片 |
| Batch_size | 32 |32 |
| 精确度 | mAP[0.3475] |mAP[0.3499] |
| 总时间 | 10 mins and 50 seconds |13 mins and 40 seconds |
## [随机情况的描述](#content)
......@@ -543,3 +512,125 @@ mAP: 0.35043225294034314
## [ModelZoo 主页](#content)
请核对官方 [主页](https://gitee.com/mindspore/models).
## [迁移学习](#content)
### [迁移学习训练流程](#content)
#### 数据集处理
[数据集下载地址](https://www.kaggle.com/datasets/andrewmvd/face-mask-detection)
下载数据集后解压至retinanet根目录下,使用data_split脚本划分出80%的训练集和20%的测试集
```bash
运行脚本示例
python data_split.py
```
```text
数据集结构
└─dataset
├─train
├─val
├─annotation
```
```text
训练前,先创建MindRecord文件,以face_mask_detection数据集为例,yaml文件配置好facemask数据集路径和mindrecord存储路径
# your dataset dir
dataset_root: /home/mindspore/retinanet/dataset/
# mindrecord dataset dir
mindrecord_dir: /home/mindspore/retinanet/mindrecord
```
```bash
# 生成训练数据集
python create_data.py --config_path
(例如:python create_data.py --config_path './config/finetune_config.yaml')
# 生成测试数据集
测试数据集可以在训练完成由eval脚本自动生成
```
#### 迁移学习训练过程
需要先从[Mindspore Hub](https://www.mindspore.cn/resources/hub/details?MindSpore/1.8/retinanet_coco2017)下载预训练的ckpt
```text
# 在finetune_config.yaml设置预训练模型的ckpt
pre_trained: "/home/mindspore/retinanet/retinanet_ascend_v170_coco2017_official_cv_acc35.ckpt"
```
```bash
#运行迁移学习训练脚本
python train.py --config_path './config/finetune_config.yaml'
如果需要保存日志信息,可使用如下命令:
python train.py --config_path ./config/finetune_config.yaml > log.txt 2>&1
```
**结果展示**
训练结果将存储在示例路径中。checkpoint将存储在 `./ckpt` 路径下,训练loss输出示例如下:
```text
epoch: 1 step: 42, loss is 4.347288131713867
lr:[0.000088]
Train epoch time: 992053.072 ms, per step time: 23620.311 ms
Epoch time: 164034.415, per step time: 358.154
epoch: 3 step: 42, loss is 1.8387094736099243
lr:[0.000495]
Train epoch time: 738396.280 ms, per step time: 17580.864 ms
epoch: 4 step: 42, loss is 1.3805917501449585
lr:[0.000695]
Train epoch time: 742051.709 ms, per step time: 17667.898 ms
```
#### 迁移学习推理过程
```bash
#运行迁移学习训练脚本
python eval.py --config_path './config/finetune_config.yaml'
```
**结果展示**
```text
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.538
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.781
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.634
Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.420
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.687
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.856
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.284
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.570
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.574
Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.448
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.737
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.872
========================================
mAP: 0.5376701115352185
```
#### 迁移学习quick_start
运行eval脚本后,会生成`instances_val.json``predictions.json`文件,需要修改`quick_start.py`脚本中`instances_val.json``predictions.json`文件的路径后再运行
```bash
# 运行quick_start脚本示例
python quick_start.py --config_path './config/finetune_config.yaml'
```
**结果说明**
图中颜色的含义分别是:
- 浅蓝: 真实标签的mask_weared_incorrect
- 浅绿: 真实标签的with_mask
- 浅红: 真实标签的without_mask
- 蓝色: 预测标签的mask_weared_incorrect
- 绿色: 预测标签的with_mask
- 红色: 预测标签的without_mask
# Builtin Configurations(DO NOT CHANGE THESE CONFIGURATIONS unlesee you know exactly what you are doing)
enable_modelarts: False
# url for modelarts
data_url: ""
train_url: ""
checkpoint_url: ""
# path for local
data_path: "./data"
output_path: "./train"
load_path: ""
#device_target: "Ascend"
device_target: "CPU"
enable_profiling: False
need_modelarts_dataset_unzip: False
modelarts_dataset_unzip_name: "MindRecord_COCO"
# ======================================================================================
# common options
distribute: False
# ======================================================================================
# create dataset
create_dataset: "facemask"
prefix: "retinanet.mindrecord"
is_training: True
python_multiprocessing: False
# ======================================================================================
# Training options
img_shape: [600,600]
num_retinanet_boxes: 67995
match_thershold: 0.5
nms_thershold: 0.6
min_score: 0.1
max_boxes: 100
# learning rate settings
lr: 0.009
global_step: 0
lr_init: 1e-5
lr_end_rate: 5e-4
warmup_epochs1: 0
warmup_epochs2: 1
warmup_epochs3: 4
warmup_epochs4: 12
warmup_epochs5: 30
momentum: 0.9
weight_decay: 1.5e-4
# network
num_default: [9, 9, 9, 9, 9]
extras_out_channels: [256, 256, 256, 256, 256]
feature_size: [75, 38, 19, 10, 5]
aspect_ratios: [[0.5, 1.0, 2.0], [0.5, 1.0, 2.0], [0.5, 1.0, 2.0], [0.5, 1.0, 2.0], [0.5, 1.0, 2.0]]
steps: [8, 16, 32, 64, 128]
anchor_size: [32, 64, 128, 256, 512]
prior_scaling: [0.1, 0.2]
gamma: 2.0
alpha: 0.75
num_classes: 4
# `mindrecord_dir` and `coco_root` are better to use absolute path.
mindrecord_dir: "./mindrecord"
dataset_root: "./dataset"
train_data_type: "train"
val_data_type: "val"
instances_set: "annotation/instances_{}.json"
coco_classes: ["background","mask_weared_incorrect", "with_mask", "without_mask"]
# The annotation.json position of voc validation dataset
voc_root: "./dataset"
facemask_root: "./dataset"
# voc original dataset
voc_dir: "./dataset"
facemask_dir: "./dataset"
# if coco or voc used, `image_dir` and `anno_path` are useless
image_dir: ""
anno_path: ""
save_checkpoint: True
save_checkpoint_epochs: 1
keep_checkpoint_max: 10
save_checkpoint_path: "./ckpt"
finish_epoch: 0
# optimiter options
workers: 8
mode: "sink"
epoch_size: 95
batch_size: 16
pre_trained: "/home/mindspore/retinanet/retinanet_ascend_v170_coco2017_official_cv_acc35.ckpt"
pre_trained_epoch_size: 90
loss_scale: 200
filter_weight: True
finetune: True
# ======================================================================================
# Eval options
dataset: "facemask"
checkpoint_path: "./ckpt/retinanet_1-95_42.ckpt"
# ======================================================================================
# export options
device_id: 0
file_format: "MINDIR"
export_batch_size: 1
file_name: "retinanet"
# ======================================================================================
# postprocess options
result_path: ""
img_path: ""
img_id_file: ""
---
# Help description for each configuration
enable_modelarts: "Whether training on modelarts default: False"
data_url: "Url for modelarts"
train_url: "Url for modelarts"
data_path: "The location of input data"
output_pah: "The location of the output file"
device_target: "device id of GPU or Ascend. (Default: None)"
enable_profiling: "Whether enable profiling while training default: False"
workers: "Num parallel workers."
lr: "Learning rate, default is 0.1."
mode: "Run sink mode or not, default is sink."
epoch_size: "Epoch size, default is 500."
batch_size: "Batch size, default is 32."
pre_trained: "Pretrained Checkpoint file path."
pre_trained_epoch_size: "Pretrained epoch size."
save_checkpoint_epochs: "Save checkpoint epochs, default is 1."
loss_scale: "Loss scale, default is 1024."
filter_weight: "Filter weight parameters, default is False."
dataset: "Dataset, default is coco."
device_id: "Device id, default is 0."
file_format: "file format choices [AIR, MINDIR]"
file_name: "output file name."
export_batch_size: "batch size"
result_path: "result file path."
img_path: "image file path."
img_id_file: "image id file."
maksssksksss304
maksssksksss311
maksssksksss6
maksssksksss479
maksssksksss231
maksssksksss180
maksssksksss485
maksssksksss557
maksssksksss290
maksssksksss435
maksssksksss703
maksssksksss827
maksssksksss129
maksssksksss635
maksssksksss5
maksssksksss559
maksssksksss412
maksssksksss235
maksssksksss80
maksssksksss312
maksssksksss810
maksssksksss65
maksssksksss179
maksssksksss823
maksssksksss770
maksssksksss279
maksssksksss433
maksssksksss68
maksssksksss423
maksssksksss246
maksssksksss72
maksssksksss769
maksssksksss287
maksssksksss817
maksssksksss551
maksssksksss831
maksssksksss742
maksssksksss509
maksssksksss153
maksssksksss760
maksssksksss232
maksssksksss452
maksssksksss402
maksssksksss841
maksssksksss343
maksssksksss754
maksssksksss144
maksssksksss546
maksssksksss143
maksssksksss344
maksssksksss115
maksssksksss40
maksssksksss467
maksssksksss320
maksssksksss220
maksssksksss106
maksssksksss360
maksssksksss591
maksssksksss151
maksssksksss191
maksssksksss768
maksssksksss211
maksssksksss254
maksssksksss470
maksssksksss372
maksssksksss594
maksssksksss150
maksssksksss379
maksssksksss533
maksssksksss730
maksssksksss271
maksssksksss339
maksssksksss613
maksssksksss465
maksssksksss101
maksssksksss634
maksssksksss364
maksssksksss397
maksssksksss161
maksssksksss458
maksssksksss583
maksssksksss783
maksssksksss700
maksssksksss193
maksssksksss60
maksssksksss328
maksssksksss299
maksssksksss112
maksssksksss720
maksssksksss371
maksssksksss346
maksssksksss99
maksssksksss385
maksssksksss182
maksssksksss718
maksssksksss166
maksssksksss369
maksssksksss650
maksssksksss575
maksssksksss210
maksssksksss242
maksssksksss53
maksssksksss787
maksssksksss87
maksssksksss838
maksssksksss431
maksssksksss156
maksssksksss125
maksssksksss274
maksssksksss582
maksssksksss336
maksssksksss209
maksssksksss599
maksssksksss499
maksssksksss54
maksssksksss713
maksssksksss812
maksssksksss181
maksssksksss398
maksssksksss520
maksssksksss498
maksssksksss269
maksssksksss744
maksssksksss100
maksssksksss155
maksssksksss565
maksssksksss159
maksssksksss534
maksssksksss692
maksssksksss306
maksssksksss300
maksssksksss654
maksssksksss47
maksssksksss729
maksssksksss609
maksssksksss98
maksssksksss846
maksssksksss679
maksssksksss142
maksssksksss704
maksssksksss597
maksssksksss266
maksssksksss111
maksssksksss669
maksssksksss177
maksssksksss736
maksssksksss523
maksssksksss419
maksssksksss672
maksssksksss49
maksssksksss123
maksssksksss316
maksssksksss35
maksssksksss31
maksssksksss538
maksssksksss821
maksssksksss794
maksssksksss445
maksssksksss282
maksssksksss365
maksssksksss624
maksssksksss788
maksssksksss614
maksssksksss711
maksssksksss775
maksssksksss510
maksssksksss250
maksssksksss767
maksssksksss622
maksssksksss74
maksssksksss313
maksssksksss302
maksssksksss747
maksssksksss542
maksssksksss58
maksssksksss107
maksssksksss800
maksssksksss27
maksssksksss118
maksssksksss217
maksssksksss464
maksssksksss386
maksssksksss592
maksssksksss76
maksssksksss749
maksssksksss244
maksssksksss641
maksssksksss491
maksssksksss356
maksssksksss260
maksssksksss836
maksssksksss719
maksssksksss381
maksssksksss199
maksssksksss685
maksssksksss61
maksssksksss640
maksssksksss34
maksssksksss573
maksssksksss439
maksssksksss502
maksssksksss48
maksssksksss0
maksssksksss105
maksssksksss653
maksssksksss513
maksssksksss46
maksssksksss496
maksssksksss252
maksssksksss756
maksssksksss598
maksssksksss503
maksssksksss705
maksssksksss495
maksssksksss114
maksssksksss798
maksssksksss24
maksssksksss411
maksssksksss626
maksssksksss665
maksssksksss213
maksssksksss92
maksssksksss497
maksssksksss443
maksssksksss476
maksssksksss78
maksssksksss317
maksssksksss103
maksssksksss396
maksssksksss442
maksssksksss505
maksssksksss521
maksssksksss585
maksssksksss247
maksssksksss446
maksssksksss368
maksssksksss579
maksssksksss514
maksssksksss425
maksssksksss238
maksssksksss531
maksssksksss261
maksssksksss709
maksssksksss690
maksssksksss701
maksssksksss772
maksssksksss643
maksssksksss204
maksssksksss668
maksssksksss354
maksssksksss671
maksssksksss126
maksssksksss327
maksssksksss4
maksssksksss349
maksssksksss795
maksssksksss140
maksssksksss586
maksssksksss295
maksssksksss222
maksssksksss822
maksssksksss791
maksssksksss239
maksssksksss779
maksssksksss197
maksssksksss228
maksssksksss563
maksssksksss777
maksssksksss689
maksssksksss293
maksssksksss681
maksssksksss484
maksssksksss285
maksssksksss830
maksssksksss276
maksssksksss590
maksssksksss212
maksssksksss352
maksssksksss847
maksssksksss617
maksssksksss721
maksssksksss796
maksssksksss663
maksssksksss89
maksssksksss621
maksssksksss265
maksssksksss172
maksssksksss82
maksssksksss75
maksssksksss815
maksssksksss294
maksssksksss8
maksssksksss407
maksssksksss405
maksssksksss471
maksssksksss473
maksssksksss544
maksssksksss422
maksssksksss79
maksssksksss154
maksssksksss387
maksssksksss811
maksssksksss226
maksssksksss2
maksssksksss255
maksssksksss121
maksssksksss852
maksssksksss307
maksssksksss62
maksssksksss149
maksssksksss577
maksssksksss615
maksssksksss803
maksssksksss560
maksssksksss673
maksssksksss581
maksssksksss589
maksssksksss288
maksssksksss472
maksssksksss259
maksssksksss684
maksssksksss481
maksssksksss73
maksssksksss38
maksssksksss670
maksssksksss418
maksssksksss141
maksssksksss776
maksssksksss120
maksssksksss176
maksssksksss429
maksssksksss175
maksssksksss807
maksssksksss432
maksssksksss102
maksssksksss451
maksssksksss205
maksssksksss64
maksssksksss131
maksssksksss171
maksssksksss127
maksssksksss697
maksssksksss128
maksssksksss45
maksssksksss462
maksssksksss41
maksssksksss620
maksssksksss605
maksssksksss198
maksssksksss146
maksssksksss556
maksssksksss200
maksssksksss716
maksssksksss708
maksssksksss819
maksssksksss580
maksssksksss221
maksssksksss138
maksssksksss383
maksssksksss734
maksssksksss168
maksssksksss816
maksssksksss52
maksssksksss647
maksssksksss826
maksssksksss676
maksssksksss415
maksssksksss629
maksssksksss455
maksssksksss724
maksssksksss454
maksssksksss694
maksssksksss404
maksssksksss529
maksssksksss348
maksssksksss377
maksssksksss536
maksssksksss623
maksssksksss753
maksssksksss469
maksssksksss28
maksssksksss687
maksssksksss183
maksssksksss660
maksssksksss447
maksssksksss43
maksssksksss801
maksssksksss438
maksssksksss391
maksssksksss39
maksssksksss436
maksssksksss764
maksssksksss548
maksssksksss33
maksssksksss487
maksssksksss541
maksssksksss426
maksssksksss361
maksssksksss851
maksssksksss532
maksssksksss202
maksssksksss324
maksssksksss223
maksssksksss839
maksssksksss196
maksssksksss508
maksssksksss113
maksssksksss263
maksssksksss237
maksssksksss738
maksssksksss395
maksssksksss603
maksssksksss611
maksssksksss342
maksssksksss357
maksssksksss178
maksssksksss848
maksssksksss315
maksssksksss727
maksssksksss173
maksssksksss403
maksssksksss417
maksssksksss225
maksssksksss298
maksssksksss771
maksssksksss695
maksssksksss666
maksssksksss384
maksssksksss525
maksssksksss362
maksssksksss427
maksssksksss825
maksssksksss340
maksssksksss408
maksssksksss743
maksssksksss273
maksssksksss698
maksssksksss434
maksssksksss482
maksssksksss608
maksssksksss828
maksssksksss170
maksssksksss558
maksssksksss488
maksssksksss799
maksssksksss658
maksssksksss50
maksssksksss530
maksssksksss524
maksssksksss607
maksssksksss19
maksssksksss227
maksssksksss518
maksssksksss351
maksssksksss284
maksssksksss376
maksssksksss390
maksssksksss782
maksssksksss793
maksssksksss486
maksssksksss394
maksssksksss414
maksssksksss303
maksssksksss850
maksssksksss258
maksssksksss382
maksssksksss774
maksssksksss256
maksssksksss334
maksssksksss117
maksssksksss601
maksssksksss595
maksssksksss766
maksssksksss331
maksssksksss84
maksssksksss657
maksssksksss707
maksssksksss725
maksssksksss460
maksssksksss547
maksssksksss430
maksssksksss428
maksssksksss494
maksssksksss501
maksssksksss528
maksssksksss638
maksssksksss194
maksssksksss814
maksssksksss201
maksssksksss91
maksssksksss535
maksssksksss696
maksssksksss122
maksssksksss675
maksssksksss834
maksssksksss16
maksssksksss748
maksssksksss17
maksssksksss137
maksssksksss169
maksssksksss157
maksssksksss130
maksssksksss97
maksssksksss792
maksssksksss11
maksssksksss292
maksssksksss189
maksssksksss20
maksssksksss55
maksssksksss478
maksssksksss308
maksssksksss844
maksssksksss132
maksssksksss18
maksssksksss353
maksssksksss587
maksssksksss77
maksssksksss81
maksssksksss70
maksssksksss248
maksssksksss576
maksssksksss627
maksssksksss489
maksssksksss540
maksssksksss527
maksssksksss190
maksssksksss566
maksssksksss648
maksssksksss251
maksssksksss512
maksssksksss67
maksssksksss51
maksssksksss569
maksssksksss29
maksssksksss309
maksssksksss840
maksssksksss319
maksssksksss733
maksssksksss187
maksssksksss506
maksssksksss268
maksssksksss270
maksssksksss219
maksssksksss283
maksssksksss835
maksssksksss374
maksssksksss740
maksssksksss69
maksssksksss262
maksssksksss236
maksssksksss214
maksssksksss490
maksssksksss759
maksssksksss230
maksssksksss459
maksssksksss568
maksssksksss596
maksssksksss37
maksssksksss71
maksssksksss165
maksssksksss570
maksssksksss642
maksssksksss842
maksssksksss325
maksssksksss763
maksssksksss564
maksssksksss735
maksssksksss281
maksssksksss388
maksssksksss752
maksssksksss57
maksssksksss824
maksssksksss572
maksssksksss802
maksssksksss780
maksssksksss618
maksssksksss765
maksssksksss784
maksssksksss543
maksssksksss332
maksssksksss400
maksssksksss731
maksssksksss457
maksssksksss440
maksssksksss667
maksssksksss550
maksssksksss7
maksssksksss88
maksssksksss683
maksssksksss366
maksssksksss655
maksssksksss682
maksssksksss466
maksssksksss21
maksssksksss240
maksssksksss755
maksssksksss483
maksssksksss843
maksssksksss578
maksssksksss184
maksssksksss275
maksssksksss833
maksssksksss804
maksssksksss399
maksssksksss820
maksssksksss593
maksssksksss162
maksssksksss549
maksssksksss410
maksssksksss691
maksssksksss253
maksssksksss66
maksssksksss715
maksssksksss124
maksssksksss604
maksssksksss659
maksssksksss164
maksssksksss633
maksssksksss305
maksssksksss739
maksssksksss552
maksssksksss109
maksssksksss152
maksssksksss245
maksssksksss448
maksssksksss94
maksssksksss337
maksssksksss688
maksssksksss728
maksssksksss1
maksssksksss453
maksssksksss504
maksssksksss335
maksssksksss389
maksssksksss286
maksssksksss93
maksssksksss367
maksssksksss741
maksssksksss188
maksssksksss463
maksssksksss500
maksssksksss370
maksssksksss373
maksssksksss380
maksssksksss218
maksssksksss686
maksssksksss750
maksssksksss321
maksssksksss516
maksssksksss322
maksssksksss761
maksssksksss257
maksssksksss63
maksssksksss845
maksssksksss359
maksssksksss519
maksssksksss23
maksssksksss229
maksssksksss714
maksssksksss562
maksssksksss10
maksssksksss233
maksssksksss409
maksssksksss264
maksssksksss329
maksssksksss289
maksssksksss646
maksssksksss36
maksssksksss797
maksssksksss330
maksssksksss849
maksssksksss318
maksssksksss805
maksssksksss139
maksssksksss545
maksssksksss134
maksssksksss474
maksssksksss174
maksssksksss86
maksssksksss280
maksssksksss644
maksssksksss449
maksssksksss461
maksssksksss314
maksssksksss456
maksssksksss203
maksssksksss185
maksssksksss751
maksssksksss85
maksssksksss758
maksssksksss680
maksssksksss652
maksssksksss249
maksssksksss781
maksssksksss167
maksssksksss416
maksssksksss539
maksssksksss722
maksssksksss808
maksssksksss600
maksssksksss207
maksssksksss135
maksssksksss25
maksssksksss674
maksssksksss610
maksssksksss406
maksssksksss186
maksssksksss441
maksssksksss413
maksssksksss277
maksssksksss710
maksssksksss363
maksssksksss444
maksssksksss116
maksssksksss12
maksssksksss350
maksssksksss420
maksssksksss136
maksssksksss30
maksssksksss706
maksssksksss631
maksssksksss517
maksssksksss637
maksssksksss636
maksssksksss818
maksssksksss699
maksssksksss378
maksssksksss693
maksssksksss492
maksssksksss661
maksssksksss192
maksssksksss14
maksssksksss345
maksssksksss625
maksssksksss567
maksssksksss145
maksssksksss243
maksssksksss301
maksssksksss341
maksssksksss790
maksssksksss326
maksssksksss278
maksssksksss468
maksssksksss522
maksssksksss216
maksssksksss32
maksssksksss726
maksssksksss13
maksssksksss555
maksssksksss160
maksssksksss477
maksssksksss554
maksssksksss56
maksssksksss746
maksssksksss493
maksssksksss310
maksssksksss809
maksssksksss26
maksssksksss553
maksssksksss612
maksssksksss110
maksssksksss9
maksssksksss475
maksssksksss737
maksssksksss338
maksssksksss662
maksssksksss829
maksssksksss272
maksssksksss215
maksssksksss450
maksssksksss375
maksssksksss574
maksssksksss507
maksssksksss323
maksssksksss702
maksssksksss392
maksssksksss732
maksssksksss537
maksssksksss333
maksssksksss108
maksssksksss561
maksssksksss678
maksssksksss757
maksssksksss104
maksssksksss515
maksssksksss639
maksssksksss347
maksssksksss158
maksssksksss355
maksssksksss588
maksssksksss806
maksssksksss206
maksssksksss393
maksssksksss83
maksssksksss571
maksssksksss22
maksssksksss42
maksssksksss3
maksssksksss649
maksssksksss44
maksssksksss656
maksssksksss480
maksssksksss224
maksssksksss526
maksssksksss778
maksssksksss723
maksssksksss119
maksssksksss195
maksssksksss712
maksssksksss133
maksssksksss297
maksssksksss786
maksssksksss762
maksssksksss437
maksssksksss745
maksssksksss606
maksssksksss59
maksssksksss241
maksssksksss616
maksssksksss664
maksssksksss15
maksssksksss584
maksssksksss773
maksssksksss96
maksssksksss163
maksssksksss837
maksssksksss421
maksssksksss511
maksssksksss291
maksssksksss717
maksssksksss785
maksssksksss632
maksssksksss630
maksssksksss234
maksssksksss832
maksssksksss677
maksssksksss602
maksssksksss147
maksssksksss358
maksssksksss401
maksssksksss628
maksssksksss424
maksssksksss789
maksssksksss95
maksssksksss208
maksssksksss645
maksssksksss148
maksssksksss90
maksssksksss651
maksssksksss813
maksssksksss619
maksssksksss267
......@@ -24,7 +24,8 @@ from pycocotools.cocoeval import COCOeval
from mindspore import context, Tensor
from mindspore.train.serialization import load_checkpoint, load_param_into_net
from src.retinanet import retinanet50, resnet50, retinanetInferWithDecoder
from src.dataset import create_retinanet_dataset, data_to_mindrecord_byte_image, voc_data_to_mindrecord
from src.dataset import create_retinanet_dataset, data_to_mindrecord_byte_image, voc_data_to_mindrecord, \
facemask_data_to_mindrecord
from src.box_utils import default_boxes
from src.model_utils.config import config
from src.model_utils.moxing_adapter import moxing_wrapper
......@@ -69,6 +70,8 @@ def apply_nms(all_boxes, all_scores, thres, max_boxes):
def make_dataset_dir(mindrecord_dir, mindrecord_file, prefix):
if config.dataset == "voc":
config.coco_root = config.voc_root
if config.dataset == 'facemask':
config.coco_root = config.facemask_root
if not os.path.exists(mindrecord_file):
if not os.path.isdir(mindrecord_dir):
os.makedirs(mindrecord_dir)
......@@ -86,6 +89,13 @@ def make_dataset_dir(mindrecord_dir, mindrecord_file, prefix):
print("Create Mindrecord Done, at {}".format(mindrecord_dir))
else:
print("voc_root or voc_dir not exits.")
elif config.dataset == 'facemask':
if os.path.isdir(config.facemask_dir) and os.path.isdir(config.facemask_root):
print("Create Mindrecord.")
facemask_data_to_mindrecord(mindrecord_dir, False, prefix)
print("Create Mindrecord Done, at {}".format(mindrecord_dir))
else:
print("facemask_root or facemask_dir not exits.")
else:
if os.path.isdir(config.image_dir) and os.path.exists(config.anno_path):
print("Create Mindrecord.")
......@@ -98,6 +108,7 @@ def make_dataset_dir(mindrecord_dir, mindrecord_file, prefix):
def modelarts_pre_process():
'''modelarts pre process function.'''
def unzip(zip_file, save_dir):
import zipfile
s_time = time.time()
......@@ -150,7 +161,6 @@ def modelarts_pre_process():
@moxing_wrapper(pre_process=modelarts_pre_process)
def retinanet_eval():
context.set_context(mode=context.GRAPH_MODE, device_target=config.device_target, device_id=get_device_id())
prefix = "retinanet_eval.mindrecord"
mindrecord_dir = config.mindrecord_dir
......@@ -179,7 +189,7 @@ def retinanet_eval():
num_classes = config.num_classes
coco_root = config.coco_root
data_type = config.val_data_type
#Classes need to train or test.
# Classes need to train or test.
val_cls = config.coco_classes
val_cls_dict = {}
for i, cls in enumerate(val_cls):
......
# Copyright 2022 Huawei Technologies Co., Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============================================================================
"""visualize for retinanet"""
import os
import cv2
import matplotlib.pyplot as plt
from pycocotools.coco import COCO
from src.model_utils.config import config
def visualize_model():
# load best ckpt to generate instances_val.json and predictions.json
dataset_dir = r'./dataset/val/images/'
coco_root = config.voc_root
data_type = config.val_data_type
annotation_file = os.path.join(coco_root, config.instances_set.format(data_type))
coco = COCO(annotation_file)
catids = coco.getCatIds()
imgids = coco.getImgIds()
coco_res = coco.loadRes('./predictions.json')
catids_res = coco_res.getCatIds()
for i in range(10):
img = coco.loadImgs(imgids[i])[0]
image = cv2.imread(dataset_dir + img['file_name'])
image_res = image
annids = coco.getAnnIds(imgIds=img['id'], catIds=catids, iscrowd=None)
annos = coco.loadAnns(annids)
annids_res = coco_res.getAnnIds(imgIds=img['id'], catIds=catids_res, iscrowd=None)
annos_res = coco_res.loadAnns(annids_res)
plt.figure(figsize=(7, 7))
for anno in annos:
bbox = anno['bbox']
x, y, w, h = bbox
if anno['category_id'] == 1:
anno_image = cv2.rectangle(image, (int(x), int(y)), (int(x + w), int(y + h)), (153, 153, 255), 2)
elif anno['category_id'] == 2:
anno_image = cv2.rectangle(image, (int(x), int(y)), (int(x + w), int(y + h)), (153, 255, 153), 2)
else:
anno_image = cv2.rectangle(image, (int(x), int(y)), (int(x + w), int(y + h)), (255, 153, 153), 2)
plt.subplot(1, 2, 1)
plt.plot([-2, 3], [1, 5])
plt.title('true-label')
plt.imshow(anno_image)
for anno_res in annos_res:
bbox_res = anno_res['bbox']
x, y, w, h = bbox_res
if anno_res['category_id'] == 1:
res_image = cv2.rectangle(image_res, (int(x), int(y)), (int(x + w), int(y + h)), (0, 0, 255), 2)
elif anno_res['category_id'] == 2:
res_image = cv2.rectangle(image_res, (int(x), int(y)), (int(x + w), int(y + h)), (0, 153, 0), 2)
else:
res_image = cv2.rectangle(image_res, (int(x), int(y)), (int(x + w), int(y + h)), (255, 0, 0), 2)
plt.subplot(1, 2, 2)
plt.title('pred-label')
plt.imshow(res_image)
plt.show()
if __name__ == '__main__':
visualize_model()
# Copyright 2022 Huawei Technologies Co., Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ============================================================================
"""data_split"""
import os
import shutil
image_original_path = '../images/'
label_original_path = '../annotations/'
train_image_path = '../dataset/train/images/'
train_label_path = '../dataset/train/annotations/'
val_image_path = '../dataset/val/images/'
val_label_path = '../dataset/val/annotations/'
def mkdir():
if not os.path.exists(train_image_path):
os.makedirs(train_image_path)
if not os.path.exists(train_label_path):
os.makedirs(train_label_path)
if not os.path.exists(val_image_path):
os.makedirs(val_image_path)
if not os.path.exists(val_label_path):
os.makedirs(val_label_path)
def main():
mkdir()
with open("./data/facemask/train.txt", 'r') as f:
for line in f:
dst_train_image = train_image_path + line[:-1] + '.jpg'
dst_train_label = train_label_path + line[:-1] + '.xml'
shutil.copyfile(image_original_path + line[:-1] + '.png', dst_train_image)
shutil.copyfile(label_original_path + line[:-1] + '.xml', dst_train_label)
with open("./data/facemask/val.txt", 'r') as f:
for line in f:
dst_val_image = val_image_path + line[:-1] + '.jpg'
dst_val_label = val_label_path + line[:-1] + '.xml'
shutil.copyfile(image_original_path + line[:-1] + '.png', dst_val_image)
shutil.copyfile(label_original_path + line[:-1] + ".xml", dst_val_label)
if __name__ == '__main__':
main()
......@@ -19,6 +19,7 @@ from __future__ import division
import os
import json
import re
import xml.etree.ElementTree as et
import numpy as np
import cv2
......@@ -42,6 +43,17 @@ def get_imageId_from_fileName(filename):
return id_iter
def get_imageId_from_fackmask(filename):
"""Get imageID from fileName"""
filename = os.path.splitext(filename)[0]
regex = re.compile(r'\d+')
iid = regex.search(filename).group(0)
image_id = int(iid)
if filename.isdigit():
return int(filename)
return image_id
def random_sample_crop(image, boxes):
"""Random Crop the image and boxes"""
height, width, _ = image.shape
......@@ -104,6 +116,7 @@ def random_sample_crop(image, boxes):
def preprocess_fn(img_id, image, box, is_training):
"""Preprocess function for dataset."""
cv2.setNumThreads(2)
def _infer_data(image, input_shape):
img_h, img_w, _ = image.shape
input_h, input_w = input_shape
......@@ -246,6 +259,98 @@ def create_voc_label(is_training):
return images, image_files_dict, image_anno_dict
def create_facemask_label(is_training):
"""Get image path and annotation from VOC."""
facemask_dir = config.voc_dir
cls_map = {name: i for i, name in enumerate(config.coco_classes)}
sub_dir = 'train' if is_training else 'val'
facemask_dir = os.path.join(facemask_dir, sub_dir)
if not os.path.isdir(facemask_dir):
raise ValueError(f'Cannot find {sub_dir} dataset path.')
image_dir = anno_dir = facemask_dir
if os.path.isdir(os.path.join(facemask_dir, 'images')):
image_dir = os.path.join(facemask_dir, 'images')
if os.path.isdir(os.path.join(facemask_dir, 'annotations')):
anno_dir = os.path.join(facemask_dir, 'annotations')
if not is_training:
data_dir = config.facemask_root
json_file = os.path.join(data_dir, config.instances_set.format(sub_dir))
file_dir = os.path.split(json_file)[0]
if not os.path.isdir(file_dir):
os.makedirs(file_dir)
json_dict = {"images": [], "type": "instances", "annotations": [],
"categories": []}
bnd_id = 1
image_files_dict = {}
image_anno_dict = {}
images = []
for anno_file in os.listdir(anno_dir):
print(anno_file)
if not anno_file.endswith('xml'):
continue
tree = et.parse(os.path.join(anno_dir, anno_file))
root_node = tree.getroot()
file_name = root_node.find('filename').text
file_name = file_name.split('.')[0] + '.jpg'
img_id = get_imageId_from_fackmask(file_name)
image_path = os.path.join(image_dir, file_name)
print(image_path)
if not os.path.isfile(image_path):
print(f'Cannot find image {file_name} according to annotations.')
continue
labels = []
for obj in root_node.iter('object'):
cls_name = obj.find('name').text
if cls_name not in cls_map:
print(f'Label "{cls_name}" not in "{config.coco_classes}"')
continue
bnd_box = obj.find('bndbox')
x_min = int(float(bnd_box.find('xmin').text)) - 1
y_min = int(float(bnd_box.find('ymin').text)) - 1
x_max = int(float(bnd_box.find('xmax').text)) - 1
y_max = int(float(bnd_box.find('ymax').text)) - 1
labels.append([y_min, x_min, y_max, x_max, cls_map[cls_name]])
if not is_training:
o_width = abs(x_max - x_min)
o_height = abs(y_max - y_min)
ann = {'area': o_width * o_height, 'iscrowd': 0, 'image_id': \
img_id, 'bbox': [x_min, y_min, o_width, o_height], \
'category_id': cls_map[cls_name], 'id': bnd_id, \
'ignore': 0, \
'segmentation': []}
json_dict['annotations'].append(ann)
bnd_id = bnd_id + 1
if labels:
images.append(img_id)
image_files_dict[img_id] = image_path
image_anno_dict[img_id] = np.array(labels)
if not is_training:
size = root_node.find("size")
width = int(size.find('width').text)
height = int(size.find('height').text)
image = {'file_name': file_name, 'height': height, 'width': width,
'id': img_id}
json_dict['images'].append(image)
if not is_training:
for cls_name, cid in cls_map.items():
cat = {'supercategory': 'none', 'id': cid, 'name': cls_name}
json_dict['categories'].append(cat)
json_fp = open(json_file, 'w')
json_str = json.dumps(json_dict)
json_fp.write(json_str)
json_fp.close()
return images, image_files_dict, image_anno_dict
def create_coco_label(is_training):
"""Get image path and annotation from COCO."""
from pycocotools.coco import COCO
......@@ -359,6 +464,29 @@ def voc_data_to_mindrecord(mindrecord_dir, is_training, prefix="retinanet.mindre
writer.commit()
def facemask_data_to_mindrecord(mindrecord_dir, is_training, prefix="retinanet.mindrecord0", file_num=1):
mindrecord_path = os.path.join(mindrecord_dir, prefix + "0")
writer = FileWriter(mindrecord_path, file_num)
images, image_path_dict, image_anno_dict = create_facemask_label(is_training)
retinanet_json = {
"img_id": {"type": "int32", "shape": [1]},
"image": {"type": "bytes"},
"annotation": {"type": "int32", "shape": [-1, 5]},
}
writer.add_schema(retinanet_json, "retinanet_json")
for img_id in images:
image_path = image_path_dict[img_id]
with open(image_path, 'rb') as f:
img = f.read()
annos = np.array(image_anno_dict[img_id], dtype=np.int32)
img_id = np.array([img_id], dtype=np.int32)
row = {"img_id": img_id, "image": img, "annotation": annos}
writer.write_raw_data([row])
writer.commit()
def data_to_mindrecord_byte_image(dataset="coco", is_training=True, prefix="retinanet.mindrecord", file_num=8):
"""Create MindRecord file."""
mindrecord_dir = config.mindrecord_dir
......@@ -395,7 +523,6 @@ def create_retinanet_dataset(mindrecord_file, batch_size, repeat_num, device_num
decode = C.Decode()
ds = ds.map(operations=decode, input_columns=["image"])
change_swap_op = C.HWC2CHW()
# Computed from random subset of ImageNet training images
normalize_op = C.Normalize(mean=[0.485 * 255, 0.456 * 255, 0.406 * 255],
std=[0.229 * 255, 0.224 * 255, 0.225 * 255])
color_adjust_op = C.RandomColorAdjust(brightness=0.4, contrast=0.4, saturation=0.4)
......@@ -415,6 +542,7 @@ def create_retinanet_dataset(mindrecord_file, batch_size, repeat_num, device_num
ds = ds.batch(batch_size, drop_remainder=True)
return ds
def create_mindrecord(dataset="coco", prefix="retinanet.mindrecord", is_training=True):
print("Start create dataset!")
......@@ -440,6 +568,13 @@ def create_mindrecord(dataset="coco", prefix="retinanet.mindrecord", is_training
print("Create Mindrecord Done, at {}".format(mindrecord_dir))
else:
print("voc_dir not exits.")
elif dataset == "facemask":
if os.path.isdir(config.facemask_dir):
print("Create Mindrecord.")
facemask_data_to_mindrecord(mindrecord_dir, is_training, prefix)
print("Create Mindrecord Done, at {}".format(mindrecord_dir))
else:
print("voc_dir not exits.")
else:
if os.path.isdir(config.image_dir) and os.path.exists(config.anno_path):
print("Create Mindrecord.")
......
# Copyright 2021 Huawei Technologies Co., Ltd
# Copyright 2022 Huawei Technologies Co., Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
......@@ -14,7 +14,8 @@
# ============================================================================
"""Parameters utils"""
from mindspore.common.initializer import initializer, TruncatedNormal
from mindspore.common.initializer import initializer, TruncatedNormal, XavierUniform
def init_net_param(network, initialize_mode='TruncatedNormal'):
"""Init the parameters in net."""
......@@ -23,11 +24,12 @@ def init_net_param(network, initialize_mode='TruncatedNormal'):
if 'beta' not in p.name and 'gamma' not in p.name and 'bias' not in p.name:
if initialize_mode == 'TruncatedNormal':
p.set_data(initializer(TruncatedNormal(), p.data.shape, p.data.dtype))
elif initialize_mode == 'XavierUniform':
p.set_data(initializer(XavierUniform(), p.data.shape, p.data.dtype))
else:
p.set_data(initialize_mode, p.data.shape, p.data.dtype)
def filter_checkpoint_parameter(param_dict):
"""remove useless parameters"""
for key in list(param_dict.keys()):
......
# Copyright 2021 Huawei Technologies Co., Ltd
# Copyright 2022 Huawei Technologies Co., Ltd
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
......@@ -17,6 +17,7 @@
import math
import numpy as np
from src.model_utils.config import config
def get_lr(global_step, lr_init, lr_end, lr_max, warmup_epochs1, warmup_epochs2,
......@@ -43,26 +44,29 @@ def get_lr(global_step, lr_init, lr_end, lr_max, warmup_epochs1, warmup_epochs2,
warmup_steps3 = warmup_steps2 + steps_per_epoch * warmup_epochs3
warmup_steps4 = warmup_steps3 + steps_per_epoch * warmup_epochs4
warmup_steps5 = warmup_steps4 + steps_per_epoch * warmup_epochs5
step_radio = [1e-4, 1e-3, 1e-2, 0.1]
if config.finetune:
step_radio = [1e-4, 1e-2, 0.1, 1]
for i in range(total_steps):
if i < warmup_steps1:
lr = lr_init*(warmup_steps1-i) / (warmup_steps1) + \
(lr_max*1e-4) * i / (warmup_steps1*3)
lr = lr_init * (warmup_steps1 - i) / (warmup_steps1) + \
(lr_max * step_radio[0]) * i / (warmup_steps1 * 3)
elif warmup_steps1 <= i < warmup_steps2:
lr = 1e-5*(warmup_steps2-i) / (warmup_steps2 - warmup_steps1) + \
(lr_max*1e-3) * (i-warmup_steps1) / (warmup_steps2 - warmup_steps1)
lr = 1e-5 * (warmup_steps2 - i) / (warmup_steps2 - warmup_steps1) + \
(lr_max * step_radio[1]) * (i - warmup_steps1) / (warmup_steps2 - warmup_steps1)
elif warmup_steps2 <= i < warmup_steps3:
lr = 1e-4*(warmup_steps3-i) / (warmup_steps3 - warmup_steps2) + \
(lr_max*1e-2) * (i-warmup_steps2) / (warmup_steps3 - warmup_steps2)
lr = 1e-4 * (warmup_steps3 - i) / (warmup_steps3 - warmup_steps2) + \
(lr_max * step_radio[2]) * (i - warmup_steps2) / (warmup_steps3 - warmup_steps2)
elif warmup_steps3 <= i < warmup_steps4:
lr = 1e-3*(warmup_steps4-i) / (warmup_steps4 - warmup_steps3) + \
(lr_max*1e-1) * (i-warmup_steps3) / (warmup_steps4 - warmup_steps3)
lr = 1e-3 * (warmup_steps4 - i) / (warmup_steps4 - warmup_steps3) + \
(lr_max * step_radio[3]) * (i - warmup_steps3) / (warmup_steps4 - warmup_steps3)
elif warmup_steps4 <= i < warmup_steps5:
lr = 1e-2*(warmup_steps5-i) / (warmup_steps5 - warmup_steps4) + \
lr_max * (i-warmup_steps4) / (warmup_steps5 - warmup_steps4)
lr = 1e-2 * (warmup_steps5 - i) / (warmup_steps5 - warmup_steps4) + \
lr_max * (i - warmup_steps4) / (warmup_steps5 - warmup_steps4)
else:
lr = lr_end + \
(lr_max - lr_end) * \
(1. + math.cos(math.pi * (i-warmup_steps5) / (total_steps - warmup_steps5))) / 2.
(lr_max - lr_end) * \
(1. + math.cos(math.pi * (i - warmup_steps5) / (total_steps - warmup_steps5))) / 2.
if lr < 0.0:
lr = 0.0
lr_each_step.append(lr)
......
......@@ -181,7 +181,8 @@ class MultiBox(nn.Cell):
cls_layers = []
for k, out_channel in enumerate(out_channels):
loc_layers += [RegressionModel(in_channel=out_channel, num_anchors=num_default[k])]
cls_layers += [ClassificationModel(in_channel=out_channel, num_anchors=num_default[k])]
cls_layers += [ClassificationModel(in_channel=out_channel, num_anchors=num_default[k],
num_classes=config.num_classes)]
self.multi_loc_layers = nn.layer.CellList(loc_layers)
self.multi_cls_layers = nn.layer.CellList(cls_layers)
......
......@@ -32,7 +32,7 @@ from src.lr_schedule import get_lr
from src.init_params import init_net_param, filter_checkpoint_parameter
from src.model_utils.config import config
from src.model_utils.moxing_adapter import moxing_wrapper
from src.model_utils.device_adapter import get_device_id, get_device_num, get_rank_id
from src.model_utils.device_adapter import get_device_id, get_device_num
set_seed(1)
......@@ -58,11 +58,12 @@ class Monitor(Callback):
def step_end(self, run_context):
cb_params = run_context.original_args()
print("lr:[{:8.6f}]".format(self.lr_init[cb_params.cur_step_num-1]), flush=True)
print("lr:[{:8.6f}]".format(self.lr_init[cb_params.cur_step_num - 1]), flush=True)
def modelarts_pre_process():
'''modelarts pre process function.'''
def unzip(zip_file, save_dir):
import zipfile
s_time = time.time()
......@@ -112,55 +113,39 @@ def modelarts_pre_process():
print("Device: {}, Finish sync unzip data from {} to {}.".format(get_device_id(), zip_file_1, save_dir_1))
def set_graph_kernel_context(device_target):
if device_target == "GPU":
# Enable graph kernel for default model ssd300 on GPU back-end.
context.set_context(enable_graph_kernel=True,
graph_kernel_flags="--enable_parallel_fusion --enable_expand_ops=Conv2D")
@moxing_wrapper(pre_process=modelarts_pre_process)
def main():
config.lr_init = ast.literal_eval(config.lr_init)
config.lr_end_rate = ast.literal_eval(config.lr_end_rate)
device_id = get_device_id()
if config.device_target == "Ascend":
context.set_context(mode=context.GRAPH_MODE, device_target="Ascend")
if config.distribute:
if os.getenv("DEVICE_ID", "not_set").isdigit():
context.set_context(device_id=get_device_id())
init()
device_num = get_device_num()
rank = get_rank_id()
context.set_auto_parallel_context(parallel_mode=ParallelMode.DATA_PARALLEL, gradients_mean=True,
device_num=device_num)
else:
rank = 0
device_num = 1
context.set_context(device_id=get_device_id())
# Set mempool block size in PYNATIVE_MODE for improving memory utilization, which will not take effect in GRAPH_MODE
if context.get_context("mode") == context.PYNATIVE_MODE:
context.set_context(mempool_block_size="31GB")
context.set_context(mempool_block_size="31GB")
elif config.device_target == "GPU":
context.set_context(mode=context.GRAPH_MODE, device_target="GPU")
set_graph_kernel_context(config.device_target)
if config.distribute:
if os.getenv("DEVICE_ID", "not_set").isdigit():
context.set_context(device_id=get_device_id())
init()
device_num = config.device_num
rank = get_rank()
context.reset_auto_parallel_context()
context.set_auto_parallel_context(parallel_mode=ParallelMode.DATA_PARALLEL, gradients_mean=True,
device_num=device_num)
else:
rank = 0
device_num = 1
context.set_context(device_id=get_device_id())
elif config.device_target == "CPU":
device_id = 0
config.distribute = False
else:
raise ValueError("Unsupported platform.")
raise ValueError(f"device_target support ['Ascend', 'GPU', 'CPU'], but get {config.device_target}")
context.set_context(mode=context.GRAPH_MODE, device_target=config.device_target)
if config.distribute:
init()
device_num = config.device_num
rank = get_rank()
context.reset_auto_parallel_context()
context.set_auto_parallel_context(parallel_mode=ParallelMode.DATA_PARALLEL, gradients_mean=True)
else:
rank = 0
device_num = 1
context.set_context(device_id=device_id)
mindrecord_file = os.path.join(config.mindrecord_dir, "retinanet.mindrecord0")
......@@ -178,6 +163,10 @@ def main():
retinanet = retinanet50(backbone, config)
net = retinanetWithLossCell(retinanet, config)
init_net_param(net)
if config.finetune:
init_net_param(net, initialize_mode='XavierUniform')
else:
init_net_param(net)
if config.pre_trained:
if config.pre_trained_epoch_size <= 0:
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment