• [参赛经验分享] KPI异常检测比赛解题分享--复仇者联盟
    很高兴能有机会通过这个方式与大家分享我们的比赛收获。通过参加2020GDE全球开发者大赛·KPI异常检测,我们团队在这个过程中获得了极大的成长,感谢华为。接下来,我们就介绍一下我们团队针对此次比赛的一些思路与想法。我将从题目分析、有监督学习、无监督学习以及算法融合这四个方面向大家具体阐述下我们团队的解题思路。一、题目分析题目分析这部分我们首先总结了赛题的特点,紧接着根据赛题特点进行了一些思考­——怎么去解决这些问题。熟悉题目后,我们自然而然地判断这是一个二分类问题,异常标记为1,正常则为0。我们通过观察发现,数据集中是时间连续的序列型数据,每个时间戳是一个小时;KPI_ID一共20类,分别对应二十种异常情况;且异常发生的概率极低,0多1少,样本极不平衡。数据集现有的特征有四列,其中,只有value值表征了kpi的异常情况。接下来,我们首先考虑了如何解决样本不平衡的问题,想到了两种方法,一是不均衡采样,但这会破坏时间连续性;二是设置一个合适的判决阈值,此法可以保留时间连续性,但需要多次调整。综合考虑之后,我们选用了第二种方式。针对此次比赛,我们的主要解题思路如下图所示:我们主要是做了两部分工作,一部分是有监督学习、另一部分是无监督学习,有监督学习中用机器学习模型进行预测,无监督学习采用时序分解算法进行预测,然后二者结果进行取交处理。二、有监督学习针对有监督学习部分,我们首先进行特征处理。一是针对KPI_ID进行编码。由于KPI_ID是字符型数据,因此需要将KPI_ID进行数字编码,编码后分别对应于0-19,随后将其作为特征输入到模型中。二是针对时序数据增加特征。上一时刻的核心网状态( value值体现)可能对下一个时刻的状态有所影响,所以采用时序移位与减操作来丰富数据特征。经过调整,最终针对每一个时间戳生成的特征数一共为104个。接下来,我们采用了Catboost模型。由于采用了上述的特征处理,可以看到特征数量较多,因此优先采用catboost模型。Catboost的优点在于自动采用特殊的方式处理类别型特征(categorical features)。首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成新的数值型特征(numerical features)。catboost还使用了组合类别特征,可以利用到特征之间的联系,这极大的丰富了特征维度,有利于寻找特征之间的关联性,得到正确的预测结果。此外,我们采用LGB模型,我们思考的是针对单一模型检测能力有限这一问题,进一步使用其他模型来进行融合,以期望能够提高异常检测的准确率。而LightGBM是个快速的、分布式的、高性能的基于决策树算法的梯度提升框架。可用于排序、分类、回归以及很多其他的机器学习任务中。该模型预测精度高,能够减少内存占用,提高运行速度!接下来,我们将两个模型进行融合处理。首先将两个模型的预测结果输出;其次对于Catboost与LGB判定某一时刻值标签值不同的情况,我们选择将两个模型中输出结果概率大的值作为最终的有监督学习输出概率,同时认为这些点是疑似异常点;最后,我们对模型融合后的结果进一步做阈值处理,尽可能多的包含预测结果为1 的点,以有利于后续和时序分解得到的结果进行融合处理,提高预测准确率!三、无监督学习针对无监督学习部分,我们选择采用时序分解算法来检测测试集数据中的异常点,主要是通过观察每一类异常中全量数据的统计分布规律来进行筛选。上图展示的是第五类异常的时序分解图。下面是我们选择的KPI_ID中比较有代表性的几类的异常检测情况,可以看到异常点(红点标注)与正常点之间有明显的差异。通过时序分解算法,我们可以判决异常点,得到这一部分的输出结果。四、算法融合算法融合部分,我们将有监督学习算法中两个模型融合得到的疑似异常点与时序分解算法中得到的异常点进行取交操作,得到最终的预测结果文件,并提交!五、思考与总结最后,我们的总结与思考如下:1.     掌握了kpi异常检测主要流程。2.     加深了对catboost和lgb模型的认识,对时序分解算法也有一定的了解。3.     熟练使用了华为云平台,对比赛助力颇多。4.     此外,还可以继续提升方面有可进一步提高模型的泛化能力;可进一步考虑模型的检测效率。总之,通过此次比赛,我们不仅收获了知识,也认识了一批志同道合的朋友,从他们身上,我们也学到了很多。感谢此次比赛的契机,让我们有机会展示自己的收获与成长。
  • [参赛经验分享] 华为网络人工智能黑客松大赛一等奖方案分享
    比赛页面:https://competition.huaweicloud.com/information/1000029328/introduction?track=111作者:slaine本人代号slaine,有幸在此次华为网络人工智能黑客松大赛的硬盘异常检测赛题中收获第一名的成绩,在这里简单跟大家分享下比赛方案。一、赛题背景硬盘生命周期通常为3-5年,在2-3年后故障率明显升高,导致换盘量陡增。在华为数据中心服务器硬件故障中,硬盘故障占比达到48%+。因此通过机器学习构建硬盘故障预测模型,对数据中心典型硬件进行预测,可以提前感知硬件故障,降低运维成本,显著提升业务体验。此次比赛,非常荣幸能够免费接触和体验到的华为先进的NAIE训练平台。我花了大概一到两天的时间,就能够熟练使用该平台开发模型。二、任务理解本次比赛为典型的二分类问题,根据硬盘当天运行数据及之前的历史记录,判断硬盘未来是否会损坏。此前有不少人误解这个标签指的是硬盘当天损坏与否,但实际上所有的标签都是官方根据硬盘最终是否损坏与否来标注的,标注为0的就是硬盘最终没有坏,标注为1的是该盘最终坏掉了。评分标准官方定义如下:在业务上评价硬盘故障预测算法有两个指标:误报率FAR(False Alarm Rate)和检出率FDR(Fault Detect Rate)。业务目标是在误报率FAR<=0.1%的情况下尽量提高FDR。因此本任务的评价指标为:Score = max(FDR) s.t. FAR≤0.1%,其中,FDR = TP/(TP+FN),FAR = FP/(TN+FP).实质上从数据分析的角度来看,就是在保证准确率的情况下,尽量提高召回率。三、数据理解由于时间有限,本次比赛我没有在可视化分析上花太多时间,所以这里就不作详细地数据分析,重点给大家介绍一下数据里的破题点。此次比赛提供的训练集一共有55w+行数据,特征维度为52,标签值为0或者1,0代表好盘,1代表坏盘,每一条记录对应着一个硬盘某一天的状态信息,原始数据如下:1. 数据组织因为赛题目的是为了根据硬盘当天和历史数据来预测硬盘未来发生损坏的概率,那么数据组织就有至少两种方式:一是对每一个硬盘每一天的数据进行建模,模型输出每个硬盘每天的预测概率,最后对每个硬盘每天的预测概率取平均或者取最大值,作为当前硬盘在未来一段时间内损坏概率的最终预测值;二是对硬盘ID进行聚合分组,对每一个特征按硬盘ID分组计算统计特征,由此建模得到的预测概率就是在未来一段时间内该硬盘的损坏概率。我在这里优先选择了第二种数据组织方式,该方式可以有效回避个别数据异常值的影响,也更便于发现数据里的潜在规律。2. 数据筛选官方将测试集每条硬盘的数据记录数统一截取为20条。如果在构造训练集时不针对性地做出调整,很容易训练出过拟合的模型。所以我在构造训练集时首先删除了数据记录小于20条的硬盘,随后对于记录数大于20条的硬盘,按日期从小到大进行排列,并取最后20条记录来做聚合,从而保证和测试集的一致性,具体操作如下:四、特征工程这里重点讲一下特征处理的一些操作。原始特征训练集中原始的52个特征都是对硬盘当前性能的描述,在度娘上可以很容易找到对应特征的解释,比如所有raw特征均代表着从硬盘上采集到的数据的原始值,而normalized特征是对相应raw特征进行归一化操作的结果,另外各个特征数字代表的含义如下:上图中特征9,241,242等都与硬盘启用时间有强相关,一般而言硬盘工作时间越长,出故障的概率越高,这些与工作时间相关的特征应该具有很强的建模价值,所以我的baseline思路就是对所有的原始特征进行简单的均值、最值统计,具体如下:这样的操作在验证的时候(验证数据日期与训练集数据日期在同一个区间时)很有效,能轻松达到0.97+,但是当在测试集(2019年的数据)上提交时,线上得分却只有0.1不到,这意味着2019年的数据与2018年的数据有严重的不同。2. 特征构造此次比赛还有一个难点就是测试集的特征我们拿不到,这样导致我们不能像往常一样逐特征分析对比训练集和特征集的差异,包括kaggle上一些专门针对特征筛选的trick(比如对抗性验证等等)都无法使用,这时只有通过反复实验来求证(充分体现了数据科学中科学的一面)。尝试一:为了解决过拟合问题,首先想到的是剔除在训练集中表现强劲的特征,也就是我在上面讲到的与硬盘工作时间强相关的特征(9,241,242等等),但是删除这些特征后线上成绩依然没有得到明显提升。尝试二:期间我也尝试过解决训练集和测试集的一致性问题,因为测试集是统一在2019年1月头20天的数据,我便考虑构造训练集在2018年头20天或者最后20天的数据,但是训练集2018年头20天的数据标签全为1,最后20天的标签全为0,显然无法构造二分类。尝试三:前面提到过所有raw特征均代表着从硬盘上采集到的数据的原始值,而normalized特征是对相应raw特征进行归一化操作的结果。如果测试集和训练集硬盘是同一个批次且同一个时期开启使用的,那么由于测试集的时间在训练集之后,测试集硬盘的raw特征取值应该普遍大于训练集,所以我删除了所有raw特征,仅使用normalized特征建模。本来信心满满,结果依然GG。尝试四!!本来已经感觉快山穷水尽时,我做了最后一个灵光一闪的关键尝试,考虑到normalized特征是对raw特征的某种归一化操作的结果,那么两者之间应该有潜在关系可以挖掘,我条件反射地将两者拿来做除法,结果bingo!!此题的magic就这样发现了。通过将原始所有数字特征的normalized特征和raw特征分别做除法操作,线上成绩终于突破了0.1,而随后的上分操作就是一马平川。通过去除时间强相关特征,并加入一些有意义的统计特征,线上单模可以轻松突破0.4,具体操作如下:3. 特征筛选通过上述方法构造出来的特征共100多维,为进一步增强泛化能力,我采用了wrapper(封装式)特征筛选法,以lgb模型作为筛选模型,通过递归特征消除的方式最终筛选得到了最优的特征子集,这样可以有效减小特征维度并增强模型泛化能力。具体来说就是原始特征数为N,每次删除K个特征并检验当前N-K个特征下的模型得分,如果当前得分有所提高,则取当前N-K个特征为最优特征子集,继续下一次循环,再删除k个特征,以此类推,可以求得最优特征子集。五、模型模型方面我采用了简单的lgb和xgb的bagging融合,粗暴的bagging融合就是对lgb和xgb预测值之和取平均,而我稍微做了一些调整,通过遍历两个模型权重来选择最优的融合比例,操作如下:另外lgb和xgb均用了3个不同种子的5折融合,相当于最后一共融合了30个模型的预测结果,这样的操作使最终线上得分突破了0.5。本来我还打算尝试stacking融合,加入NN和逻辑回归增强泛化能力,还好各位大佬手下留情,没有逼我放大招哈哈,开玩笑。六、总结华为的服务还是很到位的,前期熟悉平台遇到的问题都能及时解答或者协助解决,甚至远程视频,诚意满满。NAIE平台本身也不错,JupyterLab特征工程有交互式编码体验,SDK调用代码一键生成,也支持在Jupyter里敲自定义代码,同时还有有强大的图表分析能力,WebIDE提供了强大的云端编码和debug能力。方案写得不怎么样,主要是跟大家分享一下心路历程和踩过的坑,因为是一边加班一边偷偷打比赛,所以过程相当艰辛,还有很多地方可以优化都没有尝试。今年据说华为还有不少比赛,如果工作时间允许还会继续支持参加,要是奖金再高一点就更好了哈哈。原文链接:https://zhuanlan.zhihu.com/p/131272835来源:网络人工智能园地
  • [参赛经验分享] 华为网络人工智能黑客松大赛二等奖方案分享
    比赛页面:https://competition.huaweicloud.com/information/1000029328/introduction?track=111作者:原子弹从入门到精通HDC2020网络人工智能黑客松大赛告一段落,来自深圳福田莲花街道的原子弹从入门到精通同学(也就是我)最终果然没能逆袭成功,线上得分0.4488,排名第二,本文将给出我的赛题解析和方案介绍。一、赛题介绍赛题背景:华为数据中心服务器硬件故障中,硬盘故障占比高达48%。因此构建硬盘故障预测模型,提前感知硬件故障,对于降低数据中心的运维成本,提升业务体验均有着重要意义。赛题数据:比赛提供2017,2018年硬盘最后一次检测前一个月的检测数据进行训练,对未来的硬盘检测数据进行线上预测,评估硬盘未来是否会损坏。模型的开发需要在NAIE服务器中完成。其中训练数据集不可以从云端下载到本地,测试数据无法查看,模型建立完成后需将预测代码打包生成推理服务进行线上测试。评价指标:本次比赛的评价指标如下:FDR = TP/(TP+FN)FAR = FP/(TN+FP)SCORE = max(FDR)  s.t. FAR≤0.1%二、指标分析仔细观察评价指标可以发现,评价指标中的FAR,FDR其实就是AUC曲线中的FPR和TPR。那么把指标翻译成人话就是:在误报率≤千分之一的分数阈值下,坏硬盘的召回率。虽然score与AUC息息相关,但是直接使用AUC作为建模阶段的评价指标会存在一些问题。图1的两个模型从AUC的角度来说显然是model2显著优于model1,然而本题的score是在FPR<0.1%下的max(TPR),也就是图中红色框框这个范围,因此虽然model2的AUC大很多,但是model2的score仅有0.21,而model1的score却有0.42。基于以上分析,在建模的过程中需要针对本题建立一个专属的评价指标,我使用的是LightGBM,建立评价函数my_score_,在调用模型的时候将my_score_传给lgb.train的参数f即可。三、目标分析由于本题线上仅需对每块硬盘的最后一条记录进行预测,因此我的分析也会以最后一条记录为主。首先看一下每个月坏硬盘的分布情况。从图3中我们可以很清楚的看到坏硬盘的数目随着时间的推进呈现震荡下降的趋势。原因可能是华为数据中心在不断优化或坏硬盘的损坏类型在发生变化,这我们不得而知。我们能拿到的是2017年和2018年的坏样本,而线上需要预测的是2019年的坏样本。既然坏样本的分布随着时间逐渐变化,在无法对2019年数据进行分析的情形下,基于图3的趋势,我倾向于相信2019年坏样本的分布与2018年下半年最为接近。因此在建模的时候我选择直接舍弃早期坏样本,把目光集中在2018年下半年,尤其是2018年8月后,因为这段时间的曲线最为平稳。四、数据分析与建模由于训练集中仅有每块样本前30天的记录,而样本变为坏样本后便不再有记录,因此,数据中好样本都集中在2018年12月而坏样本大多在2018年11月之前,如果把时间作为入模变量进行建模,就能在训练集完美区分好坏样本——12月没了记录的就是坏样本,但这显然是过拟合。由于没有2018年11月前的好样本数据,因此这个比赛存在超级难点,即如何判断模型是在识别好坏样本而不是在识别时间的远近。更雪上加霜的是硬盘自身的相关属性本身就会随着时间的增长而改变,如smart9累计通电时间(图4),smart241写入总数/写入剩余寿命(图5),等等。训练集中某变量的有效范围[a,b]在测试集中可能已经偏移到[a+c,b+c],而c是多少,我们并不知道。图6是硬盘的写入总数smart_241_raw在好坏样本上的分布,从图6的好坏样本密度图中我们可以看到在训练集中smart_241_raw这个变量有着非常强的区分能力,写入总数越少的样本坏的比率越高,或者说剩余寿命越长的样本坏的比率越高。但是从业务的角度来说显然剩余寿命越长损坏的几率越小,然而由于数据分布的原因,好样本记录的时间节点比坏样本多了那么一两年,导致分析的结果恰恰相反,得出了剩余寿命越长损坏的几率越大这种结论。这其实是一种不公平比较,好坏样本没能也无法在同一时间切片上进行比较,将这种数据直接扔进模型进行训练,就会造成严重的过拟合,很多同学线上分数无法突破0.1主要就是这个原因。为了解决这个问题,我尝试了很多方法:与时间相关的变量除以通电时间进行标准化处理:尝试将时间相关的变量除以通电时间,即将变量标准化为平均每单位时间,这种操作确实能使得分布看起来比较平滑,但这个操作不仅消除了时间的影响,也消除了大量有效信息,未能带来有效的提升。对所有数据进行归一化处理,但每个数据集仅使用该数据集本身的统计指标进行归一化,比如训练集中变量A的最大值是56而测试集中变量A的最大值是321,那么在训练集中将56设置为1,而在测试集中将321设置为1:理论上树模型仅基于数据的rank,无需做数据的标准化处理,但是在当前赛题下,2018年变量的范围是[a,b],而2019年变量的范围却是[a+c,b+c],两个数据集的取值并不是等价关系,而我希望2019年的b+c等同于2018年的b,因此我想到对2018年和2019年的数据分别做标准化处理,考虑到2019年的标准化可能涉及数据穿越的问题,即20190101的标准化是[20190101,20190120]的数据做出来的,对20190101数据进行标准化的过程中使用到了未来的数据,因此我又考虑每日标准化,即20190101的标准化仅使用当天数据,20190102的标准化也仅使用那一天的数据,以此类推,但一通操作后我发现推理服务中的预测是将测试集数据切分成73份的,所以该想法并不能很好的实现,不过做了这个与所想不符的操作也没有掉分,属实比较奇怪。虽然该操作在NAIE上没能实现,但是我觉得这个操作很骚且疑似很强,不知道隔壁阿里赛道有没有同学使用类似的方法;尽量使用滑窗统计,差分等相对平稳的变量:由于推理服务中有10分钟的限制,并且我在推理服务的predict中使用并行总是无响应,为了避免超时,我最终上线的代码仅开了3,7,15天的窗口。此处仅举例均值滑窗统计及差分的代码,其他统计指标如std,skew,kurt等可直接替换修改:使用无监督模型;经测试,在这道题中使用无监督异常检测算法iForest有着良好的效果,无监督单模型线上分数接近0.4,已经到达奖牌区,无监督的入模变量我选择了对2018年四个季度的坏样本都有效的变量,即使用LightGBM分别对四个季度的坏样本进行训练,取四个集合中都有效的变量作为无监督模型的入模变量。做完以上分析与操作后,把建模样本限制在2018年下半年,线上分数0.3,调整模型参数后线上分数0.3x,进入奖牌区;将样本范围限制在2018年8月及以后,同时将坏样本的倒数第二条记录也作为坏样本加入训练集(一边降低坏样本数,一边增大坏样本数),线上分数提升至0.41,持续一周TOP1后被超越,模型融合后线上分数0.43,短暂TOP1,最终TOP2;直接使用无监督的结果,线上分数接近0.4,无监督单模进入奖牌区,逼近奖金区;无监督做规则模型,结合有监督最强单模,线上分数0.4488,最终TOP2;五、总结这次比赛让我思考了很多以前没有考虑过的问题,对我日常的工作学习还是很有帮助的,但过程中仍有很多不足的地方:我平时经常把无监督的输出作为有监督的入模变量使用,在这题一开始我也是这样操作,但是没有显著的效果,直到最后一天晚上黔驴技穷了才开始尝试无监督直接作为输出结果使用,没想到效果这么好,导致我既没做相关调优,也没做阈值调整,感觉无监督这一块还有很大的开发空间;直到最后我也没能很好的处理变量时间泄露和变量真实效果之间的问题,可能TOP1大佬raw变量除normalized变量的骚操作才是关键吧,不过我觉得大佬上分的核心应该是基于这个衍生变量的统计变量,而不是这个变量本身。六、吐槽1. 本题中训练集的date_g是str格式,而线上测试数据是datetime格式,导致同样的代码在predict的时候总是出错,刚上手NAIE的我debug到脑壳疼;七、鸣谢非常感谢小爱姐,希旭哥,诸葛亮等各位老板在参赛过程中给予的帮助与解答,尤其是希旭哥和小爱姐,总是能够及时地答疑解惑。最后祝华为及NAIE越来越好,向下扎到根,向上捅破天!来源:网络人工智能园地链接:https://zhuanlan.zhihu.com/p/131275558
  • [参赛经验分享] 揭开KPI异常检测顶级AI模型面纱-总榜TOP1(原子弹从入门到精通)
    赛事地址:https://competition.huaweicloud.com/information/1000041319/introduction?track=107背景介绍核心网在移动运营商网络中占据举足轻重的地位,其异常往往会导致呼叫失败、网络延迟等现网故障,对全网的服务质量带来重大的负面影响,多则影响十数万用户,并引发大面积投诉[1]。因此需要快速及时地发现核心网的异常风险,在影响扩大之前及时消除故障。KPI是一类能够反映网络性能与设备运行状态的指标,本赛题提供某运营商核心网的KPI真实数据,数据形式为KPI时间序列,采样间隔为1小时,选手需要使用[2019-08-01,2019-09-23)的数据进行建模,使用训练好的模型对未来7天的数据进行预测,识别未来一周KPI序列中的异常点。评估指标:本赛题采用F1作为评估指标,具体计算公式如下:P = TP/(TP+FP)R = TP/(TP+FN)F1 = 2*P*R/(P+R)数据探索数据中共有20个不同的KPI,不同的KPI物理意义不同,代表了不同的核心网指标,由于赛题需要对未来7天的数据进行预测,因此对于建模样本也进行周级别的分布查看。从Fig1中可以明显看到训练集中前三周的异常率显著低于后续几周。进一步分析可以发现虽然赛题提供了[2019-08-01,2019-09-23)的全部数据,但2019-08-15之前所有20个KPI均毫无异常,第一个异常点是从2019-08-15 02:00:00开始出现的(Fig2),因此推测8.15前的数据分布不同于后续样本,或8.15之前存在标注异常的问题。实验中剔除8.15之前的样本建模效果也优于保留该时间段样本,进一步验证了该推测。时间序列图对于快速理解数据及业务有着重要的作用,对20个时间序列进行观察后,我将异常粗分为4类,如Fig3所示。1.边界型异常如Fig3中a部分(红框)所示,边界型异常中异常样本的取值范围与正常值取值完全不同,即存在明确的决策边界可以完全分离异常点。2.趋势破坏型异常如Fig3中b部分(绿框)所示,正常样本点的走势往往沿着一个趋势,而趋势破坏型的异常点会偏离这个趋势,但取值范围可能仍然在正常样本的取值范围内,这类异常与相邻点的差异较大,与相同时刻正常点的取值差异也较大。3.0值型异常如Fig3中c部分(橙框)所示,此类异常取值直接为0,根据我对业务的理解,正常的KPI不应出现0值,根据分析,20个KPI中有19个正常取值均不应为0,仅1个KPI正常取值为0,非0则为异常。4.其他型异常如Fig3中d部分(紫框)所示,此类异常往往既没有破坏趋势,取值也在正常的范围内,但可能会偏离相同时刻的正常取值。解题思路赛题中共有20个不同的KPI,KPI物理意义不同且异常的种类也多种多样,若将所有KPI作为一个整体建立一个统一的二分类模型,模型效果差强人意,难以进入前排,但若对每个KPI单独建模,则需要建立并维护调优至少20个不同的模型,维护成本过高,因此我的思路是将KPI或异常进行分类建模。对KPI进行遍历后可知,存在7个KPI所有异常均为边界型异常,即7个KPI在训练集中的所有异常取值范围均不同于正常样本。最终结果也表明,该方案不仅在训练集中能100%识别边界型KPI的异常,在测试集中也能100%识别相关异常。3.2 非边界型异常探索非边界型异常往往KPI走势存在一定的周期,若将时间周期剥离出来进行分析,则可以从二维的角度对时间序列进行观察。以kpi_id= 9415a… 为例,若将日期信息剥离,x轴仅为一天中的第几小时,y轴仍然为时间序列取值,则会得到如Fig5的展示。此时整个时间序列被呈现在一个二维空间中,且异常值(红点)多与正常值(蓝点)偏离较远,一个朴素的思路便是采用无监督方法识别图中的异常。事实上,在实际的生产环境中,多达5000+原始KPI,300+衍生KPI,难以获得有异常标注的时间序列,因此在生产环境中往往使用统计方法或无监督算法进行异常检测[1,2]。但在当前有标签的赛题下,经多次尝试,无监督算法如iForest,DBSCAN以及时间序列分解方法如Prophet均无法胜过有监督机器学习算法。因此,对于非边界型异常,最终决定使用有监督机器学习算法进行建模。3.3 KPI类型划分在3.1中基于简单决策树发现了7个边界型异常KPI,但剩余的13个KPI物理意义各不相同,需要进行分组建模。分组最基本的思想便是相似的KPI应该分在相同的组中。Pearson相关系数是我们最熟悉的相关性指标,其物理意义是表示两个变量同向或反向变动的程度,非常适合用于时间序列的相似性分析。通过对剩余13个KPI的相似性分析我们可以发现,以下两组id间的两两相关系数在0.9或以上。cluster1=[9415a…, 600a5…, ed63c…]cluster2=[b3842…, bb6bb…, 3fe4d…]以cluster1为例(Fig6.),可以看到相似性分组中不同KPI的时间序列不仅走势接近,而且往往当分组内一个KPI产生异常时,其他KPI也会同步异常,表现出非常高的联动性。因此对于相似性分组的模型建立非常关键,往往异常的召回和误报均为3倍,也就是对一个则3倍上分,错一个则3倍掉分,赛程中段快速上分的核心点便是这部分模型的建立。对于剩余的7个KPI,最终我依据是否包含周期,将其划分为3小类进行分组建模:半周期型:cluster3_1 = [4f493…]无周期型:cluster3_2 = [29374…,8f522…]强周期型:cluster3_3 = [681cb…, 0a9f5…,355ed…,3e1f1…]其中,半周期型KPI仅在部分时间段表现出周期趋势,其他时间段取值几乎完全相同。无周期型KPI取值与时间无明显关联,强周期型KPI取值随时间不同产生周期性波动。特征构造根据前文分析以及我对时间序列问题的理解,本赛题中构造了以下5种类型的变量。1.基础变量:一天中的第几小时,星期几,kpi_id的各种编码如label encoder,target encoder等等;2.差分变量:一阶差分,二阶差分,三阶差分;3.平移变量:上n个时间点该kpi_id的value或差分的取值及其简单衍生,如24小时前的value取值等;4.滑窗变量:过去n段时间该kpi_id的各类统计变量及其简单衍生,如过去24小时value的均值等;5.强相关窗口统计:如过去7天内该时间点上下两小时内介于该取值0.95-1.05范围内样本的总个数等等;模型方案鉴于本赛题难以建立一个能够应用于全部KPI的统一模型,而解题过程中有较多模型需要建立与调优,为提高效率,我在早期进行不同模型的若干次尝试后便决定使用训练速度较快且效果较好的LightGBM为各个分组建立二分类模型。在实际的建模中我发现仅用[2019-08-15,2019-09-08]的数据建模效果优于全部数据或使用更接近测试集样本的后几周数据,结合Fig1中异常率在后几周大幅持续降低的现象,我判断[2019-09-09,2019-09-22]的异常分布可能不同或存在部分标注问题。在进一步探索后发现嫁接学习的引入能够充分的使用到全部异常数据并取得更好的效果。嫁接学习是迁移学习的一种,用来描述将一个树模型a的输出作为另一个树模型b的输入的方法(a,b往往数据分布不同或完全属于不同产品,与同分布数据的常规融合有着本质区别),此种方法与树木繁殖中的嫁接类似,故而得名[3]。在IJCAI2018广告算法大赛中,前六天和最后一天数据分布不同,于是大部分人用同分布的第七天上半天的数据预测下半天,而植物大佬用前六天的数据训练了一个模型,预测第七天得到的分数作为第七天模型的特征,再用第七天上半天的数据预测下半天,最后轻松得到solo冠军,事后植物说这是他玩的最容易的比赛,毕竟人家用半天数据,植物用的是六天半的数据[3,4,5]。其他数据分布不同的场景下TOP方案中亦有嫁接学习的身影,如蚂蚁金服ATEC支付风险识别TOP1方案[6],CCF BDCI 2018 个性化套餐匹配TOP1方案[7]等[3] 。在若干次尝试后,我最终确定了以存在异常日期样本为1层模型样本, [2019-08-15,2019-09-08]样本结合1层模型分数作为2层模型输入的方案,模型框架如Fig7.所示,该框架的引入在本赛题中提分明显,是上分的关键点之一。结合前文的内容,最终我的建模方案如Fig8所示,先进行KPI边界的自动发现,解决7个边界型KPI的异常,对于剩余的13个KPI,先根据相似性将其拆解为相似群组(6个KPI)和不相似群组(7个KPI),相似群组由组内相关系数较高的cluster1和cluster2构成,不相似群组按照是否包含周期划分为半周期群组cluster3_1,无周期群组cluster3_2和强周期群组cluster3_3,再对不同的群组分别建模,最后汇总生成最终结果。最终该方案取得了线上最高分及答辩最高分的成绩。鸣谢 非常感谢希旭哥,苕芸博士,素颜姐,小爱姐等人在比赛过程中的帮助与指导,希旭哥还是一如既往的热情,总能在第一时间为大家答疑解惑。感谢庐山大佬赛后的精彩分享[2],让人受益匪浅。以前我没看过华为云开发者沙龙的分享,这次看完后觉得可针不戳,以后每期都不能错过。       最后祝华为及NAIE蒸蒸日上,再创辉煌!Reference[1] 网络AI-KPI异常检测,利器大揭秘https://bbs.huaweicloud.com/videos/103579[2] DevRun开发者沙龙—火遍网络的KPI异常检测到底什么https://vhall.huawei.com/fe/watch/6658[3] 嫁接学习简述https://zhuanlan.zhihu.com/p/98728768[4] 结构化数据的迁移学习:嫁接学习https://zhuanlan.zhihu.com/p/51901122[5] IJCAI-2018 TOP1分享https://github.com/plantsgo/ijcai-2018[6] ATEC支付风险大赛Top1解决方案https://zhuanlan.zhihu.com/p/45826529[7] CCF BDCI 2018 个性化套餐匹配TOP1方案https://github.com/PPshrimpGo/BDCI2018-ChinauUicom-1st-solution
  • [参赛经验分享] 揭开KPI异常检测顶级AI模型面纱--二等奖(sh团队)
    团队名称:sh大赛地址:https://competition.huaweicloud.com/information/1000041319/introduction?track=107赛题介绍1.1   赛题描述核心网在整个移动运营商网络中占据着举足轻重的地位,一旦故障,会对全网的服务质量影响很大。需要及时快速发现核心网的风险,在影响范围扩大之前及时消除故障。关键性能指标(KPI),反映了网络性能和质量。对KPI进行检测,能够及时发现网络质量劣化风险。目前KPI异常检测指的是通过算法分析KPI的时间序列数据,判断其是否出现异常行为。这里存在几个难点:a.异常发生的频率很低,网元数据很少发生故障,因此可供分析的异常数据很少2b.异常种类多,核心网网元数据多,故障发生的类型也多种多样,导致了异常种类也多种多样3c.KPI曲线的多样性,KPI曲线表现为周期型的,有稳定型的,也有不稳定型的针对以上难点,为了提高核心网网元数据的异常检测算法的准确率和召回率,主办方将在比赛中提供某运营商的KPI真实数据,采样间隔为1小时。参赛选手需要根据历史数据异常标签数据(训练数据集),训练模型并检测后续一段时间内各KPI(测试数据集)中的异常。1.2   数据介绍本次比赛提供两份数据,其中一份包含标签列,另一份不包含标签,分别为phase1_train.csv(带标签), phase1_test.csv(不带标签)。包含标签的数据有参赛选手自行划分为训练集,验证集和测试集,不包含标签的数据需要用户采用训练好的模型进行检测输出对应标签并提交,phase1_train.csv 和 phase1_test.csv 文件格式(结构化字段)说明:1.3   评价指标1)相关定义:TP(True Positive): 真实为 1,预测也为 1;FN(False Negative): 真实为 1,预测为 0 ;FP(False Positive): 真实为 0,预测为 1;TN(True Negative): 真实为 0,预测也为 0。2)按以下公式计算参赛者的成绩评分,依据准确率(公式 1)和召回率(公式 2),计算 F1-score(公式 3),最后按照 F1-score 对所有参赛者进行排序。P = TP/(TP+FP) (公式 1)R = TP/(TP+FN) (公式 2)F1-score = 2*P*R/(P+R)(公式 3)   数据理解2.1  关于kpi_id和采样时间给定的数据一共包含20种不同的kpi_id:每个kpi_id的value序列采样时间和数据量都是一致的,并且测试集的时间紧跟在训练集后面,这为我们处理这种基于时间序列的数据提供了很大的便利,测试集数据可以直接拼接到训练集后面。具体的,训练集和测试集的采样时间都是一个小时,训练集数据的时间范围为:‘2019-08-01 00:00:00’到'2019-09-22 23:00:00',共20*1272 = 25440条数据;测试集数据的时间范围为:'2019-09-23 00:00:00'到'2019-09-29 23:00:00',共20*168 = 3360条数据。2.2   关于标签在某个采样时间下,标签值为0代表KPI正常,标签值为1代表KPI异常。经过统计,标签均值为0.01517,即正样本比例约为1.5%。因此,这里有两种解题思路,一种是当做时间序列异常检测问题,另一种是直接预测标签,也就是当做样本分布不均衡的二分类问题2.3   关于时间序列值value直接统计value数值的分布情况:可以看出绝大多数value的数值分布0-3000的范围内。但是,绝不能简单根据value的数值分布来建模,而忽视各kpi_id的具体情况。不同的kpi_id对应的value序列往往具有不同的特性,下面两张图可以很直观地体现这种差异:针对第一种情况,我们用肉眼就能很轻易地判断出异常点,这种情况往往通过聚类算法(例如GMM),或者基于统计分布的异常检测算法(例如3-sigma和box-plot)就能够较好地检测出异常点,这样的方法基于数值的统计分布规律,不需要使用时间信息。针对第二种情况,value序列体现出周期变化的规律,异常值往往来自于序列的周期变化规律遭到破坏。(上面的图如果太小,下面给出了异常点附近的局部放大图)对于这种周期变化的情况,可以考虑采用基于传统的时间序列异常检测方法。时间序列异常检测算法中,对于有趋势项或周期项的,可以采用经典的时序分解模型(例如Holt-winter、STL等);对于平稳的时间序列,可以采用ARIMA算法(序列不平稳的情况下也可以采用一些方法将其转化为平稳序列);对于其他时间序列,可以采用机器学习或深度学习模型等。针对目标序列的情况,我首先尝试了相对简单的指数平滑模型(由于其具有周期性,所以采用三指数平滑,即Holt-winter算法)。另外,对于时序数据,由于数据间存在时间依赖性,所以交叉验证时,随机划分数据集会破坏序列的时间结构,需要采用滚动交叉验证进行参数选择。经过尝试,传统的时间序列异常检测算法能够达到一定的效果,但是当我使用了比赛大杀器xgboost模型后,发现前面的方法瞬间变得“不香”了。本质上来说,传统的时间序列预测模型还都是线性模型,而对于xgboost(包括后来加上的LR模型),可以自己构造大量的非线性特征,因此效果自然好了许多。另外,我最后采用的是基于二分类的方式来对标签进行预测。下面主要介绍构造特征过程中的做法。特征工程3.1   提取时间信息赛题中提供的数据是一个时间戳,但是时间戳只是一个具有相对大小的数值而已,我们可以提取出其中的“Hour”和“Day”信息,进一步还可以得到某一天是周几,是否周末等信息。3.2   onehot编码kpi_id属于类别特征,上一个过程提取得到的“Hour”和“Day”也是,这些类别特征可以进行onehot编码,onehot编码主要是用于LR模型的输入。3.3.   value处理成标准形式首先统计历史中值和标准差。这里采用中值而非均值是因为异常值对均值的统计会造成较大的影响;标准差是逐天统计,之后取中值而非均值,同样是为了减轻异常值的影响。Value可以有几种标准化的方式,比如:1、除以中值或者减去中值,保留各kpi_id标准差的相对大小关系2、减去中值,除以标准差,各kpi_id有统一的评估标准3.4   对标准形式的value离散化离散化的目的是对特征进行非线性处理,并且可以把连续型特征转化为类别型特征,便于采用类别特征的处理方式进一步加工。分桶数目可以选取多种,以此创造足够多的非线性特征。经过测试,按照分位数进行分桶具有较好的效果,分桶数目一共设置了四种:20,50,100和200。3.5   对标准化形式的value进行其他处理主要是一些常见的做法,比如一阶二阶差分,和前一小时、历史中值的差值/比值等,前一小时或者前几天的中值也都可以添加进来作为当前样本的特征。对上述重要特征再进行分桶操作。3.6   滑动窗口特征滑动窗口可以创造出大量的特征,主要的可选参数和方法有:1、滑动窗口长度;2、窗口内的统计量:最大值、最小值、均值、中值、方差,甚至三阶矩和四阶矩(偏度和峰度)等3、同比或者环比滑动窗口得到的重要特征可以进一步处理以获得更多的交叉特征,比如减法、除法、分桶、聚合等。3.7   fft特征计算谐波大小,位置等,希望以此衡量周期性强弱(这里发现效果不是太明显)。3.8   模型前一个时刻的预测值在分析数据中发现(如下图所示),对于某些kpi_id,若前一小时异常,那么下一个小时也有较大的概率也为异常,即当前时刻数值的异常概率和下一时刻数值的异常概率具有关联性,因此一些模型对前一小时的预测值(异常概率)可以作为其他模型当前小时的样本的特征,这一特征依然可以进行离散化等操作。3.9   Target Encoding对于上面得到的重要类别特征,可以进行目标编码。目标编码可以理解为统计每一种类别的概率分布信息,即用类别对应的标签的期望代替原始的类别特征。这样的特征和标签具有很强的相关性,因此具有较大的标签泄露风险,那么就容易导致过拟合。但如果处理得好,目标编码得到的特征一般都是强特征。这里采用的方案是通过K折target encoding来抑制过拟合问题。3.10  特征筛选1、基于特征相关性这里需要筛选出与标签相关程度较大的特征。而特征之间相关性较大的则需要适当删除,减少对模型的干扰。2、基于树模型输出的特征重要性3、手工筛选手工筛选特征主要针对解释性较好的LR模型,不仅可以筛选特征,还可以调整特征权重,后面的模型选择部分也会提到相关内容。模型和方案选择4.1   基于boosting的树模型有了特征之后首先尝试的当然是基于boosting的树模型,我主要尝试了xgboost、catboost和lightGBM三种模型,根据最终模型的表现情况,采用了lightGBM模型。另外,选择了两组特征作为lightGBM模型的输入,得到了lgb_pred1和lgb_pred2两个预测结果,选择不同的特征能够让模型具有不同的关注点,同时,这两个预测结果也具有相对独立的误差分布,最终融合之后也会有较好的效果。4.2   逻辑回归采用逻辑回归模型主要基于如下两点考虑:1、具有较好的可解释性,方便手工选择特征或者调整权重;2、用于重点关注lightGBM模型表现不佳的地方。在交叉验证的过程中,可以得到训练集的预测结果,进一步可以查看当前模型在什么情况下预测效果不佳。下图是某一次lightGBM模型的预测结果,黄色的星星是真实异常点,绿色的圈圈是预测的异常点,说明lightGBM模型存在预测不准的地方,那么可以重点关注这些点,针对性的选择特征,用于LR模型的训练和参数的调整,但是这种做法需要注意存在过拟合的风险。4.3   基于kpi_id之间的相似度在数据分析过程中发现了一个特点:有些kpi_id之间具有较高的相似性:不仅曲线相似,它们还倾向于在同一个时刻发生异常(如下图)。因此,可以考虑利用当前时刻其他kpi_id的上述模型预测概率的加权,来预测当前时刻当前kpi_id的异常概率,而不仅仅局限于对当前kpi_id进行建模。相似度度量方式主要有Jaccard系数、向量内积、余弦相似度、Pearson相关系数等。余弦相似度实际上是向量内积的归一化形式,而Pearson相关系数则可以看成余弦相似度的去偏置(均值)形式。最后,我采用的相似度度量准则是Pearson相关系数,并加入了适当的手工修正,因为基于相似度的预测效果,不同的kpi_id表现不尽相同。通过基于相似度的预测,得到的预测结果为sim_pred。4.4模型融合最后四个结果(lgb_pred1、lgb_pred2、lr_pred、sim_pred)通过加权融合得到最终的预测结果。总结和鸣谢(1)排行榜真的是焦虑源泉,不过有焦虑才有动力;(2)另外,数据和特征才是王道,好的特征带来的提分效果还是比较明显的;(3)这里要感谢各位一起参赛的选手,从大家在微信群里的交流讨论,以及思路和方案中学到了很多很多;(4)最后当然要感谢主办方,微信群内的细致答疑、不定期抛出的学习资源、以及华为NAIE的服务资源等等,温暖周到又贴心,点个大大的赞!本文首发:https://mp.weixin.qq.com/s/bF-dbc-nmSlvbDo_d_BggA
  • [参赛经验分享] 2020深圳开放数据应用创新大赛生活垃圾图片分类冠军方案分享 -江流儿赛队
    作者:刘迎飞作者简介:刘迎飞,硕士在读,导师为孙显研究员。2018年由天津大学保送至中国科学院大学,研究方向为遥感图像目标检测。曾获2020海华AI挑战赛·垃圾分类技术组第三名。2020年7月18日,由深圳市南山区人民政府主办,华为技术有限公司承办的“华为云杯”2020深圳开放数据应用创新大赛落下帷幕。赛博智能团队疫情期间,在科研环境有限、线下沟通不畅的情况下,发扬“艰苦奋斗、自强不息”的科研精神,利用华为云NAIE 等训练平台,积极投身科研和学科竞赛中。由刘迎飞、时爱君、郭荣鑫、许全福和林仁灯等研究生组成的江流儿赛队,在全国912支参赛队伍、4388名参赛者中脱颖而出,夺得生活垃圾图片分类检测赛道的冠军。在参加比赛的过程中,非常感谢华为NAIE平台给我们提供的计算资源支持。平台代码调试非常方便,此外为每个用户提供5张V100显卡使用。这些使我们有了更多参数调试的机会,大大提高了我们模型迭代的速度。图源 https://competition.huaweicloud.com获奖证书一、赛题描述生活垃圾的分类和处理是目前整个社会都在关注的热点,如何对生活垃圾进行简洁高效的分类与检测对智慧城市建设至关重要。为了对算法的实用性进行评估,比赛测评选用的是VOC形式的mAP,使用华为云ModelArts系统进行自动评分。选手需要将网络模型部署到ModelArts系统中,在CPU机器上对近三千张图像进行测试,要求测试时间不大于三小时,禁止使用TTA和模型融合。这对于算法的精度和实时性都有非常高的要求。二、模型介绍团队在本次比赛中使用MMdetection检测框架,以Res2Net152+gcb作为backbone,单阶段的ATSS检测算法作为baseline。训练过程中结合常见的平移、缩放、旋转、颜色变换,多尺度训练、GridMask数据增强,类别平衡采样方法、余弦学习率衰减、随机权值平均(SWA)等。1、Baseline选取双阶段算法一直是横扫各大比赛的主流算法。但是受到比赛规则的限制,双阶段算法在CPU环境下的部署要比单阶段算法慢得多。有很多的队伍都使用Cascade RCNN,但是只能对较小的输入尺寸进行测试,限制了算法的上限。网络结构图 图源|FCOS[2]如上图所示,ATSS的网络结构沿用了FCOS的形式,相比于双阶段网络,由于没有ROI head,在CPU上的运行速度大大提升,因此选用ATSS作为比赛的baseline。2、Backbone选取Res2Net模块图源|Res2Net[3]如上图所示,Res2Net在单个残差块内构造分层的残差类连接,增加每个网络层的感受野范围,提升特征提取能力。相比于ResNet,Res2Net能用相近的计算复杂度达到更高的精度,因此比赛选用Res2Net系列作为backbone,从最开始的Res2Net50逐步升级到Res2Net152.三、提升技巧很多技巧的参数在比赛的过程中是不断反复调整的,因此很难拿一个具体的数值来定量描述,这里只给出一个大致的提升效果。最初的baseline我们选用的是Res2Net50 + ATSS,保留本地验证集的情况下在初赛A榜mAP=67.48%,使用全部训练数据大约69.5%-70%。1、Albumentations数据增强库Albumentations包含了各种数据增强算法。选用平移缩放旋转和随机旋转90度进行增强。这两项结合在A榜有3%左右的提升。dict(type='RandomRotate90', p=0.5),dict(type='ShiftScaleRotate',shift_limit=0.0625,scale_limit=0.5,rotate_limit=30,interpolation=1,p=0.5)2、多尺度训练为了充分利用测试时间,选用608x640的测试尺寸。在训练过程中,固定长边不变,短边从384浮动到640进行多尺度训练. 多尺度训练的提升在1%~1.5%左右。img_scale=[(640, 384), (640, 640)]3、GridMaskGridMask示意图 图源|GridMask[5]如上图所示,GridMask 通过生成一个和原图相同分辨率的mask,然后将该mask与原图相乘得到一个图像。上图中灰色区域的值为1,黑色区域的值为0。GridMask可以理解为一种正则化方法,将GridMask使用比率设为0.8,结合其他数据增强训练50个epoch。GridMask在初赛A榜有大约2%左右的提升。dict(type='Grid', use_h=True, use_w=True, rotate = 1, offset=0, ratio = 0.5, mode=1, prob = 0.8),4、Cosine学习率衰减余弦学习率衰减指的是学习率衰减像余弦函数一样变化,在训练初期和训练末期均保持一个较为平稳的学习率,在训练中期学习率快速下降。相比于step阶梯式的学习率下降策略,在初赛A榜提升在0.5%左右。lr_config = dict(policy='CosineAnealing', min_lr_ratio=0.01, by_epoch=False,warmup='linear', warmup_iters=500, warmup_ratio=1.0 / 3,)5、类别平衡采样数据的平衡对于以mAP为测评指标的算法非常重要,初赛设置上采样率为0.02,出现频率低于0.02的类别将会采用过采样的方式达到这一比率。决赛设置上采样率为0.018. 在初赛A榜提升有0.5%左右。train=dict(type='ClassBalancedDataset',oversample_thr=0.018,…6、更大的backboneBackone的选取对模型精度提升很关键,在初赛A榜将Res2Net50替换为Res2Net101可以将mAP从70.65% 提升至72.32%, 后期使用Res2Net152将mAP从75.43% 提升至76.08%。Global Context Block 图源|GCNet[4]在决赛期间,由于不允许模型融合,继续增加网络的复杂度是很有必要的。 对Res2Net152添加Global Context Block(GCB),决赛可以从77.14%提升到77.63%。backbone=dict(type='Res2Net',depth=152,scale=4,baseWidth=26,num_stages=4,out_indices=(0, 1, 2, 3),frozen_stages=1,='pytorch',gcb=dict(ratio=1. / 4. ),stage_with_gcb=(False, True, True, True)),7、随机权值平均SWA随机权值平均可以增强模型的泛化性能,降低过拟合的风险。在50 epoch的训练过程中,每5个epoch保存一次模型,使用随机权值平均得到十个模型的平均值。这使得初赛、决赛的最后均有0.8%左右的提升。https://github.com/open-mmlab/mmdetection/issues/20018、类别细化在多类别的检测中,一组参数可能无法对所有的类别达到最优的效果。类别细化就是对不同的类别设置不同的参数,以期达到更优的效果。FCOS和ATSS都具有center-ness分支,在本地验证集的统计发现一些类别的分类得分不乘center-ness高,一些乘以center-ness高。在测试过程中对这些类别加以区分,一些乘center-ness,一些不乘。在初赛提升了0.06%,决赛提升了0.07%。从决赛最终的成绩来看,这个细节发挥了最关键的作用。三、总结展望此次比赛过程,初赛一帆风顺,决赛一波三折。从决赛的过程来看,任何时候都不能松懈,很多实验的细节可能成为决定胜败的关键。此外,受限于比赛时间和硬件条件,本方案仍存在一定的提升和改进的空间:1、Generalized Focal Loss在缺少预训练模型的情况下,GFocal Loss在比赛数据集上效果比ATSS略差,后续可以考虑加上GFocal Loss在COCO上预训练。2、GCB模块GCB模块在本方案中当做一个即插即用的模块使用,如果使用COCO的预训练模型可能取得更好的效果。3、训练尺寸测试尺寸在决赛期间做了较大修改,由于时间关系训练尺寸未做较多的调整,精细化的调整可能会带来一些提升。四、参考文献Zhang, Shifeng, et al. “Bridging the Gap Between Anchor-Based and Anchor-Free Detection via Adaptive Training Sample Selection.” CVPR 2020: Computer Vision and Pattern Recognition, 2020, pp. 9759–9768.Tian, Zhi, et al. “FCOS: Fully Convolutional One-Stage Object Detection.” 2019 IEEE/CVF International Conference on Computer Vision (ICCV), 2019, pp. 9626–9635.Gao, Shanghua, et al. “Res2Net: A New Multi-Scale Backbone Architecture.” IEEE Transactions on Pattern Analysis and Machine Intelligence, 2019, pp. 1–1.Cao, Yue, et al. “GCNet: Non-Local Networks Meet Squeeze-Excitation Networks and Beyond.” 2019 IEEE/CVF International Conference on Computer Vision Workshop (ICCVW), 2019, pp. 1971–1980.Chen, Pengguang, et al. “GridMask Data Augmentation.” ArXiv Preprint ArXiv:2001.04086, 2020.Zhang, Zhi, et al. “Bag of Freebies for Training Object Detection Neural Networks.” ArXiv Preprint ArXiv:1902.04103, 2019.Izmailov, Pavel, et al. “Averaging Weights Leads to Wider Optima and Better Generalization.” UAI 2018: The Conference on Uncertainty in Artificial Intelligence (UAI), 2018, pp. 876–885.
  • [参赛经验分享] 2020西安人工智能大赛冠军模型分享-西南交通大学VGE团队
    前沿我们是西南交通大学朱庆教授带领的虚拟地理环境团队,我们团队主页是:https://vrlab.org.cn/很荣幸在“华为云杯”2020西安人工智能创新应用大赛中获得冠军,下面是我们的方案分享我们已将方案同步到:https://github.com/liaochengcsu/road_segmentation_pytorch 欢迎各位大佬同本菜鸟一起交流探讨一、问题分析1、遥感影像中道路特点:城市主干道与郊区公路尺度差异大;道路与其它背景信息样本不平衡;城市绿化等遮挡严重,道路标注不对应;传感器、环境、构筑材料等,导致外观多样化。2、现有方法存在问题:主流方法为语义分割,在有限的数据集训练,模型过拟合严重,使得模型在不同区域泛化性差;提取结果可靠性低,无法广泛地在实际产品应用。二、解决方案1、网络架构:编码模块选用ImageNet预训练的ResNeXt200网络,在E-D架构的基础上,提出一种通道注意力增强的特征自适应融合方法,并设计基于梯度的边缘约束模块。在增强空间细节和语义特征的同时,提高道路边缘的特征响应,实现多尺度道路准确提取。2、使用策略:随机平衡采样:影像裁剪数据增强:训练过程中随机翻转,旋转,缩放,色彩损失函数:BCE+Dice,权重1:1优化函数:SGD,初始学习率lr=0.01TTA(原始影像,上下翻转,180度旋转)后处理:基于阈值的空洞填补和噪声去除三、处理结果样本裁剪获得20733×512×512数据标签对,按7:3随机划分成训练集和验证集(16337:4396)。在24G单卡TITAN RTX上单轮训练时间小于1小时,模型完整训练周期约24小时,模型在训练24轮左右,线下精度约为0.8267,此时线上精度达0.8411(初赛排名2/377)。下图是我们方案处理结果示例:四、比赛总结比赛数据和标签存在很多不对应问题,特别是细小道路标注不完整,道路被绿化遮挡问题严重,使得模型精度总体较低。由于时间有限,对提取结果后处理比较粗糙。个人认为结合道路连续性特征,可以获得显著精度提升,这也是遥感智能解译应用必需解决的问题。本文首发  AI Gallery:https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=92a0d8f9-9791-41ce-a1c8-2ae6174a1a91本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 2020西安人工智能大赛亚军获奖--HXForevertuan
    华为云杯”2020人工智能创新应用大赛总结与分析一、 赛题背景西安,古称长安、镐京,陕西省会、副省级市,是世界历史名城、中国四大古都之一、中华文明和中华民族重要发祥地,是国家重要的科研、教育、工业基地,亦是丝绸之路起点城市和“一带一路”核心区。西安国家民用航天产业基地成立于2006年11月,是陕西省、西安市政府联合中国航天科技集团公司建设的航天技术产业和国家战略性新兴产业聚集区,也是西安建设国际化大都市的城市功能承载区。2010年6月26日,被国务院批复为国家级陕西航天经济技术开发区。此次赛题结合西安以及西安航天基地以航天卫星遥感产业为特色,旨在解决道路路网信息自动提取问题。本次比赛依托陕西航天工业雄厚的综合实力和坚实的发展基础,充分发挥航天科技对国家战略性新兴产业的引领作用,立足航天产业,发展人工智能新兴产业,推动军民融合,带动产城融合,在谋求错位发展中建设世界一流航天产业新城。本赛题任务是基于高分辨可见光遥感卫星影像,提取复杂场景的道路与街道网络信息,将影像的逐个像素进行前、背景分割,检测所有道路像素的对应区域。二、 数据简介与评判指标大赛数据集来源于北京二号卫星,空间分辨率为0.8米,分为训练集和测试集2个数据集,分别包含3景遥感影像,其中训练集2景影像的尺寸分别为40391×33106、34612×29810。测试集不公开只参与线上评测。参赛者可自行将训练集切分为小图,并划分为训练集和验证集以用于模型调优。数据集下载地址:https://ma-competitions-bj4.obs.cn-north-4.myhuaweicloud.com/xian/2020/data.zipData.zip解压后目录结构说明如下:评价指标:平均交并比即MIOU,计算公式如下图:其中,k表示像素所属的类别,pij表示本属于类别i且被预测为类别j的像素数据,pii表示真正的数量,pij和pji分别表示假正和假负的数量。三、 数据分析数据概览与初步分析数据集共两张空间分辨率为0.8m的遥感影像图,尺寸大小分别是4039133106和3461229810。影像全图如下所示。初步观察分析可以从影像上分析出一下几点内容:a. 影像是大尺寸图片并不能直接输入神经网络进行训练,因此要选用合适的图像切割发方式将影像切割成合适尺寸的图像。影像的切割方式大致有三种选择:规则网格切割、滑动窗口切割以及随机切割。这里我选择的是滑动窗口对图像进行切割,以448为步长才切成512*512尺寸的图片;b. 有影像的区域并不是正矩形,周围存在黑边,黑边在影像中占据的面积并不小,因此对于切割后的数据去除掉全黑的图像;c. 两张影像在颜色上存在肉眼可见的色差,因此拟考虑在数据增强中添加色彩增强相关部分降低模型对色彩上的敏感程度;d. 仔细查看数据集可以发现影像中的区域以城市乡镇为主,说明影像中会存在路网密集区和路网稀疏区,这可能会导致标签中的类别不平衡。四、 数据增强数据增强的目的是为了增加样本的多样性,避免模型的过拟合。数据增强库很多,如:skimage、imgaug、opencv、Albumentations以及Augmentor等。在这里我选择的是Albumentations。在此次大赛中我所用到的数据增强有很多,我主要将其分为三大类:形态变换、颜色变换以及其他变换。形态变换主要是为了对图像上的结构信息进行调整与改变从而达到数据增广的目的。如下图左侧的为原始图像,右侧为经过形态变换(网格失真)后的图像,可以看到两张影像上的道路部分发生一些改变,右侧的道路部分有些细微的扭曲,而道路的扭曲对于真是的情况来说是可能存在的,可以避免让模型误认为细长的颜色相同的区域就是道路,在一定程度上增加了样本的多样性。颜色变换主要有随机调整色相饱和度、随机打乱通道顺序、RGB色彩偏移、随机调整亮度和对比度。其中随机打乱通道顺序避免不同库在读取图片时颜色通道不一致输入模型带来的影响,降低模型对色彩的依赖。随机调整亮度和对比度避免遥感影像因为天气影响带来的过曝或是欠曝导致影像亮度不一致的情况,在此加入是为了避免验证集上的遥感影像亮度对比度可能存在一定差别的因素。其他变换主要有随机添加高斯噪声、中值滤波、cutout等,主要是为了提高模型的泛化能力。五、 模型设计与训练基本结构基本结构选择了2015年在MICCAI会议上发表的Unet。Unet结构简单,大体上可以分为两个部分,分别是用于提取特征的编码区和对特征进行解码还原的解码器。编码器和解码器之间存在skip connnection。即在解码器部分会融合编码器中的部分输出,这样实际上是将多尺度特征融合在了一起,实现了网络对图像特征的多尺度特征识别。在本地实验也尝试过其他结构如:DeepLabV3、LinkNet、FPN等,但各有优缺点,如DeepLabV3训练效果比Unet略高,但是训练时间比Unet长,本人本地并没有好的GPU资源可以用于模型训练,而且大赛分配ModelArts资源宝贵,因此选择了训练速度快,精度较好的Unet作为基本结构。BackBone选取Unet用于特征提取的编码器部分结构较为简单,只有几层卷积网络顺次连接而成,为了提取更加丰富全面的特征我们可以更换编码器的结构用于提取更丰富的特征,常见的方法是从分类效果好的网络结构中选择合适的层作为backbone,以用于特征提取。在比赛过程中一共测试了8种backbone,包括resnet_34、resetnet50、se_resnet50、se_resnext50_32x4d、efficient-b0、efficient-b1、efficient-b2、efficient-b5。最终选择最好的efficient-b5作为backbone。Loss选取大赛的最终评价指标时miou,在二分类中iou等于miou,因此在Loss选取的时候选择了以iou作为优化方向的损失函数,Lovasz损失函数和Focal损失函数。添加Focal的主要目的是在数据裁切和增强部分并没有对样本的类别不均衡做处理,添加Focal是为了解决正负样本不均衡的问题。Dice+BCELoss主要是优化速度快,但是后期BCELoss会变得非常小,近似与只有DiceLoss,而且在线上线下差距大,测试结果不稳定。Lovasz+FocalLoss前期损失下降平缓,测试时较为稳定,线上线下差距小。优化器选取优化器选择的时Radam+Lookahead,即Ranger。此组合变相的提供了不需要调参的warmUp,在快速优化的同时保持了模型的稳定性,且对学习率不敏感。训练trick多尺度训练,对于每一batch,保持batch内的图片尺寸相同,不同batch间的尺寸存在区别,使用多个尺寸的图片对模型进行训练,提高泛化性。学习率调整,使用带重启的余弦退火最为学习率调整的方式,使得模型对探索较好的局部最优。六、 后处理膨胀预测膨胀预测的主要思想是每次预测仅仅保留图片的中心部分,其余地方舍弃,而舍 弃的地方通过滑动切割的思想也会成为其他预测图的中心区域,该方法避免因边界的 特征提取问题而产生拼接痕接,影响最终分割效果。阈值划定在二分类语义分割常用0.5作为前景和背景的分割阈值,某一点的置信度大于0.5就被划分为前景,反之则为背景。在此次比赛中通过测试重新确定分类阈值,最终测试结果为10-2下图左侧为正常0.5作为分割阈值,有图为以10-2作为分割阈值。七、 结果与参考文献最终提交结果为当模型,无TTA等测试时增强操作,模型参数为120M,单张图片(4048*6144)推理时间小于10s(2070super)。      参考文献:EfficientNet: Rethinking Model Scaling for Convolutional Neural NetworksU-Net: Convolutional Networks for Biomedical Image SegmentationFocal Loss for Dense Object Detection, Tsung-Yi Lin, 2018The Lovász-Softmax loss: A tractable surrogate for the optimization of the intersection-over-union measure in neural networksAlbumentations: Fast and Flexible Image Augmentationshttps://github.com/qubvel/segmentation_models.pytorchStochastic Gradient Descent with Warm RestartsLookahead Optimizer: k steps forward , 1 step backRadam:ON THE VARIANCE OF THE ADAPTIVE LEARNING RATE AND BEYOND      本文首发  AI Gallery: https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=712bcbe2-5535-435d-8866-cd0259df56f4     本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance     决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 2020西安人工智能大赛季军获奖方案分享-我的model怎么不work啊团队
    “华为云杯”2020人工智能创新应用大赛-季军方案本赛题任务是基于高分辨可见光遥感卫星影像,提取复杂场景的道路与街道网络信息,将影像的逐个像素进行前、背景分割,检测所有道路像素的对应区域。大赛官网source code数据分析训练集包含2景遥感影像,尺寸分别为40391×33106、34612×29810。测试集包含6张4048×6144尺寸的切分图片,每张测试图片的推理时间被要求在50s以内。训练集图片分辨率过大,需要自行切分,这里需要权衡合适的切分图像大小和步长。我们使用baseline默认的切图代码,图片尺寸为512,步长为256,训练验证集比例为10:1。由于训练图片周围存在黑边,切分后会出现全黑的图像,我们认为这不利于模型的训练,因此通过筛选再去除全黑的图像,最后用作训练和验证的样本数为23553和2269。对标签进行可视化分析,发现背景像素占标签的大部分面积。经过粗略的统计,得到前景和背景的像素占比约为12.2%和87.8%,像素类别极度不平衡,故我们在loss中加入权重(3: 1),以减轻类别不平衡带来的影响。数据增强网络模型采用了Efficentnet作为backbone,优化器是Adam,损失函数为BCE。后处理测试时增强策略模型融合策略忽略边缘预测因为每张图像块的边缘区域缺少上下文信息,会导致周边预测结果精度较低,所以我们采用忽略边缘来预测结果。模型测试时增强模型融合忽略边缘预测成绩Efficentnet-b30.8203Efficentnet-b40.8225Efficentnet-b3√0.8234Efficentnet-b4√0.8254Efficentnet-b3+b4√√0.8325Efficentnet-b3+b4√√√0.8377比赛总结因为时间等因素,我们团队没有花过多的时间去探讨模型的优化,所以模型仍还有很大改进的空间,包括利用道路的边缘信息,采用更适合遥感图像语义分割的loss函数,以及一些形态学操作等。本文首发  AI Gallery: https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=3182dfbe-244f-4aa0-9ed7-de2f6f3ac810本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 2020西安人工智能大赛季军获奖团队分享-不配拥有姓名团队
    前言我们是不配拥有姓名团队,获得决赛第六名,很高兴分享我们的解决方案。1赛题理解1.1任务基于高分辨可见光遥感卫星影像,提取复杂场景的道路与街道网络信息1.2特点:原图比较大,需要自行切分前景(道路)占比比较小1.3数据探索比较宽的道路的标注,和主观识别的道路比较一致。过河道路,认为非路网信息。对于有树木的道路,标注有部分不一致的情况有些比较窄的道路有偏移,有些可能是道路的位置没标注2解决方案2.1 数据预处理裁剪策略window size:1024 × 1024step size: 1024 - 128 = 896计算道路占比计算非全黑区域占比数据过滤策略策略1:道路占比大于0,非全黑区域占比大于0策略2:382 道路占比大于0.09,有效区域占比大于0.3182 道路占比大于0,有效区域占比大于0.32.2 模型结构方案中使用FPN和UNet,backbone均为Efficientnet-B52.3 数据增强CropNonEmptyMaskIfExists:裁剪512×512大小子图,并确保里面有道路信息Normalize:图片数据除以2552.4 训练策略单阶段训练策略初始权重:imagenet训练的EfficientNet-B5权重Loss:1 BCELoss + 1 DiceLoss优化器:SGD学习率调度:使用可重启的余弦退火学习率策略两阶段训练策略1.第一阶段初始权重:imagenet训练的EfficientNet-B5权重Loss:BCELoss优化器:SGD学习率调度:steplr2.第二阶段初始权重:第一阶段训练出的最优模型Loss:LovaszHinge优化器:SGD学习率调度:steplr2.5 模型推理膨胀预测:window size: 1024 × 1024step size: 5121024 × 1024区域,保留中心512 × 512区域内容2.6 后处理对于图像中全黑区域,pred设置为1(非道路)本文首发  AI Gallery: https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=550cd8af-e871-4c7e-a9a9-bd47f99b80a6本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 2020西安人工智能大赛优胜奖获奖团队分享-0.4441警告 团队
    前言大家好,我们是“0.4441警告”,很高兴在论坛和大家交流“华为云杯”2020人工智能创新应用大赛的比赛心得。我们团队的三名成员都来自西安交通大学电信学部信通学院的三名研究生。本次比赛的任务是对遥感图像进行道路的语义分割,下面是我们将从网络框架、数据处理、模型训练、实验结果四个方面阐述我们的解决方案。一、网络框架介绍本次比赛中,我们队伍选用的网络为Unet的变体,主要改动有两个方面:backbone也即encoder部分使用了在ImageNet上预训练的resnet34网络,decoder部分沿用原unet的部分;bridge部分增加了输入和输出通道均为512的残差+BN+ReLU模块。二、数据预处理本次比赛中,我们的数据处理部分主要也是分为两部分,具体如下:使用大赛baseline中cut_data.py文件将两张大图进行有重叠的剪裁,得到xxx张1024×1024的小图,stride(128),也即重叠1/8;把1中得到的全黑的图片(无目标)以及全白的标签(无目标)删除,接着对标签进行反转,即将路的像素值变为255 ,背景像素值变为0。这样做的目的是:之后进行旋转和平移等图像增强时,不会让标签旋转而引入噪声(原黑色部分为道路)。三、训练策略训练方面我们主要采用主要从数据增强和模型调优两个方面说明:1. 数据增强本次比赛中我们使用了多种数据增强方式,主要有以下几种:高斯模糊我们使用了模糊核大小为11的高斯模糊,以0.5的概率对图像进行模糊处理;Gamma变换我们观察发现,由于光照等因素的影响,不同遥感图像之间的对比度存在一定的差异,因此我们采用max(0.65, random(0,1)*2)的方式,以0.5为概率对图像进行gamma变换,结果发现此增强手段对模型性能提升很有帮助;色彩变换对图像的HSV通道进行一定程度的扰动;垂直、水平翻转,90度旋转为了适应遥感图像中道路目标具有旋转不变性,因此有必要进行一定的旋转和翻转变换;归一化处理最后,我们将通过增强的图像归一化到-1.6 - 1.6的范围之间,这样处理可使后面训练更加便捷。2. 模型训练此次比赛我们的训练策略主要分为两个阶段,分别时粗训练和最优模型微调两部分,详细方式如下:粗训练训练集:前文第二部分数据预处理所得到的1789张训练图片验证集:前文第二部分数据预处理所得到的386张训练图片训练设备:华为云,v100Batch_size: 16训练epoch:80初始学习率和更迭策略:1e-3,每5epoch衰减为原来的0.9倍优化器:AdamLoss:0.5dice loss + 0.5bce loss训练结果选择:根据训练结果大致选择epoch 60左右的结果,根据规律在验证集和训练集loss相同的附近的局部最优点为最佳结果。最优模型微调训练集:前文第二部分数据预处理所得到训练集+验证集图片,一共1789+386=2175张验证集:前文第二部分数据预处理所得到的386张验证集训练设备:本地,2080tiBatch_size: 4训练epoch:10初始学习率和更迭策略:1e-5,每5epoch衰减为原来的0.9倍优化器:AdamLoss:0.5dice loss + 0.5bce loss训练结果选择:根据规律在验证集和训练集loss相同的附近的局部最优点为最佳结果。四、测试增强本次比赛中,为了提高模型推理的效果,我们还进行了测试增强策略,主要包括以下三个部分,具体如下:滑动步长选择由于推理文件中图片也需要进行裁剪,此处我们选择使用896步长来进行图片的裁剪。使用原图的8种不同变换进行推理此处将原图与其旋转90°的图进行翻转,镜像等操作得到一共8种图片,使用同一模型进行预测,得到8组结果;结果的阈值选择对于前文得到的8组结果,我们首先对图片进行sigmoid归一化;然后对于滑动中重叠的图片部分取每个像素点的最大值作为该点的值;最后使用阈值1进行二值化处理。本文首发  AI Gallery: https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=8fe51502-0373-4acf-ab89-e9efd53c0b76本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 2020西安人工智能大赛季军分享_道路分割-天呐真的吗团队
    方案介绍赛题介绍这是一个道路分割的任务,基于高分辨可见光遥感卫星影像,提取复杂场景的道路与街道网络信息,将影像的逐个像素进行前、背景分割,检测出道路所在区域,下图是数据集局部区域的展示。训练集包含两张大尺寸的可见光遥感图像及对应的标签图。测试集不可见,包含6张4048x6144的图像。数据端因为所给训练集是大尺寸的图像,我们选择重叠滑窗的切割方式,将原图切成小图。窗口大小是1024x1024,步长为896。滑窗时过滤掉全黑的无效图像。然后将数据按8:2的比例随机划分为训练集和验证集。我们使用在线数据增强的策略,包括翻转、旋转和尺度缩放。网络结构低分辨的特征包含丰富的语义信息,但由于下采样操作,导致它丢失了部分位置信息。而高分辨率的特征相反,它的语义信息相对较少,但位置信息保留较多,定位相对准确,有利于检测小目标。由于道路大多都是长且窄的形状,就要求模型必须定位准确,也就是说道路的检测依赖于高分辨率的特征。现有的大多数网络都是由高分辨率特征下采样到低分辨率特征,再从低分辨率特征中恢复高分辨率特征,但是丢失的位置信息不能完全恢复。而HRNet在整个阶段都保持高分辨率的特征,有利于道路的检测。此外,HRNet的不同分支产生不同分辨率的特征,这些特征之间交互获取信息,最后得到包含多尺度信息的高分辨率特征。因此选择HRNet作为我们backbone。此外,我们认为道路分割不依赖于非常高级的语义信息,因此就不需要非常深的网络,而且在训练数据量有限的情况下,大网络有庞大的参数量,会有过拟合的风险。因此我们选择的是HRNet系列中的小模型:HRNet18。分割头选择OCR注意力模块,利用目标上下文增强特征表示。整个网络结构小,训练速度和推理速度都较快。在实验中,发现HRNet18在速度和精度上都优于hrnet32、hrnet48和deeplabv3+(resnest50)损失函数直接使用交叉熵损失会存在以下的问题。首先每幅图像中道路区域占比少,导致前、背景样本极不平衡。此外,如果逐像素点计算损失然后累加的话,这些简单的背景样本占比大,可能会淹没loss,并且这些简单背景样本对于网络增益较少。因此我们在交叉熵损失的基础上改进。包含三点:增加困难样本的权重,降低简单样本的权重,增加直接优化IOU的损失项。我们将第k个像素点的交叉熵损失记为CEk,首先,我们认为位于边缘附近的样本点属于困难样本,所选中的边缘区域如下图的白色区域所示,因此我们增加这些区域样本损失的权重。这里E就代表所选中的边缘区域,w是权值。此外,针对大量的简单背景样本,我们采用OHEM的策略,损失值小于阈值的样本点不参与反向传播。最终的损失函数就是改进后的交叉熵损失+lovasz_loss训练策略推理与后处理原始的预测结果有明显的漏检,中间区域没有检测出道路。我们观察了预测为道路的概率热图,越亮表示预测为道路的概率越大,越暗表示预测为道路的概率越小。因此越亮或者越暗表示网络对该区域的预测结果置信度高。我们发现对于漏检的区域,概率热图不亮不暗,也就是说网络对该区域的预测结果不自信,并且预测为道路的概率小于0.5,导致了漏检。因此我们采用了一个简单有效的方法,降低预测为前景类概率的阈值,降低漏检率。并且由于网络对背景区域预测结果的置信度非常高,因此在一定范围内降低阈值,在减少漏检的同时,并不会带来明显的过检。实验结果总结代码:https://github.com/reacher-l/2020-ai-road-segmentation本文首发  AI Gallery: https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=b7e8a547-7629-46c1-abb2-91347a46969b本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 2020人工智能大赛优胜奖经验分享-道路识别-风无极团队
    一、问题分析类型:语义分割识别物体:卫星遥感影像,道路识别二、解决方案1、模型:Hrnetv2-482、策略1)数据裁切:滑动窗口(512*512),overlab=1282)数据增强:随机翻转、旋转、缩放等3)loss:二分类交叉熵4)优化函数:随机梯度下降5)后处理:TTA(水平和垂直翻转)三、成果数据裁切后,大约有8000张图片,2-8分成训练集和验证集初赛得分0.8360本文首发  AI Gallery: https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=ebf691a6-f0b2-4a74-acdd-6fa05864b682本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 2020西安人工智能大赛TOP7获奖经验丰富分享-第一次做分割团队
    大家好,我们是“第一次做分割”团队,很高兴在论坛和大家交流“华为云杯”2020人工智能创新应用大赛的比赛心得。本次比赛的任务是对遥感图像进行道路的语义分割,下面是我们将从数据分析,方案设计,实验结果三个方面阐述我们的解决方案。0、数据分析本次比赛提供了2张高分辨率影像作为训练集(40391×33106、34612×29810),6张遥感切片作为测试集(4048x6144)。通过对训练数据进行分析,可以发现数据集存在以下三个特点:1. 类别不平衡;2. 标签存在噪声;3. 训练数据量有限。针对上述问题,我们进行我们的方案设计,整体方案设计分为:数据预处理,特征提取,后处理和模型融合四部分。1、数据预处理数据切割:切割大小为1024的patch进行训练,步长为992。预处理:策略一:(无清洗+CutMix+数据增强)使用原始切割图片,结合CutMix,多尺度训练,随机翻转,随机裁剪数据增强策略二:(数据清洗+数据增强)将原始切割图片中无效区域占比超过75%的图片删除,结合多尺度训练,随机翻转,随机裁剪数据增强2、特征提取模型选择:我们选择了DeeplabV3+和OCRNet作为特征提取的模型。DeeplabV3+利用ASPP提取多尺度特征,并且采用U-like的逐步上采样方式预测结果,使得分割结果更精细;OCRNet利用上下文信息强化同一类别之间像素的贡献,且采用HRNet提取分辨率更大的特征图进行分割。训练细节:DeeplabV3+: Cityscapes预训练模型初始化,训练30k/40k,学习率0.005(head部分0.05),warm up 2000 iters,,CE weight设为[2.0, 1.0]。OCRNet: Cityscapes预训练模型初始化,训练20k,学习率0.005(head部分0.05),warm up 500 iters,CE weight设为[2.0, 1.0]。3、后处理采用膨胀预测替代普通预测,缓解拼接效应,并提升切片边缘预测质量。采用偏差预测预测替代平衡阈值预测:平衡阈值预测:像素值类别=argmax{logit0, logit1}偏差阈值预测:像素值类别=argmax{logit0, logit1-bias}4、模型融合使用3个DeeplabV3+模型与一个OCRNet模型进行融合,不使用TTA。5、实验结果迭代实验消融实验本文首发  AI Gallery: https://marketplace.huaweicloud.com/markets/aihub/modelhub/detail/?id=03b70583-e94c-417d-ae71-4ec2be1e7976本赛事赛题:https://competition.huaweicloud.com/information/1000041322/circumstance决赛获奖选手分享集锦:https://competition.huaweicloud.com/information/1000041322/share
  • [参赛经验分享] 揭开KPI异常检测顶级AI模型面纱(5)--南开大学Excavator团队(挖机联盟)
    首先感谢华为公司举办的比赛,感谢提供给我们一个提升自己的机会。我们是来自南开大学的Excavator团队(挖机联盟),本次比赛非常有幸能进入前10。赛题任务本次KPI异常检测比赛提供了某运营商的部分网元的KPI真实数据,根据历史一个月的异常标签数据,训练机器学习模型,智能预测后续一周内KPI中的异常。评价函数为二分类中常用的F1-score:数据初探训练集数据仅有5列,分别是:kpi_id:表示某个KPI名称,本次共分为20个KPI_ID。start time、end time:采样间隔为1小时,用于指示当前KPI值的开始时间和结束时间。value:KPI值,本次KPI检测的关键数据,核心特征。label:标签值,指示kpi值是否异常。0为正常,1为异常。除去ID列和标签列,仅有时间特征和kpi特征。其中最为关键的就是KPI值,通过KPI值的时序变化,来判别异常点。根据上述分析,将本赛题归纳出几个关键字:时序类数据、原始特征较少、二分类问题。接下来我们进一步分析,发现三个问题:01通过绘制value值分布图发现,不同kpi_id的 value值分布截然不同:有的较为平稳,有的波动很大,且取值区间也相差很大。02通过对label列的value_counts()函数统计发现,0值较多,1值极少。0与1取值分布如下图所示,比值约为98.5:1.5,训练集数据极为不平衡。03训练集数据的时间范围是2019/08/01至2019/09/22,将近两个月的数据;测试集数据的时间范围是2019/09/23至2019/09/29日一周的数据。特征工程时可以围绕“7天”这个周期进行构造。第一时间想到的解决方案是:分ID训练不同模型,根据1/0比值划分阈值,窗口大小优先选择7。特征工程时序类数据和时间强相关,上下联系紧密,首先想到的就是窗口特征和差分特征。01窗口特征:向上向下取一定数量的值(称为窗口),进行统计分析,观察某一周期内value值的变化情况。可以使用Dataframe中rolling函数。(1)统计量:均值(mean)、标准差(std)、方差(var)等。(2)窗口大小:12h内,24h内,7天内等。02差分特征:时间移位作差,目的是观察数据的时序变化。可以使用diff函数。(1)差分方式:时间向上移位作差、时间向下移位作差。(2)差分量:1阶~10阶。03卡方分箱:基于卡方检验,将连续型变量做分箱处理,减小数据异常值带来的影响。在本题中主要针对不稳定ID,将其value值放缩并进行一个映射,衍生出非线性特征,便于模型理解。解决方案常见的时序类模型会想到lstm等神经网络,但是其训练速度较慢,所以本次并未采用。本次采用数据挖掘比赛常用的Lightgbm模型,并结合数据规则进行综合评判。分ID思路如下:01稳定ID一部分ID具有较稳定的value值,异常点即离群点。针对这个现象,我们根据折线图和散点图,找出这些稳定ID,设置一个KPI正常区间。区间之外的点为异常点,置为1。02不稳定ID(1)直接按照模型概率划分0,1对于一部分不稳定ID,我们直接采用LGB模型预测,得到每个点是异常点的概率,再通过计算Train中0,1比例,得到概率划分基准点,再进行微调。(2)经常会出现两个连续1的ID有一部分ID的异常点经常是连续出现的(2个),根据这种情况,我们采用的方案是:①确定必然是异常的点(异常概率大,超过0.5)。②在异常点的上下寻找概率较大的点,也将其记作异常点。(3)模型概率加阈值划分最后一类问题是我们最头疼的一类问题,某些谷底的值,因为下降过程非常平滑,模型有时不能判断其是否是异常,这种我们通过模型概率先找出异常点,再划分阈值来判断异常。划分阈值思路:LGB五折交叉验证后得到训练集异常概率,再遍历0.001到0.5之间阈值(步长0.001),对比训练集标签并计算F1_score,从而得到最优的阈值list。根据最优阈值对测试集概率划分。最终评分0.9403,线上排名第10,复核排名第9总 结首先分ID训练优化模型,对于较少ID的比赛(比如本次比赛)还可以,对于ID多的恐怕会相当复杂,所以还是很期待前排“1”佬们的方案。我们提供的方案主要还是单模,难免在最后阶段进入瓶颈期。后面还要更多考虑模型融合,发掘不同模型之间的优势,取长补短。特征挖掘思路较为常规,还需要进行更深入的挖掘,毕竟“特征为王”,挖到几个强特可能直接分数暴增。对于华为NAIE平台,刚开始使用的时候还是挺困难的,但是一天的摸索后,就一句话:NAIE真香。对于赛制:没有B榜可能是唯一的槽点吧,全都朝着A棒拟合,模型泛化能力检测不够吧。有点慈善赛的味道(不是为了买代码)。希望下次还能有机会参加华为的比赛,和各路高手比拼。和GREAT再战300回合!本文首发:网络人工智能园地https://mp.weixin.qq.com/s/vcSB8qtpDI6m4_NCGUAV3w
总条数:5192 到第
上滑加载中