文章目录
- 0. 团队信息
- 1. 赛题分析
- 1.1 任务
- 1.2 指标
- 1.3 数据
- 1.4 难点
- 2. 整体方案
- 2.1 模型训练
- 2.1.1 数据增强
- 2.1.2 模型结构
- 2.1.3 训练策略
- 2.2 模型量化
- 2.2.1 量化算法
- 2.3 模型推理
- 2.3.1 图片读取
- 2.3.2 预处理
- 2.3.3 前向执行
- 2.3.4 代码框架 & 流程图
- 3. 实验结果
- 4. 总结 & 展望
- 4.1 总结
- 4.2 展望
- 5. Reference
比赛主页: 数字人体”视觉挑战赛——宫颈癌风险智能诊断
相关代码:github
0. 团队信息
- 团队名称: LLLLC
- 团队成员: 梁凯焕(@knightliang)、李晨阳(@morning_sun_lee)、林婉宜、林宏辉(@now_more)、陈展丽
1. 赛题分析
1.1 任务
- 对异常鳞状上皮细胞进行定位,属于单类别目标检测任务
- 在支持Intel VNNI的框架上进行量化推理
1.2 指标
- 性能scroe :mAP
- 时间score : QPS = slide数量 / inference总时间(总时间包括数据预处理、模型推理、后处理时间等)
- 最终score = 性能score + 时间score(两个指标分别计算,取第一名作为Gold standard,score=1.0, 其余的成绩与第一名的差距的百分比作为score的累加值,依次计算。如第一名0.3张/s,第二名0.1张/s,则第一名score=1.0,第二名score=1.667)。
1.3 数据
- 训练数据: 宫颈癌细胞学图片800张,其中阳性数据500张(包含1212个ROI),阴性数据300张;
- 测试数据:200张ROI区域图片(分辨率在几千到上万)
1.4 难点
- 速度与精度平衡
- 训练样本较少,目标背景复杂
- 细胞成像颜色多样性(染色剂种类、配比、染色时间等因素影响)
2. 整体方案
基于RetinaNet[1]的目标检测算法,在 pytorch 框架上进行模型训练,在 Openvino 上完成量化推理,流程图如下,包括以下四个步骤:模型训练、格式转换、模型量化、模型推理。
2.1 模型训练
2.1.1 数据增强
-
OnlineCropResize : 以 RoI 中目标为中心,“在线”随机裁剪1600x1600框,然后Resize成800x800,降低计算量;
-
RandomFlip:随机翻转;
-
RandomShift:将目标框裁剪下来,随机贴到图像中的其它位置,使模型学到更多的背景信息,裁剪后的区域使用cv2.inpaint进行填补;
-
ReplaceBackground + StainNorm:
-
将阳性数据中目标裁剪下来,随机贴到阴性样本上(阴性样本中背景信息有利于假阳抑制);
-
裁剪的目标框可能与随机抽取的阴性图像颜色差异较大,为减少“突兀”,通过染色剂归一化算法将裁减目标调色至阴性背景风格;
-
2.1.2 模型结构
为了提升推理速度,我们对 RetinaNet 各个模块重新设计。
-
Backbone :
- 采用轻量化的 (ImageNet pretained) MobileNetV2 [2] ;
- 实验中,MobileNetV2性能与ResNet-50相当,ResNet-34、ResNet-18等精度下降;
- 使用本次检测数据,训练分类网络作为初始化参数效果不如ImageNet;
-
减少 FPN 以及 Head 通道数:
- FPN-256 —> FPN-128
- Head-256 —> Head-64
- 实现网络各部分计算量平衡
-
模型各部分理论计算量 (GFLOPS) 及占比分析
Model structure | Backbone | FPN | Head | Total | 加速比 |
---|---|---|---|---|---|
R50-FPN256-Head256 | 52.55 (35.11%) | 10.87 (7.26%) | 86.27 (57.64%) | 149.66 | - |
MbV2-FPN128-Head64 | 4.07 (34.73%) | 2.37 (20.22%) | 5.28 (45.05%) | 11.72 | ≈12x |
2.1.3 训练策略
- 超参数:
优化器 | SGD |
---|---|
学习率 | **采用余弦下降方式,初始学习率为 1e-2 ,终止学习率为 1e-5 ** |
Batch size | 8 |
预训练模型 | ImageNet,训练时不固定BN |
Epoch数量 | 100 |
2.2 模型量化
2.2.1 量化算法
- OpenVINO Calibration Tool [3] : 量化过程包括以下4个步骤;
-
量化层选择:
- OpenVINO支持自动进行量化层选择,将准确率损失较大的层切换回fp32,但在实验中我们发现对我们模型并不是很work;
- 实验中,我们不采用OpenVINO量化层选择,而是基于经验,FPN部分参数对量化比较敏感,对MbV2-FPN1287-Head64,FPN部分卷积层不量化,其余卷基层全部量化;
Δ map@0.5 时间(ms) 量化全部卷积层 -1.71 43.58 不量化FPN部分卷积层 -0.33 51.57 -
校验数据:实验中增加校验数据并没有带来性能的提升,最终以300张训练图片作为校验数据;
校验图片数量 Δ map@0.5 300 -1.71 1200 -2.13
2.3 模型推理
推理流程包括:图片读取、预处理、前向执行、后处理等步骤。
2.3.1 图片读取
实验中IO读取占据了相当大的一部分时间消耗,采取了两个优化策略:
- 采用读取速度更快的GDAL库[3];
- 多个子进程同时读取,存放到共享队列中;
图片读取库 | 时间(s) |
---|---|
OpenCV (OpenVINO版本) | 174 |
GDAL | 99 |
2.3.2 预处理
预处理主要包括以下步骤:
- 采用无交叠滑窗策略;
- 丢弃边界像素;
- 将裁减 1600x1600 区域缩放成 800x800;
2.3.3 前向执行
采用 OpenVINO 的异步模式[4] :
-
发起执行请求后,控制权交还给主程序,分摊数据读取和后处理的时间;
-
执行完成后,通过回调函数通知主程序;
-
可以发起多个infer request同时执行;
2.3.4 代码框架 & 流程图
- 子进程负责图片的读取、裁剪、缩放、拼batch等数据处理相关的操作,处理完的数据存放到共享队列中;
- 主进程从共享队列读取数据,负责模型推理、后处理操作;
3. 实验结果
- 性能:网络结构改进 & 数据增强
模型 | 训练数据 | Online crop | Random flip | Replace BG | Drop border | **Random Shift ** | Crop size | map@0.5 (%) |
---|---|---|---|---|---|---|---|---|
R50-FPN256-Head256 | 90% | √ | 800 | 27.49 | ||||
R50-FPN256-Head256 | 90% | √ | √ | 800 | 28.24 | |||
R50-FPN256-Head256 | 90% | √ | √ | √ | 800 | 28.87 | ||
R50-FPN256-Head256 | 90% | √ | √ | √ | √ | 800 | 29.49 | |
R50-FPN256-Head256 | 90% | √ | √ | √ | √ | √ | 800 | 29.63 |
MbV2-FPN256-Head256 | 90% | √ | √ | √ | √ | √ | 800 | 28.37 |
MbV2-FPN256-Head128 | 90% | √ | √ | √ | √ | √ | 1280 | 29.14 |
MbV2-FPN128-Head128 | 100% | √ | √ | √ | √ | √ | 1280 | 32.22 |
MbV2-FPN128-Head64 | 100% | √ | √ | √ | √ | √ | 1600 | 33.54 |
- 时间:Batch size & infer request & subProcess (io) & Drop border
- 由网络结构从MbV2-FPN256-Head128调整为计算量更小的MbV2-FPN128-Head64,但推理时间不变(均为120s)可知,推理时间平静下来不在模型推理,而是 io。
模型 | Batch size | Infer request | subProcess | Drop border | Crop size | 时间(s) |
---|---|---|---|---|---|---|
R50-FPN256-Head256 | 1 | - | - | - | 800 | 830 |
R50-FPN256-Head256 | 1 | 13 | - | - | 800 | 356 |
R50-FPN256-Head256 | 8 | 13 | - | - | 800 | 303 |
R50-FPN256-Head256 | 8 | 13 | - | √ | 800 | 260 |
MbV2-FPN256-Head128 | 8 | 13 | - | √ | 1280 | 120 |
MbV2-FPN128-Head64 | 8 | 13 | - | √ | 1280 | 120 |
MbV2-FPN128-Head64 | 8 | 13 | 8 | √ | 1600 | 35 |
MbV2-FPN128-Head64 | 1 | 11 | 15 | √ | 1600 | 24 |
4. 总结 & 展望
4.1 总结
- 轻量化网络结构设计;
- RandomShift、ReplaceBackground + StainNorm 等针对医疗数据场景样本较少的数据增强方法;
- 采用异步模式进行推理;
- 多进程、GDAL库等加速IO;
4.2 展望
- IO与推理的时间大约各占一半,更优化的IO库,更小的模型都能进一步提升性能;
- 推理时采用更大的裁剪区域或者整图,预计能进一步提升速度和精度;
- 采用量化损失更小的 Backbone(Intel工程师建议,目前 OpenVINO 针对 ResNet 优化较好,量化损失较低);
比赛结果:
team_id | mAP | time(s) | Norm_time | Norm_mAP | score | rank |
---|---|---|---|---|---|---|
LLLLC | 35.99 | 34 | 1 | 1 | 2 | 1 |
《我的便携式游戏女友》 | 34.92 | 196 | 1.83 | 1.03 | 2.86 | 2 |
named | 31.28 | 208 | 1.84 | 1.13 | 2.97 | 3 |
AI-LIGHT | 28.17 | 144 | 1.76 | 1.22 | 2.98 | 4 |
xywh | 32.18 | 443 | 1.92 | 1.11 | 3.03 | 5 |
Drcubic | 27.73 | 209 | 1.84 | 1.23 | 3.07 | 6 |
deep-thinker | 32.41 | 1148 | 1.97 | 1.10 | 3.07 | 7 |
HUST_WNLO_AI | 29.34 | 1001 | 1.96 | 1.18 | 3.15 | 8 |
注:由于天池测评api时间也被计入,所有队伍实际时间都增加了10s。
5. Reference
[1] Lin T Y, Goyal P, Girshick R, et al. Focal loss for dense object detection[C], CVPR, 2017: 2980-2988.
[2] Sandler M, Howard A, Zhu M, et al. Mobilenetv2: Inverted residuals and linear bottlenecks[C], CVPR, 2018: 4510-4520.
[3] https://gdal.org/
[4]https://docs.openvinotoolkit.org/2019_R3.1/_inference_engine_tools_benchmark_tool_README.html