-
一、问题分析类型:语义分割识别物体:卫星遥感影像,道路识别二、解决方案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人工智能创新应用大赛的比赛心得。本次比赛的任务是对遥感图像进行道路的语义分割,下面是我们将从数据分析,方案设计,实验结果三个方面阐述我们的解决方案。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
-
首先感谢华为公司举办的比赛,感谢提供给我们一个提升自己的机会。我们是来自南开大学的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
-
导语结束比赛有几天了,这几天一直在处理前段时间堆积的工作,今天得空对自己的方案进行梳理总结。今年7月多结束魔镜杯后,将之前的内容整理了一下,刚好看到华为垃圾分类比赛,由于我的工作内容还是偏图像,所以就想玩玩,有幸拿了一个亚军。这次比赛是基于华为云的modelArts平台,免费的gpu硬件环境,全新的结果提交验证方法。感谢组织方华为云,喜欢打比赛的小伙伴也可以多留意该平台,会不定期举办各种数据类竞赛。我们队共有三人:谢赋(老虎)、舒欣(up)和文瑞(一休),大家交流分工合作,才能不断奋力前进。这次分享主要是针对决赛阶段,该阶段要求模型的推理时间不能大于100ms,不能使用融合和TTA。故关于模型融合和TTA技巧,本次不会涉及到,后面还会有图像分类的专题分享。一 解题思路拿到数据后,我们首先做了数据分析。统计数据样本分布,尺寸分布,图片形态等,基于分析可以做一些针对性的数据预处理算法,对后期的模型训练会有很大的帮助。选择好的baseline。需要不断的尝试各种现有的网络结构,进行结果对比,挑选出适合该网络的模型结构,然后基于该模型进行不断的调参,调试出性能较好的参数。做结果验证,分析badcase。将上述模型在验证集上做结果验证,找出错误样本,分析出错原因,然后针对性的调整网络和数据。基于新数据和模型,再次进行模型调优二 数据分析(EDA)原始共有43个类别,共计19459张图片。图像类别数据不均衡,其中较少数据为类别3(牙签)、类别40(毛巾)和类别41(饮料盒);数据较多的为类别11(菜叶根)和类别21(插头电线)。 图片长宽比有一定的差异性,下图是h/w比例数据分布图(只显示该类数量大于100的比例),长宽比大多数集中于1,后来模型输入尺寸设为1:1基于分析对图像进行简单的数据增强操作,包括图像的等比填充缩放裁剪,水平翻转、高斯噪声等。其中第一项目,对结果影响较大。这里是先将原始图像以最大边为基准做等比缩放,不足的地方填充0,这里缩放后的边是最终输入边长的256/224倍,然后在进行剪切,这里输入模型的尺寸为288*288。下图是对比图,如果不进行等比缩放,最终的结果是最右边的图片,最后的输出就极易识别为筷子。等比缩放的代码如下:class Resize(object): def __init__(self, size, interpolation=Image.BILINEAR): self.size = size self.interpolation = interpolation def __call__(self, img): # padding ratio = self.size[0] / self.size[1] w, h = img.size if w / h < ratio: t = int(h * ratio) w_padding = (t - w) // 2 img = img.crop((-w_padding, 0, w+w_padding, h)) else: t = int(w / ratio) h_padding = (t - h) // 2 img = img.crop((0, -h_padding, w, h+h_padding)) img = img.resize(self.size, self.interpolation) return img三 模型设计与训练首先对原始的数据进行分组,9:1的比例分为训练集和测试集,基于此做线下验证。模型结构baseline准确率seresnext5032x4d93.10seresnext10132x4d93.59Senet15494.38resnext50_32*8d95.01resnext10132*16dwsl95.56resnext10132*32dwsl95.32Pnasnet5large94.38efficientnet-b795.20基于上述结果验证,采用了resnext10132*16dwsl网络作为基本的baseline,进行结果调优,最后的网络结构如下图,红色的部分为调整的网络部分,模型最后全连接层添加dropout降低过拟合,首层卷积添加cbam注意力机制增强特征表征能力,关注重要特征抑制不必要特征。基于此网络,现在训练20个epoch就能收敛到最高分,训练时间大概5个小时左右。在模型参数选择和调整方面,尝试了很多参数,针对损失函数分别尝试了CrossEntropyLoss和focal loss, 优化函数:adabound、Radam、adam、sgd和sgd + warm up, 其中adabound在起始收敛的速度较快,但是最终还是sgd的网络精度较高。学习率优化方面使用了ReduceLROnPlateau和定值优化两种方法,定值优化需要根据实验选择适合的降分点。并且也要针对不同的模型调整学习率,最终采用的参数如下:使用预训练参数优化函数: sgd学习率:0.001学习率优化:ReduceLROnPlateau自己设置的网络层,初始学习率是预加载参数网络的5倍四 结果分析在验证集上做结果验证,得到下图所示的混淆矩阵。基于此分析各类别预测结果分布,分析badcase,采取措施进行数据扩充或数据增强工作。五 展望对网络结果中的全部残差块添加时间和空间注意力机制对模型进行量化和剪枝,在保证精度的同时提高模型速度转化为二分类问题,使用人脸的arcfaceloss + triplet loss + focal loss联合loss优化在落地的场景中增加反馈机制,收集用户的反馈信息,对模型进行在线训练,不断增加训练数据优化模型。参考文献Robustness properties of Facebook’s ResNeXtWSL modelsFaceNet: A Unified Embedding for Face Recognition and ClusteringFocal Loss for Dense Object Detection最后比赛这种东西,即使第一次没有得奖,多参加两次,多熬两个夜就会得奖了,大多数比赛技巧性都比较强,相信自己可以的。如果感觉自己一个人学习太孤单,欢迎添加下方微信群,一块交流成长,如果二维码失效也可通过微信下方链接加群。参加每一次项目,如果感觉可以,或者有用,我会把代码直接放出,方便新手学习,快速成长,关注微信公众号回复:垃圾分类,即可获得本次决赛代码,接下也会将分类任务整理一下,包含主流的一些网络,敬请关注。
-
Jeff Dean(也称Jeffrey Adgate Dean)是一名美国计算机科学家和软件工程师,出生于1968年,毕业于华盛顿大学,主要作品有《MapReduce》eff Dean:2021年之后,机器学习领域的五大潜力趋势2021 年之后,机器学习将会对哪些领域产生前所未有的影响?在过去的数年,见证了机器学习(ML)和计算机科学领域的许多变化。按照这种长弧形的进步模式,人们或许将在接下来的几年中看到许多令人兴奋的进展,这些进步最终将造福数十亿人的生活,并产生比以往更深远的影响。 在一篇总结文章中,谷歌 AI 负责人、知名学者 Jeff Dean 重点介绍了 2021 年之后机器学习最具潜力的五个领域:趋势 1:能力、通用性更强的机器学习模型趋势 2:机器学习持续的效率提升趋势 3:机器学习变得更个性化,对社区也更有益趋势 4:机器学习对科学、健康和可持续发展的影响越来越大趋势 5:对机器学习更深入和更广泛的理解
-
内容介绍本文重点在于如何利用python收集各类型因子并进行预处理最终用于构建量化选股模型。工具介绍本代码所需要调用的包如下图所示:import pandas as pdimport tushare as tspro = ts.pro_api()import numpy as npimport timeimport mathimport statsmodels.api as smfrom sklearn import preprocessingfrom sklearn.decomposition import PCAimport os这里需要用到的是python中的pandas和statsmodels模块,分别用于数据处理和做多元回归。另外,还需要获取股票和指数的各项数据,这里所用到的是tushare,tushare拥有丰富的数据内容,如股票、基金等行情数据,公司财务理等基本面数据。通过tushare平台赚取一定的积分可以免费获取平台提供的数据。(个人ID:419382)数据获取本段代码展示了如何通过tushare获取相关数据并清洗成为所需因子,共展示了估值因子,成长因子,财务质量因子,杠杆因子,动量反转因子,波动率因子以及beta的构建。其中beta因子是取个股与指数收益率线性回归的回归系数。def get_all_factors(codes_list,date,start,end,one_m_start,beta_start,beta_end): #获取估值因子 evaluate_factors = pd.DataFrame() for i in range(len(codes_list)): #获取给定交易日的指标 df1 = pro.daily_basic(ts_code=codes_list[i],trade_date=date,fields="ts_code,trade_date,pe_ttm,pb,ps_ttm,dv_ttm") evaluate_factors = evaluate_factors.append(df1) time.sleep(0.4) print("第%d支股票估值因子获取成功"%i) #根据指标计算因子 evaluate_factors["EP"] = 1/evaluate_factors["pe_ttm"] evaluate_factors["BP"] = 1/evaluate_factors["pb"] evaluate_factors["SP"] = 1/evaluate_factors["ps_ttm"] evaluate_factors["DP"] = evaluate_factors["dv_ttm"] evaluate_factors = evaluate_factors[["ts_code","trade_date","EP","BP","SP","DP"]] #获取成长因子 growth_factors = pd.DataFrame() for i in range(len(codes_list)): #获取给定日期最近的财报 df1 = pro.income(ts_code=codes_list[i],end_date=date, fields="ts_code,end_date,revenue,n_income") df1 = df1.drop_duplicates(subset=["end_date"]) #根据财报计算因子 df1["end_date"] = df1["end_date"].astype("int64") df1 = df1.iloc[[0,4],:] revenue = df1["revenue"].tolist() n_income = df1["n_income"].tolist() sales_G = revenue[0]/revenue[1] - 1 profit_G = n_income[0]/n_income[1] - 1 df2 = pro.fina_indicator(ts_code=codes_list[i],end_date=date) df2 = df2.drop_duplicates(subset=["end_date"]) df2["end_date"] = df2["end_date"].astype("int64") df2 = df2.iloc[[0,4],:] roe = df2["roe"].tolist() ROE_G = roe[0]/roe[1] - 1 df3 = pd.DataFrame({"ts_code":codes_list[i],"sales_G":sales_G,"profit_G":profit_G,"ROE_G":ROE_G},index=[20201231]) growth_factors = growth_factors.append(df3) time.sleep(1.2) print("第%d支股票成长因子获取成功"%i) all_factors = evaluate_factors.merge(growth_factors) #获取财务质量因子 quality_factors = pd.DataFrame() for i in range(len(codes_list)): #获取给定日期最近的财报 df1 = pro.fina_indicator(ts_code=codes_list[i],end_date=date) df1["end_date"] = df1["end_date"].astype("int64") df1 = df1.iloc[0,:] df1 = df1[["ts_code","roe","assets_turn"]] quality_factors = quality_factors.append(df1) time.sleep(1) print("第%d支股票财务质量获取成功"%i) all_factors = all_factors.merge(quality_factors) #获取杠杆因子 leverage_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = pro.fina_indicator(ts_code=codes_list[i],end_date=date) df1["end_date"] = df1["end_date"].astype("int64") df1 = df1.iloc[0,:] df1 = df1[["ts_code","debt_to_assets"]] leverage_factors = leverage_factors.append(df1) time.sleep(0.8) print("第%d支股票杠杆因子获取成功"%i) all_facotrs = all_factors.merge(leverage_factors) #获取市值因子 capital_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = pro.daily_basic(ts_code=codes_list[i],trade_date=date,fields="ts_code,total_mv") df1["total_mv"] = df1["total_mv"].apply(lambda x:math.log(x)) capital_factors = capital_factors.append(df1) time.sleep(0.5) print("第%d支股票市值因子获取成功"%i) all_factors = all_facotrs.merge(capital_factors) #获取动量反转因子 return_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = ts.pro_bar(ts_code=codes_list[i], freq='M', adj='hfq') df1["trade_date"] = df1["trade_date"].astype("int64") close = df1["close"].tolist() return_1m = df1["pct_chg"].tolist()[0] return_3m = close[0]/close[3] - 1 df2 = ts.pro_bar(ts_code=codes_list[i], adj='hfq') df2["trade_date"] = df2["trade_date"].astype("int64") df3 = pro.daily_basic(ts_code=codes_list[i],start_date=start,end_date=end,fields="ts_code,trade_date,turnover_rate") df3["trade_date"] = df3["trade_date"].astype("int64") df2 = df2[df2["trade_date"]>=start] w_return_3m = (df2["pct_chg"]*df3["turnover_rate"]).sum()/len(df2) df_1m_return = df2[df2["trade_date"]>=one_m_start] df_1m_turnover = df3[df3["trade_date"]>=one_m_start] w_return_1m = (df_1m_return["pct_chg"]*df_1m_turnover["turnover_rate"]).sum()/len(df_1m_return) df4 = pd.DataFrame({"ts_code":codes_list[i], "return_1m":return_1m,"return_3m":return_3m,"w_return_1m":w_return_1m,"w_return_3m":w_return_3m},index=[0]) return_factors = return_factors.append(df4) print("第%d支股票动量反转因子获取成功"%i) all_factors = all_factors.merge(return_factors) #获取波动率因子 vol_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = ts.pro_bar(ts_code=codes_list[i], adj='hfq') df1["trade_date"] = df1["trade_date"].astype("int64") df2 = df1[df1["trade_date"]>=start] std_1m = df2["pct_chg"].std() df3 = df1[df1["trade_date"]>=one_m_start] std_3m = df3["pct_chg"].std() df4 = pd.DataFrame({"ts_code":codes_list[i],"std_1m":std_1m,"std_3m":std_3m},index=[0]) vol_factors = vol_factors.append(df4) print("第%d支股票波动率因子获取成功"%i) all_factors = all_factors.merge(vol_factors) #获取beta beta_factors = pd.DataFrame() rf = 1.03**(1/360) - 1 hs300 = pro.index_daily(ts_code="399300.SZ",start_date=beta_start,end_date=beta_end) hs300["rm"] = hs300["pct_chg"]/100 - rf for i in range(len(codes_list)): df1 = pro.daily(ts_code=codes_list[i],start_date=beta_start,end_date=beta_end) df1["rp"] = df1["pct_chg"]/100 - rf df_model = pd.merge(hs300[["trade_date","rm"]],df1[["trade_date","rp"]],on="trade_date") df_model.index = pd.to_datetime(df1.trade_date) df_model.sort_index(inplace=True) model = sm.OLS(df_model["rp"],sm.add_constant(df_model["rm"])) result = model.fit() beta = result.params["rm"] df2 = pd.DataFrame({"ts_code":codes_list[i],"beta":beta},index=[0]) beta_factors = beta_factors.append(df2) print("第%d支股票beta因子获取成功"%i) all_factors = all_factors.merge(beta_factors) #获取换手率因子 turn_factors = pd.DataFrame() for i in range(len(codes_list)): df1 = pro.daily_basic(ts_code=codes_list[i],start_date=start,end_date=end,fields="ts_code,trade_date,turnover_rate") df1["trade_date"] = df1["trade_date"].astype("int64") turn_3m = df1["turnover_rate"].sum().mean() df2 = df1[df1["trade_date"]>=one_m_start] turn_1m = df2["turnover_rate"].sum().mean() df3 = pd.DataFrame({"ts_code":codes_list[i],"turn_1m":turn_1m,"turn_3m":turn_3m},index=[0]) turn_factors = turn_factors.append(df3) print("第%d支股票换手率因子获取成功"%i) time.sleep(0.3) all_factors = all_factors.merge(turn_factors) return all_factors 数据预处理本段的数据预处理显示获取个股所属行业,这一部分需要先在网上下载一份上司公司所属中信一级行业的表格(即代码中的“ industry.xlsx ”)。之后再用merge函数合并进数据表中。之后可以利用所属行业进行行业市值中性化处理,其他预处理步骤包括中位数去极值,缺失值处理,标准化和PCA。这里的PCA主要是为了去除多重共线性的影响,不在于筛选因子。#获取标签def get_tag(data,date): stocks = data["ts_code"].tolist() rm = pro.index_monthly(ts_code="399300.SZ",trade_date=date).pct_chg.tolist() return_list=[] for i in range(len(stocks)): r = pro.monthly(ts_code=stocks[i], trade_date=date).pct_chg.tolist() return_list.append(r[0]-rm[0]) print("第%d支股票超额收益计算完成"%i) time.sleep(0.5) data["ex_return"] = return_list return data#获取行业def get_industry(data): df1 = pd.read_excel(r"industry.xlsx",dtype="object") df1 = df1.rename(columns={"code":"ts_code"}) ts_codes = data["ts_code"].tolist() data["ts_code"] = data["ts_code"].apply(lambda x:x[0:6]) data = data.merge(df1,on="ts_code") data["ts_code"] = ts_codes return data#数据预处理#中位数去极值def MAD(data,n): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] for i in range(len(indexes)): Dm = data[indexes[i]].quantile(0.5) Dm1 = ((data[indexes[i]] - Dm).abs()).quantile(0.5) max_range = Dm + n*Dm1 min_range = Dm - n*Dm1 data[indexes[i]] = np.clip(data[indexes[i]],min_range,max_range) return data#缺失值处理def Miss_data(data): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] for i in range(len(indexes)): data[indexes[i]] = data.groupby("industry")[indexes[i]].transform(lambda x:x.fillna(x.mean())) return data#市值行业中性化def Indifference(data): data2 = data.drop_duplicates(subset=["industry"]) list1 = data2["industry"].tolist() list2 = data["industry"].tolist() industry_matrix = pd.DataFrame(columns=list1) industry_names = industry_matrix.columns.values.tolist() for each in range(len(industry_names)): for i in range(len(list2)): if list2[i] == list1[each]: list2[i] = 1 else: list2[i] = 0 industry_matrix[list1[each]] = list2 list2 = data["industry"].tolist() indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] for i in range(len(indexes)): model = sm.OLS(data[indexes[i]],sm.add_constant(industry_matrix)) result = model.fit() data[indexes[i]] = result.resid return data#标准化def Standardize(data): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] data[indexes] = preprocessing.scale(data[indexes]) return data #主成分分析def PCA_data(data): indexes = data.columns.values.tolist() indexes = indexes[2:len(indexes)-1] pca = PCA(n_components=20) new_data = pca.fit_transform(data[indexes]) new_data = pd.DataFrame(new_data) data[indexes] = new_data return data模型构建到这里之后用于回归模型的数据集就已经构建完成了,利用传统机器学习的步骤,将数据集分为训练集和测试集,训练集为T-2期至T-12期的数据,测试集为T-1期的数据,本模型最终目的是利用T-1期的数据预测T期个股的超额收益率。
-
赛题介绍这次比赛的赛道主要是针对金相显微图片来预测其对应定级,本次建模思路是当作一个分类问题来做,给定一个图像预测其所属的定级。比赛链接参赛队员本次比赛的队员有,裴森(中国科学院自动化研究所)、孙嘉玺(中国科学院自动化研究所)、安迪(南加大USC)、刘丹(山东财经大学)、张文轩(西安交通大学)我们的方法数据处理拿到数据后,我们首先对数据进行筛查,在筛查过程中我们发现,数据中主要包含两类错误,第一类就是同一张图片包含在数据集中有多个定级标签。第二类错误,就是图片明显的标签错误,因为标签是按照图片中晶元密度给定的,所以人眼就可以检测出来。具体实例如下:为了处理这些数据,我们采用了基于模型的清洗方法。因为在模型的训练中,一般outlier很难拟合。基于这个知识,我们首先将模型训练到0.9正确率,那么预测错误的0.1很可能含有outlier。这时候我们通过人工的手段,对这0.1预测错误的数据进行清洗。清洗后,如果模型表现更好,说明我们人工清洗的数据是对的,否则需要重新对数据进行清洗。数据增强为了提高训练阶段模型的泛化性能,我们使用了训练增强的技术。因为晶元的分布在显微图像上具有不均匀性,所以需要整个图像的信息才能判断出图像的定级。因此在数据增强上不建议使用随机裁剪,在我们的模型上,随机裁剪也会对我们模型的表现有消极影响。完整的数据增强的一些trick和其效果如下:随机旋转:小角度(5°)范围内随机旋转,可提升模型泛化能力(≈+0.5% )随机裁切:可以保留细节信息,但是全局信息受限,分级任务不过分强调局部信息(≈-0.7%)全局下采样:细节信息部分丢失,全局信息被较好地保留,分级任务依赖图像整体(≈+1.2% )色彩变换:对于包含语义信息的目标识别或者分类比较有效,分级任务收益较小(≈+0.0% )镜像翻转: 不改变金相图的含义与图像尺寸,可扩充样本数量,不会带来负面影响(≈+0.9% )尺度完备网络:Kernel Completed Net (KCN)我们这个模型也是从传统方法截点法得到的启发。这个模型有三个特点:输入时图像中的某一行或者列使用多个卷积神经网络并行提取多尺度感受野信息使用Attention机制对冗余感受野进行权重上的屏蔽首先为什么使用图像中的某一行作为输入呢?因为截点法就是在图像中画一个线,通过这些线与晶元边界交点的个数来计算定级。这就说明,某些行就包含了足够的定级信息。另外因为不同定级的晶元大小时不同的,因为对于大的晶元来说需要大的感受野对晶元进行计数,对于小的晶元来说,需要小的感受野对晶元进行计数。多以多尺度的感受野特诊提取是必要的。但是这同样引入一个问题,就是会有冗余的感受野,比如在对小晶元进行计数的时候,大的感受野输出结果是没有任何参考价值的,所以需要把大感受的输出进行屏蔽。我们使用的屏蔽方法就是用Attention机制来学习一个权重,把冗余信息的权重调小。网络架构入下:首先输入的图像行或者图像列被并行的卷积网络处理成多个不同长度的序列,这些序列经过自适应池化归一化成512长度。将这些序列堆叠到一起后,再经过Attention层的处理,就被送到MLP层预测分类结果。对比式残差网络:Contrast ResNet(CRN)我们为比赛设计的第二个模型就是对比式残差网络,这个网络使用了对比学习和有监督学习融合的训练方式,因为也继承了两者的优点。比如能捕捉更多类内信息和鲁棒性更高、精度更高等。架构如下:输入图像首先经过两次数据增强后得到三张图像,这三张图像经过ResNet得到三个特征向量,我们把这三个向量看作三张图的语义表示。将这三个向量经过Channel Attention的校正,送到MLP里面,就可以输出最终的分类结果。模型集成因为我们的模型是异构的,因此集成到一起可以大大提升最终效果。在集成公式上,我们选择Adaboost的集成公式对两个模型进行集成,最终获得了1.8%的性能提升。赛后总结这次比赛取得了不错的成绩。但是比赛完成后,复盘整个比赛,还是可以发现很多可以提升的地方,比如在问题的定义上,如果定义成回归问题,那么效果会不会更好。如果在我们的方法可以将截点法自动化建模,就算精度提升不多,但是比直接输出图片定级概率更有意义。因此学无止境,未来路上继续努力求索!撰写人:孙嘉玺 2021/11/10
-
成员介绍本次比赛我们的队长是 何笑韬,队员是何向萌和梁保金。我们都来自西安交通大学电信学部信通学院图像所, 主要研究方向为图像质量评价和视觉显著性分析。下面介绍我们团队的解决方案。一、赛题分析本赛题的任务是基于显微镜成像的金相图片评估定级结果,可将其抽象为一个图像分类任务或者是一个回归任务,赛题存在如下的几个难点,下面我们结合数据集和赛题,详细说明其具体难点。1.图片数量有限,尺寸较大本次比赛数据集图片较少,且图片尺寸较大,数据集中图片可以四张组合在一起为一张完整的大图。2.图片局部区域的晶粒度差异大本次比赛数据集图片内部patch区域的晶粒度差异较大,如下图所示。3.图片标注误差由于人为标注的不确定性,数据集中存在部分标注错误图片/重复图片,如下图所示。4.混合评分标准本次比赛的评分标准混合考虑了acc0和acc0_5的内容,因此需要指定合适的训练策略,有的放矢。5.图片特性分析最后就是赛题的图片内容上表现出,色彩单一,形状不敏感的特性,可据此采用不同的增强策略。二、数据预处理和增强根据上面的分析,我们可以制定出如下的数据预处理和数增强策略,(√)表示有效,(×)表示无效:数据预处理数据清洗(√)利用md5值查找重复图片,对于同标签的重复图片,保留一张对于不同标签的重复图片,通过人工标注的方式选择合适的标签,最终删除重复图片数:319张;更改标签图片数:35张。cleanlab数据清洗(×)使用五折训练,将预测结果使用cleanlab进行错误标签查找,具体流程如下: 3.针对准确率较差的数据人工清洗(×) 我们针对模型识别率较差的晶粒度9.0/9.5 7.0/6.5图片进行人工清洗,但效果不佳。数据增强离线切块训练baseline的RandomResizedCrop不符合此任务的实际,改用RandomCrop后,在线训练时难以收敛,为了增加数据量的同时,提高模型的训练稳定性,我们采用一种折衷的策略,即离线裁剪图像块,进行离线训练的策略。最终我们对训练集图片进行了重叠裁剪,将原始图片裁剪为224*224的patch,裁剪步长设置为56,即重叠3/4,最后得到训练图片1178688张。在线增强对于在线增强,我们主要采用了如下的增强策略,但只有随机水平和竖直翻转有效。三、网络选择和损失函数设计网络选择网络模型的选择上,我们尝试了很多网路,但最终发现小模型就可以满足精度要求,增大模型对最终的推理精度没有很大提升。我们还尝试了(1)结合梯度图,训练双分支网络(2)将分类问题退化为回归问题,最后都没有取得很好的结果。因此最终我们选择resnet34作为最终模型。损失函数设计本次比赛除了考虑了acc0还考虑了acc0_5,因此我们设计了如下的损失函数,其可以有效提高acc0_5的得分。四、模型训练此次比赛我们的训练中使用前面所生成的裁剪后的1178688张图片进行训练,5个epoch左右即可收敛,参数如下:(1)数据集将数据集按照9:1的比例划分为训练集与验证集训练集按照步长56、尺寸224×224进行滑动剪裁,获得训练集图片1178688张验证集图片380张 图片尺寸1376×1104(2)batch_size 32(3)训练epoch 8 选择最优线下epoch上传(4)初始学习率和更迭策略:1e-2,每1epoch衰减为原来的0.1倍(5)优化器:SGD(6)损失函数: 0.5CrossEntropyLoss + 0.5mapL1loss五、推理策略本次比赛中,为了提高模型推理的效果,我们还进行了测试增强,主要尝试了以下三种策略,如下图所示:大图预测:对整图预测,结合TTA,得到最终分类结果小图预测:大图裁成小块,预测小块,结合预测策略,得到分类结果小图滑动预测:大图重叠裁成小块,预测小块,结合预测策略,得到分类结果最终,我们采用的策略是:小图滑动裁剪,结合小图预测结果的众数,得到最终分类结果。这一策略在线上取得最优结果。六、性能提升曲线结合前面所说的解决方案,我们的性能提升曲线如下图:飞龙在天2021/11/10
-
一、赛题理解1. 任务分析任务:基于显微镜成像的金相图片评估定级结果。有三种定级方法,通过分析他们的原理可知,他们都是通过不同策略来估计单位面积晶粒个数。特点:晶粒度定级规则与面积有关,即选用数据增强策略时应尽量避免导致原始图片大小发生变化的方法任务需要评估整幅图像的平均状态,而非某一部分的状态由于定级规则,标注天然存在噪声,且不易区分噪声样本与困难样本2. 数据探索数据中存在重复图片,其中存在部分重复图片标注不同的情况晶粒度在同一张图片上不同区域,有时不同,中间级别这种情况相对较多一些二、 解决方案1. 数据预处理2. 模型选择最终选用了EfficientNet-B2作为比赛模型3. 数据增强首选使用了两个常见第数据增强策略修改数据裁剪策略,初赛阶段得到一定提升更进一步优化数据裁剪策略,多个随机尺寸进行训练4. 训练策略预训练权重: ImageNet训练的EfficientNet-B2权重损失函数: CrossEntropyLoss优化器: AdamW初始学习率: 3e-4BatchSize: 16训练Epoch数: 1200学习率调度: StepLR(step=[400, 800, 1000])5. 模型推理推理时选用1024x1024大小区域作为模型输入,预测结果。推理采用单模型、无TTA,提交后半小时左右出分。三、总结思考总结:根据数据量及任务情况选择合适的模型,并非越大模型越好训练时适当减少裁剪区域范围,可提高模型泛化能力未来思考:如果标注成本可以接受的情况下,由专家人工标注晶粒边界,利用语义分割算法进行边界提取,再进行截线法或面积法进行定级
-
团队介绍我们是来自广西师范大学计算机科学与工程学院的研二学生。队长冼添涛,队员何凯杰,主要研究方向为图像描述,跨模态检索,目标追踪。下面介绍我们团队的解决方案。1. 任务基于显微镜成像的金相图片评估定级结果2. 数据分析拿到初始数据后,我们对数据的类别进行了分析,如图中所示,数据集包含4222张图片,类别之间存在着严重的不均衡,最少的类别只有161张,最多的类别有524张,3倍多的差距。 使用图片查重工具Duplicate Photo Finder Plues,发现总共有621张重复图片,占总量的14.7%。 我们把重复数据分为三类: 类内重复、邻居重复(正负0.5范围的重复)和间隔重复(超出正负0.5的重复)。对不同类型采取不同的策略,尽量减少图片损失。3. 数据预处理通过观察数据,我们发现四张连号的图片是一张大图切分而来。如果1/4小大的局部信息就足以判断图片的类别,我们大胆假设图片的局部信息之间不存在强关联,那么可以通过打乱图片的局部位置获得新的图片,来作为数据扩充。 具体来说,我们把一张图分为四个小块,随机组合,那么一张图可以获得4x3x2x1=24种组合。 通过上述扩充,我们的获得了9465张图片的训练集和280张图片的验证集。注:验证集不包括任何扩充图片。4. 实验设置模型:Swin-Base-384学习率:初始1e-4, 策略ReduceLROnPlateau(5个epoch无提升则*0.5)损失函数 :Label Smothing(平滑因子0.2 ) 优化器 :Adam Batch size::24Epoch:805. 预测分类训练数据增强RandomGridShuffleGaussianBlurGridDistortionRandomResizedCropRandomHorizontalFlipRandomVerticalFlipRandomRotationRandomErasing本阶段主要是让Swin-Transformer拟合数据集。最终在初赛获得90.53,复赛85.99的成绩。6. 相似度分类训练受启发于比较法,除了让模型学习学习预测类别,我们也可以显式地训练模型根据对比图片的相似度判断类别。核心思想:基于对比学习的思想, 让相似的图片距离近,不相似的图片距离远。 实际上,在单纯的模型分类能力训练中,模型已经隐式的学习到了这种对比能力。为了强化模型的判断能力,我们设计了一种对比训练方法,对上一阶段得到的模型进行显式训练。对比学习的大概框架如图:为此,我们对模型结构进行了修改。我们新增了一个相似度计算头,把每张图片编码为144x512的向量表示注:本阶段只训练相似度头的参数。具体实现1. 对批次内的输入图片编码, 得到大小为 [batch,144,512] 的特征矩阵2. 对验证集所有图片编码,按类求均值,得到大小为 [14,144,512] 的特征矩阵,作为14个类别的对比图片表示3. 每张输入图片会对14个类别对比图片表示进行余弦相似度计算,得到大小为 [batch, 14] 的相似度矩阵4. 损失计算 损失函数该损失函数的核心思想为,当输入图片与正样本的相似度 >= 与负样本相似度 + α ,损失-> 0 。因此,为了最小化损失值,模型会在每个迭代拉大与同类对比图片的相似度,缩减与不同类对比图片的相似度,最终获得很好的分类能力。7. 结合完成第二阶段训练后,对所有图片(训练集+验证集)进行编码,按类别均值,得到大小为 [14, 144, 512] 的特征矩阵作为线上测试时候的对比集。最终分类结果 = 预测分类概率 + 相似度分类概率。 最终得到复赛成绩86.32。
-
一.前言我们组是一个很神奇的队伍,组长黄泽瀚,组员李敏君、彭潇枫,三个人在参加这次比赛前,Pytorch都不会用的,报名比赛纯粹是为了学习一下Pytorch。能在245支团队中进入前12,参加这次高手云集的决赛,完全是Efficent Net的强大和一点点点点点...(此处省略n个点)运气。(在2021年11月5日进行决赛答辩时,只能在角落留下没有知识的泪水(〒_〒)(〒_〒)(〒_〒))二、思路我们的思路很简单,面向搜索引擎:最强的图像分类网络搜索提升模型精度的方法搜索提升模型泛化能力的方法此处萌新三连!萌新三连!萌新三连!思路一:网络选择EfficientNet 兼顾了速度与精度,b0分辨率略微不足,B6和B7经测试需要训练时间过长,B7 训练的模型大小超过比赛限制。我们折中选择了b4。实际上EfficientNet 潜力巨大,甚至发现一个问题:应该都不需要B4就能拿到很高分数。思路二:数据增强我们组都是人工智能小萌新,还没有能力去完全理解和有效地改动一个神经网络,我们的主要精力放在数据增强上。经过多次实践,我们发现其中两种对模型精度提升很大:仿射变换和垂直变换。随机仿射变换以下这组参数经测试,有1%以上的稳定提升transforms.RandomAffine(degrees=(0, 25), translate=(0.05, 0.20))随机垂直翻转、随机水平翻转加入垂直翻转后,并修改随机概率,也能有1%以上的稳定提升transforms.RandomVerticalFlip(p=0.4), transforms.RandomHorizontalFlip(p=0.4)至此,b0 + 随机仿射变换 + 随机垂直翻转后,初赛能拿到0.84~0.85左右的成绩。思路三:参数调优查阅资料,提升泛化能力简单方式有如下:经验正则化,即提前终止和模型集成。使用Dropout,在训练过程中,随机的丢弃一部分输入,此时丢弃部分对应的参数不会更新。 我们主要运用了Dropout , 实际上EfficentNet_pytorch有相关实现,调整网络参数即可。调整EfficentNet Dropout :model = EfficientNet.from_pretrained( "efficientnet-b4", advprop=True, num_classes=class_num, dropout_rate = 0.6, drop_connect_rate = 0.3)至此,B4加上之前的数据增强,初赛能拿到0.86左右的成绩,复赛能有0.81上下的成绩。 (此处三个小萌新流下了欣慰的泪水,有了一个新的突破!)我们最后的提升是在指定Epoch下调学习率实现的,减少无用训练的次数:optimizer = torch.optim.AdamW(model.parameters(), lr = 1e-3)lr_scheduler = torch.optim.lr_scheduler.MultiStepLR( optimizer=optimizer, milestones=[20,36,45,52,60], gamma=0.1)最终复赛得到的最高成绩:0.8274小结:由于理论知识和比赛经验的不足,我们能走的方向不多,在复赛中我们算是迷茫了。到了决赛才知道,还有很多工作可以做,如数据扩充、缩放裁剪的选择、推理代码的优化等等。思考:得多读书加深理论知识,多角度去思考问题,不要只停留某一个点上!追龙组2021/11/12
-
一、前言团队介绍:三个来自于西安交通大学的研二学生: 高泱晗,专业:控制科学与工程 研究方向:社交网络,多分类问题 张 洁,专业:控制科学与工程 研究方向:智能电网 张潇然,专业:信息与通信工程, 研究方向:图像隐写,信息隐藏队伍宣言:岂曰无饭 与子同甘 干饭狂魔 拒绝摆烂(合影就不放大赛要求那个合照了,像是罚站一样)二、比赛历程和思路输入输出说明:输入是RGB的三通道数据;输出为类别。在确定完输入输出之后,首先按照惯例,进行一波baseline的复现。Baseline采用的是ResNet50。ResNet理解: 当深度学习网络层数越深时,理论上网络的表达能力会更强,但是CNN网络达到一定的深度后,再加深,分类性能不会提高,而是会导致网络收敛更缓慢,准确率也随着降低,即使把数据集增大,解决过拟合的问题,分类性能和准确度也不会提高,ResNet应运而生 。对于“随着网络加深,准确率下降”的问题,Resnet提供了两种选择方式,也就是identity mapping和residual mapping。分类结果正确率约为70%。后续优化思路也很清晰:1、基于数据的预处理和特征抽取;2、基于算法的优化。思路一:数据清洗:异常值处理 原始数据集中,部分图像被赋于了不正确的标签,例如以下两张图均为label=6.5的样本。当模型在训练集上充分拟合时,我们会获得较小的训练误差。但是,对于不可见的测试集模型的测试误差会增大。因而,标签错误数据将会成为噪声,干扰模型的训练。对于此类数据通过人工选取的方式进行剔除。思路二:数据增强图像随机地进行旋转;图像随机地进行水平翻转;图像随机地进行垂直翻转;调整图像的亮度,对比度和色调。目的:在不改变图像的尺寸与语义的前提下扩充图像样本,增强模型的泛化性能。思路三:改造数据集/TTA测试时数据增强(Test-Time Augmentation)数据增强是一种在模型训练期间通常使用的方法,它使用训练数据集中修改过的样本副本来扩展训练集。通常使用图像数据来执行数据增强,其中通过执行一些图像操作技术来创建训练数据集中的图像副本,例如缩放、翻转、移动等等。(transform/flip/rotation)思路四:模型的选择分别选用不同ResNet网络进行测试,根据奥卡姆剃刀原则,同时考虑到ResNet模型越复杂,越容易产生过拟合现象;最终选用ResNet 18;结果更新:89.96%。对于单一模型,初赛成绩为:0.8996(第七名);复赛成绩为:0.8432。引入TTA后,最终成绩为:0.8477(第五名) 。三、反思和感悟反思:比赛结束之后,最主要的遗憾是在发现数据处理和数据增强对于模型的准确率有巨大帮助之后,后期在尝试更多的模型的时候均为浅尝辄止,也并未模型融合的思想。感悟:比赛的初衷只是想丰富简历,抱着试试的态度,最后获得了大赛的第六名也是意料之外,欣喜若狂。最大的感慨在于:绝大多数情况下,我们所畏惧的就是恐惧本身,真刀真枪干的时候才发现很多困难并不是不可逾越的大山。BTW:感谢大赛组委员,比赛全过程公正公平公开,让每一位参赛人员都可以享受其中。同时感谢每一位工作人员,大家都很善解人意且认真。
-
成员介绍本次比赛我们的队长是 陈致远,队员是陈毅铧、俸萍、陈震海,指导老师是唐振军老师。我们都来自广西师范大学计算机科学与工程学院, 主要研究方向为深度学习,多媒体信息安全等。下面介绍我们团队的解决方案。一、赛题分析首先进入赛题分析,本次竞赛主要是针对钢铁金相图片进行评估定级,展示出来的图例,从左到右,从上到下依次是6.5到13.0,以0.5级为间隔,共14类数据的图片。我们可以清楚的看到金像图片整体质量较好,扰动较少。并且通过图例可知,分级的依据主要是根据晶界的疏密程度进行划分的。稠密的级别会高一些,稀疏的会低一些。因此针对这项赛事任务,可以看做是一种特殊的图像质量评价问题,金像图片是根据晶界的疏密程度进行分类,那么我们可以提取出金像图片的边缘特征,通过纹理的稠密程度进行分级。但这会存在一个问题:由于图像标签是离散值,也就是7.0这一类的图片存在有实际是6.8的,也可能有实际是7.3的,但他们都打了7.0的标签,所以无法得到精细分类结果。这项赛事任务也可以直接看做是图像分类问题,但由于类与类之间差距比较小,直接分类很容易出现类间混淆的情况。因此综上,我们采取的方案是通过质量评价网络进行粗分类调优数据集,然后再设计精细的评级网络进行分类。二、数据分析我们团队对训练集的数据做了分析,简单的将训练集数据分成了三类。即重复图片,难例图片和准确图片。我们通过图片的md5值将重复的图片鉴别出来,发现存在相同图片标注为不同类别的情况,并且在误差范围外。如:难例图片我们是以节点法为判断依据进行筛选的,也存在类别标注不准确的问题。因此存在问题的图片会对最终评级的精度造成干扰,需要纠正存在问题的图片,向评级网络送入高质量数据,提升精度。三、竞赛方案我们整体的竞赛方案分为两个阶段,在数据预处理阶段,我们将筛选出的重复图片和难例图片使用Scharr算子提取出边缘特征,送往我们CNN-Transformer级联融合的图像质量评价网络进行粗分类,根据结果对标注有误的图片进行纠正。纠正好数据后,通过浅层ResNet网络级联Vision Transformer网络构成的评级网络实现评级。使用质量评价网络粗调优的方式如下:有三张相同的图片,分别标注了6.5,7.0,8.5三个类别。我们将该图片使用Scharr提取出边缘信息送往我们的图像质量评价网络得到的预测类别为6.5 7.0,之后再辅以节点法进行判断,将标注为8.5的重复图片进行删除。同样的对难例图片一样处理对难例数据和重复数据纠正完全后,接下来就可以送往我们的评级网络进行评级。四、数据增强策略训练时数据增强情况如下:保持长宽比下采样后采取了亮度对比度变换,水平翻转,之后随机裁剪固定大小输入评级网络,经过我们实验验证,发现过于丰富的数据增强方式反而会带来不合理性。测试时数据增强情况如下:一样的保持长宽比下采样,然后将图片剪裁成5张(4个角和中心),最终评级结果取5次结果的平均。晶界评级对尺度变化的敏感性较高。因此测试时图集要保持和训练图集同一尺度,增强方式也要在训练增强方式的范围内。我们对输入模型的图片尺寸,优化器的选择,损失函数的选择做了实验。发现较大尺寸有利于提升模型性能。SGD+Momentum的选择有助于模型逃脱平稳区,使模型不易陷入局部极小值,泛化能力更好。使用了标签平滑的策略会提升模型泛化性能表现最好。此外,还可以做一些特殊的增强操作如数据扩充等。五、性能比较情况我们在竞赛期间也尝试了很多现有的模型,这是我们筛选出的一些比较有标志性的模型的性能对比情况,最后发现使用了级联融合的模型得到了最好的性能, 此外也发现,我们对图像集进行了预处理调整后也有提升。GXNU-HashLab2021/11/11
-
赛题任务赛题是基于显微镜成像的金相图片评估定级,要求对于金相图片给出离散的评级以及置信度,因此我们将此评级任务视为图像分类任务来完成。数据处理在训练和推理过程中,我们将图像统一缩放到800×640。在训练时随机从图像中裁剪出384×384的区域作为网络输入。而在测试时从图像的中心以及四个角落进行裁剪。这种数据处理方式主要是出于以下两点:在思考数据处理方式时,考虑到尺度变换会影响到晶粒的形状和大小,所以我们认为应该尽量保持图片的长宽比,并且对图像进行统一尺度的缩放。此外,我们还有一个非常矛盾的观点,就是一方面想让模型“看到”的区域尽可能大(给出预测所依据的区域越大,给出的预测就越有代表性),一方面又不想让模型“看到”的区域过大(因为模型固定了输入的尺寸,我们觉得对较大的的区域进行下采样会使图像丢失过多细节)但是在学习了其他参赛队伍的方案之后,我们意识到我们可能低估了神经网络的鲁棒性,应该对数据进行更大胆的缩放和增强。模型训练首先训练swin-window12-patch4-base-384,训练所用参数:随后训练DeiT-patch16-base-384对swin transformer进行蒸馏,使用参数为:初赛中蒸馏得到的DeiT相对于swin提升了1.34%评分。(在训练DeiT时,虽然DeiT的论文中在imagenet上的结果是hard distillation好于soft distillation,但是我们的实验中是soft distillation好于hard distillation)模型推理由于在数据处理时我们采取了折中的方式,因此我们使用测试时数据增强来增加预测结果对整张图片的代表性,既对图像中心和四个角落的裁剪图片分别预测得到x_{1}~x_{5}五个score,然后对x_{1}~x_{5}进行以下操作:在初赛中,测试时数据增强能为我们所有尝试过的模型带来1.5%左右的评分提升。总结数据清洗与数据增强十分重要,虽然在比赛过程中我们也尝试了对错误数据进行纠正以及进行数据增强,但是由于缺乏经验和方法,并没有得到比较好的效果。这次比赛使我们有机会学习大佬们对数据的理解以及处理方法,学习的收获对于我们来说也是参赛奖励,所以十分庆幸能有这次参赛机会。
-
成员介绍我们是来自广西大学电气工程学院的队伍,我们的指导老师是高放老师,主要研究方向是深度学习,图像处理,量子人工智能,队长为李雪涛,主要研究方向是深度学习和图像分类,其他两名成员分别是王家宝和孙晴艺,主要研究方向是深度学习、深度图像处理和3D位姿估计。一、赛题分析众所周知,钢铁是当代社会重要的结构性材料之一,而晶粒度级别是评价钢材性能的重要指标,传统晶粒度定级方法是通过人眼比对,或者通过计数等方式对其定级,但是当一张钢材截面中晶粒数量按指数级倍增时,依靠肉眼是无法对其进行判断的,所以有什么方法可以代替传统定级方法对钢铁进行又快又准的定级呢?我们的答案是深度学习,我们对基于CNN的模型进行了很多尝试,下表是所尝试的模型,这些模型精度表现残次不齐,经过比对之后,Densenet121以最少的参数量以及较高的分数表现最优,所以我们选择了Densenet121作为backbone进行后续优化二、数据分析通过观察原数据集,我们发现原数据集中存在许多脏数据,如果这种数据过多,会影响系统的鲁棒性,所以我们决定对数据进行清洗。2.1 数据清洗清洗原则是如果多个模型对训练集的某张图片均判断错误,则通过列表记录图片名称,再通过人工判断是否应该对该图片进行删除。2.2 数据扩增清洗过后由于样本数过小,我们对清洗后的数据进行了扩充,首先我们对原图进行裁剪,分别在四个角裁出四张640X640的图片,然后我们对序号为偶数的图片进行了水平翻转,对序号为奇数的图片进行了垂直翻转,再对翻转之后的图片进行同样的裁剪操作,这样进行扩充之后即保证了样本的多样性,也保证了数据集容量。2.3 数据处理结果这是官方数据、清洗后的数据以及清洗扩展后的数据分布,我们可以直观地看到扩充之后的数据集在数量上和多样性上都有提升。经过数据处理后,初赛分数实现了由0.835到0.855的提升三、模型设计这是我们所选的backbone densenet121的网络结构。他由四个dense模块串联组成,其中每个dense块中又分别以稠密连接进行连接,这种连接方式可以对图中特征进行保留,并且可以通过dropout对参数量级进行缩小,因此虽然模型连接很稠密,但是模型参数量却很小。在此基础上我们引进了自适应权重通道注意力机制AWCA模块,和上下文注意力机制PSNL模块虽然说Attention is all your need!但是每当我们处理一个事情之前都需要考虑这三个问题,就是:WHY?HOW?WHAT?为什么做,怎么做,有什么效果。3.1 Why AWCA and PSNL?首先第一个问题,为什么要加入AWCA注意力机制,是因为注意力机制可以让机器有目的性地去学习与目标任务相关的图像信息,这些是经过AWCA处理之后的可视化图片,这里有128个通道的特征图,我们挑出了两张权重值相差较大的图片进行对比,可以看到权重值较大的图片可能会更多地去关注晶粒的面积信息。这是经过PSNL的特征图,可以看到经过上下文注意力机制后的特征图可能更多的会去关注晶粒的边缘信息。3.2 How AWCA and PSNL Work?AWCA具体的工作原理是,通过对原图进行维度变换,平面拉伸,正则化,点乘等操作计算出一个自适应权重对每个通道赋予权重,如图所示,输出图片的特征图可能在某个通道的权重值会比较高。PSNL模块首先会将图片分为四个大小相同的图像块,再对每个图像块进行变形,转置,叉乘,最后与原始图片进行相加操作。此操作可以将相隔较远的信息进行融合,实现空间加权操作以得到更强的特征表示。3.3 What can them do?最后,通过加入这两个注意力模块后,初赛得分从0.855提升至0.8793.4 其他的提分策略3.4.1 优化图片预处理其他提分的策略包括对图片预处理的优化,baseline中预处理步骤是先随机裁剪成任意大小,再统一缩放成224X224。这会损失很多图像信息。我们更改后的训练前的图片预处理是直接将整个图片缩小成640x797,再裁剪成640x640,最大程度保留了全图的信息。经过此操作后,初赛分数由0.879提升至0.881.3.4.2 优化预测结果此外,我们通过投票机制优化了预测结果,首先我们让模型对同一张图片进行五次预测,再对预测的出的结果进行投票选出重复次数最多的预测结果,此操作后,初赛分数由0.881提升至0.884.四、总结与展望总结针对数据进行数据清洗与扩充,增加了模型鲁棒性提出DenseNet121与通道级注意力机制、全文注意力机制结合的连接模型优化对图片的预处理,最大程度保留原图特征基于pytorch实现端到端训练,模型简洁,易复现模型容量小,参数量少(71M)展望潜力大,可通过优化模型结构对性能继续提升可对模型进行量化与剪枝,在保证精度的同时进一步提升模型速度可落地形成产品,并且在落地场景中增加反馈机制,对模型进行在线训练,可不断优化模型参数可利用多模态学习方法对模型进行优化撰写人:李雪涛2021/11/13
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签