图像分类技巧与开源框架分享
图像分类
最后更新 2020-04-16 11:44 阅读 3813
最后更新 2020-04-16 11:44
阅读 3813
图像分类
图像分类是计算机视觉和数字图像处理的一个基本问题,它根据图像中的语义信息将不同类别的图像区分开来,也是其他视觉任务,如目标检测,语义分割等高层视觉任务的基础。
传统的图像分类方法通过人工设计提取图像特征,而基于深度学习的图像分类方法能够自动提取特征,其中卷积神经网络(CNN)近年来取得了惊人的成绩。本文意在研究一个简单有效的深度卷积神经网络的图像分类 baseline。在许多start-of-art文献中,对于一些高效有用的训练技巧常常简单的忽略了。本文收集并评估了这些图像分类中的训练技巧。
我们开源了一个简单高效的图像分类框架,其支持多种backbone网络,包括(resnet,densenet,efficiennet,wrn)等等,同时支持cpu/gpu/multi-gpu(sync
bn),包含完整的日志系统与可视化系统。
开源地址: https://github.com/whut2962575697/image_classification
本文针对Fashion-MNIST数据集,设计、搭建、训练机器学习模型,能够尽可能准确地分辨出测试数据地标签。
一、整体思路/方案
本次任务我们使用了开源的深度卷积神经网络resnet34作为我们的baseline backone, 同时通过消融实验,设计了数据增强方法。经过实验调试,我们对比了不同的backbone网络的性能,以及各种超参数对实验结果的影响,最终选择了最优的模型。 具体实现方案如下。
- 选择backbone:考虑到本次任务的原始数据分辨率小(28x28),过深过大的网络可能会导致发生过拟合(overfiting)现象,我们选择了参数量较少的深度模型resnet34, effcientnet b0, wrn 40-4 作为 backbone。
- 设计数据增强:数据增强是解决过拟合一个比较好的手段,它的本质是在一定程度上扩充训练数据样本,避免模型拟合到训练集中的噪声,所以设计一个好的数据增强方案尤为必要。在CV任务中,常用的数据增强包括RandomCrop(随机扣取)、Padding(补丁)、RandomHorizontalFlip(随机水平翻转)、ColorJilter(颜色抖动)等。还有一些其他高级的数据增强技巧,比如RandomEreasing(随机擦除)、MixUp、CutMix、AutoAugment,以及最新的AugMix和GridMask等。在此次任务中我们通过实验对比,选择了一个较合适的数据增强方案。
- 参数调优:针对各种参数的选择,我们利用控制变量法与网格搜索方法,选取最优参数,为了节省训练时间我们选用了收敛更快的Adam优化器,同时尝试了Warmup以及最新的Rnager优化器。WarmUp 可以减缓模型在初始阶段对mini-batch的提前过拟合现象,保持分布的平稳同时保持模型深层的稳定性。
- 测试增强方法:测试时增强(test time augmentation, TTA),测试时将原始图像造出多个不同版本,包括不同区域裁剪和更改缩放程度等,并将它们输入到模型中;然后对多个版本进行计算得到平均输出,作为图像的最终输出分数。这种技术很有效,因为原始图像显示的区域可能会缺少一些重要特征,在模型中输入图像的多个版本并取平均值,能解决上述问题。
二、数据处理
数据转化:由于原始数据为单通道图片,所以我们有两种选择方案
- 默认1通道图片进行训练
- 将图片转换为3通道图片进行训练 ,这样可以使用一些迁移学习的技巧,使用在大数据集上的预训练模型
Fashion Mnist原始数据展示如下:
其与Minist手写数据集相比,Fashion-Minist 不再是抽象符号,而是更加具体的人类服装,一共有10类
标注编号 | 描述 |
---|---|
0 | T-shirt/top (T恤) |
1 | Trouser (裤子) |
2 | Pullover(套衫) |
3 | Dress (裙子) |
4 | Coat(外套) |
5 | Sandal(凉鞋) |
6 | Shirt(汗衫) |
7 | Sneaker(运动鞋) |
8 | Bag(包) |
9 | Ankle boot(踝靴) |
数据集大小:
数据集 | 样本数量 |
---|---|
训练集 | 60000 |
测试集 | 10000 |
数据增强:通过实验对比,选择了一个如下数据增强方案:
- Resize 36x36
- RandomCrop(随机) 32x32
- RandomHorizontalFlip(随机水平翻转)
- RandomEreasing(随机擦除)
- AutoAugment
- CutMix
- Normalation
模型训练
网络结构:
ResNet
自 AlexNet 以来,最先进的 CNN 架构已经越来越深。AlexNet 只有 5 个卷积层,而之后的 VGG 网络 [3] 和 GoogleNet(代号 Inception_v1)[4] 分别有 19 层和 22 层。
但是,网络的深度提升不能通过层与层的简单堆叠来实现。由于梯度消失问题,深层网络很难训练。因为梯度反向传播到前面的层,重复相乘可能使梯度无穷小。结果就是,随着网络的层数更深,其性能趋于饱和,甚至开始迅速下降。ResNet
的核心思想是引入一个所谓的「恒等快捷连接」(identity
shortcut connection),直接跳过一个或多个层,如下图所示:
EfficientNet
为了获得更好的精度,放大卷积神经网络是一种广泛的方法。目前通用的几种方法是放大CNN的深度、宽度和分辨率,在之前都是单独放大这三个维度中的一个,尽管任意放大两个或者三个维度也是可能的,但是任意缩放需要繁琐的人工调参同时可能产生的是一个次优的精度和效率。EffcientNet系统地研究了模型缩放,并发现仔细平衡网络深度,宽度和分辨率可以提高性能。相比resnet,它在当前许多任务中以更少的参数获得了更好的精度。
WideResNet
ResNet的跳连接,导致了只有少量的残差块学到了有用信息,或者大部分残差块只能提供少量的信息。而WideResNet在ResNet的基础上减小深度,增加宽度。其中B(3,3)表示一个两个3x3卷积,k表示一个宽度因子,当k为1时卷积核个数和ResNetv2相等,k越大网络越宽。用WRN-n-k来表示一个网络,n表示卷积层的总数,k表示宽度因子。
模型训练策略:
- WarmUp 10 epoch
- CosineAnnealingLR Scheduler
- Adam 3e-4 + weight_decay 5e-4 / Ranger Optimizer(no warm up) 4e-3
- epoch 400
注:关于优化器,可以参考下面github:
https://github.com/lessw2020/Best-Deep-Learning-Optimizers,里面收集了当前一些sota的优化器
结果分析
通过实验比较与分析,可以看出,使用好的backbone能起到很好的作用,同时使用开源数据集预训练模型进行迁移学习能够加快收敛速度的同时提升精度。
数据增强方法同样重要,好的数据增强方法能够有效避免过拟合现象,让模型可以使用一些更强大的backbone,我们极其推荐CutMix方法。
而一些训练策略也十分重要,在训练初始阶段使用WarmUp策略能够在开始阶段避免过拟合,这种方法对大部分视觉任务均有帮助,而采用LookAhead机制的Ranger在分类任务中能够更快的收敛,同时能够提升模型精度。但是这种优化器不一定适用于所有的视觉任务,它在其他任务中的效果有待检验。