非常感谢极市平台提供的比赛,感谢比赛群实时给选手提供技术帮助的程序员朋友。
以下是我的一些尝试与想法,如果有不同想法或者实验结果欢迎讨论,若我有错误欢迎指出,共同学习!
训练: pytorch python3.7
sklearn, torch, mmcv, opencv-python, apex, efficientnet-pytorch
推理:openvino c++
比赛初期首先试的是efficientnet-b0, 没做过多tricks,CV:0.85x,提交:0.75x-0.76x, 但是FPS不够理想大约是10+FPS. 后面方向就主要转到所谓的移动端模型上去了.
模型尝试了MobilenetV3-small(FLOPS 60多), GhostNet1.0x(FLOPS 140多), MobilenetV3-large(FLOPS 160多), ShufflenetV2.因为速度在比赛的权重还是挺高的(0.3) 所以Ghostnet1.0x和MobilenetV3-large, ShufflenetV2尝试了2-3次没有特别高的准确率出现也就没再试. 最终选择MobilenetV3-small
因为后期C++端有速度上的BUG,我的主要实验都在前期,所以这里速度记录都是修复BUG前的速度. 模型为MobilenetV3-small.
HEIGHT = WIDTH = 224
self.transforms = Compose([
Resize(int(HEIGHT * (256 / 224)), int(WIDTH * (256 / 224)), p=1),
RandomCrop(height=HEIGHT, width=WIDTH, p=1),
HorizontalFlip(p=0.5),
])
self.test_transforms = Compose([
Resize(int(HEIGHT * (256 / 224)), int(WIDTH * (256 / 224)), p=1),
CenterCrop(height=HEIGHT, width=WIDTH, p=1),
])
Cutmix(alpha=1.0, prob=0.5) >= Mixup(alpha=1.0, prob=0.5) > GridMask(d1=10,d2=100,rotate=7,ratio=[0.4,0.6],p=0.5)
最终选择Cutmix
-
teacher-student模式,teacher模型: efficientnet-b4>=efficientnet-b1 > seresnext50-32x4d >= densenet121
-
自我蒸馏模式,上面实验已经表明efficientnet-b1是还可以的模型,这里没有过多尝试直接用efficientnet-b1对5折数据进行训练,然后对验证集输出oof,再使用oof和原标签按2:8混合
两种模式效果差不多
普通softmax交叉熵 > focal-loss
RAdam(Cosine-decay) > Adam(warm-up + Cosine-decay) 我的余弦退火是每个batch即调整学习率(每个epoch调整应该差别不大)
epochs = 20
batch_size = 256 (因为前面没有看到平台提供的GPU是什么,我没有给很大,更大可能结果会更好)
BalanceClassSampler用于平衡7个类别
-
取之前最好的checkpoint,把所有数据加入训练 训练4epochs,最后平均这4个epochs的checkpoints
-
model = torch.quantization.fuse_modules(model ,config.merge_list)
conv-bn-relu -> convbnrelu. 提升13-15FPS
metric learning: Arcface loss learning
更大的input_size: 我的实验里96x96提交能到0.67x, 224x224提交能到0.72x,所以数据存在一些非常难的样本而大部分是简单样本,如果为了极限速度可以考虑96x96.(再极限点你可以32x32.......)
optimizer的选择: 尝试了over9000和Ranger效果和RAdam并无很大差别.
修改模型: 这太难了。。。也是我时间耗得最多的地方,但结果不好.
分类代码并不复杂,所以我稍微保留了一些我的注释.
代码是按极市平台环境为基础写的 如果要本地运行需要修改路径
e4.py : efficientnet-b1生成自我蒸馏oof
m11.py: MobilenetV3-small训练代码
openvino推理代码我没存下来。。。但是非常简单!就是处理图片然后送到网络里面没有任何tricks, 后面我能拿到 我会进行补充.
MobilenetV3-small is from mobilenetV3
GhostNet is from GhostNet
感谢!!