【图像分类】华为云·垃圾分类亚军方案分享

2024-06-12 22:38

本文主要是介绍【图像分类】华为云·垃圾分类亚军方案分享,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

导语

浏览更多内容,可访问:http://www.growai.cn
结束比赛有几天了,这几天一直在处理前段时间堆积的工作,今天得空对自己的方案进行梳理总结。今年7月多结束魔镜杯后,将之前的内容整理了一下,刚好看到华为垃圾分类比赛,由于我的工作内容还是偏图像,所以就想玩玩,有幸拿了一个亚军。

这次比赛是基于华为云的modelArts平台,免费的gpu硬件环境,全新的结果提交验证方法。感谢组织方华为云,喜欢打比赛的小伙伴也可以多留意该平台,会不定期举办各种数据类竞赛。这次我们队共有三人:谢赋(老虎)、舒欣(up)和文瑞(一休),大家交流分工合作,才能不断奋力前进。这次分享主要是针对决赛阶段,该阶段要求模型的推理时间不能大于100ms,不能使用融合和TTA。故关于模型融合和TTA技巧,本次不会涉及到,后面还会有图像分类的专题分享。

一 解题思路

  1. 拿到数据后,我们首先做了数据分析。统计数据样本分布,尺寸分布,图片形态等,基于分析可以做一些针对性的数据预处理算法,对后期的模型训练会有很大的帮助。
  2. 选择好的baseline。需要不断的尝试各种现有的网络结构,进行结果对比,挑选出适合该网络的模型结构,然后基于该模型进行不断的调参,调试出性能较好的参数。
  3. 做结果验证,分析badcase。将上述模型在验证集上做结果验证,找出错误样本,分析出错原因,然后针对性的调整网络和数据。
  4. 基于新数据和模型,再次进行模型调优

二 数据分析(EDA)

  • 原始共有43个类别,共计19459张图片。图像类别数据不均衡,其中较少数据为类别3(牙签)、类别40(毛巾)和类别41(饮料盒);数据较多的为类别11(菜叶根)和类别21(插头电线)。

image-20190925011449179

  • 图片长宽比有一定的差异性,下图是h/w比例数据分布图(只显示该类数量大于100的比例),长宽比大多数集中于1,后来模型输入尺寸设为1:1

    image-20190925011513617

基于分析对图像进行简单的数据增强操作,包括图像的等比填充缩放裁剪,水平翻转、高斯噪声等。其中第一项目,对结果影响较大。这里是先将原始图像以最大边为基准做等比缩放,不足的地方填充0,这里缩放后的边是最终输入边长的256/224倍,然后在进行剪切,这里输入模型的尺寸为288*288。下图是对比图,如果不进行等比缩放,最终的结果是最右边的图片,最后的输出就极易识别为筷子。

image-20190925013235717

等比缩放的代码如下:

class Resize(object):def __init__(self, size, interpolation=Image.BILINEAR):self.size = sizeself.interpolation = interpolationdef __call__(self, img):# paddingratio = self.size[0] / self.size[1]w, h = img.sizeif w / h < ratio:t = int(h * ratio)w_padding = (t - w) // 2img = img.crop((-w_padding, 0, w w_padding, h))else:t = int(w / ratio)h_padding = (t - h) // 2img = img.crop((0, -h_padding, w, h h_padding))img = img.resize(self.size, self.interpolation)return img

三 模型设计与训练

首先对原始的数据进行分组,9:1的比例分为训练集和测试集,基于此做线下验证。

模型结构baseline准确率
se_resnext50_32x4d93.10
se_resnext101_32x4d93.59
Senet15494.38
resnext50_32*8d95.01
resnext101_32*16d_wsl95.56
resnext101_32*32d_wsl95.32
Pnasnet5large94.38
efficientnet-b795.20

基于上述结果验证,采用了resnext101_32*16d_wsl网络作为基本的baseline,进行结果调优,最后的网络结构如下图,红色的部分为调整的网络部分,模型最后全连接层添加dropout降低过拟合,首层卷积添加cbam注意力机制增强特征表征能力,关注重要特征抑制不必要特征。基于此网络,现在训练20个epoch就能收敛到最高分,训练时间大概5个小时左右。image-20190925014422492

在模型参数选择和调整方面,尝试了很多参数,针对损失函数分别尝试了CrossEntropyLoss和focal loss, 优化函数:adabound、Radam、adam、sgd和sgd warm up, 其中adabound在起始收敛的速度较快,但是最终还是sgd的网络精度较高。学习率优化方面使用了ReduceLROnPlateau和定值优化两种方法,定值优化需要根据实验选择适合的降分点。并且也要针对不同的模型调整学习率,最终采用的参数如下:

  • 使用预训练参数
  • 优化函数: sgd
  • 学习率:0.001
  • 学习率优化:ReduceLROnPlateau
  • 自己设置的网络层,初始学习率是预加载参数网络的5倍

四 结果分析

在验证集上做结果验证,得到下图所示的混淆矩阵。基于此分析各类别预测结果分布,分析badcase,采取措施进行数据扩充或数据增强工作。

image-20190925015451752

五 展望

  • 对网络结果中的全部残差块添加时间和空间注意力机制
  • 对模型进行量化和剪枝,在保证精度的同时提高模型速度
  • 转化为二分类问题,使用人脸的arcfaceloss triplet loss focal loss联合loss优化
  • 在落地的场景中增加反馈机制,收集用户的反馈信息,对模型进行在线训练,不断增加训练数据优化模型。

参考文献

  • Robustness properties of Facebook’s ResNeXtWSL models
  • FaceNet: A Unified Embedding for Face Recognition and Clustering
  • Focal Loss for Dense Object Detection

感悟与建议

  • 想要做一件事情,要好好的坚持下去,坚持到最后都会有所收获;
  • 结束一件任务,要做好总结,无论有没有获得名次;
  • 报着真诚的态度向别人学习,学习别人的方法。比赛这种东西,即使第一次没有得奖,多参加两次,多熬两个夜就会得奖了,大多数比赛技巧性都比较强。
  • 基础知识很重要,真正的牛人基础都会比较好,共勉!!!

如果想要获取开源代码,关注微信公众号AI成长社 回复:垃圾分类

推荐阅读:

如果出现出现图片失效的情况请阅读:https://mp.weixin.qq.com/s/7GhXMXQkBgH_JVcKMjCejQ

  • 基于lightgbm实现的二分类、多分类和回归任务
  • 基于xgboost实现的二分类、多分类和回归任务
  • 基于keras实现的二分类、多分类和回归任务
  • 基于pytorch实现的二分类、多分类和回归任务

作者的知乎:一休, 知乎专栏:ML与DL成长之路

微信公号:AI成长社:ML/DL/CV的成长圣地。

这篇关于【图像分类】华为云·垃圾分类亚军方案分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055541

相关文章

前端缓存策略的自解方案全解析

《前端缓存策略的自解方案全解析》缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物,:本文主要介绍前端缓存的自解方案,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、为什么“清缓存”成了技术圈的梗二、先给缓存“把个脉”:浏览器到底缓存了谁?三、设计思路:把“发版”做成“自愈”四、代码

解决docker目录内存不足扩容处理方案

《解决docker目录内存不足扩容处理方案》文章介绍了Docker存储目录迁移方法:因系统盘空间不足,需将Docker数据迁移到更大磁盘(如/home/docker),通过修改daemon.json配... 目录1、查看服务器所有磁盘的使用情况2、查看docker镜像和容器存储目录的空间大小3、停止dock

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S

Python内存管理机制之垃圾回收与引用计数操作全过程

《Python内存管理机制之垃圾回收与引用计数操作全过程》SQLAlchemy是Python中最流行的ORM(对象关系映射)框架之一,它提供了高效且灵活的数据库操作方式,本文将介绍如何使用SQLAlc... 目录安装核心概念连接数据库定义数据模型创建数据库表基本CRUD操作创建数据读取数据更新数据删除数据查

分析 Java Stream 的 peek使用实践与副作用处理方案

《分析JavaStream的peek使用实践与副作用处理方案》StreamAPI的peek操作是中间操作,用于观察元素但不终止流,其副作用风险包括线程安全、顺序混乱及性能问题,合理使用场景有限... 目录一、peek 操作的本质:有状态的中间操作二、副作用的定义与风险场景1. 并行流下的线程安全问题2. 顺

C#实现高性能拍照与水印添加功能完整方案

《C#实现高性能拍照与水印添加功能完整方案》在工业检测、质量追溯等应用场景中,经常需要对产品进行拍照并添加相关信息水印,本文将详细介绍如何使用C#实现一个高性能的拍照和水印添加功能,包含完整的代码实现... 目录1. 概述2. 功能架构设计3. 核心代码实现python3.1 主拍照方法3.2 安全HBIT

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1