系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、模型选的选择
- 1. Baseline的选择
- 2. BackBone
- 3.Neck
- 4. Head
- 5. Loss
- 二、数据增强
- 三、训练测试策略
- 1,模型训练
- 2、模型测试
- 总结
前言
对图像算法的一些个人纪录,如果出现一些不是很明白的部分可以进行关键字搜索,网上有相应的讲解。
推荐几个最新的文章:目标检测比赛中的tricks, 目标检测类算法比赛的经验总结, 提升小目标检测的思路。
一、模型选的选择
1. Baseline的选择
MMdetection,Yolo系列,Anchor Free,Anchor Base,图像分类 等选择一个自己用着顺手且易于修改的框架
2. BackBone
Object Detection或者Classification的任务:一般使用开源ImageNet预训练权重的backbone或者COCO预训练权重初始化,一般情况相较预随机初始化会好很多。更极致一点就是针对训练数据集做一次预训练,将所有目标裁剪出来,然后训练一个不错分类模型。
BatchNorm:BN,IBN(Reid效果很好),GN(batch size太小时可以选择),syncBN,一般情况syncBN会比较好。
backbone加注意力机制Attention module:个人认为这两个比较好用SE module, CBAM module,但是加了的话就得修改下加载预训练权重的方法了,按照键值对相应load进去,对新加的module跳过并选择合适的权重初始化方式。
可变形卷积 DCN:一般加在backbone的后半部分,目前DCN对部署非常不友好,有部署需求慎重选择,但是一般加了DCN都能涨点的。
3.Neck
SSH,FPN,BiFPN,PAnet根据自己需求高矮胖瘦的选择,高胖重,性能更强速度慢,矮瘦速度快但性能受限
4. Head
比如yoloV4输出三个head(yolo层),tiny版则是两个head(yolo层),Tinaface输出六个head,cls和Regression box两条分支是否共享权重。
cancat 和 add的衡量选择用哪个
Concat:张量拼接,会扩充两个张量的维度,例如2626256和2626512两个张量拼接,结果是2626768。Concat和cfg文件中的route功能一样。
add:张量相加,张量直接相加,不会扩充维度,例如104104128和104104128相加,结果还是104104128。add和cfg文件中的shortcut功能一样。
5. Loss
cls 的 loss:CrossEntropy Loss,BCEloss,Focal Loss, GFocal LossBounding Box Regeression的Loss近些年的发展过程是:L1 loss/L2 loss->Smooth L1 Loss-> IoU Loss(2016)-> GIoU Loss(2019)-> DIoU Loss(2020)->CIoU Loss(2020)
landmark 的 loss:landmark也属于回归问题,比较特别的有Wing Loss
二、数据增强
翻转和旋转: 注意目标是否具有翻转旋转不变性,并且要对labels做相应的变换
Resize: 多尺度,YoloV5的多尺度变换就很好
distort:像素级变换,主要是对图像做颜色,色调,饱和度的变换)
blur: 模糊增强,高斯、中值、运动
Expand: SSD中的,将图像缩小,其他地方补0回原始尺寸,ssd默认是300
MixUP和填鸭式
三、训练测试策略
1,模型训练
1.apex混合精度训练
2.增大学习率。更大的Batch Size可以使每个Batch数据计算的梯度更加贴近整个数据集,从侧面提高学习率。如果batch size偏小可以通过梯度累加若干epoch,在一起回传进行BP计算。
3.Warm up:指的是用一个小的学习率先训练几个epoch,一般从0上升到一个初始学习率,这是因为网络的参数是随机初始化的,一开始就采用较大的学习率容易数值不稳定。
3.学习率衰减策略:
有序调整:等间隔调整(Step),按需调整学习率(MultiStep),指数衰减调整(Exponential)和 余弦退火CosineAnnealing。
自适应调整:自适应调整学习率 ReduceLROnPlateau。
自定义调整:自定义调整学习率 LambdaLR。
4.优化器选择 :一般都是SGD或者Adam。
5.标签平滑 label smooth
对于分类问题,尤其是多类别分类问题中,常常把类别向量做成one-hot。会造成过拟合等问题。可以通过标签平滑降低一些分类过于准确的程度。
6.多尺度训练Mult-Scale
7.伪标签pseudo-labeling:在测试阶段用训练好的模型先对测试集做一次标注,然后吧标注出来的数据merge到训练集中finetune,之后在对测试集做最终的预测。这个一般适用于比赛,一昧的追求精度。
8.Anchor的设置:每个feature map的像素点都会有一系列的anchor,这个要结合feature map对应上原输入图像上的感受野和目标bbox的长宽比来设置,比如Yolo的Kmeans聚类生成anchor。
2、模型测试
TTA(Test Time Augmentation)通过对每张测试图像进行多次变换(如水平翻转、提高图像分辨率)并生成新的图像来进行数据增广。新的图像与现有图像一起被输入到训练好的模型中。因此,对应于每一个测试图像,使用增强的图像生成多个预测。在此过程中产生的重复或重叠的预测使用非极大抑制(NMS)算法进行过滤或者用WBF(weighted Boxes Fusion)做bbox融合。整个方法被称为集成预测(Ensemble Prediction,EP)
Ensemble Model 将模型的不同变体进行集成。鉴于训练一个模型涉及到调整不同的超参数,使用这些参数的不同组合会产生不同的训练模型。作者选择这些模型的一个子集,以使它们的整体精度最大化。每幅图像都会在所有选定的模型上测试,然后对每个模型的预测结果进行平均,最后应用非极大抑制。这种集成技术通过降低预测方差实现了更好的准确性。
tips:降低score的阈值能提升map,但会较多的误检。
总结
持续更新。。。