AI Challenger 2018 农作物病害细粒度分类-----Pytorch 深度学习实战

AI Challenger 2018 农作物病害细粒度分类

1 前言
2 代码组织结构
3 完整流程解析
     3.1 EDA
     3.2 参数定义
     3.3 数据加载过程
     3.4 数据处理 DataAugmentation 和TTA
     3.5 模型定义
     3.6 训练过程定义
     3.7 模型融合
     3.8 测试与结果提交
     3.9 log记录,可视化训练过程及其他trick
4 收获与心得

前言

    本文以AI Challenger 2018 农作物病害细粒度分类为例,比赛详细信息和数据见文末,基于Pytorch 0.4.0 构建项目 其中模型训练部分是在jupyter中完成 因此没有将整个训练过程封装为可执行的py文件,做这个比赛的初衷是熟悉一下pytorch,还有就是了解一下打比赛的整个流程,在过程中排名一度还不错 让自己产生了可能能拿奖的错觉 果然还是年轻啊 第一次打比赛还想拿奖 最终acc 在0.883 如果有好心的大佬能够告诉我这个怎么调参调到0.89以上 十分感谢

    不过通过这次比赛 让自己学习到了很多编程的技巧 熟悉了流程 收获还是很大的 有想要一起打比赛的小伙伴可以组队呀。下面就将这次比赛的整个流程的收获做一下总结,方便日后参考,同时也能够作为一份真正的实战指导,虽然做的菜 但总归有可以借鉴的地方.

代码github地址

代码组织结构

    在使用pytroch过程中可以将整个流程分为如下部分:数据分析过程(EDA), 参数定义 ,数据加载过程,数据处理 Data Augmentation和TTA(Test Time Augmentation),模型定义,训练过程定义,验证过程定义,测试过程定义,log定义与训练过程可视化 ,模型融合。 大致可以分为上述部分,每一部分在下文中做具体展开。

整体代码结构如下:

• code
  ▫CropModel.py
  ▫CropDataSet.py
  ▫utils.py 
   ......
• config
   ▫config.py
• data
  ▫trainData
  ▫validationData
  ▫testData
• model
  ▫ResNet50
    ▫2018-11-03_acc.pth
• feature
  ▫ ResNet50
      ▫ val_all_prediction.pth
      ▫ val_crop_prediction.pth
      ▫ test_all_prediction.pth
      ......
• log
    ▫ 2018-11-01
           ▫ ResNet50
                  ▫ tensorBoardX
                  ▫ logtxt
           ▫ ResNet 101
     ▫ 2018-11-02
    
• submision:
        ▫ 2018-11-02


在这次比赛中我发现良好的代码组织以及模型组织是必不可少的,只有这样才能更好的实现源源不断的idea的修改,使得代码不至于不可控,上述代码组织结构是这次比赛摸索出来的,肯定还有不好的地方 需要之后实践中不断修改。
code : 存放项目代码其中CropModel .py 将项目使用到的所有模型进行封装 ,CropDataSet .py 存放数据加载类以及不同的transform的方法 ,utils存放各种工具方法
data:在data中下分三个文件夹 trainData ,testData,validationData 每个文件夹下面存放着对应的annotation.json以及img文件夹保存图像
model:model用来保存不同训练模型结果 以模型名称命名,在每个文件夹下以 日期+acc.pth 保留当日最好模型,日期+_loss.pth 保留当日最好loss模型。 在这里其实可以改进model的保存方式 可以每一轮(或者固定周期)都将模型保存下来 然后把最好的模型另外创建一个和model完全一致结构的checkpoint文件夹 专门保存最优模型
feature:feature文件夹存储TTA之后生成的结果(之所以称为feature 是在stacking的时候 第二层的算法是将第一次算法结果作为特征的 所以这里就使用feature来命名这些TTA的结果)
log:存储tensorboardX生成的训练过程图 以及自定义的训练过程中的log输出。在这次比赛中没有存储log输出而是使用jupyter 直接打印出来 这样做是有风险的 不利于log的回溯 同时如果jupyter断开与服务器的连接 那么log信息就会丢失
submission:存储提交结果

完整流程解析
EDA

对于该问题EDA相对而言较为简单 可以分为如下几个步骤
1.将annotation转化为pandas格式
2.查询trainData validateData testData中是否有缺失值存在
3.生成各类样本数量分布图 并按样本数量大小排序
4. 展示若干样本图像

首先通过使用matplotlib 和pandas 对数据进行简单的统计和可视化
matplotlib 可能会出现中文注解乱码的问题 可以通过下述代码解决

import matplotlib
matplotlib.rcParams[u'font.sans-serif'] = ['simhei']
matplotlib.rcParams['axes.unicode_minus'] = False

将json文件转化为pandas

with open("../data/AgriculturalDisease_trainingset/AgriculturalDisease_train_annotations.json") as datafile1:
    trainDataFram=pd.read_json(datafile1,orient='records')
with open("../data/AgriculturalDisease_validationset/AgriculturalDisease_validation_annotations.json") as datafile2: #first check if it's a valid json file or not
    validateDataFram =pd.read_json(datafile2,orient='records')    

查看数据中Null的分布情况:

total=trainDataFram.isnull().sum().sort_values(ascending=False)
percent=(trainDataFram.isnull().sum())/(trainDataFram.isnull().count()).sort_values(ascending = False)
missing_validation_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'],sort=False)
missing_validation_data.head()

在这里插入图片描述

查看数据分布情况

dataDistribute=trainDataFram.groupby(by=['disease_class']).size()
plt.figure(figsize=(50,20),dpi=100)
plt.xticks(range(len(dataDistribute)),dataDistribution.index.tolist(),fontsize=40)
plt.yticks(fontsize=40)
bar=plt.bar(dataDistribution.index.tolist(), dataDistribute.tolist(),width=0.7)
 
for b in bar:
    h=b.get_height()
    plt.text(b.get_x()+b.get_width()/2,h,int(h),ha='center',fontsize=30)
plt.show()

在这里插入图片描述

validate data
在这里插入图片描述

由此可见在训练过程中可以将44,45 label删除 提升正确率

根据数据量的大小排序

trainDataFram['disease_class'].value_counts().plot(kind='bar',figsize=(60,30),fontsize =60,title="Number of Training Examples Versus Class").title.set_size(80)

在这里插入图片描述

按大小排列同时在柱状图上增加数据量大小

dataDistribute=trainDataFram['disease_class'].value_counts()
plt.figure(figsize=(50,20),dpi=100)
plt.xticks(range(len(dataDistribute)),dataDistribute.index.tolist(),fontsize=40) #第一个参数是在哪些位置需要放置坐标值  第二个参数是放置的坐标值大小
plt.yticks(fontsize=40)
bar=plt.bar(range(len(dataDistribute)),dataDistribute.tolist(),width=0.6)
for b in bar:
    h=b.get_height()
    plt.text(b.get_x()+b.get_width()/2,h,int(h),ha='center',fontsize=25)
plt.show()

在这里插入图片描述

查看trainDataSet和Validate DataS

  • 37
    点赞
  • 233
    收藏
    觉得还不错? 一键收藏
  • 42
    评论
### 回答1: AI Challenger 2018农作物是一个人工智能竞赛项目,旨在通过机器学习深度学习技术,提高农作物的生产效率和质量。该竞赛项目涉及多个领域,包括农业图像识别、农作物病虫害识别、农作物生长预测等。参赛者需要通过训练模型,实现对农作物图像的自动识别和分类,以及对农作物生长和病虫害的预测和监测。该竞赛项目旨在促进人工智能技术在农业领域的应用和发展,为农业生产提供更加智能化和高效的解决方案。 ### 回答2: AI Challenger 2018是一个人工智能挑战赛,其中一个任务是农作物农作物是人类生产和生活中不可或缺的重要资源之一,对于了解和掌握农作物的种植、生长、病虫害防治等方面的情况,可以提高农作物的产量、质量和安全性。在这项挑战赛中,参赛者需要利用深度学习等人工智能技术,对输入的农作物图像进行识别和分类,以达到提高农作物管理的效率和质量的目的。 具体来说,任务要求参赛者根据提供的数千张高清的农作物图像,识别出其中的农作物品种,包括玉米、小麦、水稻等常见食用农作物,以及棉花、葡萄等经济作物。此外,还需要识别图像中是否存在病虫害等有害因素,以辅助农民制定有效的防治措施。参赛者需要将其算法应用于大规模的农作物图像数据集,并通过不同的评估指标来评估其算法的准确性和鲁棒性。 这项挑战赛旨在促进人工智能技术在农业领域的应用,提升农作物生产效率和安全性,推动农业可持续发展。同时,它也为人工智能领域的技术研究者提供了一个公开的数据集和标准评测平台,以便他们能更加深入地研究和发展相关技术,为人类社会的进步做出贡献。 ### 回答3: AI Challenger 2018农作物是一个人工智能应用的比赛项目,该项目集中在农作物领域,旨在利用人工智能技术,提升农业生产效率和质量。2018年的比赛主题是“智能算法解决农业问题”,并提供了三个任务供参赛者选择,分别是农作物病害诊断、作物生长状态监测和玉米叶片脆性识别。 为了解决农业生产中存在的问题,比赛利用了人工智能技术,提供了一种创新的解决方案。通过使用计算机视觉等技术,参赛选手可以识别农作物病害和生长状态,从而提供更加准确的判断和更好的解决方案。参赛者可以使用各种人工智能算法,如深度学习、卷积神经网络等,对数据进行分析和识别,从而获得较好的识别准确率。比赛数据集包含着不同的场景下的图片,如构架上的甜瓜叶面、土壤上的辣椒、玉米叶片等,这些数据能够帮助参赛者进行训练,提高识别准确率。 参赛者可以通过这个比赛对新型人工智能技术有更深刻的了解,同时提高其能力水平,为未来的智能农业提供参考,这也是比赛参赛的意义所在。AI Challenger 2018农作物比赛在智能农业技术的研究和应用方面起到了积极作用,同时也为人工智能技术在农业生产中的应用提供了范例。
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值