Are you sure you want to delete this task? Once this task is deleted, it cannot be recovered.
bravozyz 8e346adee5 | 2 years ago | |
---|---|---|
ascend310_infer | 2 years ago | |
infer | 2 years ago | |
modelarts | 2 years ago | |
scripts | 2 years ago | |
src | 2 years ago | |
.gitignore | 2 years ago | |
README.md | 2 years ago | |
eval.py | 2 years ago | |
export.py | 2 years ago | |
postprocess.py | 2 years ago | |
preprocess.py | 2 years ago | |
torch2mindspore.py | 2 years ago | |
train.py | 2 years ago |
HRNet是一个全能型的计算机视觉骨干网络,可用于图像分类、语义分割、面部识别等多种计算机视觉任务的特征提取。该网络分为四个阶段,每个阶段产生一个分辨率更低的分支,通过重复连接不同分辨率的特征图的方式增强特征表示。本脚本以HRNet为骨干网络,实现语义分割任务。
High-Resolution Representations for Labeling Pixels and Regions
Cityscapes数据集包含5000幅高质量像素级别精细注释的街城市道场景图像。图像按2975/500/1525的分割方式分为三组,分别用于训练、验证和测试。数据集中共包含30类实体,其中19类用于验证。
Look into person (LIP)数据集用于训练模型进行人类身体部位分割。该数据集包含50000张图像,带有详细的像素注释,其中包含19个语义人体部位标签和16个关键点的二维人体姿势。
数据集下载后的结构模式如下:
$DATASET
├─ cityscapes # cityscapes数据集根目录
│ ├─ gtFine # 标签文件
│ │ ├─ train # 训练标签文件
│ │ │ └─ [city folders]
│ │ │ └─ [label images]
│ │ └─ val # 推理标签文件
│ │ └─ [city folders]
│ │ └─ [label images]
│ ├─ leftImg8bit # 图像文件
│ │ ├─ train # 训练图像文件
│ │ │ └─ [city folders]
│ │ │ └─ [images]
│ │ └─ val # 推理图像文件
│ │ └─ [city folders]
│ │ └─ [images]
│ ├─ train.lst # 训练样本列表
│ └─ val.lst # 推理样本列表
├─ lip # lip数据集根目录
│ ├─ TrainVal_images # 图像文件
│ │ ├─ train_images # 训练图像文件
│ │ │ └─ [images]
│ │ └─ val_images # 推理图像文件
│ │ └─ [images]
│ ├─ TrainVal_parsing_annotations # 标签文件
│ │ ├─ train_segmentations # 训练标签文件
│ │ │ └─ [label images]
│ │ └─ val_segmentations # 推理标签文件
│ │ └─ [label images]
│ ├─ train_id.txt # 训练样本id
│ ├─ val_id.txt # 推理样本id
│ ├─ train.lst # 训练样本列表
│ └─ val.lst # 推理样本列表
生成 train.lst
和 val.lst
文件:
# 首先将lst文件之外的其他文件按上述目录结构存放
# 运行./src/dataset/目录下对应的maker脚本生成lst文件
# 生成cityscapes数据集的lst文件
python cityscapes_lst_maker.py --root [DATASET_ROOT]
# 生成lip数据集的lst文件
python lip_lst_maker.py --root [DATASET_ROOT]
# Example
python cityscapes_lst_maker.py --root ../data/cityscapes/
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
# 分布式训练
sh scripts/run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [EVAL_CALLBACK]
# 分布式训练,从指定周期开始恢复训练
sh scripts/run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [BEGIN_EPOCH] [EVAL_CALLBACK]
# 单机训练
sh scripts/run_standalone_train.sh [DEVICE_ID] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [EVAL_CALLBACK]
# 单机训练,从指定周期开始恢复训练
sh scripts/run_standalone_train.sh [DEVICE_ID] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [BEGIN_EPOCH] [EVAL_CALLBACK]
# 运行评估
sh scripts/run_eval.sh [DEVICE_ID] [DATASET_PATH] [CHECKPOINT_PATH]
如果要在ModelArts上进行模型的训练,可以参考ModelArts的 官方指导文档 开始进行模型的训练和推理,具体操作如下:
# 训练模型
1. 创建作业
2. 选择数据集存储位置
3. 选择输出存储位置
2. 在模型参数列表位置按如下形式添加参数:
data_url [自动填充]
train_url [自动填充]
dataset [cityscapes/lip]
checkpoint_url [CHECKPOINT_PATH_OBS]
modelarts True
run_distribute [True/False]
begin_epoch [起始周期]
end_epoch [结束周期]
eval [True/False]
eval_start [推理起始周期]
interval [推理周期间隔]
3. 选择相应数量的处理器
4. 开始运行
# 评估模型
1. 创建作业
2. 选择数据集存储位置
3. 选择输出存储位置
2. 在模型参数列表位置按如下形式添加参数:
data_url [自动填充]
train_url [自动填充]
checkpoint_url [CHECKPOINT_PATH_OBS]
modelarts True
dataset [cityscapes/lip]
3. 选择单个处理器
4. 开始运行
├─ seg-hrnet
│ ├─ ascend310_infer # 310推理相关脚本
│ │ ├─ inc
│ │ │ └─ utils.h
│ │ └─ src
│ │ ├─ build.sh
│ │ ├─ CMakeLists.txt
│ │ ├─ main.cc
│ │ └─ utils.cc
│ ├─ infer # MindX推理相关脚本
│ │ ├─ convert # om模型转换相关脚本
│ │ │ ├─ convert.sh # om模型转换执行脚本
│ │ │ └─ hrnetw48seg_aipp.cfg # om模型转换配置信息
│ │ ├─ data # 推理过程所需数据信息
│ │ │ └─ config
│ │ │ ├─ hrnetw48seg.cfg
│ │ │ ├─ hrnetw48seg.names
│ │ │ └─ hrnetw48seg.pipeline
│ │ ├─ mxbase # MxBase推理相关脚本
│ │ │ ├─ src
│ │ │ │ ├─ hrnetw48seg.cpp
│ │ │ │ ├─ hrnetw48seg.h
│ │ │ │ └─ main.cpp
│ │ │ ├─ build.sh # MxBase推理执行脚本
│ │ │ └─ CMakeLists.txt
│ │ ├─ sdk # SDK推理相关脚本
│ │ │ ├─ cityscapes.py
│ │ │ ├─ do_infer.sh # SDK推理执行脚本
│ │ │ └─ main.py
│ │ └─ docker_start.sh # 镜像启动
│ ├─ modelarts # ModelArts训练相关脚本
│ │ └─ start.py # ModelArts训练启动脚本
│ ├─ scripts # Ascend执行脚本
│ │ ├─ ascend310_inference.sh # 启动Ascend310推理(单卡)
│ │ ├─ run_standalone_train.sh # 启动Ascend910单机训练(单卡)
│ │ ├─ run_distribute_train.sh # 启动Ascend910分布式训练(8卡)
│ │ └─ run_eval.sh # 启动Ascend910推理(单卡)
│ ├─ src
│ │ ├─ dataset # 数据集预处理相关脚本
│ │ │ ├─ basedataset.py # 数据集生成器基类
│ │ │ ├─ cityscapes.py # Cityscapes生成器
│ │ │ ├─ cityscapes_lst_maker.py # Cityscapes list生成器
│ │ │ ├─ lip.py # LIP生成器
│ │ │ ├─ lip_lst_maker.py # LIP list生成器
│ │ │ └─ dataset_generator.py # 数据集生成脚本
│ │ ├─ callback.py # 自定义回调函数
│ │ ├─ config.py # 参数配置
│ │ ├─ loss.py # 损失函数定义
│ │ └─ seg_hrnet.py # HRNetW48语义分割网络定义
│ ├─ eval.py # 910推理脚本
│ ├─ export.py # 模型转换脚本
│ ├─ postprocess.py # 310推理后处理脚本,计算mIoU
│ ├─ preprocess.py # 310推理前处理脚本,数据预处理
│ ├─ torch2mindspore.py # 转换torch模型为mindspore格式,用于预训练模型获取
│ └─ train.py # 910训练脚本
在配置文件中可以同时配置训练参数和评估参数。
# 训练超参数
"lr": 0.01, # 初始学习率
"lr_min": 1e-7, # 最终学习率
"lr_power": 0.9, # poly学习率衰减策略系数
"lr_scheme": "cos", # 学习率衰减策略
"optimizer": "adam", # 优化器
"save_checkpoint_epochs": 5, # checkpoint保存频率
"keep_checkpoint_max": 10, # checkpoint保存数量
"total_epoch": 600, # 训练周期数
"batchsize": 4, # 批量大小
"loss_scale": 1024, # loss scale
"opt_momentum": 0.99, # 优化器动量
"wd": 1e-5, # 优化器weight decay
"eps": 1e-3 # 优化器epsilon
# HRNetW48模型参数
"FINAL_CONV_KERNEL": 1, # 最后一层卷积的kernel size
"STAGE1": # Stage1 结构
"NUM_MODULES": 1, # HRModule数量
"NUM_BRANCHES": 1, # 分支数量
"BLOCK": "BOTTLENECK", # 块类型
"NUM_BLOCKS": [4], # 各个分支块的数量
"NUM_CHANNELS": [64], # 各个分支的通道数量(宽度W)
"FUSE_METHOD": "SUM" # 融合方式
"STAGE2": # Stage2 结构
"NUM_MODULES": 1,
"NUM_BRANCHES": 2,
"BLOCK": "BASIC",
"NUM_BLOCKS": [4, 4],
"NUM_CHANNELS": [48, 96],
"FUSE_METHOD": "SUM"
"STAGE3": # Stage3 结构
"NUM_MODULES": 4,
"NUM_BRANCHES": 3,
"BLOCK": "BASIC",
"NUM_BLOCKS": [4, 4, 4],
"NUM_CHANNELS": [48, 96, 192],
"FUSE_METHOD": "SUM"
"STAGE4": # Stage4 结构
"NUM_MODULES": 3,
"NUM_BRANCHES": 4,
"BLOCK": "BASIC",
"NUM_BLOCKS": [4, 4, 4, 4],
"NUM_CHANNELS": [48, 96, 192, 384],
"FUSE_METHOD": "SUM"
训练HRNet实现语义分割任务需要以HRNet基于ImageNet2012数据集实现图像分类任务的训练结果作为预训练模型,以下提供几种获取预训练模型的方法:
转换HRNet官方提供模型
HRNet官方网站 提供预训练模型下载链接,下载文件经 torch2mindspore.py
转换产出训练所需预训练模型。
python torch2mindspore.py --pth_path [TORCH_MODEL_PATH] --ckpt_path [OUTPUT_MODEL_PATH]
自行训练
HRNet分类任务已经实现了MindSpore版本,并提供可达到目标精度的超参,可自行训练获取预训练模型。详情请参考:HRNet图像分类-MindSpore实现 。
# 分布式训练
sh scripts/run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [EVAL_CALLBACK]
# 分布式训练,从指定周期开始恢复训练
sh scripts/run_distribute_train.sh [RANK_TABLE_FILE] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [BEGIN_EPOCH] [EVAL_CALLBACK]
# 单机训练
sh scripts/run_standalone_train.sh [DEVICE_ID] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [EVAL_CALLBACK]
# 单机训练,从指定周期开始恢复训练
sh scripts/run_standalone_train.sh [DEVICE_ID] [DATASET_PATH] [TRAIN_OUTPUT_PATH] [CHECKPOINT_PATH] [BEGIN_EPOCH] [EVAL_CALLBACK]
分布式训练需要提前创建JSON格式的HCCL配置文件。
具体操作,参见 hccn_tools 中的说明。
训练结果保存在示例路径中,文件夹名称以“train”或“train_parallel”开头。您可在此路径下的日志中找到检查点文件以及结果,如下所示。
运行单卡用例时如果想更换运行卡号,可以通过设置环境变量 export DEVICE_ID=x
。
如果需要训练时推理,在执行shell脚本时为 EVAL_CALLBACK
参数传入 True
即可,其默认值为 False
。
使用Cityscapes数据集训练HRNetV2-W48
# 分布式训练结果(8p)
epoch: [ 1/600], epoch time: 520409.557, steps: 743, per step time: 700.417, avg loss: 0.343, lr:[0.000100]
epoch: [ 2/600], epoch time: 191926.929, steps: 743, per step time: 258.313, avg loss: 0.227, lr:[0.000100]
epoch: [ 3/600], epoch time: 191954.042, steps: 743, per step time: 258.350, avg loss: 0.658, lr:[0.000100]
epoch: [ 4/600], epoch time: 191917.645, steps: 743, per step time: 258.301, avg loss: 0.291, lr:[0.000100]
epoch: [ 5/600], epoch time: 195191.187, steps: 743, per step time: 262.707, avg loss: 0.343, lr:[0.000100]
epoch: [ 6/600], epoch time: 191863.135, steps: 743, per step time: 258.228, avg loss: 0.144, lr:[0.000100]
···
# 运行评估
sh scripts/run_eval.sh [DEVICE_ID] [DATASET_PATH] [CHECKPOINT_PATH]
评估结果保存在示例路径中,文件夹名为“eval”。你可在此路径下的日志文件中找到如下结果:
Number of samples: 500, total time: 400.28s, average time: 0.80s
============= 910 Inference =============
miou: 0.7921274714446462
iou array:
[0.98434563 0.86852768 0.93243294 0.51712274 0.61742523 0.71696446
0.7468067 0.83170647 0.92999597 0.62933721 0.95104717 0.84875123
0.6644514 0.95406839 0.66889207 0.8800112 0.81180921 0.69305802
0.80366822]
=========================================
python export.py --device_id [DEVICE_ID] --checkpoint_file [CKPT_PATH] --file_name [FILE_NAME] --file_format MINDIR --device_target Ascend --dataset [DATASET]
在执行推理之前,必须先通过 export.py
脚本到本mindir文件。以下展示了使用mindir模型执行推理的示例。目前只支持Cityscapes数据集batchsize为1的推理。
sh scripts/ascend310_inference.sh [MINDIR_PATH] [DATA_PATH] [DEVICE_ID]
MINDIR_PATH
mindir文件的存储路径DATA_PATH
Cityscapes原始数据集的存储路径DEVICE_ID
卡号脚本内部分为三步:
preprocess.py
对原始数据集进行预处理,并将处理后的数据集以二进制的形式存储在./preprocess_Result/
路径下;ascend310_infer/src/main.cc
执行推理过程,并将预测结果以二进制的形式存储在./result_Files/
路径下,推理日志可在infer.log
中查看;postprocess.py
利用预测结果与相应标签计算mIoU,计算结果可在 acc.log
中查看。Total number of images: 500
=========== 310 Inference Result ===========
miou: 0.7920974410146139
iou array:
[0.98435467 0.86849459 0.93240479 0.5170266 0.61721129 0.71663695
0.74685659 0.83161668 0.92993842 0.62925042 0.95103679 0.84861963
0.66363543 0.95415057 0.67026404 0.88005176 0.81205242 0.6925974
0.80365232]
============================================
python export.py --device_id [DEVICE_ID] --checkpoint_file [CKPT_PATH] --file_name [FILE_NAME] --file_format AIR --device_target Ascend --dataset [DATASET]
cd ./infer/convert/
bash convert.sh [AIR_MODEL_PATH] [AIPP_CONFIG_PATH] [OM_MODEL_NAME]
# Example
bash convert.sh ./hrnetw48seg.air ./hrnetw48seg_aipp.cfg ../data/model/hrnetw48seg
其中, [OM_MODEL_NAME]
为om模型输出路径,默认路径为 ../data/model/hrnetw48seg
。用户亦可自定义,但需要在 ./infer/data/config/hrnetw48seg.pipeline
和 ./infer/mxbase/src/main.cpp
脚本中进行文件名统一。
# 执行MxBase推理
cd ./infer/mxbase/
bash build.sh
build/hrnetw48seg [TEST_IMAGE_PATH]
# Example
build/hrnetw48seg ./test.png
推理结果为输入图片的语义分割效果图,输出位置与输入图片相同,命名以 _infer
结尾。
# 执行SDK推理
cd ./infer/sdk/
bash do_infer.sh [DATA_PATH] [DATA_LST_PATH]
# Example
bash do_infer.sh ../data/input/cityscapes ../data/input/cityscapes/val.lst
推理得到测试集全部图片的语义分割效果图,结果存储于 ./inferResults/
目录。精度结果在推理结束后打印在执行窗口,与910推理的精度差异可控制在0.5%以内。
参数 | Ascend 910 |
---|---|
模型版本 | HRNetV2-W48 |
资源 | Ascend 910;CPU 2.60GHz,192核;内存 755G;系统 Euler2.8 |
上传日期 | 2021-12-12 |
MindSpore版本 | 1.1.3 |
数据集 | Cityscapes |
训练参数 | epoch=600, steps per epoch=93, batch_size = 4 |
优化器 | Adam |
损失函数 | SoftmaxCrossEntropyWithLogits |
输出 | mIoU |
损失 | 0.0507812 |
速度 | 256毫秒/步(8卡) |
总时长 | 5小时 |
train.py
中使用了随机种子。
请浏览官网 主页 。
以HRNet为骨干网络,实现语义分割任务。
Python C++ Shell Text other
Dear OpenI User
Thank you for your continuous support to the Openl Qizhi Community AI Collaboration Platform. In order to protect your usage rights and ensure network security, we updated the Openl Qizhi Community AI Collaboration Platform Usage Agreement in January 2024. The updated agreement specifies that users are prohibited from using intranet penetration tools. After you click "Agree and continue", you can continue to use our services. Thank you for your cooperation and understanding.
For more agreement content, please refer to the《Openl Qizhi Community AI Collaboration Platform Usage Agreement》