原视频链接
1.定义
输入一张图片或者一段视频,用一个bbox将感兴趣的预定义类别检测出来,同时完成定位和分类。
2.设备
必须要有一块GPU
- 显卡类型:目前只有nvidia公司的显卡支持cuda及cudnn,AMD显卡也可以通过opengl支持深度学习训练,但是很多op需要自己重构
- 显存大小:显存大小限制模型训练时输入图像分辨率,batch size大小上限以及模型复杂度
- 显卡数量:数量主要影响训练速度也就是方案的迭代速度
- 是否支持半精度(fp16):可以节约显存从而增大训练尺度,也可以一定程度加速训练,虽然即使是没有tensor core不支持fp16的显卡如1080Ti,也可以利用apex等方案实现fp16训练,但训练速度会比正常训练还慢很多
- 硬盘:硬盘最好采用固态硬盘,节约IO时间
- 内存:一些目标检测框架为了加快训练和推理速度,会尽量将所有op都在GPU上完成,但是当你单个训练样本上有非常多boxes的时候,很容易出现爆显存(OOM)的情况。此时为了避免OOM且不想缩小训练尺度,我们可以将这些op动态调整到cpu上完成,此时就会对内存大小有一定占用。
- CPU:够用就好
- 机器散热:如果是使用自己本地普通机器(无机房散热环境)的小伙伴们还是要想办法加强散热,合理使用水冷或者强力风冷,提高GPU效率
3.预备基础知识
- python
- 计算机视觉基础
- 机器学习、深度学习基础
- 深度学习框架Pytorch、mxnet、Tensorflow、PaddlePaddle等等
- 目标检测相关论文
https://github.com/hoya012/deep_learning_object_detection
4.deep learning based OD
5.常用目标检测开源项目
- mmdetection
https://github.com/open-mmlab/mmdetection - detectron2
https://github.com/facebookresearch/detectron2 - simpleDet https://github.com/TuSimple/simpledet
- PaddleDetection https://github.com/PaddlePaddle/PaddleDetection
6.参赛基本流程
- 规则理解掌握
- 数据分析
- baseline
- 方案迭代改进
- 代码和模型提交
- 答辩准备
- 答辩
6.1比赛规则分析
- 时间节点及不同阶段关联性
- 精力分配,熬夜伤身
- 评测指标
- mAP(配合不同IoU要求)
- acc+mAP
这里acc是指,比赛的测试集中会包含一些正常图像,也就是不包含检测目标的图像,我们需要对包含目标的图像和和不包含目标的图像做一个二分类,用到的指标就是acc - F1-score
- 模型限制
- 数量
- 体积
- 运行时间限制
- 硬性规定
- 得分加权
- 时间分数占比
注:mAP(0.5:0.95:0.05)
score阈值不一样,一个是0.3,一个是0.001,但是右边mAP大于左边mAP
6.1.1 mAP
- https://github.com/rafaelpadilla/Object-Detection-Metrics
有详细介绍目标检测指标,并有开源的实现 - 新手常见错误:
- score阈值的给定由可视化结果决例如0.5
- score阈值适当的降低可以提高mAP
6.1.2 模型限制
- 体积限制
- 直接将float32格式模型保存为float16格式
- 采用fp16训练保存float16格式模型
- 移除不必要的参数,例如optimize优化过程的参数等(好处是:可以帮助更好的恢复训练)
- 数量限制
- 由于数量难以界定,现在一般不采用
6.1.3 推理时间
- 医疗遥感类检测任务图像较大时由于测试需要滑动窗口一般不考虑推理时间
- 硬性限制:推理速度必须高于n FPS
- 加权衰减:按照推理时间加权惩罚
- 时间分数占比
- 应对的策略:
- 模型轻量化
- 减少模型数量
- 减小infer尺度
- 特殊的优化手段:多进程异步数据加载,模型压缩量化等
6.2 数据分析
- 图像大小分布
- Gt boxes大小及长宽比例分布
- Gt boxes与图像大小相对比例分布
- Gt boxes类别分布
以上四点是感受野&anchor&训练尺度
- Domain分布
- 数据的特殊性质
a. 图像大小分布:统计数据集中图像大小的分布
- 医疗、遥感数据常见超大图像,需要合理的crop操作
- 数据集内图像大小差异较大,需要合理的padding和crop策略
- 结合自身设备初步判断训练的尺度上限
b. Gt boxes大小及长宽比例分布
- Boxes 大小分布影响anchor scale设计
- Boxes 长宽比例分布影响anchor ratio设计
- 类内和类间boxes大小的分布,影响整体算法的设计,例如多尺度及专家模型以及后处理
c. Gt boxes与图像大小相对比例分布
- 由这一比例可以计算目标在经过resize进入网络时候的实际大小,从而:
- 结合图像实际大小决定训练尺度的选取
- 决定anchor scaleb
- 决定anchor ratio
- 决定backbone的选取(模型感受野)
- 大、中、小三种目标的权衡
d. Gt boxes类别比例分布
- 非常不均衡,呈现长尾分布(典型代表open image,object365等):
- 上采样增强(对数量少的类,可以对框内目标单独做增强)
- 下采样增强(对数量多的类)
- 训练动态加权采样(尽量让每个batch选取数量少的类)
- 稀少数据专家模型
f. 感受野&anchor&训练尺度
- 三者互相协调
- 结合以上分析,设定合理的训练尺度
- 基于resize后的目标boxes大小来讨论(将目标大小依据训练尺度resize)
- anchor scale 和anchor ratio 接近目标的分布可以加快收领
- 模型感受野要尽量大于目标长边
- 缩小训练图像尺度(本质上网络感受野没变,根对数据的感受野变大)
- 增加网络深度,即选择更深的backbone
- 最后的卷积采用空洞卷积
- 引入DCN模块
- 当一个训练尺度或者一个模型难以协调的时候:
- 多尺度训练预测
- 专家模型(这里是基于尺度的专家)
- https://zhuanlan.zhihu.com/p/44106492
- https://zhuanlan.zhihu.com/p/55824651
g. 数据的特殊性质
-
天池津南数字制造算法挑战赛【赛场二】物流限制品检测-X光图像限制品语义分割
- 图像为RGB的X光成像图片
- 过观察可以发现数据类似摆拍形式,分布很一致
- 比赛提供了正常无限制品图片
- 由于X光透明性质,所以我们可以使用“抠图"+“贴图"的形式来各种进行在线数据增强,将任意的目标从原图中裁剪出来使用“mixup”的方式贴到一个正常无限制品图像中构造新的训练数据
-
基于虚拟仿真环境下的自动驾驶交通标志识别
- 数据为出题方模拟引擎生成的虚拟数据,存在光照天气等变化,但是交通标志形式变化有限
- 一张图最多仅有一个交通标志目标
- 图像尺度很大,但是目标极小
- 评测指标为iou>0.95的f1值,要求很变态(其实是因为0.75要求的时候分数都刷爆了,都是满分)
- 采用粗检测+精细检测来应对目标数量及其稀少的检测
- 以hrnet作为Asbackbone来应对iou要求极高的检测
h. 数据分析引发的思考
- 模型感受野 & anchor & gt分布
- 数据增强方式
- 针对数据特殊性质的特殊处理
- 验证集划分(额外意义):
- 按起葫芦浮起瓢
- 对应极端情况,一个模型难以满足所有类别
- 通过验证集对每一类进行指标分析,从而定向解决问题
- 专家模型
- 按起葫芦浮起瓢
- 训练采样的方式
- 在线加权采样
- 按照类别数量比例加权
- 按照图片类别丰富度加权(类别越多,权重越大)
- OHEM等基于loss的采样
- 在线加权采样
- 正常数据(背景数据)的使用
- 拼接将含目标图像与正常图像拼接在一起进行训练
- 抠图+粘贴将目标crop出来以后通过各种方式贴在正常数据上
- 如果背景数据与含目标数据具有对应关系
- 做差
- 通道拼接
6.3 目标检测算法选择
- 整体算法(anchor-based)
- Backbone
- Head
- Substructure
- Post-processing
6.3.1 Backbone
- ResNet
- ResNext
- SENet
- EfficientNet
- HRNet
- DCN
6.3.2 FPN
- FPN
- PANET
- NAS-fps
- Bifpn
6.3.3 Head
- cascade
- Double head(回归分类分开)
6.3.4 Post-processing
- nms
- Soft-nms
- 基于最大score的后验二分类
- 基于类间关系的后处理
- 基于目标大小及位置先验的后处理
6.4 模型预训练
- ImageNet 预训练
- COCO 预训练(推荐用这个,对backbone和fpn都有一个很好的预训练)
- Open image或object365预训练等
- 基于目标检测数据集的预训练帮助前景背景的区分
- 使用DCN时最好采用基于检测数据的预训练,自己从零训练DCN时不一定能够收敛
6.5 模型的继承
- 多模型集成配合单类最优替代
- 直接nms
- score加权集成
- bboxes voting集成
- 专家单类替代
6.6 实验&调参
- 搞清每一个参数的实际含义(理解数据和算法)
- 可以先在小的backbone上调试与backbone独立的参数
- 实验时尽量控制变量——明确每一项改动是否work
6.7 心态和节奏
- 学习第一,兴趣驱动
- 从入门到top,只需要一次认真的参赛