当前位置:   article > 正文

百度松果飞浆大作业--图像分类_百度松果大作业

百度松果大作业

一、问题背景        

        基于Caltech数据集的图像分类,Caltech101包含101个目标类+背景类,每种类别大约40到800个图像,训练集总计7999图像。本次试题需要图片为输入,通过课程学习的分类方法(支持向量机、深度神经网络、卷积神经网络等)从中识别该图像属于哪一个类别。

二、代码实现

2.1数据预处理

2.1.1解压数据集

!unzip /home/aistudio/data/data146107/dataset.zip -d /home/aistudio/data

2.1.2导入所需的包

  1. # 导入需要的包
  2. import paddle
  3. import os
  4. import numpy as np
  5. from PIL import Image
  6. import matplotlib.pyplot as plt
  7. import sys
  8. import pickle
  9. from paddle.vision.transforms import ToTensor
  10. import paddle.nn.functional as F
  11. print("本教程基于Paddle的版本号为:"+paddle.__version__)
  12. # 本方案基于paddlepaddle2.2.2实现

2.1.3划分好数据集

  1. from sklearn.utils import shuffle
  2. total_list = []
  3. # 打开 train.txt 文件并读取内容
  4. f = open('/home/aistudio/data/dataset/train.txt', 'r', encoding='utf-8')
  5. total_list = f.readlines()
  6. f.close()
  7. # 随机打乱数据
  8. total_list = shuffle(total_list, random_state=100)
  9. # 确定训练集和验证集的长度
  10. train_len = int(0.85 * 7999)
  11. # 划分训练集和验证集
  12. train_list = total_list[:train_len]
  13. val_list = total_list[train_len:]
  14. # 打开 train1.txt 和 val.txt 文件用于写入
  15. f1 = open('/home/aistudio/data/dataset/train1.txt', 'w', encoding='utf-8')
  16. f2 = open('/home/aistudio/data/dataset/val.txt', 'w', encoding='utf-8')
  17. # 将训练集写入 train1.txt 文件
  18. for line in train_list:
  19. f1.write(line)
  20. # 将验证集写入 val.txt 文件
  21. for line in val_list:
  22. f2.write(line)
  23. # 关闭文件
  24. f1.close()
  25. f2.close()

2.1.4提取标签label

  1. # 打开 label.txt 文件用于写入
  2. f3 = open('/home/aistudio/data/dataset/label.txt', 'w', encoding='utf-8')
  3. # 打开 class.txt 文件用于读取
  4. f = open('/home/aistudio/data/dataset/class.txt', 'r', encoding='utf-8')
  5. # 逐行读取 class.txt 文件内容
  6. for line in f.readlines():
  7. # 去除每行两端的空白符并按制表符 '\t' 分割字符串,获取标签名称和标签ID
  8. label_name, label_id = line.strip().split('\t')
  9. # 将标签名称写入 label.txt 文件,并在每个标签后添加换行符
  10. f3.write(label_name + '\n')
  11. # 关闭 label.txt 文件
  12. f3.close()

 2.1.5安装paddlex(最新版)

!pip install paddlex

2.1.6数据增强

  1. from paddlex import transforms as T
  2. # 训练集数据变换列表
  3. train_transforms = T.Compose([
  4. T.RandomHorizontalFlip(), # 随机水平翻转
  5. T.RandomVerticalFlip(), # 随机垂直翻转
  6. T.MixupImage(alpha=1.5, beta=1.5, mixup_epoch=-1), # Mixup增强,alpha和beta调整混合强度,mixup_epoch设置为-1表示在所有训练时期都应用Mixup
  7. T.RandomBlur(prob=0.1), # 以0.1的概率对图像进行随机模糊处理
  8. T.RandomDistort(), # 随机扭曲图像
  9. T.Normalize(), # 图像归一化处理
  10. T.Resize(224) # 调整图像大小为224x224像素
  11. ])
  12. # 评估集数据变换列表
  13. eval_transforms = T.Compose([
  14. T.Normalize(), # 图像归一化处理
  15. T.Resize(224) # 调整图像大小为224x224像素
  16. ])

        如果这一步发生报错请将pyarrow包降版本为0.17.0版本或更高一点点的版本。0.17.0版本测试是可以通过的。

2.1.7构建数据集

  1. import paddlex as pdx
  2. # 创建训练集
  3. train_dataset = pdx.datasets.ImageNet(
  4. data_dir='/home/aistudio/data/dataset/images/', # 数据集存储路径
  5. file_list='/home/aistudio/data/dataset/train1.txt', # 训练集文件列表路径
  6. label_list='/home/aistudio/data/dataset/label.txt', # 标签文件路径
  7. transforms=train_transforms, # 训练集数据变换方式
  8. shuffle=True # 是否对数据进行随机打乱
  9. )
  10. # 创建验证集
  11. eval_dataset = pdx.datasets.ImageNet(
  12. data_dir='/home/aistudio/data/dataset/images/', # 数据集存储路径
  13. file_list='/home/aistudio/data/dataset/val.txt', # 验证集文件列表路径
  14. label_list='/home/aistudio/data/dataset/label.txt', # 标签文件路径
  15. transforms=eval_transforms # 验证集数据变换方式
  16. )
  17. # 创建总数据集(包含训练集和验证集)
  18. total_dataset = pdx.datasets.ImageNet(
  19. data_dir='/home/aistudio/data/dataset/images/', # 数据集存储路径
  20. file_list='/home/aistudio/data/dataset/train.txt', # 总数据集文件列表路径
  21. label_list='/home/aistudio/data/dataset/label.txt', # 标签文件路径
  22. transforms=train_transforms, # 总数据集数据变换方式
  23. shuffle=True # 是否对数据进行随机打乱
  24. )

2.2模型训练

2.2.1设置超参数并训练

  1. num_classes = len(train_dataset.labels) # 获取数据集的类别数量,用于模型的输出类别数
  2. # 使用 PaddleX 提供的 ResNet101_vd_ssld 模型,传入类别数作为参数
  3. model = pdx.cls.ResNet101_vd_ssld(num_classes=num_classes)
  4. # 对模型进行训练
  5. model.train(num_epochs=50, # 训练的轮数
  6. train_dataset=train_dataset, # 训练集数据
  7. train_batch_size=64, # 训练时的批量大小
  8. eval_dataset=eval_dataset, # 验证集数据
  9. lr_decay_epochs=[10, 20, 30], # 学习率衰减的时期
  10. save_dir='output/resnet101_ssld', # 模型和日志保存的路径
  11. label_smoothing=True, # 是否使用标签平滑(减少过拟合)
  12. use_vdl=True) # 是否使用可视化工具进行训练过程的监控和记录

2.2.2测试验证集效果

  1. model = pdx.load_model('output/resnet101_ssld//best_model') # 导入效果最好的模型
  2. model.evaluate(eval_dataset, batch_size=1, return_details=True) # 验证集结果

2.2.3测试全部数据集

  1. # 对模型进行更多轮次的训练(总共 15 轮)
  2. model.train(num_epochs=15, # 训练的轮数
  3. train_dataset=total_dataset, # 使用全部数据集进行训练
  4. train_batch_size=64, # 训练时的批量大小
  5. eval_dataset=eval_dataset, # 验证集数据
  6. lr_decay_epochs=[4, 6, 8], # 学习率衰减的时期
  7. save_dir='output/resnet101_ssld1', # 模型和日志保存的路径
  8. label_smoothing=True, # 是否使用标签平滑(减少过拟合)
  9. use_vdl=True) # 是否使用可视化工具进行训练过程的监控和记录

2.2.4预测测试集

  1. # 导入最佳模型以进行预测
  2. model = pdx.load_model('output/resnet101_ssld/best_model') # 加载第一次训练最佳模型
  3. #model = pdx.load_model('output/resnet101_ssld1/best_model') # 加载第二次训练最佳模型
  4. test_path = "/home/aistudio/data/dataset/images/" # 测试集图片路径
  5. test_files = []
  6. # 读取测试集文件列表
  7. f = open('/home/aistudio/data/dataset/test.txt', 'r', encoding='utf-8')
  8. for line in f.readlines():
  9. test_files.append(test_path + line.strip()) # 将测试集文件路径添加到列表中
  10. f.close()
  11. # 使用模型进行预测
  12. result = model.predict(img_file=test_files, transforms=eval_transforms) # 对测试集图片进行预测
  13. print("Predict Result:\n", result) # 打印预测结果

2.3.5将结果写入result.txt文件

  1. f = open('/home/aistudio/result.txt', 'w', encoding='utf-8') # 打开文件用于写入预测结果
  2. k = 0
  3. # 遍历预测结果并写入文件
  4. for d in result:
  5. img_name = test_files[k].split('/')[-1] # 获取图片文件名
  6. f.write(img_name + '\t' + str(d[0]['category_id']) + '\n') # 写入图片名和对应的预测类别ID
  7. k += 1
  8. f.close() # 关闭文件

三、项目地址

github:百度松果飞浆大作业--图像分类

paddlepaddle:百度松果飞浆大作业--图像分类

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

闽ICP备14008679号