• [参赛经验分享] 2020中国高校计算机大赛·华为云大数据挑战赛-周周星分享(第一期)
    一、周周星分享——什么都做不队大家好,我们是“什么都做不队”团队,很荣幸获得了本次的周周星。下面是本次的分享:1. 复赛的数据是更加复杂,我们在尝试的时候发现去重这个操作对数据的影响还是挺大的,针对不同的特征进行去重操作后 对最后的得分影响非常高,关于这一点我们初步认为大量塞港数据或者疫情影响数据导致。比如在测试集中LR运单号,我们尝试在匹配相似路径,最后发现部分属于2020的相似路径大部分出现一个情况: 到港口前开始停顿不动。 这可能是疫情原因导致的 也可能是塞港行为。我们认为上分的关键就是来处理这种异常运单号(可能会过拟合测试集)2. 特征选择:大家可以考虑使用少量特征,这个复赛数据有一个问题就是把初赛中某些强特带入能反向上分,可以尽量使用一些泛化能力强的特征。3. 模型方面 调参对模型的影响还是很大的,可以进一步参数通过调参上分。4. 接下来我们尝试去使用xgboost,ctb等其他模型看看是否会有提升效果,模型应该还是需要多多尝试。以上就是我们团队的分享 最后祝大家上分!二、周周星分享——智能集美大家好,我们是“智能集美”团队。首先感谢前几周的周周星的分享,下面是我们的一些思路心得。    1、数据清洗  A榜还有一周就要结束了,数据清洗的重要性我想大家都也明白。  初赛洗数据的方法已经不完全适用,所以我们除了保留了初赛部分简单的洗数据方法(如去除速度方向异常的gps记录),更多的采用的是画图找异常运单号的方式。通过先将各个运单号的航线画出来,找到可能为异常数据的运单号,再通提取这些异常数据的运单号数据,通过观察数据来判断是否进行删除。(在观察航线图的时候,还可以通过观察同一路由的其它运单号进行横向比对)  2、特征工程  特征工程是一个比较玄学的东西,大家可以尝试增删特征,找对比较合适的特征搭配。(我也在找…)  3、模型选择     LGB,永远滴神。参数还是有一定的影响的,在实在没有其它思路的时候可以考虑调参。  4、塞港问题  塞港显然是一个对结果影响很大的因素,但我们目前也没有什么很好的解决方案,毕竟有的船才刚刚走了百分之十到二十的路程,实在不知道怎么判断它有没有塞港。  我们接下来会特别关注一下经常塞港的路由,试图寻找到一些规律,同时我们接下来还会考虑疫情对于航线的影响,最后祝大家都能够取得好成绩。三、周周星分享--突然Ping通大家好,我们是“突然Ping通”团队,很高兴获得本次比赛的最后一周周周星,首先感谢前两周周周星的分享,让我们也有机会获得周周星。简要分享一下我们的思路:1、我们数据处理方式和初赛差不多,不过在初赛的基础上加了一步处理塞港状态的代码,根据之前官方人员提示经纬度在误差0.25之内可算到港,距离大概在30-40千米左右,所以我们对一些塞港的和到港又开走的数据进行了截断,就我们的方案在本地而言清洗完这类数据效果更好。由于测试集存在一些“离谱”的数据,比如FA订单,这些数据模型不能预测,所以我们对这类订单进行了后处理。2、特征工程一开始使用初赛的方案,但是效果不好,删除几个强特反而能够上分,所以大家可以尝试用少量特征调试。3、看到上周有周周星分享调参能上分,我们这周也用调参工具尝试调参,确实能上不少分,所以大家也可以尝试换换祖传参数,上一波分。大赛赛题:https://competition.huaweicloud.com/information/1000037843/introduction
  • [参赛经验分享] 【开发者高校青年班】华为云开发者AI青年班黑客松大赛——参赛方案和总结
    比赛简介共十类美食,总计5000张图片,包含中餐、西餐、甜点、粥类,每张图像中美食所占比例大于3/4,数据分布均衡,自由划分训练集和验证集比例,本方案采取9:1的比例进行划分,项目最终以识别准确率作为评价指标,本方案使用单模型,在ModelArts上测试集的acc为0.978训练策略数据方面数据集划分采用9:1的比例将数据集划分为训练集和验证集,并将数据打乱(实际影响不大)数据增强采用简单的数据增强方案,包括图像的翻转,仿射变化及标准化这里的size选用的是224(听说太小了)train_transformer_ImageNet=transforms.Compose([ transforms.Resize((size,size)), transforms.RandomHorizontalFlip(), transforms.RandomAffine(degrees=5, translate=(0.05, 0.05), scale=(0.95, 1.05)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ])模型方面模型的选择baseLine选用的是Resnet模型,本着一切从简的原则(其实就是懒),分别试了Resnet18,ResNet34,ResNet101,ResNet152,还是ResNet152的acc较高,所以预训练模型选用的是ResNet152模型的训练策略方面采用了标签平滑,个人感觉差别也不大def reduce_loss(loss, reduction='mean'): return loss.mean() if reduction == 'mean' else loss.sum() if reduction == 'sum' else loss def lin_comb(a, b, epsilon): return epsilon * a + b * (1 - epsilon) class LabelSmoothingCrossEntropy(nn.Module): def __init__(self, epsilon: float = 0.1, reduction='mean'): super().__init__() self.epsilon, self.reduction = epsilon, reduction def forward(self, output, target): c = output.size()[-1] log_preds = F.log_softmax(output, dim=-1) loss = reduce_loss(-log_preds.sum(dim=-1), self.reduction) nll = F.nll_loss(log_preds, target, reduction=self.reduction) return lin_comb(loss / c, nll, self.epsilon)学习率调整,使用ReduceLROnPlateau学习调度器,如果三个epoch准确率没有提升,则减少学习率exp_lr_scheduler = lr_scheduler.ReduceLROnPlateau(optimizer_ft,mode='max',patience=3,verbose=True)模型性能验证集上的acc为0.974,提交到ModelArts上为0.978比赛总结这次的比赛对我来说收获挺大的,有些东西真是在学校里边体会不到的,还得多实践,同时也认识到了不同地区的小伙伴,寒假快要结束了,又是新的学期啊,可能只有短短一个多月?我们都加油,祝大家始终保持心里有火,眼里有光的状态!
  • [参赛经验分享] 2019华为云大赛冠军说
    视频观看链接:https://bbs.huaweicloud.com/videos/1018552019年,越来越多的行业都将业务放上了“云端”。大势所趋的背后,不只是AI、云计算、大数据等新兴技术的崛起,也是各种各样应用场景的智能化激活和渗透。凭借自身深厚的技术积累与实践,华为云不断深入行业场景,以AI开发为切口,让技术赋能千行百业。2019年,华为云举行了一系列开发者大赛,为开发者提供展示自我的舞台,助力企业与优秀人才、前沿科技的对接,让“高深莫测”的技术更加落地,让云上世界更加智能。No.1数字中国创新大赛:文化传承-汉字书法多场景识别赛2019年1月,华为云以“文化传承-汉字书法识别场景”为赛题,通过人工智能算法实现书法文字的自动识别,解决实际场景中有些书法文字难以识别的问题,传承中国千年文化。赛事共有1071赛队的1203名选手报名,最终破晓、银月之晶、Gtai三支团队获得前三名。冠军团队破晓,赢得最高8万元大奖,并获得华为云AI实验室的实习机会,以及华为云面试绿色通道资格。比赛过程中,华为云为参赛选手们提供了华为云ModelArts一站式AI开发与管理平台和华为云OCR(文字识别服务)技术支持。其中,华为云OCR凭借识别精度高、服务稳定、支持复杂场景、简单易用等优势,现今已被广泛应用于物流、医疗、金融等行业。No2华为云人工智能大赛•无人车挑战杯7月1日,“华为云人工智能大赛•无人车挑战杯”开始报名。通过本项赛事,华为云全面锻炼和提高了赛队的AI解决方案能力及无人驾驶编程技巧的赛事。作为整场赛事的技术支撑,华为云ModelArts一站式AI开发与管理平台及端云协同AI开发应用平台HiLens让参赛开发者们轻松地进行了模型开发与部署。具体而言,在识别红绿灯的问题上,无人车可在上路前通过华为云HiLens Kit采集交通灯照片,然后在ModelArts上进行图片数据集的标注并生成标注数据,轻松过灯。No3华为云鲲鹏开发者大赛7月23日,“2019华为云鲲鹏开发者大赛”开赛,选手基于华为云自研的鲲鹏云服务器,进行主题为“化鲲为鹏”的游戏策略开发。大赛吸引了来自北京大学、浙江大学、哈尔滨工业大学等全国374所高校的学生,以及50个来自不同行业的开发者共1200多位选手参赛。而华为云鲲鹏开发者大赛的最大亮点就是在于华为云为参赛选手们提供最新的华为云鲲鹏云服务器。基于鲲鹏处理器对云原生软件随时随地的部署,华为云鲲鹏云服务可以帮助开发者在大数据、分布式存储、ARM原生应用等诸多应用开发场景中游刃有余,为其提供从芯片到服务器到云平台的全栈自主创新能力,帮助开发者轻松应对多云计算的挑战。No4华为云人工智能大赛·垃圾分类挑战杯于7月30日启动“华为云人工智能大赛·垃圾分类挑战杯”致力于运用AI赋能垃圾分类,减轻城市居民在垃圾分类方面产生的困扰。截至比赛结束,有2600多位社会各界开发者参赛。比赛中,华为云为选手提供ModelArts、算力云资源、数据集等。ModelArts以全流程的极简和自动化升级已有的传统AI开发模式,让数据准备、算法开发、模型训练、模型管理、模型推理全链条产生质的飞越。值得一提的是,华为云ModelArts不仅仅应用于垃圾分类,还可适用于建筑、互联网、医疗等诸多行业场景。华为云历来重视用技术使能开发者,不仅发布了ModelArts、HiLens、华为云鲲鹏云服务、OCR等众多解决方案及工具,帮助开发者驰骋开发界,还在2019华为全联接大会上,发布了沃土计划2.0,宣布未来五年将投入15亿美元,帮助全球开发者基于华为开源开放的产品和服务进行技术与商业创新。依托华为30年的技术积淀,华为云正在努力构建完善的开发者生态,以促进每一位加入华为云生态的开发者,不仅能获得技术支持,还能找到同伴、发现商机,将梦想从不可能变可能。如果说云计算改变了中国各行各业的发展历程,那么可以说,华为云正让每一位开发者参与到这一历史进程当中。
  • [参赛经验分享] 【华为云智能校园应用创新大赛】校园数字化的改善措施
    大赛详情地址:https://competition.huaweicloud.com/information/1000041320/introduction华为云账号:gogosuccess正文内容:随着大数据人工智能时代的到来,在我们的生活中仍有很多生活方式,因为没有数字化而引来了一些不便利,作为学生,学校犹如我们的家。在这里让我们感受到的不便利主要是学习和生活的未数字化造成的。首先在学习方面,我经常往返图书馆让我感到不变的首先是身份验证,每当入馆,我们先要打开微信,找到公众号进行入馆预约,并且每次都要重新输密码,验证码。输完后才能刷卡进入图书馆,然后在进行排队在机器上座位预约签到,除此之外,图书馆可能有的人一个人占两个座位,水龙头未关闭,借书需要电脑检索在自己去寻找等等。面对这些情形,如何解决呢。1. 入馆时,我们可以进行人脸与学生证上的图片进行识别核对,并在每个入馆的关卡外设置红外线测温仪器,入馆后才可以在公众号上进行预约并扫脸签到。这3件事可以有效地防止“占座”现象,体温异常现象,以及因为网络拥堵导致网站崩溃的现象发生。2. 在馆中,可以将水龙头换成红外线水龙头,这样可以较为有效的避免水源浪费以及水龙头的损坏。3. 借书时,可以运用自动借还书柜,一来可以减少工作人员的工作量,二来方便寻找。其次在做实验时,经常遇到仪器损坏导致实验无法完成,建议运用数字化平台进行模拟实验,这样既可以减少仪器损坏也可以让学生在课后多加练习。最后便是生活方面,主要有点餐,疫情拿快递需要出校门并且需要验证,宿舍充电费需要去食堂,无法找到具体的共享单车等现象。1. 由于冬天来临,天气较为寒冷,饭菜容易凉,食堂可以采用保温饭菜器代替传统的热水热气保温的方式,第二冬天上课时间表缩短,导致中午时间减少大半,然而每次放学都会排很长的队,导致中午无法缓解疲劳,建议使用扫码点餐,机器人送餐。2.在这个交通便利的时代,快递成为了我们生命中不可或缺的一部分。由于特殊情况,我们拿快递需要请假,然后出校门要给门卫看,进门要证明是学校的学生并且量体温。这一系列操作十分繁琐,可以在校内采用智能快递柜,由快递人员将消毒过的快递产品,放入快递柜中,这样既可以避免一系列事情发生,又可以通过效率。3.共享单车在学校内经常乱停乱放,因此有时不容易寻找,也不易出行,既增加了工作人员的工作量,也耽误了需要出行人的时间。如何解决呢?首先可以使用一个专门在校园内借还车app,此app有一系列的功效,必须在固定的停车点,才能还车,并且可以显示车辆数目和定位。除此之外,对于每次遵守规则的人提高借车成功率,反之降低。4.最后便是宿舍充电,有时会出现半夜停电因为电费不足,而充电费必须去食堂,此时宿管人员已经关门,碰上夏天只能热一晚上,甚至有时会出现食堂的缴费机器都坏了。为解决这一问题,我认为可以让移动支付平台与学校平台对接,这样就随时随地交电费了,并可以减少一些不必要的麻烦。
  • [参赛经验分享] 解锁华为云AI如何助力无人车飞驰“新姿势”,大赛冠军有话说
    在2020年第二届华为云人工智能大赛•无人车挑战杯赛道中,“华中科技大学无人车一队”借助华为云一站式AI开发与管理平台ModelArts及HiLens端云协同AI开发应用平台,进行无人车模型开发与部署,最终夺冠,获得20万奖励(10万现金+10万代金券)。战队撰文分享其参赛体验,包括无人车比赛的整体方案,多维数据处理及行驶控制的能力等。 1.   比赛背景第二届华为云无人车挑战杯大赛,相比第一届大赛,难度更大,赛道环境更加接近真实的道路。在比赛中,无人车需要从发车区出发,通过车道线循迹沿“8”字形赛道在不能压线和触碰挡板的条件下行走一周半后,准确地停入到停车区。在小车行驶期间,需要完成交通信号灯识别、斑马线识别、机器人动态避障、挡板区循迹、限速/解限速标志识别、精准停车等任务。无人车不仅需要完美无误地完成所有的任务,在速度上也有要求,在总决赛中,无人车需要在70s内完成所有任务,时间加分项才能为满分。在比赛中,华为云ModelArts一站式AI开发与管理平台,给参赛选手提供全流程的AI模型开发环境,助力参赛选手高效地完成检测任务中模型的训练,HiLens端云协同AI开发应用平台帮助参赛选手快速地完成模型在端侧设备上的部署和加速。华为云无人车挑战杯在由上海交大学生创新中心智能制造实验室自主研发的无人车的基础上,结合华为云人工智能平台,全面锻炼和提高赛队的AI解决方案能力及无人驾驶编程技巧。图1‑1 华中科技大学无人车一队的后浪图1‑2 华为云无车人挑战赛总决赛现场2.   整体方案无人车比赛整体解决方案如图2‑1所示,比赛主要分为三个部分,ModelArts做模型的在线训练,HiLens Kit做模型的部署,无人车上工控机的通过ROS将各个节点整合到一起,做无人车底盘的决策和控制。通过华为云ModelArts一站式AI开发与管理平台完成数据标注、模型训练、模型转换等工作,得到可供HiLens Kit前向推理的卷积神经网络的模型。HiLens Kit通过自带的相机采集图像,通过技能部署进行模型的前向推理和加速,HiLens Kit搭载着高性能的华为人工智能芯片昇腾310,针对卷积神经网络进行了优化,在模型的前向推理过程中可发挥出强大的算力。HiLens Kit完成红绿灯、限速/解限速标志识别、斑马线的目标检测识别,通过Socket通信,将检测结果传给无人车上的工控机。无人车上工控机处理激光雷达的点云数据,做Slam建图和运行中的实时定位,工控机处理USB摄像头的采集的车道线数据,做车道线的识别,再通过ROS将所有节点信息做整合,做底盘电机和舵机的决策控制。3.   ModelArts模型训练ModelArts是面向AI开发者的一站式开发平台,包含数据处理、模型训练、模型管理、模型部署等操作,并且提供AI市场功能,能够在市场内与其他开发者分享模型,其功能总览如图3‑1所示。在比赛中,我们通过ModelArts平台完成了数据标注、模型训练和模型在线转换等工作,并且通过ModelArts做模型的线上部署,检验模型的精度效果。3.1.  任务分析本次大赛涉及6类目标的检测识别:红灯、绿灯、黄灯、限速标志牌、解限速标志牌、斑马线,如图3‑2所示。无人车在运行过程中,对目标采集的图像涉及不同的视角和距离,而且比赛场地光强未知,所以对于目标检测任务,要充分考虑到目标不同视角的刚体形变、不同距离的尺度变化、不同环境光强的变化以及无人车运行中的运动模糊。无人车根据检测的结果做出相应决策和控制,对目标检测的精度要求很高,一但误检或漏检,小车的控制就会出错,而且小车在赛道上快速运行,所以对目标检测的速度也要求较高,一但小车看见目标,需要快速输出检测结果。3.1.  数据标注数据标注采用ModelArts中的数据管理功能,进入ModelArts平台的数据标注模块,创建数据集,选择物体检测,添加标签集。既可以选择手动标注,也可以在手动标注一部分后选择智能标注,最终再修改确认智能标注。当数据集较大的时候,智能标注可以有效降低数据集标注的工作量。通过创建标注团队,将数据集分配给团队队员,团队合作加快数据集标注速度。3.3.  数据增强我们模型训练的数据集大部来自HiLens Kit拍摄的不同环境下的视频序列,数据集中图像的重复比例较大,有必要将重复的图像做一些删除,对数据集做数据增强实现数据扩增,解决由于图像数据量较少带来的模型过拟合的问题。在比赛中,我们参考2018年的论文《Albumentations: fast and flexible image augmentations》开源的代码做数据集的扩充,开源代码网址:https://github.com/albumentations-team/albumentations。该项目对于数据的扩充采用颜色空间变换、模糊、亮度调整、黑白、压缩、随机噪声等30余中数据扩充办法。由于我们比赛中要识别的对象,颜色是很重要的一个特征,例如:红灯、黄灯、绿灯三种灯的颜色,限速标识的红色和解限速标识的黑色,颜色变化相关的数据扩充,会造成数据颜色特征的丢失。红灯、黄灯、绿灯三种灯分别在左、中、右三个位置,交通灯亮的位置,也是区分三种灯的很重要的特征。所以对数据集的扩充,去掉了色彩变换和水平翻转的数据扩充办法。数据扩充采用扩充方法级联的方式,如图3‑4所示,更大程度上,减小数据之间的相似性,增加图像数据的多样性,数据增强的效果如图3‑5所示。3.4.  模型训练通过数据增强,减小了数据之间的相似性,增加了数据多样性,最终选用了6031张图像数据做模型训练。模型训练我们选用的是华为云AI市场里面基于TensorFlow框架的YOLOv3_Darknet53的网络。在训练时,采用COCO数据集上的预训练模型,训练完后,通过模型转换功能将TensorFlow的PB模型转换成Ascend类型,以支持在HiLens Kit的Ascend 310 AI芯片上做模型推理。YOLOv3是典型的一阶段的目标检测网络,图像输入为416*416条件下,COCO数据集上测试的mAP的分数为31.0,模型转换后在Ascend-310推理速度:17.8ms/pic,是目前速度和精度最为均衡的目标检测网络之一,其网络结构如图3‑6所示。YOLOv3采用Darknet53作为backbone,Darknet53大量使用类似于ResNet的残差跳层连接,从而可以加深网络的深度,特征提取可以提取出更高层的语义特征,并且为了降低池化带来的梯度负面效果,作者直接摒弃了pooling,用conv的stride来实现降采样,在这个网络结构中,使用的是步长为2的卷积来进行降采样。YOLO v3中采用类似FPN的上采样和特征融合的做法,在多尺度的特征图上做检测,大大加强了对小目标检测的精确度。YOLOv3采用固定anchor对目标的位置做预测,图3‑6中输出的y1、y2、y3分别对应着32倍、16倍和8倍图像采样结果,32倍降采样的感受野最大,适合检测大的目标,所以在输入为416×416时,每个cell的三个anchor box为(116 , 90)、 (156 , 198)、 (373 , 326)。16倍适合一般大小的物体,anchor box为(30 , 61)、(62 , 45)、 (59 , 119)。8倍的感受野最小,适合检测小目标,因此anchor box为(10 , 13)、(16 , 30)、(33 , 23)。y1、y2、y3中每个cell回归边界框预测4个坐标,tx , ty , tw ,th。如果目标cell距离图像左上角的距离是(cx ,cy),且它对应边界框的宽和高为pw , ph ,如图3‑7所示,那么网络的预测值为:在ModelArts中做模型训练和调优参数相关设置如图3‑8所示,使用ModelArts中可视化工具做训练过程可视化结果如图3‑9所示。模型训练完成后,通过在线的模型转换工具,转换为.om的模型,以供在HiLens Kit上做推理。4.   HiLens技能开发和模型部署华为HiLens为端云协同多模态AI开发应用平台,提供简单易用的开发框架、开箱即用的开发环境、丰富的AI技能市场和云上管理平台。HiLens Framework封装了丰富的视频分虚算法基础组件,如图像预处理、模型推理等,开发者只需少量代码即可开发自己的技能。HiLens Studio提供在线的开发环境,可以方便的在线编写和调试技能代码。管理控制台提供模型管理、技能开发等功能,供用户在云侧管理模型和技能,一键安装技能到端侧设备。在比赛中,我们使用HiLens Kit端侧设备做模型推理,线上开发好的技能可以一键部署到HiLens Kit上。4.1.  检测任务的Skill开发如图4‑2所示在本次无人车比赛中,我们团队开发了3个Skill,get_pic是用HiLens Kit采集图像数据并通过socket通信传给主机,做数据集采集使用;yolo-v3-v1-test是用来在测试模型的精度效果,不加与工控机通信代码;uac-yolov3-v1是在无人车实际行驶时的技能,在比赛中采集图像进行模型推理并与工控机通信。在做检测任务的技能开发,我们首先利用HiLens Studio的开发环境和HiLens Framework,在线做模型前向推理的测试,HiLens Studio开发环境如图4‑4所示,代码流程如图4‑3所示,先初始化HiLens、摄像头和加载模型,接着进入一个循环,读取摄像头采集的图像,做数据预处理,HiLens读取摄像头的图像为YUV格式,需要转为RGB格式,以及将图像resize为(416,416),以便做模型推理。模型推理通过调用HiLens Framework封装好的API,做模型前向推理的计算。由于Ascend310不支持模型后处理的计算,所以这一部分需要通过软件来做,后处理主要包括,从模型输出的特征矩阵中解码出检测框的位置、类别、置信度等信息、NMS筛选检测框等,最后输出结果。在结果后处理阶段,我们也加入了一些小技巧,以提高检测任务的准确率:l  对于6类目标我们分别采用不同的置信度阈值做筛选,交通灯和斑马线需要在较远的距离就识别到,置信度阈值我们设置为0.5,而限速/解限速,为确保检测正确性,置信度设置为0.9。l  对于红绿灯和限速/解限速,通过计算目标框中图像的红色分量值,来纠正检测的错误,例如,但检测到红灯,必须红色分量值大于0.15,才认为正确,否则视为错误。对于检测到绿灯或黄灯,必须红色分量小于0.1,才认为正确。l  同理,对于斑马线的检测,将目标框图像二值化,白色像素占比大于0.3,才认为检测正确。最终,我们在HiLens Studio对决赛现场的图像做测试,测试了700张图像,只有23张图像检测错误,目标漏检的也很少,而且都是在角度很偏的时候,漏检率在5%以内。在HiLens Studio技能代码做完了测试之后,在“技能管理”里面,创建一个新的技能,导入在HiLens Studio里面的代码,加入与工控机通信的部分,就完成了检测任务加上通信的技能开发,然后将技能在线安装到端侧设备HiLens Kit上。下一次HiLens Kit启动后,就会自动启动技能。4.2.  HiLens的通信在无人车比赛中,HiLens Kit通过网口采用Socket通信与工控机或PC机进行通信,Socket网络通信框架如图4‑5所示,Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。Socket通信分为基于TCP和基于UDP两种。TCP协议是基于连接的协议,需要先建立可靠的连接,而UDP不需要事先建立可靠的链接,而是直接把数据包发送出去,是不稳定的连接。在图像数据集采集时,通过Socket通信传输视频数据,数据量大且不必要求每一个数据包都准确接收,我们采用Socket UDP通信,传输视频数据。在HiLens Kit做目标检测任务时,客户端数据少又需要稳定可靠的传输,所以我们采用基于TCP协议的Socket通信,基于TCP协议的Socket通信如图4‑6所示。5.   ROS无人车决策控制无人车上由车上的工控机完成各项数据的处理和融合,进行无人车的决策控制。通过处理激光雷达的点云数据,做Slam建图和运行中的实时定位以及挡板区的循迹,处理USB摄像头的采集的车道线数据,做车道线的识别,通过Socket通信接收来自HiLens kit的目标检测的结果。如图5‑1所示,无人车的控制方案主要包括:车道线循迹、挡板去循迹、斑马线停车及避障、限速和解像素、发车和停车、建图和定位,通过ROS整合各个节点的消息,将多种数据进行多模态融合,进行无人车控制状态机的切换,给驱动控制发送不同的速度和方向指令,驱动控制将速度和方向信息转为无人车底盘的电机速度和舵机打角指令,通过串口发送给无人车驱动,最终实现无人车完美高效地完成整个比赛任务。5.1.  车道线识别在本次比赛中,车道线的识别也是本次比赛的一个难点,无人车上USB camera的位置低、视角窄导致大部分时间只能看到单线,再加上工控机的性能较弱,对图像相关处理速度较慢。对于车道线识别,我们没有采用比赛方提供的例程,而是从实际驾车思路出发,想办法得到道路的中线,通过中线推算偏差。车道线识别的流程如图5‑2所示,首先将图像二值化,通过膨胀与腐蚀,将车道线线条的断裂给补上,小车在运行中,车道线总是会交与图像的左、右、下三条边,所以在这三条边上搜索车道线基本点,根据搜索到的基本点搜索边线。由于摄像头固定,采用提前标定好的透视变换矩阵将图像变换到俯视图。由于在搜索车道线基本点可能会搜索到多个,例如图5‑3搜索到3个基本点,从而会搜到多个边线,所以需要对边线进行筛选,提取车道线。将车道线做一次拟合,由于道路宽度固定,所以可以通过拟合的车道线计算出中线。根据中线的计算结果,即可求解偏差。在图像计算中,通过采用python的numpy矩阵操作代替大量python低速循环进行计算加速,精简计算流程,(640,480)的图像在工控机计算帧率平均可达到46fps。5.2.  激光雷达挡板区循迹与无人车定位无人车上的激光雷达传感器可扫描到无人车周围360度的障碍物的信息,可以用来做挡板区的循迹和无人车的实时定位。雷达数据的可视化展示如图5‑4(a)所示,雷达的点云数据组成了无人车行驶的车道,可采用和车道线相似的处理办法,采用搜索雷达右半部分0-75度的范围,拟合右边线,从而计算中线,求取偏差。具体处理过程可参考车道线处理方案,此处不再赘述。无人车Slam建图和定位的方案,现已经很成熟, GitHub、GitLab等开源平台也有很多非常棒的基于ROS的激光Slam项目和定位方案,我们采用开源的rf2o将激光雷达数据转为里程计信息,通过AMCL做定位,采用Gmapping建图,ROS开源社区(http://wiki.ros.org)都有详细的介绍,此处不再赘述。5.3.  多模态融合的无人车决策控制在HiLen Kit部署的技能,尽管采用一些技巧提升了图像的识别准确率,但也并非百分百准确。无人车在行驶过程中,存在运动模糊、未知光源干扰、反光灯等问题,尽管制作数据集考虑了此类情况,但是还是会有影响。我们采用了数字滤波中常用的的窗口滤波处理来做图像信息的后端处理。l  采用长度为k的定长队列做为观察窗口l  选取k个元素中出现最多类别作为当前阶段预测类别在小车行驶过程中,将ROS节点的各个信息,做多模态融合,实现无人车不同状态下切换,如图5‑6所示,无人车完成起步、斑马线停车避障、挡板区循迹、限速/解限速、精准停车等任务。6.   联合使用ModelArts和HiLens体验在此次华为云无人车大赛中,联合使用ModelArts和 HiLens,这全流程的解决方案对项目的完成提供了高质量的服务。ModelArts提供全流程的AI开发平台,数据管理、模型训练、在线部署,都方便高效;HiLens提供了端云协同的AI开发平台,大大降低了嵌入式平台开发门槛,实现模型高效快捷的端侧部署。我们在使用华为云的全栈式解决方案之前,也接触过一些其他的AI解决方案,但是无论是云还是端都没有华为云ModelArts和HiLens的联合使用便捷高效。其便捷高效主要体现在以下几个方面:(1)数据管理平台支持数据上传、存储、标注、处理一体化服务;(2)ModelArts提供了各种配置好的开发环境,支持各种深度学习框架的开发;(3)ModelArts的AI市场提供了丰富的网络模型,提高开发者开发效率;(4)ModelArts支持模型在线部署和测试,可提供网络接口供物联网设备实现云端协同;(5)HiLens的HiLens Framework,丰富的API解决了驱动和图像接入问题,自带媒体数据处理库,支持各种自定义操作;(6)HiLens Studio开发环境可在不需要硬件的条件下,做模型的测试和代码的调试;(7)HiLens技能管理平台可对技能直接做在线的部署和切换,方便、快捷。(8)HiLens的技能市场,提供了丰富的开发好的技能,开发者可以站在巨人的肩膀上做开发,提高开发效率。
  • [参赛经验分享] 2019华为云大赛冠军说
    视频观看链接:https://bbs.huaweicloud.com/videos/1018552019年,越来越多的行业都将业务放上了“云端”。大势所趋的背后,不只是AI、云计算、大数据等新兴技术的崛起,也是各种各样应用场景的智能化激活和渗透。凭借自身深厚的技术积累与实践,华为云不断深入行业场景,以AI开发为切口,让技术赋能千行百业。2019年,华为云举行了一系列开发者大赛,为开发者提供展示自我的舞台,助力企业与优秀人才、前沿科技的对接,让“高深莫测”的技术更加落地,让云上世界更加智能。No.1数字中国创新大赛:文化传承-汉字书法多场景识别赛2019年1月,华为云以“文化传承-汉字书法识别场景”为赛题,通过人工智能算法实现书法文字的自动识别,解决实际场景中有些书法文字难以识别的问题,传承中国千年文化。赛事共有1071赛队的1203名选手报名,最终破晓、银月之晶、Gtai三支团队获得前三名。冠军团队破晓,赢得最高8万元大奖,并获得华为云AI实验室的实习机会,以及华为云面试绿色通道资格。比赛过程中,华为云为参赛选手们提供了华为云ModelArts一站式AI开发与管理平台和华为云OCR(文字识别服务)技术支持。其中,华为云OCR凭借识别精度高、服务稳定、支持复杂场景、简单易用等优势,现今已被广泛应用于物流、医疗、金融等行业。No2华为云人工智能大赛•无人车挑战杯7月1日,“华为云人工智能大赛•无人车挑战杯”开始报名。通过本项赛事,华为云全面锻炼和提高了赛队的AI解决方案能力及无人驾驶编程技巧的赛事。作为整场赛事的技术支撑,华为云ModelArts一站式AI开发与管理平台及端云协同AI开发应用平台HiLens让参赛开发者们轻松地进行了模型开发与部署。具体而言,在识别红绿灯的问题上,无人车可在上路前通过华为云HiLens Kit采集交通灯照片,然后在ModelArts上进行图片数据集的标注并生成标注数据,轻松过灯。No3华为云鲲鹏开发者大赛7月23日,“2019华为云鲲鹏开发者大赛”开赛,选手基于华为云自研的鲲鹏云服务器,进行主题为“化鲲为鹏”的游戏策略开发。大赛吸引了来自北京大学、浙江大学、哈尔滨工业大学等全国374所高校的学生,以及50个来自不同行业的开发者共1200多位选手参赛。而华为云鲲鹏开发者大赛的最大亮点就是在于华为云为参赛选手们提供最新的华为云鲲鹏云服务器。基于鲲鹏处理器对云原生软件随时随地的部署,华为云鲲鹏云服务可以帮助开发者在大数据、分布式存储、ARM原生应用等诸多应用开发场景中游刃有余,为其提供从芯片到服务器到云平台的全栈自主创新能力,帮助开发者轻松应对多云计算的挑战。No4华为云人工智能大赛·垃圾分类挑战杯于7月30日启动“华为云人工智能大赛·垃圾分类挑战杯”致力于运用AI赋能垃圾分类,减轻城市居民在垃圾分类方面产生的困扰。截至比赛结束,有2600多位社会各界开发者参赛。比赛中,华为云为选手提供ModelArts、算力云资源、数据集等。ModelArts以全流程的极简和自动化升级已有的传统AI开发模式,让数据准备、算法开发、模型训练、模型管理、模型推理全链条产生质的飞越。值得一提的是,华为云ModelArts不仅仅应用于垃圾分类,还可适用于建筑、互联网、医疗等诸多行业场景。华为云历来重视用技术使能开发者,不仅发布了ModelArts、HiLens、华为云鲲鹏云服务、OCR等众多解决方案及工具,帮助开发者驰骋开发界,还在2019华为全联接大会上,发布了沃土计划2.0,宣布未来五年将投入15亿美元,帮助全球开发者基于华为开源开放的产品和服务进行技术与商业创新。依托华为30年的技术积淀,华为云正在努力构建完善的开发者生态,以促进每一位加入华为云生态的开发者,不仅能获得技术支持,还能找到同伴、发现商机,将梦想从不可能变可能。如果说云计算改变了中国各行各业的发展历程,那么可以说,华为云正让每一位开发者参与到这一历史进程当中。
  • [参赛经验分享] 2019华为云人工智能大赛·垃圾分类挑战杯
    知乎链接:https://zhuanlan.zhihu.com/p/96033452所有代码以上传至github:garbage_classifygithub.com已修改成本地可以运行。修改方法:1.save_model.py|train.py|eval.py|run.py|中moxing.framework.file函数全部换成os.path和shutil.copy函数。因为python里面暂时没有moxing框架。2.注释掉run.py文件里面的下面几行代码:# FLAGS.tmp = os.path.join(FLAGS.local_data_root, 'tmp/') # print(FLAGS.tmp) # if not os.path.exists(FLAGS.tmp): #     os.mkdir(FLAGS.tmp)运行环境python3.6 tensorflow 1.13.1 keras 2.24garbage_classify赛题背景比赛链接:华为云人工智能大赛·垃圾分类挑战杯如今,垃圾分类已成为社会热点话题。其实在2019年4月26日,我国住房和城乡建设部等部门就发布了《关于在全国地级及以上城市全面开展生活垃圾分类工作的通知》,决定自2019年起在全国地级及以上城市全面启动生活垃圾分类工作。到2020年底,46个重点城市基本建成生活垃圾分类处理系统。人工垃圾分类投放是垃圾处理的第一环节,但能够处理海量垃圾的环节是垃圾处理厂。然而,目前国内的垃圾处理厂基本都是采用人工流水线分拣的方式进行垃圾分拣,存在工作环境恶劣、劳动强度大、分拣效率低等缺点。在海量垃圾面前,人工分拣只能分拣出极有限的一部分可回收垃圾和有害垃圾,绝大多数垃圾只能进行填埋,带来了极大的资源浪费和环境污染危险。随着深度学习技术在视觉领域的应用和发展,让我们看到了利用AI来自动进行垃圾分类的可能,通过摄像头拍摄垃圾图片,检测图片中垃圾的类别,从而可以让机器自动进行垃圾分拣,极大地提高垃圾分拣效率。因此,华为云面向社会各界精英人士举办了本次垃圾分类竞赛,希望共同探索垃圾分类的AI技术,为垃圾分类这个利国利民的国家大计贡献自己的一份智慧。赛题说明本赛题采用深圳市垃圾分类标准,赛题任务是对垃圾图片进行分类,即首先识别出垃圾图片中物品的类别(比如易拉罐、果皮等),然后查询垃圾分类规则,输出该垃圾图片中物品属于可回收物、厨余垃圾、有害垃圾和其他垃圾中的哪一种。模型输出格式示例:{     " result ": "可回收物/易拉罐" }垃圾种类40类{     "0": "其他垃圾/一次性快餐盒",     "1": "其他垃圾/污损塑料",     "2": "其他垃圾/烟蒂",     "3": "其他垃圾/牙签",     "4": "其他垃圾/破碎花盆及碟碗",     "5": "其他垃圾/竹筷",     "6": "厨余垃圾/剩饭剩菜",     "7": "厨余垃圾/大骨头",     "8": "厨余垃圾/水果果皮",     "9": "厨余垃圾/水果果肉",     "10": "厨余垃圾/茶叶渣",     "11": "厨余垃圾/菜叶菜根",     "12": "厨余垃圾/蛋壳",     "13": "厨余垃圾/鱼骨",     "14": "可回收物/充电宝",     "15": "可回收物/包",     "16": "可回收物/化妆品瓶",     "17": "可回收物/塑料玩具",     "18": "可回收物/塑料碗盆",     "19": "可回收物/塑料衣架",     "20": "可回收物/快递纸袋",     "21": "可回收物/插头电线",     "22": "可回收物/旧衣服",     "23": "可回收物/易拉罐",     "24": "可回收物/枕头",     "25": "可回收物/毛绒玩具",     "26": "可回收物/洗发水瓶",     "27": "可回收物/玻璃杯",     "28": "可回收物/皮鞋",     "29": "可回收物/砧板",     "30": "可回收物/纸板箱",     "31": "可回收物/调料瓶",     "32": "可回收物/酒瓶",     "33": "可回收物/金属食品罐",     "34": "可回收物/锅",     "35": "可回收物/食用油桶",     "36": "可回收物/饮料瓶",     "37": "有害垃圾/干电池",     "38": "有害垃圾/软膏",     "39": "有害垃圾/过期药物" }efficientNet默认参数    (width_coefficient, depth_coefficient, resolution, dropout_rate)     'efficientnet-b0': (1.0, 1.0, 224, 0.2),     'efficientnet-b1': (1.0, 1.1, 240, 0.2),     'efficientnet-b2': (1.1, 1.2, 260, 0.3),     'efficientnet-b3': (1.2, 1.4, 300, 0.3),     'efficientnet-b4': (1.4, 1.8, 380, 0.4),     'efficientnet-b5': (1.6, 2.2, 456, 0.4),     'efficientnet-b6': (1.8, 2.6, 528, 0.5),     'efficientnet-b7': (2.0, 3.1, 600, 0.5),代码解析BaseLine改进1.使用多种模型进行对比实验,ResNet50, SE-ResNet50, Xeception, SE-Xeception, efficientNetB5。2.使用组归一化(GroupNormalization)代替批量归一化(batch_normalization)-解决当Batch_size过小导致的准确率下降。当batch_size小于16时,BN的error率逐渐上升,train.py。for i, layer in enumerate(model.layers):     if "batch_normalization" in layer.name:         model.layers = GroupNormalization(groups=32, axis=-1, epsilon=0.00001)3.NAdam优化器optimizer = NAdam(lr=FLAGS.learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-08, schedule_decay=0.004)4.自定义学习率-SGDR余弦退火学习率sample_count = len(train_sequence) * FLAGS.batch_size epochs = FLAGS.max_epochs warmup_epoch = 5 batch_size = FLAGS.batch_size learning_rate_base = FLAGS.learning_rate total_steps = int(epochs * sample_count / batch_size) warmup_steps = int(warmup_epoch * sample_count / batch_size) warm_up_lr = WarmUpCosineDecayScheduler(learning_rate_base=learning_rate_base,                                         total_steps=total_steps,                                         warmup_learning_rate=0,                                         warmup_steps=warmup_steps,                                         hold_base_rate_steps=0,                                         )5.数据增强:随机水平翻转、随机垂直翻转、以一定概率随机旋转90°、180°、270°、随机crop(0-10%)等(详细代码请看aug.py和data_gen.py)def img_aug(self, img):     data_gen = ImageDataGenerator()     dic_parameter = {'flip_horizontal': random.choice([True, False]),                      'flip_vertical': random.choice([True, False]),                      'theta': random.choice([0, 0, 0, 90, 180, 270])                     }     img_aug = data_gen.apply_transform(img, transform_parameters=dic_parameter)     return img_aug from imgaug import augmenters as iaa import imgaug as ia def augumentor(image):     sometimes = lambda aug: iaa.Sometimes(0.5, aug)     seq = iaa.Sequential(         [             iaa.Fliplr(0.5),             iaa.Flipud(0.5),             iaa.Affine(rotate=(-10, 10)),             sometimes(iaa.Crop(percent=(0, 0.1), keep_size=True)),         ],         random_order=True     )     image_aug = seq.augment_image(image)     return image_aug6.标签平滑data_gen.pydef smooth_labels(y, smooth_factor=0.1):     assert len(y.shape) == 2     if 0 <= smooth_factor <= 1:         # label smoothing ref: https://www.robots.ox.ac.uk/~vgg/rg/papers/reinception.pdf         y *= 1 - smooth_factor         y += smooth_factor / y.shape[1]     else:         raise Exception(             'Invalid label smoothing factor: ' + str(smooth_factor))     return y7.数据归一化:得到所有图像的位置信息Save_path.py并计算所有图像的均值和方差mead_std.py normMean = [0.56719673 0.5293289  0.48351972] normStd = [0.20874391 0.21455203 0.22451781] img = np.asarray(img, np.float32) / 255.0 mean = [0.56719673, 0.5293289, 0.48351972] std = [0.20874391, 0.21455203, 0.22451781] img[..., 0] -= mean[0] img[..., 1] -= mean[1] img[..., 2] -= mean[2] img[..., 0] /= std[0] img[..., 1] /= std[1] img[..., 2] /= std[2]各部分代码解析deploy_scripts——推理文件,需要修改1.self.input_size = 456  2. def _inference(self, data): """ model inference function Here are a inference example of resnet, if you use another model, please modify this function """ img = data[self.input_key_1] img = img[np.newaxis, :, :, :]  # the input tensor shape of resnet is [?, 224, 224, 3] img = np.asarray(img, np.float32) / 255.0 mean = [0.56719673, 0.5293289, 0.48351972] std = [0.20874391, 0.21455203, 0.22451781] img[..., 0] -= mean[0] img[..., 1] -= mean[1] img[..., 2] -= mean[2] img[..., 0] /= std[0] img[..., 1] /= std[1] img[..., 2] /= std[2] pred_score = self.sess.run([self.output_score], feed_dict={self.input_images: img}) if pred_score is not None:     pred_label = np.argmax(pred_score[0], axis=1)[0]     result = {'result': self.label_id_name_dict[str(pred_label)]} else:     result = {'result': 'predict score is None'} return result aug.py——图像增强代码(imgaug函数)data_gen.py——数据预处理代码,包括数据增强、标签平滑以及train和val的划分eval.py——估值函数Groupnormalization.py——组归一化mean_std.py——图像均值和方差Network.py——ResNet50, SE-ResNet50, Xeception, SE-Xeception, efficientNetB5run.py——运行代码save_model.py——保存模型Save_path.py——图像位置信息train.py——训练网络部分,包括网络,loss, optimizerwarmup_cosine_decay_scheduler.py——余弦退火学习率使用前期准备克隆此存储库git clone https://github.com/wusaifei/garbage_classify.git2. 垃圾分类数据集下载地址3. 扩充数据集:链接:https://pan.baidu.com/s/1SulD2MqZx_U891JXeI2-2g   提取码:epgs运行运行Save_path.py得到图像的位置信息运行mean_std.py得到图像的均值和方差run.py——训练python run.py --data_url='./garbage_classify/train_data' --train_url='./model_snapshots' --deploy_script_path='./deploy_scripts'run.py——保存为pd  python run.py --mode=save_pb --deploy_script_path='./deploy_scripts' --freeze_weights_file_path='./model_snapshots/weights_024_0.9470.h5' --num_classes=40run.py——估值python run.py --mode=eval --eval_pb_path='./model_snapshots/model' --test_data_url='./garbage_classify/train_data'实验结果网络的改进:ResNet50-0.689704,SE-ResNet50-0.0.83259,Xception-0.879003,EfficientNetB5-0.924113(无数据增强)数据增强:由0.924113提升到0.934721标签平滑和数据归一化处理、TTA、学习率策略的调整ReduceLROnPlateau换成WarmUpCosineDecayScheduler,最终准确率在95%左右
  • [参赛经验分享] 量子计算黑客松大赛-量子计算编程获奖选手思路分享
    比赛地址:https://competition.huaweicloud.com/information/1000029609/introduction?track=111黑客松比赛2020春季赛第一题解题交流用单线纸画了一个3比特QRC的线路,作为第一题的思路分享,抛砖引玉了!这个思路实现N比特QRC需要N个辅助比特,|t>,|w0>,|w1>,...|w_{n-1}>,其中|t>作临时工作比特用,随用随恢复,而|wi>用来表示从高位起第i位以后(从第0位算起),是否还需要比较,当|wi> = |1>时后续比较有效,用Toffoli门实现控制。三比特情况的线路图如下,其中|w2>不是必需的,仅用来示意,它可以方便的拓展到更多比特的情形。原文:https://bbs.huaweicloud.com/forum/thread-51801-1-1.html
  • [参赛经验分享] 爱(AI)美食美食图片分类大赛——第三名方案分享
    比赛简介共10类食物,数据集共5000个图片,尺寸大小不一,类别分别均衡。需要自己划分训练集和验证集,用于判分的测试集不可见。比赛难度不大,主要难点在于如何减小过拟合,提高模型的泛化能力。代码已在我的github上开源,欢迎star。源码的github地址涨点核心思想:cbam注意力auto_augmentcutmixsnapshotLabelSmooth数据探索由于数据集比较小,也比较简单,因此主要是统计了一下所有图像的尺寸分布,发现大多数图像的宽高在400~500,因此可以选择将图像输入尺寸调整到这个区间。大尺寸的另一个好处是可以显著提高分类准确率。训练策略数据集划分采用9:1的比例将数据集划分为训练集和验证集,时间和资源允许的情况下,可以进行10折交叉验证。数据增强数据集比较小,因此数据增强是提分的重点方向。除了torch自带的随机裁切和随机擦除以外,涨分的一大技巧是采用auto_augment。数据增强的代码如下:train_transform = transforms.Compose([ transforms.Resize((size+32, size+32)), transforms.RandomChoice([transforms.RandomCrop(size, padding=1, pad_if_needed=True, padding_mode='edge'), transforms.RandomResizedCrop(size, scale=(resize_scale, 1.0), ratio=(0.8, 1.2))]), transforms.RandomHorizontalFlip(), auto_augment.AutoAugment(dataset='CIFAR'), transforms.ToTensor(), transforms.RandomErasing(p=erasing_prob), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])模型选择采用efficientnet-b5,同时增加了cbam注意力模块,代码如下:class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // 16, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // 16, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3, 7), 'kernel size must be 3 or 7' padding = 3 if kernel_size == 7 else 1 self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv1(x) return self.sigmoid(x)优化器和学习率衰减优化器采用RAdam,学习率衰减策略采用torch1.4自带的学习率自动重启的余弦衰减。optimizer = newoptim.RAdam(model.parameters(), lr=lr, weight_decay=weight_decay) scheduler = optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=epochs//snap_num)训练方法采用三阶段训练法,每一阶段基于快照集成思想获得5个模型快照,选择acc最高的模型作为当前阶段的训练结果。具体流程如下:Stage 1:图像输入尺寸为400,使用LabelSmooth和cutmix,采用带学习率自动重启的CosineAnnealingWarmRestarts方法,获得5个模型快照,选择val_acc最高的模型,作为Stage 1的训练结果。Stage 2:图像输入尺寸为500,适当调整随机裁切和随机擦除的参数,增加weight_decay,在Stage 1模型的基础上训练获得5个模型快照,选择val_acc最高的模型,作为Stage 2的训练结果。Stage 3:图像输入尺寸为500,关闭cutmix,损失函数采用CrossEntropyLoss,在Stage 2模型的基础上训练获得5个模型快照,选择val_acc最高的模型,作为最终的训练结果。模型性能单模型,验证集上acc为99.4%,提交到modelarts上,测试集的acc为99.2%。由于图像分辨率较大,推理时间比较长,500张图片需要40多分钟。
  • [参赛经验分享] 【华为云DevCloud软件编程大赛】【分享汇总】【赛道一】选手算法&amp;代码&amp;视频&amp;心得分享汇总
    说明:为了让大家辛苦分享的内容不被埋没,可以被看到,已经把所有选手分享的内容都汇总到本帖,也请大家看到优秀内容给分享者一些鼓励,多多评论点赞哦~比赛链接:https://competition.huaweicloud.com/information/1000037176/introduction内容汇总如下视频分享帖:1.华为云DevCloud软件编程大赛—优秀选手作品展播2.华为云DevCloud软件编程大赛 直播答疑会 视频录播3.5月7日直播录播4.txt文档和pygame实现每日pk地图本机跑5.赛道一:思路及经验分享,希望对大家有所帮助!!(来自有幸被选中优秀选手视频展播的小白)6.赛道一思路分享(一等奖)7.【华为云DEVCLOUD软件编程大赛赛道一】参赛视频分享及初级代码讲述、心得体会心得、算法思路类分享帖:1.口罩大作战(赛道一)二等奖解题思路分享2.最后一天的十次机会也用完了,来说说感受3.关于口罩大作战赛道一(C++)的记录和总结——White-Loub4.赛道一小结(C++)_本次竞赛算法思路与部分具体实现代码以及学习c++的资源链接和计算机速成课视频链接5.口罩大作战(赛道一)python思路以及代码分享6.赛道一解题思路分享7.赛道一:思路及经验分享,希望对大家有所帮助!!(来自有幸被选中优秀选手视频展播的小白)8.【华为云DEVCLOUD软件编程大赛赛道一】参赛视频分享及初级代码讲述、心得体会9.赛道一思路分享(一等奖)10.口罩大作战(赛道一)陪跑经历和算法思路代码(C++)分享11.【华为云DEVCLOUD软件编程大赛赛道一】参赛视频分享及初级代码讲述、心得体会12.口罩大作战(赛道一)算法思路分享(三等奖)16.赛道一 综合排名第六 算法小白思路分享(三等奖)代码分享帖:1.口罩大作战(赛道一)二等奖解题思路分享2.赛道一口罩配送大作战代码分享3.关于口罩大作战赛道一(C++)的记录和总结——White-Loub4.txt文档和pygame实现每日pk地图本机跑5.赛道一python地图绘制分享6.赛道一python分享7.大赛塞到一代码。献丑了。8.口罩大作战(赛道一)python思路以及代码分享9.赛道一解题思路分享10.赛道一:思路及经验分享,希望对大家有所帮助!!(来自有幸被选中优秀选手视频展播的小白)11.【华为云DEVCLOUD软件编程大赛赛道一】参赛视频分享及初级代码讲述、心得体会12.口罩大作战(赛道一)陪跑经历和算法思路代码(C++)分享13.【华为云DEVCLOUD软件编程大赛赛道一】参赛视频分享及初级代码讲述、心得体会14.【赛道一代码分享】 可以完成 但效果不好测试工具分享:1.官方测试工具2.赛道一,基于官方测试程序改的随机地图生成,自动测试1000幅(可自己更改测试数目),适用于配送结束未配送完的同学其他:华为云DevCloud软件编程大赛常见问题华为云DevCloud软件编程大赛——选手问题收集帖
  • [参赛经验分享] 【开发者高校青年班】华为云开发者AI青年班黑客松大赛——参赛方案和总结
    赛事介绍 美食数据包含10个类别,数据集共5000个图片,尺寸大小不一,类别分别均衡。需要自己划分训练集和验证集,竞赛数据来自真实的美食图片数据,包含中餐、西餐、甜点、粥类,每张图像中美食所占比例大于3/4,每张图片代表一类美食。  竞赛数据分为2个数据集:参赛选手可使用第1个数据集,第2个数据集作为评判用(参赛者不可见)。主要思路数据集划分    采用了8.5:1.5的比例将数据集划分为训练集和验证集数据增强对图片进行了一定的旋转处理()和尺寸处理,这里计算了一下所有照片的均值,方差 mean std = [0.6736, 0.5654, 0.4031],[0.1994, 0.2248, 0.2528],具体代码如下:normalize = transforms.Normalize([0.6736, 0.5654, 0.4031],[0.1994, 0.2248, 0.2528])train_transformer_ImageNet = transforms.Compose([    transforms.Resize((size,size)),    transforms.RandomHorizontalFlip(),    transforms.RandomAffine(degrees=3, translate=(0.05, 0.05), scale=(0.95, 1.05)),    transforms.ToTensor(),    normalize])  val_transformer_ImageNet = transforms.Compose([    transforms.Resize((size,size)),    #transforms.CenterCrop(224),    transforms.ToTensor(),    normalize])   3.划分数据集和基础的图像预处理      色彩抖动,图像中有一个比较大的难点是背景干扰,在实际工程中为了消除图像在不同背景中存在的差异性,通常会做一些色彩抖动操作,扩充数据集合。色彩抖动主要是在图像的颜色方面做增强,主要调整的是图像的亮度,饱和度和对比度。工程中不是任何数据集都适用,通常如果不同背景的图像较多,加入色彩抖动操作会有很好的提升。def randomColor(image, saturation=0, brightness=0, contrast=0, sharpness=0):    if random.random() < saturation:        random_factor = np.random.randint(0, 31) / 10.  # 随机因子        image = ImageEnhance.Color(image).enhance(random_factor)  # 调整图像的饱和度    if random.random() < brightness:        random_factor = np.random.randint(10, 21) / 10.  # 随机因子        image = ImageEnhance.Brightness(image).enhance(random_factor)  # 调整图像的亮度    if random.random() < contrast:        random_factor = np.random.randint(10, 21) / 10.  # 随机因1子        image = ImageEnhance.Contrast(image).enhance(random_factor)  # 调整图像对比度    if random.random() < sharpness:        random_factor = np.random.randint(0, 31) / 10.  # 随机因子        ImageEnhance.Sharpness(image).enhance(random_factor)  # 调整图像锐度    return image   4.batch_size      一般设为8、16、32、64、128、256等2的幂次值,batch_size越小,梯度下降方向变化越大,可能导致训练不收敛,batch_size越大,梯度下降方向越稳,但是有如下几个缺点:  (1)       所需的内存和显存都越大,有可能撑爆机器;          (2)       由于计算好大一批数据才进行一次梯度下降,会导致达到相同精度所需的训练时间变长;           batch_size一般不影响最终精度,主要影响训练速度,每次做不同的训练任务,应该去尝试、总结合适的batch_size值,最后跑该类任务时就固定使用该batch_size=16  5. 预训练模型的选择         考虑到时间和精力的问题,在保证训练效果不错的基础上,将原有的resnet50神经网络结构训练模型换成了resnet101  6.学习率衰减调整      使用ReduceLROnPlateau学习调度器,如果三个epoch准确率没有提升,则减少学习率exp_lr_scheduler = lr_scheduler.ReduceLROnPlateau(optimizer_ft,mode='max',patience=3,verbose=True)7.通过训练中的实际情况对epochs做了点适当的微调以及推理文件的微调最后模型性能   单模型,验证集上best acc为96.933%,提交到modelarts上,测试集的acc为98%。
  • [参赛经验分享] 爱(AI)美食美食图片分类大赛——第二名方案分享
    数据500 张图 x 10 类, 共 5000 个样本易混淆类别举例:三明治 和 玉米饼冰激凌 和 土豆泥芒果班戟 和 鸡蛋布丁方案基于成熟模型进行迁移学习模型EfficientNet B3在 ImageNet 数据集上精度比较高输入图像尺寸 300参数少,训练快,部署快训练策略损失函数标签平滑:抑制过拟合优化器RangerSGD数据增强随机进行旋转、平移、翻转变换随机调节亮度对比度过程两阶段训练阶段一Ranger + one-cycle只训练离输出较近的几层,锁定其他层用比较大的学习率,收敛到一个比较低的 validation loss阶段二改用 SGD使用较低学习率微调 epochs 和 lr 等超参数其他尝试Selective-Backprop参考:https://arxiv.org/abs/1910.00762minimum loss percentage 用 0.9效果不明显Weighted CE'土豆泥', '鸡蛋布丁', '冰激凌', '小米粥', '三明治' 损失函数权重设置为 1.2参考代码: weight = torch.Tensor(np.ones(data_.c)) if torch.cuda.is_available(): weight = weight.cuda() hard_classes = ['土豆泥', '鸡蛋布丁', '冰激凌', '小米粥', '三明治'] hard_classes_idx = [data_.train_ds.c2i[x] for x in hard_classes] weight[hard_classes_idx] = 1.2 loss_func = nn.CrossEntropyLoss(weight=weight)效果不明显展望尝试注意力机制尝试调整 WeightedCE 权重其他参考https://towardsdatascience.com/label-smoothing-making-model-robust-to-incorrect-labels-2fae037ffbd0https://towardsdatascience.com/exploring-learning-rates-to-improve-model-performance-in-keras-e37f5e63f16c
  • [参赛经验分享] 爱(AI)美食美食图片分类大赛——第三名方案分享
    比赛简介共10类食物,数据集共5000个图片,尺寸大小不一,类别分别均衡。需要自己划分训练集和验证集,用于判分的测试集不可见。比赛难度不大,主要难点在于如何减小过拟合,提高模型的泛化能力。代码已在我的github上开源,欢迎star。源码的github地址涨点核心思想:cbam注意力auto_augmentcutmixsnapshotLabelSmooth数据探索由于数据集比较小,也比较简单,因此主要是统计了一下所有图像的尺寸分布,发现大多数图像的宽高在400~500,因此可以选择将图像输入尺寸调整到这个区间。大尺寸的另一个好处是可以显著提高分类准确率。训练策略数据集划分采用9:1的比例将数据集划分为训练集和验证集,时间和资源允许的情况下,可以进行10折交叉验证。数据增强数据集比较小,因此数据增强是提分的重点方向。除了torch自带的随机裁切和随机擦除以外,涨分的一大技巧是采用auto_augment。数据增强的代码如下:train_transform = transforms.Compose([ transforms.Resize((size+32, size+32)), transforms.RandomChoice([transforms.RandomCrop(size, padding=1, pad_if_needed=True, padding_mode='edge'), transforms.RandomResizedCrop(size, scale=(resize_scale, 1.0), ratio=(0.8, 1.2))]), transforms.RandomHorizontalFlip(), auto_augment.AutoAugment(dataset='CIFAR'), transforms.ToTensor(), transforms.RandomErasing(p=erasing_prob), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ])模型选择采用efficientnet-b5,同时增加了cbam注意力模块,代码如下:class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super(ChannelAttention, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc1 = nn.Conv2d(in_planes, in_planes // 16, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // 16, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3, 7), 'kernel size must be 3 or 7' padding = 3 if kernel_size == 7 else 1 self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = torch.mean(x, dim=1, keepdim=True) max_out, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avg_out, max_out], dim=1) x = self.conv1(x) return self.sigmoid(x)优化器和学习率衰减优化器采用RAdam,学习率衰减策略采用torch1.4自带的学习率自动重启的余弦衰减。optimizer = newoptim.RAdam(model.parameters(), lr=lr, weight_decay=weight_decay) scheduler = optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0=epochs//snap_num)训练方法采用三阶段训练法,每一阶段基于快照集成思想获得5个模型快照,选择acc最高的模型作为当前阶段的训练结果。具体流程如下:Stage 1:图像输入尺寸为400,使用LabelSmooth和cutmix,采用带学习率自动重启的CosineAnnealingWarmRestarts方法,获得5个模型快照,选择val_acc最高的模型,作为Stage 1的训练结果。Stage 2:图像输入尺寸为500,适当调整随机裁切和随机擦除的参数,增加weight_decay,在Stage 1模型的基础上训练获得5个模型快照,选择val_acc最高的模型,作为Stage 2的训练结果。Stage 3:图像输入尺寸为500,关闭cutmix,损失函数采用CrossEntropyLoss,在Stage 2模型的基础上训练获得5个模型快照,选择val_acc最高的模型,作为最终的训练结果。模型性能单模型,验证集上acc为99.4%,提交到modelarts上,测试集的acc为99.2%。由于图像分辨率较大,推理时间比较长,500张图片需要40多分钟。
  • [参赛经验分享] 【开发者高校青年班】华为云开发者AI青年班黑客松大赛——参赛方案分享
    比赛简介        大赛提供5000张图片,10分类问题。        本次主要在数据,网络模型和优化器做优化,数据量较小,主要工作是在防止过拟合。数据处理:1.数据增强随机水平翻转  RandomHorizontalFlip随机仿射变换       RandomAffine2.数据扩充    大赛提供了5000张数据进行训练,数据量较小。    在网上爬取了4946张图片,爬取的数据集链接:        链接:https://pan.baidu.com/s/1MbKgC3JP1EA5TbQUdl53xw         提取码:97qy    爬取的数据有很多脏数据,做了两轮简单的数据清洗后扩充数据集。    给易混淆的类别多扩充一些数据,同时考虑数据均衡。两轮每个类别的的数据增加量如下图。    训练时分别使用两个扩充的数据集训练。                            模型选择    本次比赛分别尝试了ResNet系列和efficientnet系列,参考了下图,    最后直接选择了参数量最大的efficientnet-b7。                     其他工作    优化器:训练全程采用ranger优化器,使用L2正则化。    损失函数:使用了标签平滑(LabelSmoothingCrossEntropy)    学习率策略:使用ReduceLROnPlateau,两个epoch验证集准确度没有上升就减小学习率。模型训练        训练分两部分,图片输入尺寸为(224,224)        第一阶段:使用数据处理部分第一轮添加的数据,9:1划分,只训练最后一层网络参数,10个epoch。        第二阶段:在第一阶段模型基础上继续训练,使用数据处理部分第二轮添加的数据,9.6:0.4划分,训练最后一层网络参数10个epoch后,训练全部参数25个epoch。未来展望        在efficientnet网络中添加cbam注意力机制。        使用学习率余弦退火等方法。        增大图片输入尺寸。模型性能        单模型,测试集acc98.4%。参考:        模型选择出图片来源:https://github.com/lukemelas/EfficientNet-PyTorch
  • [参赛经验分享] 【开发者高校青年班】华为云开发者AI青年班黑客松大赛——参赛方案分享
    赛事介绍       美食数据包含10个类别,数据集共5000个图片,尺寸大小不一,类别分别均衡。需要自己划分训练和验证数据,竞赛数据来自真实的美食图片数据,包含中餐、西餐、甜点、粥类,每张图像中美食所占比例大于3/4,每张图片代表一类美食。  除提供给参赛选手的训练集外,主办方还有一个测试集,该数据集对参赛者不可见,用于多提交模型进行评判。主办方提供使用resnet50训练的baseline,其测试精度在86%左右。优化思路数据增强采用旋转、翻转和剪裁对数据进行增强数据集划分采用9:1的训练和验证集划分,经过多次训练发现,在训练集上达到最优的模型,往往验证准确率也越高。于是,为了充分利用数据,训练时不做验证,最终选取在训练集达到上最优的模型提交。模型选择考虑不做验证,为避免严重的过拟合,选取结构简单、参数量较少的Xception,用ImageNet预训练的权重进行初始化。其他设置经过多次测试,在最后的全连接层,添加dropout(0.2)的层,使用SGD优化器以及StepLR梯度下降,可得到最优的测试准确率。最终结果提交在训练集上表现最好的模型,最终测试准确率97.2%总结真正的小白技巧,几乎单纯通过对数据进行增强和一点防止过拟合的技巧,就可以将模型的准确率提升至97.2%。感想:这次青年班的学习和比赛太合适入门与实践了,既入门了CNN,又会学会了使用modlearts,通过比赛还能学到其他大佬的优化技巧,太值了!
总条数:1810 到第
上滑加载中