You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

README_CN.md 29 kB

4 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593
  1. # 目录
  2. <!-- TOC -->
  3. - [目录](#目录)
  4. - [MaskRCNN概述](#maskrcnn概述)
  5. - [模型架构](#模型架构)
  6. - [数据集](#数据集)
  7. - [环境要求](#环境要求)
  8. - [快速入门](#快速入门)
  9. - [脚本说明](#脚本说明)
  10. - [脚本和样例代码](#脚本和样例代码)
  11. - [脚本参数](#脚本参数)
  12. - [训练脚本参数](#训练脚本参数)
  13. - [参数配置](#参数配置)
  14. - [训练过程](#训练过程)
  15. - [训练](#训练)
  16. - [分布式训练](#分布式训练)
  17. - [训练结果](#训练结果)
  18. - [评估过程](#评估过程)
  19. - [评估](#评估)
  20. - [评估结果](#评估结果)
  21. - [模型说明](#模型说明)
  22. - [性能](#性能)
  23. - [训练性能](#训练性能)
  24. - [评估性能](#评估性能)
  25. - [随机情况说明](#随机情况说明)
  26. - [ModelZoo首页](#modelzoo首页)
  27. <!-- /TOC -->
  28. # MaskRCNN概述
  29. MaskRCNN是一种概念简单、灵活、通用的目标实例分割框架,在检测出图像中目标的同时,还为每一个实例生成高质量掩码。这种称为Mask R-CNN的方法,通过添加与现有边框识别分支平行的预测目标掩码分支,达到扩展Faster R-CNN的目的。Mask R-CNN训练简单,运行速度达5fps,与Faster R-CNN相比,开销只有小幅上涨。此外,Mask R-CNN易于推广到其他任务。例如,允许在同一框架中预测人体姿势。
  30. Mask R-CNN在COCO挑战赛的三个关键难点上都表现不俗,包括实例分割、边框目标检测和人物关键点检测。Mask R-CNN没有什么华而不实的附加功能,各任务的表现都优于现存所有单模型,包括COCO 2016挑战赛的胜出模型。
  31. # 模型架构
  32. MaskRCNN是一个两级目标检测网络,作为FasterRCNN的扩展模型,在现有的边框识别分支的基础上增加了一个预测目标掩码的分支。该网络采用区域候选网络(RPN),可与检测网络共享整个图像的卷积特征,无需任何代价就可轻松计算候选区域。整个网络通过共享卷积特征,将RPN和掩码分支合并为一个网络。
  33. [论文](http://cn.arxiv.org/pdf/1703.06870v3):"MaskRCNN"
  34. # 数据集
  35. - [COCO2017](https://cocodataset.org/)是一个广泛应用的数据集,带有边框和像素级背景注释。这些注释可用于场景理解任务,如语义分割,目标检测和图像字幕制作。训练和评估的图像大小为118K和5K。
  36. - 数据集大小:19G
  37. - 训练:18G,118,000个图像
  38. - 评估:1G,5000个图像
  39. - 注释:241M;包括实例、字幕、人物关键点等
  40. - 数据格式:图像及JSON文件
  41. - 注:数据在`dataset.py`中处理。
  42. # 环境要求
  43. - 硬件(昇腾处理器)
  44. - 采用昇腾处理器搭建硬件环境。
  45. - 框架
  46. - [MindSpore](https://gitee.com/mindspore/mindspore)
  47. - 获取基础镜像
  48. - [Ascend Hub](ascend.huawei.com/ascendhub/#/home)
  49. - 如需查看详情,请参见如下资源:
  50. - [MindSpore教程](https://www.mindspore.cn/tutorial/training/zh-CN/master/index.html)
  51. - [MindSpore Python API](https://www.mindspore.cn/doc/api_python/zh-CN/master/index.html)
  52. - 第三方库
  53. ```bash
  54. pip install Cython
  55. pip install pycocotools
  56. pip install mmcv=0.2.14
  57. ```
  58. # 快速入门
  59. 1. 下载COCO2017数据集。
  60. 2. 在`config.py`中修改COCO_ROOT及设置其他参数。参考目录结构如下:
  61. ```text
  62. .
  63. └─cocodataset
  64. ├─annotations
  65. ├─instance_train2017.json
  66. └─instance_val2017.json
  67. ├─val2017
  68. └─train2017
  69. ```
  70. 如您使用自己的数据集训练网络,**执行脚本时,请选择“其他”数据集。**
  71. 创建一个TXT文件用于存放数据集信息。参考如下文件内容:
  72. ```text
  73. train2017/0000001.jpg 0,259,401,459,7 35,28,324,201,2 0,30,59,80,2
  74. ```
  75. 一行一个图像注释,以空格分割。第一列为图像的相对路径,其后紧跟着边框和类信息列,格式为[xmin,ymin,xmax,ymax,class]。图像可以从`IMAGE_DIR`(数据集目录)和`ANNO_PATH`(TXT文件路径)中的相对路径拼接而成的路径中读取,路径均可以在`config.py`中配置。
  76. 3. 执行训练脚本。
  77. 数据集准备完成后,按照如下步骤开始训练:
  78. ```text
  79. # 分布式训练
  80. sh run_distribute_train.sh [RANK_TABLE_FILE] [PRETRAINED_CKPT]
  81. # 单机训练
  82. sh run_standalone_train.sh [PRETRAINED_CKPT]
  83. ```
  84. 注:
  85. 1. 为加快数据预处理速度,MindSpore提供了MindRecord数据格式。因此,训练前首先需要生成基于COCO2017数据集的MindRecord文件。COCO2017原始数据集转换为MindRecord格式大概需要4小时。
  86. 2. 进行分布式训练前,需要提前创建JSON格式的[hccl配置文件](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools)。
  87. 3. PRETRAINED_CKPT是一个ResNet50检查点,通过ImageNet2012训练。你可以使用ModelZoo中 [resnet50](https://gitee.com/qujianwei/mindspore/tree/master/model_zoo/official/cv/resnet) 脚本来训练, 然后使用src/convert_checkpoint.py把训练好的resnet50的权重文件转换为可加载的权重文件。
  88. 4. 执行评估脚本。
  89. 训练结束后,按照如下步骤启动评估:
  90. ```bash
  91. # 评估
  92. sh run_eval.sh [VALIDATION_JSON_FILE] [CHECKPOINT_PATH]
  93. ```
  94. 注:
  95. 1. VALIDATION_JSON_FILE是用于评估的标签JSON文件。
  96. 5. 执行推理脚本。
  97. 训练结束后,按照如下步骤启动推理:
  98. ```bash
  99. # 评估
  100. sh run_infer_310.sh [AIR_PATH] [DATA_PATH] [ANN_FILE_PATH]
  101. ```
  102. 注:
  103. 1. AIR_PATH是在910上使用export脚本导出的模型。
  104. 2. ANN_FILE_PATH是推理使用的标注文件。
  105. # 在docker上运行
  106. 1. 编译镜像
  107. ```shell
  108. # 编译镜像
  109. docker build -t maskrcnn:20.1.0 . --build-arg FROM_IMAGE_NAME=ascend-mindspore-arm:20.1.0
  110. ```
  111. 2. 启动容器实例
  112. ```shell
  113. # 启动容器实例
  114. bash scripts/docker_start.sh maskrcnn:20.1.0 [DATA_DIR] [MODEL_DIR]
  115. ```
  116. 3. 训练
  117. ```shell
  118. # 单机训练
  119. bash run_standalone_train.sh [PRETRAINED_CKPT]
  120. # 分布式训练
  121. bash run_distribute_train.sh [RANK_TABLE_FILE] [PRETRAINED_CKPT]
  122. ```
  123. 4. 评估
  124. ```shell
  125. # 评估
  126. bash run_eval.sh [VALIDATION_JSON_FILE] [CHECKPOINT_PATH]
  127. ```
  128. # 脚本说明
  129. ## 脚本和样例代码
  130. ```shell
  131. .
  132. └─MaskRcnn
  133. ├─README.md # README
  134. ├─ascend310_infer #实现310推理源代码
  135. ├─scripts # shell脚本
  136. ├─run_standalone_train.sh # 单机模式训练(单卡)
  137. ├─run_distribute_train.sh # 并行模式训练(8卡)
  138. ├─run_infer_310.sh # Ascend推理shell脚本
  139. └─run_eval.sh # 评估
  140. ├─src
  141. ├─maskrcnn
  142. ├─__init__.py
  143. ├─anchor_generator.py # 生成基础边框锚点
  144. ├─bbox_assign_sample.py # 过滤第一阶段学习中的正负边框
  145. ├─bbox_assign_sample.py # 过滤第二阶段学习中的正负边框
  146. ├─mask_rcnn_r50.py # MaskRCNN主要网络架构
  147. ├─fpn_neck.py # FPN网络
  148. ├─proposal_generator.py # 基于特征图生成候选区域
  149. ├─rcnn_cls.py # RCNN边框回归分支
  150. ├─rcnn_mask.py # RCNN掩码分支
  151. ├─resnet50.py # 骨干网
  152. ├─roi_align.py # 兴趣点对齐网络
  153. └─rpn.py # 区域候选网络
  154. ├─aipp.cfg #aipp 配置文件
  155. ├─config.py # 网络配置
  156. ├─convert_checkpoint.py # 转换预训练checkpoint文件
  157. ├─dataset.py # 数据集工具
  158. ├─lr_schedule.py # 学习率生成器
  159. ├─network_define.py # MaskRCNN的网络定义
  160. └─util.py # 例行操作
  161. ├─mindspore_hub_conf.py # MindSpore hub接口
  162. ├─export.py #导出 AIR,MINDIR,ONNX模型的脚本
  163. ├─eval.py # 评估脚本
  164. ├─postprogress.py #310推理后处理脚本
  165. └─train.py # 训练脚本
  166. ```
  167. ## 脚本参数
  168. ### 训练脚本参数
  169. ```bash
  170. # 分布式训练
  171. 用法:sh run_distribute_train.sh [RANK_TABLE_FILE] [PRETRAINED_MODEL]
  172. # 单机训练
  173. 用法:sh run_standalone_train.sh [PRETRAINED_MODEL]
  174. ```
  175. ### 参数配置
  176. ```bash
  177. "img_width":1280, # 输入图像宽度
  178. "img_height":768, # 输入图像高度
  179. # 数据增强随机阈值
  180. "keep_ratio": True,
  181. "flip_ratio":0.5,
  182. "photo_ratio":0.5,
  183. "expand_ratio":1.0,
  184. "max_instance_count":128, # 各图像的边框最大值
  185. "mask_shape": (28, 28), # rcnn_mask中掩码的形状
  186. # 锚点
  187. "feature_shapes": [(192, 320), (96, 160), (48, 80), (24, 40), (12, 20)], # FPN特征图的形状
  188. "anchor_scales": [8], # 基础锚点区域
  189. "anchor_ratios": [0.5, 1.0, 2.0], # 基础锚点高宽比
  190. "anchor_strides": [4, 8, 16, 32, 64], # 各特征图层的步长大小
  191. "num_anchors": 3, # 各像素的锚点数
  192. # ResNet
  193. "resnet_block": [3, 4, 6, 3], # 各层区块数
  194. "resnet_in_channels": [64, 256, 512, 1024], # 各层输入通道大小
  195. "resnet_out_channels": [256, 512, 1024, 2048], # 各层输出通道大小
  196. # FPN
  197. "fpn_in_channels":[256, 512, 1024, 2048], # 各层输入通道大小
  198. "fpn_out_channels": 256, # 各层输出通道大小
  199. "fpn_num_outs":5, # 输出特征图大小
  200. # RPN
  201. "rpn_in_channels": 256, # 输入通道大小
  202. "rpn_feat_channels":256, # 特征输出通道大小
  203. "rpn_loss_cls_weight":1.0, # 边框分类在RPN损失中的权重
  204. "rpn_loss_reg_weight":1.0, # 边框回归在RPN损失中的权重
  205. "rpn_cls_out_channels":1, # 分类输出通道大小
  206. "rpn_target_means":[0., 0., 0., 0.], # 边框编解码方式
  207. "rpn_target_stds":[1.0, 1.0, 1.0, 1.0], # 边框编解码标准
  208. # bbox_assign_sampler
  209. "neg_iou_thr":0.3, # 交并后负样本阈值
  210. "pos_iou_thr":0.7, # 交并后正样本阈值
  211. "min_pos_iou":0.3, # 交并后最小正样本阈值
  212. "num_bboxes":245520, # 边框总数
  213. "num_gts": 128, # 地面真值总数
  214. "num_expected_neg":256, # 负样本数
  215. "num_expected_pos":128, # 正样本数
  216. # 候选区域
  217. "activate_num_classes":2, # RPN分类中的类数
  218. "use_sigmoid_cls":True, # 在RPN分类中是否使用sigmoid作为损失函数
  219. # roi_alignj
  220. "roi_layer": dict(type='RoIAlign', out_size=7, mask_out_size=14, sample_num=2), # ROIAlign参数
  221. "roi_align_out_channels": 256, # ROIAlign输出通道大小
  222. "roi_align_featmap_strides":[4, 8, 16, 32], # ROIAling特征图不同层级的步长大小
  223. "roi_align_finest_scale": 56, # ROIAlign最佳比例
  224. "roi_sample_num": 640, # ROIAling层中的样本数
  225. # bbox_assign_sampler_stage2 # 第二阶段边框赋值样本,参数含义类似于bbox_assign_sampler
  226. "neg_iou_thr_stage2":0.5,
  227. "pos_iou_thr_stage2":0.5,
  228. "min_pos_iou_stage2":0.5,
  229. "num_bboxes_stage2":2000,
  230. "num_expected_pos_stage2":128,
  231. "num_expected_neg_stage2":512,
  232. "num_expected_total_stage2":512,
  233. # rcnn # 第二阶段的RCNN参数,参数含义类似于FPN
  234. "rcnn_num_layers":2,
  235. "rcnn_in_channels":256,
  236. "rcnn_fc_out_channels":1024,
  237. "rcnn_mask_out_channels":256,
  238. "rcnn_loss_cls_weight":1,
  239. "rcnn_loss_reg_weight":1,
  240. "rcnn_loss_mask_fb_weight":1,
  241. "rcnn_target_means":[0., 0., 0., 0.],
  242. "rcnn_target_stds":[0.1, 0.1, 0.2, 0.2],
  243. # 训练候选区域
  244. "rpn_proposal_nms_across_levels":False,
  245. "rpn_proposal_nms_pre":2000, # RPN中NMS前的候选区域数
  246. "rpn_proposal_nms_post":2000, # RPN中NMS后的候选区域数
  247. "rpn_proposal_max_num":2000, # RPN中最大候选区域数
  248. "rpn_proposal_nms_thr":0.7, # RPN中NMS的阈值
  249. "rpn_proposal_min_bbox_size":0, # RPN中边框的最小尺寸
  250. # 测试候选区域 # 部分参数与训练候选区域类似
  251. "rpn_nms_across_levels":False,
  252. "rpn_nms_pre":1000,
  253. "rpn_nms_post":1000,
  254. "rpn_max_num":1000,
  255. "rpn_nms_thr":0.7,
  256. "rpn_min_bbox_min_size":0,
  257. "test_score_thr":0.05, # 打分阈值
  258. "test_iou_thr":0.5, # 交并比阈值
  259. "test_max_per_img":100, # 最大实例数
  260. "test_batch_size":2, # 批次大小
  261. "rpn_head_loss_type":"CrossEntropyLoss", # RPN中的损失类型
  262. "rpn_head_use_sigmoid":True, # 是否在RPN中使用sigmoid
  263. "rpn_head_weight":1.0, # RPN头的损失重量
  264. "mask_thr_binary":0.5, # 输入RCNN的掩码阈值
  265. # 逻辑回归
  266. "base_lr":0.02, # 基础学习率
  267. "base_step":58633, # 逻辑回归发生器中的基础步骤
  268. "total_epoch":13, # 逻辑回归发生器总轮次
  269. "warmup_step":500, # 逻辑回归发生器热身步骤
  270. "warmup_mode":"linear", # 热身模式
  271. "warmup_ratio":1/3.0, # 热身比
  272. 0.9, # 优化器中的动量
  273. # 训练
  274. "batch_size":2,
  275. "loss_scale":1,
  276. "momentum":0.91,
  277. "weight_decay":1e-4,
  278. "pretrain_epoch_size":0, # 预训练的轮次
  279. "epoch_size":12, # 总轮次
  280. "save_checkpoint":True, # 是否保存检查点
  281. "save_checkpoint_epochs":1, # 检查点保存间隔
  282. "keep_checkpoint_max":12, # 检查点最大保存数
  283. "save_checkpoint_path":"./checkpoint", # 检查点所在路径
  284. "mindrecord_dir":"/home/maskrcnn/MindRecord_COCO2017_Train", # MindRecord文件路径
  285. "coco_root":"/home/maskrcnn/", # COCO根数据集的路径
  286. "train_data_type":"train2017", # 训练数据集名称
  287. "val_data_type":"val2017", # 评估数据集名称
  288. "instance_set":"annotations/instances_{}.json", # 注释名称
  289. "coco_classes":('background', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus',
  290. 'train', 'truck', 'boat', 'traffic light', 'fire hydrant',
  291. 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog',
  292. 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra',
  293. 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie',
  294. 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball',
  295. 'kite', 'baseball bat', 'baseball glove', 'skateboard',
  296. 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup',
  297. 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple',
  298. 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza',
  299. 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
  300. 'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote',
  301. 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink',
  302. 'refrigerator', 'book', 'clock', 'vase', 'scissors',
  303. 'teddy bear', 'hair drier', 'toothbrush'),
  304. "num_classes":81
  305. ```
  306. ## 训练过程
  307. - 在`config.py`中设置配置项,包括loss_scale、学习率和网络超参。单击[此处](https://www.mindspore.cn/tutorial/training/zh-CN/master/use/data_preparation.html)获取更多数据集相关信息.
  308. ### 训练
  309. - 运行`run_standalone_train.sh`开始MaskRCNN模型的非分布式训练。
  310. ```bash
  311. # 单机训练
  312. sh run_standalone_train.sh [PRETRAINED_MODEL]
  313. ```
  314. ### 分布式训练
  315. - 运行`run_distribute_train.sh`开始Mask模型的分布式训练。
  316. ```bash
  317. sh run_distribute_train.sh [RANK_TABLE_FILE] [PRETRAINED_MODEL]
  318. ```
  319. - Notes
  320. 1. 运行分布式任务时要用到由RANK_TABLE_FILE指定的hccl.json文件。您可使用[hccl_tools](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools)生成该文件。
  321. 2. PRETRAINED_MODEL应该是训练好的ResNet50检查点。如果此参数未设置,网络将从头开始训练。如果想要加载训练好的MaskRcnn检查点,需要对train.py作如下修改:
  322. ```python
  323. # Comment out the following code
  324. # load_path = args_opt.pre_trained
  325. # if load_path != "":
  326. # param_dict = load_checkpoint(load_path)
  327. # for item in list(param_dict.keys()):
  328. # if not item.startswith('backbone'):
  329. # param_dict.pop(item)
  330. # load_param_into_net(net, param_dict)
  331. # Add the following codes after optimizer definition since the FasterRcnn checkpoint includes optimizer parameters:
  332. lr = Tensor(dynamic_lr(config, rank_size=device_num, start_steps=config.pretrain_epoch_size * dataset_size),
  333. mstype.float32)
  334. opt = Momentum(params=net.trainable_params(), learning_rate=lr, momentum=config.momentum,
  335. weight_decay=config.weight_decay, loss_scale=config.loss_scale)
  336. if load_path != "":
  337. param_dict = load_checkpoint(load_path)
  338. if config.pretrain_epoch_size == 0:
  339. for item in list(param_dict.keys()):
  340. if item in ("global_step", "learning_rate") or "rcnn.cls" in item or "rcnn.mask" in item:
  341. param_dict.pop(item)
  342. load_param_into_net(net, param_dict)
  343. load_param_into_net(opt, param_dict)
  344. ```
  345. 3. 本操作涉及处理器内核绑定,需要设置`device_num`及处理器总数。若无需此操作,请删除`scripts/run_distribute_train.sh`中的`taskset`
  346. ### 训练结果
  347. 训练结果将保存在示例路径,文件夹名称以“train”或“train_parallel”开头。您可以在loss_rankid.log中找到检查点文件及如下类似结果。
  348. ```bash
  349. # 分布式训练结果(8P)
  350. epoch:1 step:7393 ,rpn_loss:0.10626, rcnn_loss:0.81592, rpn_cls_loss:0.05862, rpn_reg_loss:0.04761, rcnn_cls_loss:0.32642, rcnn_reg_loss:0.15503, rcnn_mask_loss:0.33447, total_loss:0.92218
  351. epoch:2 step:7393 ,rpn_loss:0.00911, rcnn_loss:0.34082, rpn_cls_loss:0.00341, rpn_reg_loss:0.00571, rcnn_cls_loss:0.07440, rcnn_reg_loss:0.05872, rcnn_mask_loss:0.20764, total_loss:0.34993
  352. epoch:3 step:7393 ,rpn_loss:0.02087, rcnn_loss:0.98633, rpn_cls_loss:0.00665, rpn_reg_loss:0.01422, rcnn_cls_loss:0.35913, rcnn_reg_loss:0.21375, rcnn_mask_loss:0.41382, total_loss:1.00720
  353. ...
  354. epoch:10 step:7393 ,rpn_loss:0.02122, rcnn_loss:0.55176, rpn_cls_loss:0.00620, rpn_reg_loss:0.01503, rcnn_cls_loss:0.12708, rcnn_reg_loss:0.10254, rcnn_mask_loss:0.32227, total_loss:0.57298
  355. epoch:11 step:7393 ,rpn_loss:0.03772, rcnn_loss:0.60791, rpn_cls_loss:0.03058, rpn_reg_loss:0.00713, rcnn_cls_loss:0.23987, rcnn_reg_loss:0.11743, rcnn_mask_loss:0.25049, total_loss:0.64563
  356. epoch:12 step:7393 ,rpn_loss:0.06482, rcnn_loss:0.47681, rpn_cls_loss:0.04770, rpn_reg_loss:0.01709, rcnn_cls_loss:0.16492, rcnn_reg_loss:0.04990, rcnn_mask_loss:0.26196, total_loss:0.54163
  357. ```
  358. ## 评估过程
  359. ### 评估
  360. - 运行`run_eval.sh`进行评估。
  361. ```bash
  362. # 推理
  363. sh run_eval.sh [VALIDATION_ANN_FILE_JSON] [CHECKPOINT_PATH]
  364. ```
  365. > 关于COCO2017数据集,VALIDATION_ANN_FILE_JSON参考数据集目录下的annotations/instances_val2017.json文件。
  366. > 检查点可在训练过程中生成并保存,其文件夹名称以“train/checkpoint”或“train_parallel*/checkpoint”开头。
  367. >
  368. > 数据集中图片的数量要和VALIDATION_ANN_FILE_JSON文件中标记数量一致,否则精度结果展示格式可能出现异常。
  369. ### 评估结果
  370. 推理结果将保存在示例路径,文件夹名为“eval”。您可在该文件夹的日志中找到如下类似结果。
  371. ```text
  372. Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.376
  373. Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.598
  374. Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.405
  375. Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.239
  376. Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.414
  377. Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.475
  378. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.311
  379. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.500
  380. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.528
  381. Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.371
  382. Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.572
  383. Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.653
  384. Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.326
  385. Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.553
  386. Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.344
  387. Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.169
  388. Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.356
  389. Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.462
  390. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.278
  391. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.426
  392. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.445
  393. Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.294
  394. Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.484
  395. Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.558
  396. ```
  397. ## 模型导出
  398. ```shell
  399. python export.py --ckpt_file [CKPT_PATH] --device_target [DEVICE_TARGET] --file_format[EXPORT_FORMAT]
  400. ```
  401. `EXPORT_FORMAT` 选项 ["AIR", "ONNX", "MINDIR"]
  402. ## 推理过程
  403. ### 使用方法
  404. 在推理之前需要在昇腾910环境上完成模型的导出。目前推理只支持batch_size=1。推理过程需要占用大约600G的硬盘空间来保存推理的结果。
  405. ```shell
  406. # Ascend310 推理
  407. sh run_infer_310.sh [AIR_PATH] [DATA_PATH] [ANN_FILE_PATH]
  408. ```
  409. ### 结果
  410. 推理的结果保存在当前目录下,在acc.log日志文件中可以找到类似以下的结果。
  411. ```bash
  412. Evaluate annotation type *bbox*
  413. Accumulating evaluation results...
  414. Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.3368
  415. Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.589
  416. Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.394
  417. Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.218
  418. Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.411
  419. Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.476
  420. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.305
  421. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.489
  422. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.514
  423. Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.323
  424. Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.562
  425. Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.657
  426. Evaluate annotation type *segm*
  427. Accumulating evaluation results...
  428. Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.323
  429. Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.544
  430. Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.336
  431. Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.147
  432. Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.353
  433. Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.479
  434. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.278
  435. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.422
  436. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.439
  437. Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.248
  438. Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.478
  439. Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.594
  440. ```
  441. # 模型说明
  442. ## 性能
  443. ### 训练性能
  444. | 参数 | MaskRCNN |
  445. | ------------------- | --------------------------------------------------------- |
  446. | 模型版本 | V1 |
  447. | 资源 | Ascend 910;CPU: 2.60GHz,192核;内存:755G |
  448. | 上传日期 | 2020-08-01 |
  449. | MindSpore版本 | 0.6.0-alpha |
  450. | 数据集 | COCO2017 |
  451. | 训练参数 | epoch=12,batch_size=2 |
  452. | 优化器 | SGD |
  453. | 损失函数 | Softmax交叉熵,Sigmoid交叉熵,SmoothL1Loss |
  454. | 速度 | 单卡:250毫秒/步;8P: 260毫秒/步 |
  455. | 总时长 | 单卡:52小时;8卡:6.6小时 |
  456. | 参数(M) | 280 |
  457. | 脚本 | <https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/maskrcnn> |
  458. ### 评估性能
  459. | 参数 | MaskRCNN |
  460. | --------------------- | ----------------------------- |
  461. | 模型版本 | V1 |
  462. | 资源 | Ascend 910 |
  463. | 上传日期 | 2020-08-01 |
  464. | MindSpore版本 | 0.6.0-alpha |
  465. | 数据集 | COCO2017 |
  466. | 批次大小 | 2 |
  467. | 输出 | mAP |
  468. | 精确度 | 交并比(IoU)=0.50:0.95 32.4% |
  469. | 推理模型 | 254M(.ckpt文件) |
  470. # 随机情况说明
  471. `dataset.py`中设置了“create_dataset”函数内的种子,同时还使用`train.py`中的随机种子进行权重初始化。
  472. # ModelZoo主页
  473. 请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。