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 17 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. # 目录
  2. <!-- TOC -->
  3. - [目录](#目录)
  4. - [SSD说明](#ssd说明)
  5. - [模型架构](#模型架构)
  6. - [数据集](#数据集)
  7. - [环境要求](#环境要求)
  8. - [快速入门](#快速入门)
  9. - [脚本说明](#脚本说明)
  10. - [脚本及样例代码](#脚本及样例代码)
  11. - [脚本参数](#脚本参数)
  12. - [训练过程](#训练过程)
  13. - [Ascend上训练](#ascend上训练)
  14. - [GPU训练](#gpu训练)
  15. - [评估过程](#评估过程)
  16. - [Ascend处理器环境评估](#ascend处理器环境评估)
  17. - [GPU处理器环境评估](#gpu处理器环境评估)
  18. - [推理过程](#推理过程)
  19. - [导出MindIR](#导出mindir)
  20. - [在Ascend310执行推理](#在ascend310执行推理)
  21. - [结果](#结果)
  22. - [模型描述](#模型描述)
  23. - [性能](#性能)
  24. - [评估性能](#评估性能)
  25. - [推理性能](#推理性能)
  26. - [随机情况说明](#随机情况说明)
  27. - [ModelZoo主页](#modelzoo主页)
  28. <!-- /TOC -->
  29. # SSD说明
  30. SSD将边界框的输出空间离散成一组默认框,每个特征映射位置具有不同的纵横比和尺度。在预测时,网络对每个默认框中存在的对象类别进行评分,并对框进行调整以更好地匹配对象形状。此外,网络将多个不同分辨率的特征映射的预测组合在一起,自然处理各种大小的对象。
  31. [论文](https://arxiv.org/abs/1512.02325): Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, Alexander C. Berg.European Conference on Computer Vision (ECCV), 2016 (In press).
  32. # 模型架构
  33. SSD方法基于前向卷积网络,该网络产生固定大小的边界框集合,并针对这些框内存在的对象类实例进行评分,然后通过非极大值抑制步骤进行最终检测。早期的网络层基于高质量图像分类的标准体系结构,被称为基础网络。后来通过向网络添加辅助结构进行检测。
  34. # 数据集
  35. 使用的数据集: [COCO2017](<http://images.cocodataset.org/>)
  36. - 数据集大小:19 GB
  37. - 训练集:18 GB,118000张图像
  38. - 验证集:1 GB,5000张图像
  39. - 标注:241 MB,实例,字幕,person_keypoints等
  40. - 数据格式:图像和json文件
  41. - 注意:数据在dataset.py中处理
  42. # 环境要求
  43. - 安装[MindSpore](https://www.mindspore.cn/install)。
  44. - 下载数据集COCO2017。
  45. - 本示例默认使用COCO2017作为训练数据集,您也可以使用自己的数据集。
  46. 1. 如果使用coco数据集。**执行脚本时选择数据集coco。**
  47. 安装Cython和pycocotool,也可以安装mmcv进行数据处理。
  48. ```python
  49. pip install Cython
  50. pip install pycocotools
  51. ```
  52. 并在`config.py`中更改COCO_ROOT和其他您需要的设置。目录结构如下:
  53. ```text
  54. .
  55. └─cocodataset
  56. ├─annotations
  57. ├─instance_train2017.json
  58. └─instance_val2017.json
  59. ├─val2017
  60. └─train2017
  61. ```
  62. 2. 如果使用自己的数据集。**执行脚本时选择数据集为other。**
  63. 将数据集信息整理成TXT文件,每行如下:
  64. ```text
  65. train2017/0000001.jpg 0,259,401,459,7 35,28,324,201,2 0,30,59,80,2
  66. ```
  67. 每行是按空间分割的图像标注,第一列是图像的相对路径,其余为[xmin,ymin,xmax,ymax,class]格式的框和类信息。我们从`IMAGE_DIR`(数据集目录)和`ANNO_PATH`(TXT文件路径)的相对路径连接起来的图像路径中读取图像。在`config.py`中设置`IMAGE_DIR`和`ANNO_PATH`。
  68. # 快速入门
  69. 通过官方网站安装MindSpore后,您可以按照如下步骤进行训练和评估:
  70. - Ascend处理器环境运行
  71. ```shell script
  72. # Ascend分布式训练
  73. sh run_distribute_train.sh [DEVICE_NUM] [EPOCH_SIZE] [LR] [DATASET] [RANK_TABLE_FILE]
  74. ```
  75. ```shell script
  76. # Ascend处理器环境运行eval
  77. sh run_eval.sh [DATASET] [CHECKPOINT_PATH] [DEVICE_ID]
  78. ```
  79. - GPU处理器环境运行
  80. ```shell script
  81. # GPU分布式训练
  82. sh run_distribute_train_gpu.sh [DEVICE_NUM] [EPOCH_SIZE] [LR] [DATASET]
  83. ```
  84. ```shell script
  85. # GPU处理器环境运行eval
  86. sh run_eval_gpu.sh [DATASET] [CHECKPOINT_PATH] [DEVICE_ID]
  87. ```
  88. # 脚本说明
  89. ## 脚本及样例代码
  90. ```text
  91. .
  92. └─ cv
  93. └─ ssd
  94. ├─ README.md ## SSD相关说明
  95. ├─ scripts
  96. ├─ run_distribute_train.sh ## Ascend分布式shell脚本
  97. ├─ run_distribute_train_gpu.sh ## GPU分布式shell脚本
  98. ├─ run_eval.sh ## Ascend评估shell脚本
  99. └─ run_eval_gpu.sh ## GPU评估shell脚本
  100. ├─ src
  101. ├─ __init__.py ## 初始化文件
  102. ├─ box_util.py ## bbox工具
  103. ├─ coco_eval.py ## coco指标工具
  104. ├─ config.py ## 总配置
  105. ├─ dataset.py ## 创建并处理数据集
  106. ├─ init_params.py ## 参数工具
  107. ├─ lr_schedule.py ## 学习率生成器
  108. └─ ssd.py ## SSD架构
  109. ├─ eval.py ## 评估脚本
  110. ├─ train.py ## 训练脚本
  111. └─ mindspore_hub_conf.py ## MindSpore Hub接口
  112. ```
  113. ## 脚本参数
  114. ```text
  115. train.py和config.py中主要参数如下:
  116. "device_num": 1 # 使用设备数量
  117. "lr": 0.05 # 学习率初始值
  118. "dataset": coco # 数据集名称
  119. "epoch_size": 500 # 轮次大小
  120. "batch_size": 32 # 输入张量的批次大小
  121. "pre_trained": None # 预训练检查点文件路径
  122. "pre_trained_epoch_size": 0 # 预训练轮次大小
  123. "save_checkpoint_epochs": 10 # 两个检查点之间的轮次间隔。默认情况下,每10个轮次都会保存检查点。
  124. "loss_scale": 1024 # 损失放大
  125. "class_num": 81 # 数据集类数
  126. "image_shape": [300, 300] # 作为模型输入的图像高和宽
  127. "mindrecord_dir": "/data/MindRecord_COCO" # MindRecord路径
  128. "coco_root": "/data/coco2017" # COCO2017数据集路径
  129. "voc_root": "" # VOC原始数据集路径
  130. "image_dir": "" # 其他数据集图片路径,如果使用coco或voc,此参数无效。
  131. "anno_path": "" # 其他数据集标注路径,如果使用coco或voc,此参数无效。
  132. ```
  133. ## 训练过程
  134. 运行`train.py`训练模型。如果`mindrecord_dir`为空,则会通过`coco_root`(coco数据集)或`image_dir`和`anno_path`(自己的数据集)生成[MindRecord](https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/convert_dataset.html)文件。**注意,如果mindrecord_dir不为空,将使用mindrecord_dir代替原始图像。**
  135. ### Ascend上训练
  136. - 分布式
  137. ```shell script
  138. sh run_distribute_train.sh [DEVICE_NUM] [EPOCH_SIZE] [LR] [DATASET] [RANK_TABLE_FILE] [PRE_TRAINED](optional) [PRE_TRAINED_EPOCH_SIZE](optional)
  139. ```
  140. 此脚本需要五或七个参数。
  141. - `DEVICE_NUM`:分布式训练的设备数。
  142. - `EPOCH_NUM`:分布式训练的轮次数。
  143. - `LR`:分布式训练的学习率初始值。
  144. - `DATASET`:分布式训练的数据集模式。
  145. - `RANK_TABLE_FILE`:[rank_table.json](https://gitee.com/mindspore/mindspore/tree/master/model_zoo/utils/hccl_tools)的路径。最好使用绝对路径。
  146. - `PRE_TRAINED`:预训练检查点文件的路径。最好使用绝对路径。
  147. - `PRE_TRAINED_EPOCH_SIZE`:预训练的轮次数。
  148. 训练结果保存在当前路径中,文件夹名称以"LOG"开头。 您可在此文件夹中找到检查点文件以及结果,如下所示。
  149. ```text
  150. epoch: 1 step: 458, loss is 3.1681802
  151. epoch time: 228752.4654865265, per step time: 499.4595316299705
  152. epoch: 2 step: 458, loss is 2.8847265
  153. epoch time: 38912.93382644653, per step time: 84.96273761232868
  154. epoch: 3 step: 458, loss is 2.8398118
  155. epoch time: 38769.184827804565, per step time: 84.64887516987896
  156. ...
  157. epoch: 498 step: 458, loss is 0.70908034
  158. epoch time: 38771.079778671265, per step time: 84.65301261718616
  159. epoch: 499 step: 458, loss is 0.7974688
  160. epoch time: 38787.413120269775, per step time: 84.68867493508685
  161. epoch: 500 step: 458, loss is 0.5548882
  162. epoch time: 39064.8467540741, per step time: 85.29442522723602
  163. ```
  164. ### GPU训练
  165. - 分布式
  166. ```shell script
  167. sh run_distribute_train_gpu.sh [DEVICE_NUM] [EPOCH_SIZE] [LR] [DATASET] [PRE_TRAINED](optional) [PRE_TRAINED_EPOCH_SIZE](optional)
  168. ```
  169. 此脚本需要五或七个参数。
  170. - `DEVICE_NUM`:分布式训练的设备数。
  171. - `EPOCH_NUM`:分布式训练的轮次数。
  172. - `LR`:分布式训练的学习率初始值。
  173. - `DATASET`:分布式训练的数据集模式。
  174. - `PRE_TRAINED`:预训练检查点文件的路径。最好使用绝对路径。
  175. - `PRE_TRAINED_EPOCH_SIZE`:预训练的轮次数。
  176. 训练结果保存在当前路径中,文件夹名称以"LOG"开头。 您可在此文件夹中找到检查点文件以及结果,如下所示。
  177. ```text
  178. epoch: 1 step: 1, loss is 420.11783
  179. epoch: 1 step: 2, loss is 434.11032
  180. epoch: 1 step: 3, loss is 476.802
  181. ...
  182. epoch: 1 step: 458, loss is 3.1283689
  183. epoch time: 150753.701, per step time: 329.157
  184. ...
  185. ```
  186. ## 评估过程
  187. ### Ascend处理器环境评估
  188. ```shell script
  189. sh run_eval.sh [DATASET] [CHECKPOINT_PATH] [DEVICE_ID]
  190. ```
  191. 此脚本需要两个参数。
  192. - `DATASET`:评估数据集的模式。
  193. - `CHECKPOINT_PATH`:检查点文件的绝对路径。
  194. - `DEVICE_ID`: 评估的设备ID。
  195. > 在训练过程中可以生成检查点。
  196. 推理结果保存在示例路径中,文件夹名称以“eval”开头。您可以在日志中找到类似以下的结果。
  197. ```text
  198. Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.238
  199. Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.400
  200. Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.240
  201. Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.039
  202. Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.198
  203. Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.438
  204. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.250
  205. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.389
  206. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.424
  207. Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.122
  208. Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.434
  209. Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.697
  210. ========================================
  211. mAP: 0.23808886505483504
  212. ```
  213. ### GPU处理器环境评估
  214. ```shell script
  215. sh run_eval_gpu.sh [DATASET] [CHECKPOINT_PATH] [DEVICE_ID]
  216. ```
  217. 此脚本需要两个参数。
  218. - `DATASET`:评估数据集的模式。
  219. - `CHECKPOINT_PATH`:检查点文件的绝对路径。
  220. - `DEVICE_ID`: 评估的设备ID。
  221. > 在训练过程中可以生成检查点。
  222. 推理结果保存在示例路径中,文件夹名称以“eval”开头。您可以在日志中找到类似以下的结果。
  223. ```text
  224. Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.224
  225. Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.375
  226. Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.228
  227. Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.034
  228. Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.189
  229. Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.407
  230. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.243
  231. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.382
  232. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.417
  233. Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.120
  234. Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.425
  235. Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.686
  236. ========================================
  237. mAP: 0.2244936111705981
  238. ```
  239. ## 推理过程
  240. ### [导出MindIR](#contents)
  241. ```shell
  242. python export.py --ckpt_file [CKPT_PATH] --file_name [FILE_NAME] --file_format [FILE_FORMAT]
  243. ```
  244. 参数ckpt_file为必填项,
  245. `EXPORT_FORMAT` 必须在 ["AIR", "MINDIR"]中选择。
  246. ### 在Ascend310执行推理
  247. 在执行推理前,mindir文件必须通过`export.py`脚本导出。以下展示了使用minir模型执行推理的示例。
  248. 目前仅支持batch_Size为1的推理。精度计算过程需要70G+的内存,否则进程将会因为超出内存被系统终止。
  249. ```shell
  250. # Ascend310 inference
  251. bash run_infer_310.sh [MINDIR_PATH] [DATA_PATH] [DVPP] [DEVICE_ID]
  252. ```
  253. - `DVPP` 为必填项,需要在["DVPP", "CPU"]选择,大小写均可。需要注意的是ssd_vgg16执行推理的图片尺寸为[300, 300],由于DVPP硬件限制宽为16整除,高为2整除,因此,这个网络需要通过CPU算子对图像进行前处理。
  254. - `DEVICE_ID` 可选,默认值为0。
  255. ### 结果
  256. 推理结果保存在脚本执行的当前路径,你可以在acc.log中看到以下精度计算结果。
  257. ```bash
  258. Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.339
  259. Average Precision (AP) @[ IoU=0.50 | area= all | maxDets=100 ] = 0.521
  260. Average Precision (AP) @[ IoU=0.75 | area= all | maxDets=100 ] = 0.370
  261. Average Precision (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.168
  262. Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.386
  263. Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.461
  264. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 1 ] = 0.310
  265. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 10 ] = 0.481
  266. Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets=100 ] = 0.515
  267. Average Recall (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.293
  268. Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.659
  269. mAP: 0.33880018942412393
  270. ```
  271. # 模型描述
  272. ## 性能
  273. ### 评估性能
  274. | 参数 | Ascend | GPU |
  275. | -------------------------- | -------------------------------------------------------------| -------------------------------------------------------------|
  276. | 模型版本 | SSD V1 | SSD V1 |
  277. | 资源 | Ascend 910;CPU: 2.60GHz,192核;内存:755 GB | NV SMX2 V100-16G |
  278. | 上传日期 | 2020-06-01 | 2020-09-24 |
  279. | MindSpore版本 | 0.3.0-alpha | 1.0.0 |
  280. | 数据集 | COCO2017 | COCO2017 |
  281. | 训练参数 | epoch = 500, batch_size = 32 | epoch = 800, batch_size = 32 |
  282. | 优化器 | Momentum | Momentum |
  283. | 损失函数 | Sigmoid交叉熵,SmoothL1Loss | Sigmoid交叉熵,SmoothL1Loss |
  284. | 速度 | 8卡:90毫秒/步 | 8卡:121毫秒/步 |
  285. | 总时长 | 8卡:4.81小时 | 8卡:12.31小时 |
  286. | 参数(M) | 34 | 34 |
  287. |脚本 | https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/ssd | https://gitee.com/mindspore/mindspore/tree/master/model_zoo/official/cv/ssd |
  288. ### 推理性能
  289. | 参数 | Ascend | GPU |
  290. | ------------------- | ----------------------------| ----------------------------|
  291. | 模型版本 | SSD V1 | SSD V1 |
  292. | 资源 | Ascend 910 | GPU |
  293. | 上传日期 | 2020-06-01 | 2020-09-24 |
  294. | MindSpore版本 | 0.3.0-alpha | 1.0.0 |
  295. | 数据集 | COCO2017 | COCO2017 |
  296. | batch_size | 1 | 1 |
  297. | 输出 | mAP | mAP |
  298. | 准确率 | IoU=0.50: 23.8% | IoU=0.50: 22.4% |
  299. | 推理模型 | 34M(.ckpt文件) | 34M(.ckpt文件) |
  300. # 随机情况说明
  301. dataset.py中设置了“create_dataset”函数内的种子,同时还使用了train.py中的随机种子。
  302. # ModelZoo主页
  303. 请浏览官网[主页](https://gitee.com/mindspore/mindspore/tree/master/model_zoo)。