雪浪制造AI挑战赛—视觉计算辅助良品检测

项目背景:

在18年暑假参加了天池雪浪制造AI挑战赛—视觉计算辅助良品检测,布匹瑕疵检验是纺织行业生产和质量管理的重要环节,目前的人工检验速度慢、劳动强度大,受主观因素影响,缺乏一致性。本次大赛要求选手通过布样影像及类别标签信息,开发算法模型,判断瑕疵的种类 ,提升布样瑕疵质检的效果和效率,降低对大量人工的依赖。(数据中包含:布样中疵点形态、长度、面积以及所处位置等信息)

比赛的任务是分类,初赛和复赛规则不同,初赛任务为二分类,考察瑕疵检出能力,将全量瑕疵的图片数据用于训练不良布匹的识别模型,识别出正常图片和有缺陷的图片。复赛任务为十一分类,即识别出一类正常图片,九类缺陷图片,最后一类归为其他(正常 扎洞 毛斑 擦洞 毛洞 织稀 吊经 缺经 跳花 油/污渍 其他)。

初赛数据集总共有2022张图像,复赛在初赛数据集的基础上加上了初赛使用的测试数据集,正常图像一共2163张,有瑕疵图像一共1168张,一共3331张图片,每类瑕疵图像在50张到300多张不等,所以样本是非常不平衡的,导致模型的泛化能力会比较差。图片分辨率较高,每张图片大概1.5兆,尺寸为2560 x 1920。缺陷的尺寸差异大,瑕疵大小不一,有的很长,有的很小,只有十几个像素,这是一个图像的细粒度分类任务。

评估指标:

初赛计算AUC(Area Under Curve)
复赛计算0.7 * AUC + 0.3 * mAP,其中mAP为Mean Average Precision

这是一个多分类问题,而且数据量是非常小的,因此整个比赛过程中,我关注的问题是如何让神经网络更有效的充分利用小的数据集。此次比赛的流程大概可以分为以下五个部分

  1. 数据扩充与增强;
  2. 构建网络;
  3. 网络训练;
  4. 模型融合

数据增强与预处理(Data Augmentation)

深度卷积网络有强大的表达能力,但一般都需要大量的训练数据才能获得比较理想的结果,否则很有可能产生过拟合。在数据量有限的情况下,可以通过数据增强来扩充训练样本数量、增加训练样本的多样性, 可以降低模型对某些属性的依赖(位置,大小),提升模型的准确度、鲁棒性和泛化能力,降低模型过拟合。

图像数据增强是在保持图像类别不变的前提下,可以对训练集中的每幅图像进行以下变换:

  1. 一定程度内的随机旋转、翻转、抠取、平移、缩放、裁剪等,这些变换对应着同一个目标在不同角度的观察结果。
  2. 改变图像的亮度、锐度、清晰度、对比度等。
  3. 对图像中的像素添加噪声扰动,比如椒盐噪声、高斯白噪声等。
  4. 颜色变换,色彩抖动。

考虑到样本数据较少并且样本类别不均衡的问题,我们对训练样本进行了线上和线下两种方式进行数据增强,但只使用水平翻转,旋转,加上亮度的小幅度改变,没有对图片进行随机抠取,因为这可能会造成边缘特征的丢失。

  1. 线上数据增强:使用keras内置的增强方法,开启了旋转,镜像等(ImageDataGenerator)
  2. 线下数据增强:每张瑕疵图片扩充到三到四张,加入了裁剪,改变亮度,加噪声

进一步观察这些图像数据可以发现,这其实是一个细粒度分类,不仅瑕疵区域很小,而且瑕疵的特征也非常的相似。我们在考虑怎么能使神经网络接触到更丰富的瑕疵特征的细节,从网络结构和训练策略等方面进行优化。

构建网络:

深度模型有强大特征提取和拟合能力,当有大量训练数据时可以训练出表达能力和泛化能力非常强的深度神经网络。当数据样本有限时,训练出的模型经常会出现在训练样本上精度较高,在测试样本上表现很差的过拟合现象,泛化能力较差。在小的数据集上使用深度学习一种比较好的方式是运用迁移学习的方法,将在海量训练数据集上预训练好的卷积神经网络模型,经过调整将它应用到自己的任务上。 强大的模型不仅可以自动提取更具表现力的特征,而且无形中扩充了我们的训练数据,网络模型在我们的数据集上可以快速收敛,同时模型更鲁棒、泛化能力更好。

迁移学习主要有两种,我们都对其进行了尝试:一种是将预训练的网络作为新任务的特征提取器,将网络的前几层进行冻结,依赖网络提取出更丰富更有表现力的特征,只训练最后的全连接层,或者,将这些特征作为传统机器学习方法的输入。这样做的好处是训练速度快,可以自动地提取出更有表现力的特征,但往往性能不会太好。另一种是微调(finetune),别人训练好的模型,可能并不是完全适用于我们自己的任务,我们需要将别人训练好的网络针对自己的任务进行参数调整。通常用预训练的网络权值对自己网络的权值进行初始化,固定靠近输入层部分的参数不训练,只训练靠近输出层的参数。

我们没有直接使用预训练的模型,直接修改全连接层为11分类,就对其进行微调,因为原图大小为2560 * 1920分辨率较高,我们需要对其进行resize,对于有些瑕疵,比如边扎洞等可以进行很好的分类;但是对于毛洞等局部小瑕疵,瑕疵在整张图片中非常小,在图像缩放的过程中会损失非常多的像素信息,resize并不能很好地保留特征,影响准确率。所以我们以预训练的的模型作为基模型,在其基础上添加了Concat Gobal Pooling(average max) 以及0.5的dropout层以及L1正则化。

global average pooling 与 average pooling 的差别就在 "global" 这一个字眼上。global 与 local 在字面上都是用来形容 pooling 窗口区域的。 local 是取 feature map 的一个子区域求平均值,然后滑动这个子区域; global 显然就是对整个 feature map 求平均值了。

在卷积神经网络中我们经常会添加Pooling层,池化操作除了能显著降低参数量外,还能够保持对平移、伸缩、旋转操作的不变性。最大值池化则通过取邻域内特征的最大值来实现,能够抑制网络参数误差造成估计均值偏移的现象,可以更好地提取纹理信息。均值池化对邻域内特征数值求平均,能够抑制由于邻域大小受限造成估计值方差增大的现象,可以更好地提取背景信息,但下采样难以避免的会丢失暇丝特征信息,基于这点考虑我们使用两个不同的下采样方式进行拼接可以保留更多的有用特征。

卷积部分的基模型使用VggNet以及Resnet等多种模型,实验效果相差不大,最终选用比较小的Resnet50,参数量是102.8M,模型大小为98M。网络是端到端的,输入一张图片,从全连接层输出一个11分类的概率。较小的网络参数更有利于较小的数据集。可以十一分类的全连接层组成,使用softmax激活函数,logloss做损失函数,那输出每个类别的概率了。

网络训练:

在对预训练的模型进行微调时我们并没有使用单一的学习速率去微调所有的层,因为卷积神经网络具备良好的层次结构,对特征的提取也是有层次性的,靠近输入的层提取的是局部的、高度通用的特征(边缘、轮廓、颜色),随着网络的加深,图像视觉内容的信息就越少,关于类别的信息就越多,更靠近输出的层偏向于学习任务特定的、更加抽象特征以区分特定的类。假设一个网络要识别一只猫,一开始它是各种边缘探测器的集合,然后可能会检测到一些线条和圆形,和猫根本没有关系,再往后可能会检测到是猫腿、猫脸等。

所以我们采用了一种差异性的学习速率,早期的层我们使用很小的学习速率去微调,因为大规模的数据对神经网络学习准确、可泛化的特征是非常重要的,它们在100多万张图片上已经学会了提取那些普遍性的特征,我们不想让他在小的数据集上去学习一些不可泛化的特征,中间的卷积层,我们给他一个较大的学习速率,去学习更好的自然图像的粗粒度的特征到布匹瑕疵的细粒度特征。全连接层将卷积层提取到的特征进行非线性分类,这种方式确实能得到一个很好的提升。

模型融合:

计算公式:0.7 * AUC + 0.3 * mAP, 其中AUC是二分类模型的重要评估指标,即:最后成绩的70%来源于模型能不能将正常样本和瑕疵样本区分清楚,而瑕疵内部的分类权重并不算很高。因此,最后的策略为:对于待预测图片,先用二分类进行预测,如果二分类判断其为正常图片,则不再进行瑕疵预测;如果二分类判断其为瑕疵图片,将该图片送给11分类模型,预测得到该瑕疵的类别。

模型融合:最简单的模型融合,即对两个模型结果进行求平均

自定义11分类损失函数,并在最后加上了一层SPP层用来识别更细小的瑕疵。

EPOCHS = 60
learning_rate = 0.001

batch_size = 4
in_size = [550,600] # [H,W]

trick:

使用LSR(Label smoothing Regularization)损失,超参e={0.25,0.3},增加模型泛化能力。

尝试balanced CE以及balanced CE + focal loss损失,增加attetion,但是均未带来提升。

总结

本次比赛我们团队分两个支路进行,我负责的这块使用的是keras,队友负责的那块使用的是pytorch, 最后进行融合这次比赛让我对数据增强、数据的预处理有了一定的认识,对于vgg、inception v3以及resnet的模型大小、收敛速度、分类准确率都有了更为实际的认识,对学习率、输入大小、batch size等进行了调参。

keras 为我们提供了经典网络在 ImageNet 上为我们训练好的预训练模型,预训练模型的基本信息如下表所示:

数据增强与预处理:https://blog.csdn.net/mzpmzk/article/details/80039481


这是一个多分类问题,而且数据量是非常小的。我关注的问题是如何让深入学习,神经网络更有效的充分利用小的数据集。没有使用每个暇丝的位置信息,只是使用图片和每个图片对应的暇丝标签。因为小的数据集,所以大家都会使用数据增强,没有对图片进行随机扣取,因为可能会造成边缘特征的丢失,所以只使用水平翻转,旋转,加上亮度的小幅度改变。

进一步观察这些图像数据可以发现,这其实是一个细粒度分类,不仅瑕疵区域很小,而且瑕疵的特征也非常的相似。我们在考虑怎么能使神经网络接触到更丰富的瑕疵特征的细节,从网络结构和训练策略等方面进行优化。(问题:细粒度的分类,不同的缺陷位置,类似的缺陷特征,小缺陷区域;解决方案:提供更清晰的特性细节,体系结构与训练策略进行优化)

我们设计了一个能适用于图片多尺度的网络。由预训练的基模型、Concat Gobal Pooling(average max) 以及可以十一分类的全连接层组成,那输出每个类别的概率了。卷积部分的基模型选用比较小的Resnet50,参数量是102.8M,模型大小为98M。网络是端到端的,输入一张图片,从全连接层输出一个11分类的概率。较小的网络参数更有利于较小的数据集

Concat Gobal Pooling第一个作用是下采样难以避免的会丢失暇丝特征,然后使用两个不同的下采样方式保留更多的有用特征。它的另一个好处是使我们的网络并不限制于特定的输入尺寸,它的好处是可以使用渐进式的学习策略。

渐进式的学习策略:在网络输入一个小的800*800图片进行训练,然后在训练的过程中不断地加大图片的尺寸,增大到1200×1200,最后增大到1400×1400。在早期的时候,可以同size=800的输入尺寸得到一个较快的从自然图像到暇丝特征的知识迁移,一个epoch只要4min,随着输入尺寸的增大,训练时间不断增长,但是所需要的epoch数目是不断减少的,这其实是给网络提供了一个多尺度的特征,从小的网络800×800到都最后1400×1400,可以看到更多的、不同的暇丝特征。

在小的数据集上使用深度学习,一个比较好的方法是使用迁移学习,使用一个小的数据集对一个预训练的模型进行微调。但是我们不会使用单一的学习速率去微调所有的层,因为有研究表明,已经训练好的网络对特征的提取是有层次性的,早期的网络对边缘和轮廓的提取很在行,但是随着网络层次的加深,它可能会提前一些更加抽象的局部特征,以区分特定的类。所以我们采用了一种差异性的学习速率,早期的层我们使用很小的学习速率去微调,因为他们在100多万张图片上已经学会了提取那些普遍性的特征,我们不想让他在小的数据集上去学习一些不可泛化的特征,因为大规模的数据对神经网络学习准确、可泛化的特征是非常重要的,中间的卷积层,我们给他一个较大的学习速率,去学习更好的自然图像的粗粒度的特征到布匹瑕疵的细粒度特征。全连接层将卷积层提取到的特征进行非线性分类,这种方式确实能得到一个很好的提升。

最后是训练策略,我们使用了两种策略的交替使用。第一个是超收敛,从一个很小的学习速率去逐渐增大,到达最高点的时候然后慢慢的减少,直到最小,它的动量是随之相反的。在实验的过程中,我们发现达到相同精度的话,普通的学习速率需要40到50个epoch,而这种20到30epoch就可以了。

第二是SGDR,可以让他跳出局部最优解,去寻找全局最优解。使用这两种训练策略的联动作用,在小数据集上是有很大帮助的。

测试的时候使用的测试集的增强,将测试集使用了和训练级一样的翻转,旋转,亮度调微调。我们分类是一个端到端的网络。

我们关注的重点是怎么在只有1000多张暇丝图片的训练集中,更好地使用卷积神经网络对其进行分类。数据增强,多尺度的渐进似的模型训练,差异性的学习速率的微调,超收敛和SGDR训练策略,测试集增强。

没有进行切片切割就是一个图片进去一个概率出来,其实这种方法可以迁移到很多应用这种小数据集的图像分类,我们没有进行复杂的预训练和针对这个比赛的trick。

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值