模型
1.小物体可以考虑四个head 2.含attention的backbone,但是用不了预训练参数,需要从其他地方找coco预训练参数,比如SENet、GCNet 3.可变性卷积,可以在backbone最后三层加,难以导出onnx 4.对于大物体较差时可以使用空洞卷积 5.Group Normalization对于batch没有联系
训练
- 加长训练时间,使用3x_schedule
- 一般论文拆分StepLrSchedule,可以考虑CosineLrSchedule或CosineAnnealingLrSchedule,一般需要配合warmup
- stochastic weight averaging
- 大学习率+梯度裁剪,连续n个epochs的val acc不上升或val loss不下降时学习率衰减
- Label Smoothing是一个正则化方法
- 在需要量化的场景,可以直接使用低精度(FP16,混合精度)进行训练。
- 使用更大的batch size,一般也需要等比例增大学习率;
数据增强
3.对极小物体检测时,裁剪有助于收敛 4.albumentations库 5.mixup 6.填鸭式,把一些误检的目标放到没有目标的图上的比较合理的位置,做法是比对图像块的互信息,参考填鸭式 7.filp,resize,distort,blur 8.mosaic, 9.分类:AutoAugment,Colorjit
评估
1.coco和voc的评测方法,会把confiden设置较低,是为拉长PR曲线,使MAP变高 2.不同的NMS算法效果也不同,见https://github.com/ZFTurbo/Weighted-Boxes-Fusion/tree/master,WBF效果好但速度慢3倍 3.TTA
损失函数
在线难样本学习:
对loss进行加权,或者删去简单样本的损失
目标检测: Bbox loss (IOU,GIOU,DIOU,CIOU) Confidence loss(YOLOv4,YOLOv5,PP-YOLO) IOU_Aware_Loss(PP-YOLO) Focal loss IOU Loss:考虑了重叠面积,归一化坐标尺度; GIOU Loss:考虑了重叠面积,基于IOU解决边界框不相交时loss等于0的问题; DIOU Loss:考虑了重叠面积和中心点距离,基于IOU解决GIOU收敛慢的问题; CIOU Loss:考虑了重叠面积、中心点距离、纵横比,基于DIOU提升回归精确度; EIOU Loss:考虑了重叠面积,中心点距离、长宽边长真实差,基于CIOU解决了纵横比的模糊定义,并添加Focal Loss解决BBox回归中的样本不平衡问题。
free bag
RepConv 重参数化 粗辅助头和细引导头(yolov7)
隐式知识结合卷积特征映射和乘法方式(YOLOR) EMA模型
知识蒸馏(knowledge distillation)
轻量化
- 卷积核:
- 大卷积核用多个小卷积核平替
- 单一尺寸卷积核用多尺寸卷积核平替
- 可变性卷积
- 1x1卷积,bottleneck架构
- 通道
- 深度可分离卷积
- 分组卷积+channels shuffle
- 通道加权
- 连接
- 使用残差连接
- 融合多层特征
加速训练
使用梯度裁剪
loss.backward() torch.nn.utils.clip_grad_norm_(model.parameters(), 20) # 在代码中加入这行实现梯度裁剪 optimizer.step()设置torch.backends.cudnn.benchmark = True
设置torch.backends.cudnn.benchmark = True将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。适用场景:网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)固定。反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。 3. DataLoader
- pin_memory=True,锁页内存,内存够用一定要加上
- prefetch_factor=任意数字,预加载
- persistent_workers=True,训练完1个epoch后,不会重新初始化workers
记录
- 从adam换成sgd后,学习率需要调整,特别是在没有预训练下,更需要调大
- sgd的动量调整为0.9更易于学习
- 从0搭建训练流程时,weight_decay可以先设0,因为需要优先确认模型能不能收敛或者过拟合
- 小目标检测,可以增大训练尺寸,上采样用carafe算子
- 数据集小的时候,可以使用泊松融合生成新图片