目录
DeepMar描述
DeepMar是2015年在行人属性识别领域进行的一项创新。在DeepMar中,为了更好地利用属性之间的关系,作者提出了统一多属性联合学习模型来同时学习所有属性。在该算法中,某个属性可以有利于其他关联属性的表示。例如,长发特征对女性的概率高于男性,因而头发长度可以帮助识别性别。
论文:Li D, Chen X, Huang K. Multi-attribute learning for pedestrian attribute recognition in surveillance scenarios[C]//2015 3rd IAPR Asian Conference on Pattern Recognition (ACPR). IEEE, 2015: 111-115.
模型架构
DeepMar论文提出了多属性识别联合识别的算法框架。本代码中,特征提取部分的backbone采用了resnet50的主干部分,分类器部分的classifier稍作修改,对PEAT数据集中正比例大于1/20的35个属性进行识别。同时,为了处理数据的不平衡性,损失函数使用改进式的交叉熵损失函数,即给予35个属性不同的损失权重。对于DeepMar网络的backbone部分,载入resnet50主干部分的预训练权重。若需要resnet50的预训练权重,请参考MindSpore官方预训练权重:链接
数据集
使用的数据集:PETA
该数据集大小为 0.4G,包含 19000 张行人图像,一共属于 8705 个人,每个行人都被标注为 61 个二进制数和 4 个多类别属性。通常,实验中主要关注正比例大于1/20的35个属性。 广泛采用的实验协议是,将该 19000
张图像随机划分为三部分,9500 张用作训练集,1900 张用作验证集,7600 张用作测试集。
环境要求
- 硬件(Ascend)
- 框架
- 如需查看详情,请参见如下资源:
快速入门
通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
-
Ascend处理器环境运行
# 训练时,需要修改以下路径:
peta_dataset_mat_dir: "./data/PETA.mat" # PETA数据集.mat文件的路径
image_path: "./data/images" # PETA数据集图像文件夹的路径
pretrain_chechpoint: " " # resnet50主干部分的预训练权重的路径
save_ckpt_dir: "./model" # ckpt模型保存目录
# 评估时,需要修改以下路径:
peta_dataset_mat_dir: "./data/PETA.mat" # PETA数据集.mat文件的路径
image_path: "./data/images" # PETA数据集图像文件夹的路径
ckpt_path: "./checkpoint/Deepmar_Distributed_Epoch_400_.ckpt" # ckpt模型的路径
# 运行训练示例
cd scripts
bash run_standalone_train_ascend.sh [DEVICE_ID] [PETA_DATASET_MAT_DIR] [IMAGE_PATH] [PRETRAIN_CHECHPOINT] [SAVE_CKPT_DIR]
# example: bash run_standalone_train_ascend.sh 0 /~/data/PETA.mat ~/data/images ~/resnet50_imagenet2012.ckpt ./ckpt_standalone
# 运行分布式训练示例
cd scripts
bash run_distribute_train_ascend.sh [DEVICE_NUM] [RANK_TABLE_FILE] [PETA_DATASET_MAT_DIR] [IMAGE_PATH] [PRETRAIN_CHECHPOINT] [SAVE_CKPT_DIR]
# example:bash run_distribute_train_ascend.sh 8 ~/hccl_rank_table.json ~/data/PETA.mat ~/data/images ~/resnet50_imagenet2012.ckpt ./ckpt_distribute
# 运行评估示例
cd scripts
bash run_eval_ascend.sh [DEVICE_ID] [PETA_DATASET_MAT_DIR] [IMAGE_PATH] [CHPT_PATH]
# example:bash run_eval_ascend.sh 0 ~/data/PETA.mat ~/data/images ./ckpt_distribute/Deepmar_Distributed_Epoch_500_.ckpt
对于分布式, 训练需要提前创建JSON格式的hccl配置文件. 请遵循以下链接中的说明:
https://gitee.com/mindspore/models/tree/master/utils/hccl_tools.
-
在 ModelArts(鹏城云脑) 进行训练 (如果你想在modelarts(鹏城云脑) 上运行,可以参考以下文档 modelarts)
-
在 ModelArts 上训练 PETA 的训练集
# (1) 创建个人项目,上传相关代码文件
# (2) 将 PEAT数据集和预训练权重压缩后上传至云脑数据集;或在云脑搜索已上传好的云脑数据集和预训练权重文件:
# 【DeepMAR_Data.zip】(<https://git.openi.org.cn/wangzq/data_collection/datasets>)
# (3) 执行a或者b
# a. 在 train.py 文件中设置 "enable_pengcheng_cloud = 1"
# 在 train.py 文件中设置 "workroot = '/home/work/user-job-dir'"
# 在 train.py 文件中设置 "is_distributed = 1" 或 "is_distributed = 0",决定是否开启分布式训练
# 在 train.py 文件中设置 其他参数
# 随后新建训练任务,选择npu类型
#
# b. 首先新建训练任务,选择npu类型
# 在网页上设置 "enable_pengcheng_cloud = 1"
# 在网页上设置 "workroot = '/home/work/user-job-dir'"
# 在网页上设置 "is_distributed = 1" 或 "is_distributed = 0",决定是否开启分布式训练
# 在网页上设置 其他参数
# (4) 在网页上设置启动文件为 "train.py"
# (6) 在网页上设置"数据集"为所上传的压缩文件、"设备规格"、"mindspore版本"等
# (7) 启动训练任务
# (8) 在"日志"中查看训练信息,训练结束后在"结果下载"处下载模型
-
在 ModelArts 上评估 PETA 的测试集
# (1) 创建个人项目,上传相关代码文件和权重文件
# (2) 将 PEAT数据集 压缩后上传至云脑数据集;或在云脑搜索已上传好的云脑数据集:
# 【DeepMAR_Data.zip】(<https://git.openi.org.cn/wangzq/data_collection/datasets>)
# (3) 执行a或者b
# a. 在 eval.py 文件中设置 "enable_pengcheng_cloud = 1"
# 在 eval.py 文件中设置 "workroot = '/home/work/user-job-dir'"
# 在 eval.py 文件中设置 代码仓中权重的存放路径,如"ckpt_path = './checkpoint/Deepmar_Distributed_Epoch_400_.ckpt'"
# 在 eval.py 文件中设置 其他参数
# 随后新建训练任务,选择npu类型
#
# b. 首先新建训练任务,选择npu类型
# 在网页上设置 "enable_pengcheng_cloud = 1"
# 在网页上设置 "workroot = '/home/work/user-job-dir'"
# 在网页上设置 代码仓中权重的存放路径,如"ckpt_path = './checkpoint/Deepmar_Distributed_Epoch_400_.ckpt'"
# 在网页上设置 其他参数
# (4) 在网页上设置启动文件为 "eval.py"
# (6) 在网页上设置"数据集"为所上传的压缩文件、"设备规格"、"mindspore版本"等
# (7) 启动训练任务
# (8) 在"日志"中查看评估精度信息
脚本说明
脚本及样例代码
├── model_zoo
├── README.md // 所有模型相关说明
├── DeepMar
├── README.md // DeepMar相关说明
├── ascend310_infer // 实现310推理源代码
├── scripts
│ ├──run_infer_310.sh // 执行310推理的shell脚本
│ ├──run_distribute_train_ascend.sh // 分布式到Ascend训练的shell脚本
│ ├──run_eval_ascend.sh // Ascend评估的shell脚本
│ ├──run_standalone_train_ascend.sh // 单卡Ascend训练的shell脚本
├── src
│ ├──create_callback.py // 回调函数
│ ├──deepmar.py // DeepMar网络结构
│ ├──deepmar_dataset.py // 数据处理
│ ├──lr_schedule.py // 动态学习率
├── requirements.txt
├── checkpoint // 评估脚本的ckpt文件存放目录
├── postprocess.py // 310推理精度计算脚本
├── train.py // 训练脚本
├── eval.py // 评估脚本
├── export.py // 将checkpoint文件导出成mindir
脚本参数
在train.py中配置训练参数,在eval.py中配置评估参数
-
配置训练参数。
split: 'train' # PETA数据集划分的关键字
partition_idx: 0 # PETA数据集划分时的截取序号
image_resize: (224,224) # 输入网络的图像尺寸
batch_size: 16 # 训练集的batch大小
momentum: 0.9 # momentum因子
init_lr: 0.1 # 初始学习率
epoch_size: 500 # 训练周期
num_work: 2 # 载入训练集的线程数
epoch_star_save: 400 # 开始保存ckpt模型的epoch数
epoch_per_save: 10 # 保存ckpt模型的epoch间隔数
backbone_weight_decay: 4e-5 # backbone的权重衰减系数
classifier_weight_decay: 4e-4 # classifier的权重衰减系数
lr_strategy: "Cosine" # 学习率模式
device_target: "Ascend" # 设备类型
save_ckpt_device: 0 # 保存ckpt模型的设备号
is_distributed: 1 # 是否分布式
train_mode: 'train' # 数据集处理,指定为训练模式
save_ckpt_dir: './model' # 保存ckpt模型的目录
pretrain_chechpoint: "./data/resnet50_frompytorch.ckpt" # 预训练权重的绝对地址,默认为resnet50的路径
peta_dataset_mat_dir: './data/PETA.mat' # PETA.mat的绝对地址
image_path: './data/images' # 行人图像文件夹images的路径
enable_pengcheng_cloud: 1 # 运行环境是否为鹏城云脑的训练任务
workroot: '/home/work/user-job-dir' # 鹏城云脑的训练任务的运行路径
train_url: " " # 鹏城云脑训练任务下的运行结果的镜像地址,启动训练任务时自动载入,无需设置
data_url: " " # 鹏城云脑训练任务下的数据集obs地址,启动训练任务时自动载入,无需设置
-
配置评估参数。
split: 'test' # PETA数据集划分的关键字
partition_idx: 0 # PETA数据集划分时的截取序号,需要与训练任务保持一致
image_resize: (224, 224) # 输入网络的图像尺寸
batch_size: 256 # 测试集batch大小
num_work: 2 # 载入测试集的线程数
device_target: "Ascend" # 设备类型
train_mode: 'test' # 数据集处理,指定为评估模式
peta_dataset_mat_dir: './data/PETA.mat' # PETA.mat的绝对地址
image_path: './data/images' # 行人图像文件夹images的路径
ckpt_path: './checkpoint/Deepmar_Distributed_Epoch_400_.ckpt' # 所要测试的ckpt模型的路径
enable_pengcheng_cloud: 1 # 运行环境是否为鹏城云脑的训练任务
workroot: '/home/work/user-job-dir' # 鹏城云脑的训练任务的运行路径
train_url: " " # 鹏城云脑训练任务下的运行结果的镜像地址,启动训练任务时自动载入,无需设置
data_url: " " # 鹏城云脑训练任务下的数据集obs地址,启动训练任务时自动载入,无需设置
更多配置细节请参考脚本train.py和eval.py
。
训练过程
训练
-
Ascend处理器环境运行
修改路径和相关参数后,运行训练示例
cd scripts
bash run_standalone_train_ascend.sh [DEVICE_ID] [PETA_DATASET_MAT_DIR] [IMAGE_PATH] [PRETRAIN_CHECHPOINT] [SAVE_CKPT_DIR]
# example: bash run_standalone_train_ascend.sh 0 /~/data/PETA.mat ~/data/images ~/resnet50_imagenet2012.ckpt ./ckpt_standalone
上述python命令将在后台运行,您可以通过train.log文件查看结果。训练结束后,您可在./model脚本文件夹下找到检查点文件。所记录的损失值形如:
epoch time:10734.608 ms,per step time:18.102 ms
epoch:5 step:593, loss is 1.145705
epoch time:10752.180 ms, per step time:18.132 ms epoch:6 step:593, loss is 1,1921978 ...
分布式训练
-
Ascend处理器环境运行
对于分布式, 训练需要提前创建JSON格式的hccl配置文件. 请遵循以下链接中的说明:
https://gitee.com/mindspore/models/tree/master/utils/hccl_tools
运行分布式训练示例
cd scripts
bash run_distribute_train_ascend.sh [DEVICE_NUM] [RANK_TABLE_FILE] [PETA_DATASET_MAT_DIR] [IMAGE_PATH] [PRETRAIN_CHECHPOINT] [SAVE_CKPT_DIR]
# example:bash run_distribute_train_ascend.sh 8 ~/hccl_rank_table.json ~/data/PETA.mat ~/data/images ~/resnet50_imagenet2012.ckpt ./ckpt_distribute
上述shell脚本将在后台运行分布训练。您可以通过/train_parallelX/trainX.log文件查看结果。所记录的损失值形如:
epoch time:1655.048 ms,per step time:22.366 ms
epoch:8 step:74, loss is 0.28529447 ...
评估过程
评估
-
Ascend环境运行
在运行以下命令之前将 ckpt_path 设置为所要测试的ckpt模型的路径
cd scripts
bash run_eval_ascend.sh [DEVICE_ID] [PETA_DATASET_MAT_DIR] [IMAGE_PATH] [CHPT_PATH]
# example:bash run_eval_ascend.sh 0 ~/data/PETA.mat ~/data/images ./ckpt_distribute/Deepmar_Distributed_Epoch_500_.ckpt
测试数据集的准确性如下:
Test result, Label_acc_avg: 0.8282586813643243
导出过程
导出
python export.py --ckpt_file [CKPT_PATH] --file_name [FILE_NAME] --file_format [FILE_FORMAT]
参数ckpt_file
为必填项,file_format
选为 "MINDIR"
推理过程
推理
在执行推理前,mindir
文件必须通过export.py
脚本导出。目前peta
数据集仅支持batch_size
为1的推理。
# 昇腾310 推理
bash run_infer_310.sh [MINDIR_PATH] [DATASET_NAME] [DATASET_PATH] [DEVICE_ID]
# bash run_infer_310.sh ../deepmar_model/deepmar.mindir 'peta' ../data/ 0
数据集结构说明:
├── data // 数据集路径
├──images // 数据集图片子路径
│ ├──00001.png
│ ├──00002.png
│ ...
│ ├──18999.png
│ ├──19000.png
├──PETA.mat // PETA数据集标签文件
MINDIR_PATH
: mindir
文件路径
DATASET_NAME
: 使用的推理数据集名称,默认为peta
DATASET_PATH
: 推理数据集data路径。该路径下应包含images文件夹和PETA.mat文件。
DEVICE_ID
: 可选,默认值为0
Test result , Label_acc_avg: 0.8283114130655239
模型描述
性能
训练性能
PETA上的DeepMar
参数 |
Ascend |
模型版本 |
DeepMar |
资源 |
Ascend 910;系统 Euler2.8 |
上传日期 |
2022-6-30 |
版本 |
MindSpore 1.5.1 |
数据集 |
PETA训练集 |
训练参数 |
单卡: epoch=500, batch_size=16, lr=0.1 八卡: epoch=500, batch_size=16, lr=0.1 |
优化器 |
SGD |
损失函数 |
带损失权重的BCEloss |
输出 |
概率 |
损失 |
0.0001 |
速度 |
单卡:19毫秒/步;八卡:23毫秒/步; |
微调检查点 |
270M (.ckpt文件) |
评估性能
PETA的上的DeepMar
参数 |
Ascend |
模型版本 |
DeepMar |
资源 |
Ascend 910;系统 Euler2.8 |
上传日期 |
2022-6-30 |
MindSpore 版本 |
1.5.1 |
数据集 |
PETA验证集, 7600张图像 |
batch_size |
256 |
输出 |
概率 |
准确性 |
8卡:82.80% |
随机情况说明
在deepmar_dataset.py中,我们设置了用于划分PETA数据集的随机数种子。其余的涉及到的随机情况,皆未设置随机数种子。
ModelZoo主页
请浏览官网主页。