当前位置:   article > 正文

深度学习实战——木薯叶图像识别与分类项目_深度学习图像识别项目

深度学习图像识别项目

摘要

本文主要通过使用的PaddlePaddle用于实现的图像分类的目标的。并设计与优化的相关的模型。该问题主要来源是的:Cassava Leaf Disease Classification | Kaggle

问题背景

作为非洲第二大碳水化合物供应国,木薯是小农种植的重要粮食安全作物,因为它可以承受恶劣的条件。撒哈拉以南非洲至少有80%的家庭农场都种植这种淀粉状的根,但病毒性疾病是单产低下的主要根源。借助数据科学,可以识别常见疾病,以便对其进行治疗。 现有的疾病检测方法要求农民寻求政府资助的农业专家的帮助,以目视检查和诊断植物。这遭受了劳动密集,供应不足和成本高的困扰。另一个挑战是,针对农民的有效解决方案必须在明显的约束下表现良好,因为非洲农民可能只能使用低带宽的移动质量相机。 在本次比赛中,我们引入了在乌干达定期调查期间收集的21,367张带标签图像的数据集。大多数图像都是从农民那里采集的花园照片拍摄的,并由国家作物资源研究所(NaCRRI)的专家与坎帕拉的马克雷雷大学的AI实验室合作进行注释。这是最现实地表示农民在现实生活中需要诊断的格式。 您的任务是将每个木薯图像分类为四个疾病类别或第五个类别,指示健康的叶子。在您的帮助下,农民可能能够快速识别出患病的植物,从而有可能在遭受不可弥补的损害之前挽救他们的作物。

原始数据

模型的数据的制作

将tain.csv转为的txt文件

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. @version: 1.0
  5. @author: xjl
  6. @file: csv_to_txt.py
  7. @time: 2021/3/5 11:37
  8. """
  9. import pandas as pd
  10. import os
  11. def csv_to_txt(csv_file, txt_file,abs_path):
  12. if not os.path.exists(csv_file):
  13. print('Not that files:%s' % csv_file)
  14. else:
  15. data = pd.read_csv(csv_file, encoding='utf-8')
  16. with open(txt_file, 'a+', encoding='utf-8') as f:
  17. for line in data.values:
  18. newdata=abs_path+str(line[0]) + ' ' + str(line[1]) + '\n'
  19. f.write(newdata)
  20. if __name__ == '__main__':
  21. path=os.path.abspath('.').replace('\\','/')
  22. csv_file = path+r"/train.csv"
  23. txt_file =path+ r"/train.txt"
  24. abs_path=path+r"/train_images/"
  25. csv_to_txt(csv_file, txt_file,abs_path)

将data.txt文件化为了训练集、验证集

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. @version: 1.0
  5. @author: xjl
  6. @file: split_date.py
  7. @time: 2021/3/5 11:53
  8. """
  9. # -*- coding: utf-8 -*-
  10. import random
  11. import os
  12. """
  13. 随机按比例拆分数据
  14. """
  15. def split(all_list, shuffle=False, ratio=0.8):
  16. num = len(all_list)
  17. offset = int(num * ratio)
  18. if num == 0 or offset < 1:
  19. return [], all_list
  20. if shuffle:
  21. random.shuffle(all_list) # 列表随机排序
  22. train = all_list[:offset]
  23. test = all_list[offset:]
  24. return train, test
  25. def write_split(film, train, test):
  26. infilm = open(film, 'r', encoding='utf-8')
  27. tainfilm = open(train, 'w', encoding='utf-8')
  28. testfilm = open(test, 'w', encoding='utf-8')
  29. li = []
  30. for datas in infilm.readlines():
  31. datas = datas.replace('\n', '')
  32. li.append(datas)
  33. traindatas, testdatas = split(li, shuffle=True, ratio=0.8)
  34. for traindata in traindatas:
  35. tainfilm.write(traindata + '\n')
  36. for testdata in testdatas:
  37. testfilm.write(testdata + '\n')
  38. infilm.close()
  39. tainfilm.close()
  40. testfilm.close()
  41. if __name__ == "__main__":
  42. path = os.path.abspath('.').replace('\\', '/')
  43. data_path=path+r"/train.txt"
  44. train_path=path+r"/train_list.txt"
  45. test_path=path+r"/val_list.txt"
  46. write_split(data_path, train_path,test_path)

建立基于的Paddle的深度模型

1采用的是ResNet50_vd的一个网络模型的结构

  1. mode: 'train'# 当前所处的模式,支持训练与评估模式
  2. ARCHITECTURE:
  3. name: 'ResNet50_vd'# 模型结构,可以通过这个这个名称,使用模型库中其他支持的模型
  4. checkpoints: ""
  5. pretrained_model: ""# 预训练模型,因为这个配置文件演示的是不加载预训练模型进行训练,因此配置为空。
  6. model_save_dir: "./output/"# 模型保存的路径
  7. classes_num: 4# 类别数目,需要根据数据集中包含的类别数目来进行设置
  8. total_images: 17117# 训练集的图像数量,用于设置学习率变换策略等。
  9. save_interval: 1# 保存的间隔,每隔多少个epoch保存一次模型
  10. validate: True# 是否进行验证,如果为True,则配置文件中需要包含VALID字段
  11. valid_interval: 1# 每隔多少个epoch进行验证
  12. epochs: 100# 训练的总得的epoch数量
  13. topk: 4# 除了top1 acc之外,还输出topk的准确率,注意该值不能大于classes_num
  14. image_shape: [3, 224, 224]# 图像形状信息
  15. LEARNING_RATE:# 学习率变换策略,目前支持Linear/Cosine/Piecewise/CosineWarmup
  16. function: 'Cosine'
  17. params:
  18. lr: 0.0125
  19. OPTIMIZER:# 优化器设置
  20. function: 'Momentum'
  21. params:
  22. momentum: 0.9
  23. regularizer:
  24. function: 'L2'
  25. factor: 0.00001
  26. TRAIN:# 训练配置
  27. batch_size: 32# 训练的batch size
  28. num_workers: 0# 每个trainer(1块GPU上可以视为1个trainer)的进程数量
  29. file_list: "./dataset/cassava-leaf-disease-classification/train_list.txt"
  30. data_dir: "./dataset/cassava-leaf-disease-classification/train_images/"
  31. shuffle_seed: 0# 数据打散的种子
  32. transforms:# 训练图像的数据预处理
  33. - DecodeImage:# 解码
  34. to_rgb: True
  35. to_np: False
  36. channel_first: False
  37. - RandCropImage:# 随机裁剪
  38. size: 224
  39. - RandFlipImage:# 随机水平翻转
  40. flip_code: 1
  41. - NormalizeImage: # 归一化
  42. scale: 1./255.
  43. mean: [0.485, 0.456, 0.406]
  44. std: [0.229, 0.224, 0.225]
  45. order: ''
  46. - ToCHWImage:# 通道转换
  47. VALID:# 验证配置,validate为True时有效
  48. batch_size: 20# 验证集batch size
  49. num_workers: 0# 每个trainer(1块GPU上可以视为1个trainer)的进程数量
  50. file_list: "./dataset/cassava-leaf-disease-classification/val_list.txt"
  51. data_dir: "./dataset/cassava-leaf-disease-classification/train_images/"
  52. shuffle_seed: 0# 数据打散的种子
  53. transforms:
  54. - DecodeImage:
  55. to_rgb: True
  56. to_np: False
  57. channel_first: False
  58. - ResizeImage:
  59. resize_short: 256
  60. - CropImage:
  61. size: 224
  62. - NormalizeImage:
  63. scale: 1.0/255.0
  64. mean: [0.485, 0.456, 0.406]
  65. std: [0.229, 0.224, 0.225]
  66. order: ''
  67. - ToCHWImage:

1零基础训练-不加载预训练模型的训练:

训练的步数和没有加入参数的调整。训练完成后,验证集上的精度为63.668%。

训练参数的设置

  1. mode: 'train'
  2. ARCHITECTURE:
  3. name: 'ResNet50_vd'
  4. checkpoints: ""
  5. pretrained_model: ""
  6. model_save_dir: "./output/"
  7. classes_num: 4
  8. total_images: 17117
  9. save_interval: 1
  10. validate: True
  11. valid_interval: 1
  12. epochs: 100
  13. topk: 4
  14. image_shape: [3, 224, 224]
  15. LEARNING_RATE:
  16. function: 'Cosine'
  17. params:
  18. lr: 0.0125
  19. OPTIMIZER:
  20. function: 'Momentum'
  21. params:
  22. momentum: 0.9
  23. regularizer:
  24. function: 'L2'
  25. factor: 0.00001
  26. TRAIN:
  27. batch_size: 32
  28. num_workers: 0
  29. file_list: "./dataset/cassava-leaf-disease-classification/train.txt"
  30. data_dir: "./dataset/cassava-leaf-disease-classification/train_images/"
  31. shuffle_seed: 0
  32. transforms:
  33. - DecodeImage:
  34. to_rgb: True
  35. to_np: False
  36. channel_first: False
  37. - RandCropImage:
  38. size: 224
  39. - RandFlipImage:
  40. flip_code: 1
  41. - NormalizeImage:
  42. scale: 1./255.
  43. mean: [0.485, 0.456, 0.406]
  44. std: [0.229, 0.224, 0.225]
  45. order: ''
  46. - ToCHWImage:
  47. VALID:
  48. batch_size: 20
  49. num_workers: 0
  50. file_list: "./dataset/cassava-leaf-disease-classification/val_list.txt"
  51. data_dir: "./dataset/cassava-leaf-disease-classification/train_images/"
  52. shuffle_seed: 0
  53. transforms:
  54. - DecodeImage:
  55. to_rgb: True
  56. to_np: False
  57. channel_first: False
  58. - ResizeImage:
  59. resize_short: 256
  60. - CropImage:
  61. size: 224
  62. - NormalizeImage:
  63. scale: 1.0/255.0
  64. mean: [0.485, 0.456, 0.406]
  65. std: [0.229, 0.224, 0.225]
  66. order: ''
  67. - ToCHWImage:
-c ./configs/quick_start/ResNet50_vd.yaml

模型微调-基于ResNet101_vd预训练模型:

采用预训练的模型的方式的

ResNet101_vd_ssld_pretrained.pdparams获取:

python tools/download.py -a ResNet101_vd_ssld_pretrained -p ./pretrained -d True

模型的获取:

https://paddleclas.readthedocs.io/zh_CN/latest/models/models_intro.html

训练的配置文件

  1. mode: 'train'
  2. ARCHITECTURE:
  3. name: 'ResNet101_vd'
  4. pretrained_model: "./pretrained/ResNet101_vd_ssld_pretrained"
  5. model_save_dir: "./output/"
  6. classes_num: 4
  7. total_images: 17117
  8. save_interval: 1
  9. validate: True
  10. valid_interval: 1
  11. epochs: 200
  12. topk: 4
  13. image_shape: [3, 224, 224]
  14. use_mix: True
  15. ls_epsilon: 0.1
  16. LEARNING_RATE:
  17. function: 'Cosine'
  18. params:
  19. lr: 0.1
  20. OPTIMIZER:
  21. function: 'Momentum'
  22. params:
  23. momentum: 0.9
  24. regularizer:
  25. function: 'L2'
  26. factor: 0.000100
  27. TRAIN:
  28. batch_size: 32
  29. num_workers: 0
  30. file_list: "./dataset/cassava-leaf-disease-classification/train_list.txt"
  31. data_dir: "./dataset/cassava-leaf-disease-classification/train_images/"
  32. shuffle_seed: 0
  33. transforms:
  34. - DecodeImage:
  35. to_rgb: True
  36. to_np: False
  37. channel_first: False
  38. - RandCropImage:
  39. size: 224
  40. - RandFlipImage:
  41. flip_code: 1
  42. - NormalizeImage:
  43. scale: 1./255.
  44. mean: [0.485, 0.456, 0.406]
  45. std: [0.229, 0.224, 0.225]
  46. order: ''
  47. - ToCHWImage:
  48. mix:
  49. - MixupOperator:
  50. alpha: 0.2
  51. VALID:
  52. batch_size: 32
  53. num_workers: 0
  54. file_list: "./dataset/cassava-leaf-disease-classification/val_list.txt"
  55. data_dir: "./dataset/cassava-leaf-disease-classification/train_images/"
  56. shuffle_seed: 0
  57. transforms:
  58. - DecodeImage:
  59. to_rgb: True
  60. to_np: False
  61. channel_first: False
  62. - ResizeImage:
  63. resize_short: 256
  64. - CropImage:
  65. size: 224
  66. - NormalizeImage:
  67. scale: 1.0/255.0
  68. mean: [0.485, 0.456, 0.406]
  69. std: [0.229, 0.224, 0.225]
  70. order: ''
  71. - ToCHWImage:

SSLD模型微调-基于ResNet50_vd_ssld预训练模型:

尝试更多的模型结构-MobileNetV3

数据增广的尝试-RandomErasing

知识蒸馏

模型的优化与设计

博文参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/372797
推荐阅读
相关标签
  

闽ICP备14008679号