雪浪制造AI挑战赛——视觉计算辅助良品检验 参赛记录及相关心得

一、前言

今年暑假在阿里天池上参加了雪浪制造AI挑战赛——视觉计算辅助良品检验,算是第一次正式参加阿里天池上计算机视觉相关的比赛,初赛获得了 104/2403名,由于初赛是前100名晋级,然后在代码审核后前面正好有4个队伍代码不符合要求,所以最后非常幸运以100名的成绩晋级复赛。复赛获得了 58/100名。 第一次参赛积累了经验也获得了自己比较满意的成绩。所以在此记录一下比赛以及比赛整个过程的收获。

比赛的数据集网盘链接如下:链接:https://pan.baidu.com/s/1kUGLKbj8SAc1nWDuU4TfIw 密码:rual

我代码的github地址如下:https://github.com/wtrnash/XueLang-AI

雪浪制造AI挑战赛——视觉计算辅助良品检验 参赛记录及相关心得_第1张图片

二、初赛

比赛提供了大量的布匹样本以及布匹对应的瑕疵类别,包括正常、扎洞、薄段等类别,初赛的要求是提交一个csv文件,让我们完成对于每一张没有给标签的测试集图像,预测它们各自含有瑕疵的概率,即在csv文件上每一个样本文件名给出对应的含瑕疵的概率,实质上是个二分类问题,即判断该图像是否含有瑕疵。训练集中的瑕疵样本也提供了瑕疵在图像中的具体位置(xmin, xmax, ymin, ymax)。初赛分两个阶段,初赛第一阶段有接近一个月时间让我们调试模型,初赛第二阶段会更换新的测试集,让我们用训练好的模型给出结果来最终评判分数。初赛实际上可以用基于深度学习的图像分类的方法做,也可以用目标检测的方法做。我毕业设计完成了一个图像分类的相关工作,所以对于这一块有点经验,所以初赛选择了使用分类的方法做,但看到初赛分数很高的一些大神使用了目标检测的算法,这块知识我以后需要好好研究一下。

雪浪制造AI挑战赛——视觉计算辅助良品检验 参赛记录及相关心得_第2张图片

                                                                                                正常图像                                                             

雪浪制造AI挑战赛——视觉计算辅助良品检验 参赛记录及相关心得_第3张图片

                                                                                  瑕疵图像中的扎洞图像

初赛的数据集包含正常图像一共有48个类别,我一开始的做法是直接对48个类进行多分类,使用CNN(卷积神经网络)相关模型来进行,然后1 减去该类属于正常类别的概率就是含有瑕疵的概率。我使用最基本的alexnet模型来进行试水,将训练集、验证集以4比1的比例划分,最终在验证集的准确率只有0.61,提交到阿里天池后成绩为0.76(其中阿里天池上的成绩是以AUC来进行评判,AUC相关概念可以见我的另外一篇博文)。分析其原因,首先提供的数据集总共有2022张图像,正常图像有1316张,瑕疵图像为706张,含有47类瑕疵,每类瑕疵张数在1张到90多张不等,所以样本是非常不平衡的,导致模型的泛化能力会比较差。而由于初赛只要实现给出样本含有瑕疵的概率,所以实际上可以将47类瑕疵归成一类,将问题从多分类转化为二分类问题,此时样本类别的不均衡问题会被减小。我仍然使用alexnet模型进行训练,验证集准确率达到了0.801,在阿里天池上的成绩达到了0.836。后面我仿照alexnet自建了一个8个卷积层,2个全连接层的模型,以512*512作为输入,分数可以达到0.846,但这里非常遗憾由于我的疏忽,只保存了该模型的checkpoint文件和结果文件csv,没有保存该模型的代码文件py,所以到最后初赛第二阶段测试集数据更新后没有办法使用该模型代码来调用checkpoint文件得出新的结果文件,所以这里也给了自己一个经验。

由于给定的样本图像大小为2560*1920,而我的模型的原始输入为224*224,所以在图像缩放的过程中会损失非常多的像素,影响准确率。那么我想到两种方法来进行处理,要么是对图像进行切割,使得每张原始图像的大小变小,要么是将模型输入的大小增大,使得模型能获得更多的像素从而提取到更多的特征。首先是对图像进行分割,考虑到识别的速率、样本的均衡性的问题,经过一番尝试后,我将图像分成4块,每块的大小为1280 * 960,在预测时是将样本分成四份,每份分别送入模型计算含瑕疵的概率,最后取含瑕疵的最大概率(这里后来发现别人使用了最大值抑制,不使用最大概率,而是对前几大的概率进行平均,可以提高分数,我下次会尝试一下)。训练集中正常图像四块均是正常的,而如果是瑕疵图像,则对提供的瑕疵位置进行分析,判断瑕疵处于四块中的哪个位置并进行相应的标记,对图像处理完后,由于此时正常的图像会乘以4,而瑕疵图像一般数量不变,最多有个别样本4块中有2块是含瑕疵的,考虑到样本不均衡的问题,我于是对瑕疵图像进行了数据增强,进行了随机水平翻转或180度旋转的处理,使得正常图像和瑕疵图像的样本数比较接近,此时使用alexnet进行训练,准确率虽然提高到了0.832,但天池平台上的AUC只有0.76,于是我换成了VGG16,模型输入大小仍然是224 * 224,在迭代15000次(这里的每次指的是一个batch而不是一个epoch)后的准确率为0.869,在天池上的分数为0.851,迭代45000次后准确率为0.874,在天池的分数上为0.848。这里我犯了一个失误,让迭代了45000次的模型覆盖掉了迭代了15000次的模型,实际上AUC是前一个模型的分数比较高,这里就提醒我以后要保存好每一个模型。

分割成4块后,我尝试了将模型的输入大小改为960*960,但由于硬件相关的限制,需要改小batch size很多,导致模型收敛得不好,泛化能力也不强,准确率0.825, 天池上的分数只有0.7。 每份大小改为512 * 512 时在验证集上准确率有0.84,但天池上分数也只有0.72,比较奇怪。后来看到别人分割图像会分割得比较小,并且按一定的步长进行滑动检测,这样会避免我分成四块导致要预测的图像的瑕疵分别在两块上导致无法正确识别等情况。

除了分割,直接对原图使用VGG16作为模型进行分类我也尝试了一下。使用数据增强后的VGG16准确率有0.854,天池上的分数则为0.82,加了正则化后准确率提高到0.87,但天池上的分数只有0.814。我再修改了训练集和验证集的划分,将原本4比1的比例改成了9比1,分数会有一定的提高但可以忽略不计。我尝试了将VGG输入改为448 * 448,用原图进行输入后,准确率为0.849,在天池上的分数为0.84,比最早的alexnet稍好一些。

在和别人进行相关交流后,知道了可以围绕瑕疵进行随机切割的方法,我尝试了几下,发现效果不太好,分数比最早的alexnet二分类都要低蛮多,可能是哪里没有处理对。然后使用了模型融合的方法,这个确实可以提高分数,我用之前分割成四块模型为VGG16的分数为0.851的模型和用原图输入、自建的分数0.846的模型进行最简单的模型融合,即对两个模型结果进行求平均,在初赛第一阶段分数最高达到了0.883,名次一度在40名左右,但最后一众大佬们的分数都达到了0.9以上,把我挤出了前100名,我尝试了很多方法也没能提高分数。在初赛第二阶段,由于0.846分的模型代码文件不见了,0.851分的模型被0.848分的模型覆盖了,我最终只能使用分割成四块、模型为VGG16的0.848分的模型 和 原图输入、输入大小为448 * 448的VGG16的分数为0.84的模型进行融合取平均值,在初赛第二阶段分数为0.855,在总共2403个队伍里排名104名,靠前面四个队伍代码审核没通过,以100名的成绩进入复赛。如果对每个模型代码存储得更仔细一些,应该能以更稳的分数进入复赛,所以这里以后要吸取教训。

三、复赛

复赛的要求是要给出该样本属于每个类别的概率,就是将原本初赛的二分类问题变成多分类问题。由于提供了初赛第一阶段和第二阶段测试集的对应标签,所以数据集是在初赛数据集的基础上加上了初赛第一阶段和第二阶段测试集的数据集,正常图像一共2163张,有瑕疵图像一共1168张。此时阿里天池上的成绩公式是0.7 * AUC + 0.3 * mAP。

我首先使用alexnet 对原始数据集即不含初赛第一阶段和第二阶段测试集的数据集进行多分类,迭代10000次后过拟合严重,训练集准确率达到了1.0,验证集准确率只有0.25,在天池上成绩为0.49。

然后考虑到样本均衡的问题,我去除了对正常类别数据进行了降采样,即随机去除了部分正常的类别,再对瑕疵图像随机进行旋转、翻转操作,使用400 * 400作为输入,用类似alexnet的自建模型,测试集准确率达到0.61,成绩为0.51。再对该模型增加卷积层和L2正则化,准确率和成绩没有太大的变化。在该数据集的基础上,使用400*400作为输入,用vgg16、resnet50、resnet101以及resnet152分别测试,最后发现是resnet50的分数比较高,达到了0.52分。再在硬件能支持的情况下增大了输入大小,试验了500*500和600*600的情况,发现分数反而是400*400的比较高。

为了解决样本不平衡问题,尝试使用了focal loss进行训练,发现分数没有怎么提高。然后就没想到应该怎么对数据进行切割或其他处理方式,所以再尝试用原始数据集加上初赛第一阶段、第二阶段的测试集数据,不进行数据降采样以及数据增强,这时直接用resnet50,准确率达到了0.72,分数达到了0.555。使用数据增强,进行随机翻转、旋转后,分数能达到0.558。使用resnet152,此时分数能达到0.565。将0.555分的模型和0.565分的模型进行融合即取平均,在复赛第二阶段能够达到0.63分,最后获得了第58名的成绩。

四、总结

这次比赛让我对数据增强、数据的预处理有了一定的认识,对于alexnet、vgg、inception v3以及resnet的模型大小、收敛速度、分类准确率都有了更为实际的认识,也了解到这样的比赛虽然准确率和AUC应该是正相关的,但是在线下我应该也有和天池比赛类似的公式,这样可以随时在线下比较模型的好坏,而不用只是估计,只能等每天两次天池上的分数来判断模型的分数高低。另外也体会到了两个模型进行融合能够有一定程度的提升。还需要提高的地方在于,主要对学习率、输入大小、batch size等进行了调参,而主要都使用了现成网络,暂时还没有能力根据题目来更好地设计能解决题目问题的网络模型,即没有对网络模型进行大的调整,这需要今后看更多文献、打更多比赛来实现。另外,花了很多的时间训练各种各样的网络,但没有对题目进行更深入的思考,用战术上的勤奋掩盖了战略上的懒惰,所以需要在比赛期间多花时间来深入思考题意,思考应该在哪些方面用上更好的技巧而不只是一味训练网络。

你可能感兴趣的:(深度学习)