30万张图像、1081类植物的细分类数据集

深度学习11 — ResNet-50 算法实战与解析 ResNet-50 算法实战与解析 阅读详情

在这里插入图片描述
对于一个包含30万张图像、1081类植物的细分类数据集,您需要设置一个高效的图像分类系统。这个数据集具有高度内在歧义和长尾分布的特点,因此在设计模型时需要特别注意这些挑战。以下是如何准备和训练这样一个大规模分类数据集的步骤。、在这里插入图片描述

30万图像1081类植物细分类数据集,注意是分类数据,没有检测框信息共33GB,该数据集具有高度内在歧义和长尾分布,可用于细分类识别任务,含训练代码在这里插入图片描述

1. 环境准备

确保安装了必要的库和工具:

pip install torch torchvision
pip install numpy
pip install matplotlib
pip install opencv-python
pip install pyyaml
pip install albumentations
pip install scikit-learn

2. 数据集准备

假设您的数据集目录结构如下:

plant_classification_dataset/
├── train/
│   ├── class_0/
│   ├── class_1/
│   └── ...
├── val/
│   ├── class_0/
│   ├── class_1/
│   └── ...
└── plant_data.yaml

每个子文件夹代表一个类别,其中包含了该类别的所有图像。

3. 创建数据集配置文件

创建一个 plant_data.yaml 文件,内容如下:

train: ../plant_classification_dataset/train
val: ../plant_classification_dataset/val

nc: 1081  # 总共有1081个类别
names: ['class_0', 'class_1', ..., 'class_1080']  # 填充所有类别名称

4. 准备数据加载器

使用PyTorch的数据加载器来读取图像和标签,并进行数据增强。

import os
from torch.utils.data import Dataset, DataLoader
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
from torchvision import transforms
from PIL import Image

class PlantClassificationDataset(Dataset):
    def __init__(self, data_dir, transform=None):
        self.data_dir = data_dir
        self.transform = transform
        self.classes = sorted(os.listdir(data_dir))
        self.class_to_idx = {cls_name: i for i, cls_name in enumerate(self.classes)}
        self.images = []
        self.labels = []

        for cls_name in self.classes:
            cls_dir = os.path.join(data_dir, cls_name)
            for img_name in os.listdir(cls_dir):
                img_path = os.path.join(cls_dir, img_name)
                self.images.append(img_path)
                self.labels.append(self.class_to_idx[cls_name])

    def __len__(self):
        return len(self.images)

    def __getitem__(self, idx):
        img_path = self.images[idx]
        image = Image.open(img_path).convert('RGB')
        label = self.labels[idx]

        if self.transform:
            image = self.transform(image)

        return image, label

# 数据增强
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(15),
    transforms.ToTensor(),
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

# 创建数据加载器
train_dataset = PlantClassificationDataset(train_data_dir, transform=transform)
val_dataset = PlantClassificationDataset(val_data_dir, transform=transform)

train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=4)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False, num_workers=4)

5. 定义模型

您可以选择多种预训练模型作为基础,例如ResNet、EfficientNet等。这里我们以ResNet50为例。

import torch
import torch.nn as nn
import torchvision.models as models

class PlantClassifier(nn.Module):
    def __init__(self, num_classes=1081):
        super(PlantClassifier, self).__init__()
        self.base_model = models.resnet50(pretrained=True)
        self.base_model.fc = nn.Linear(self.base_model.fc.in_features, num_classes)

    def forward(self, x):
        return self.base_model(x)

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = PlantClassifier(num_classes=1081).to(device)

6. 训练模型

编写训练循环来训练模型。

import torch.optim as optim
from torch.utils.tensorboard import SummaryWriter
from datetime import datetime

criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=1e-4)
scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)

writer = SummaryWriter(f"runs/{datetime.now().strftime('%Y%m%d-%H%M%S')}")

num_epochs = 50
for epoch in range(num_epochs):
    model.train()
    running_loss = 0.0
    for i, (images, labels) in enumerate(train_loader):
        images, labels = images.to(device), labels.to(device)
        optimizer.zero_grad()
        outputs = model(images)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()

        if (i + 1) % 10 == 0:
            print(f'Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}')
            writer.add_scalar('Training Loss', loss.item(), epoch * len(train_loader) + i)

    # 验证阶段
    model.eval()
    with torch.no_grad():
        correct = 0
        total = 0
        for images, labels in val_loader:
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
        val_accuracy = 100 * correct / total
        print(f'Validation Accuracy: {val_accuracy:.2f}%')
        writer.add_scalar('Validation Accuracy', val_accuracy, epoch)

    scheduler.step()

    # 保存模型
    torch.save(model.state_dict(), f'models/plant_classifier_epoch_{epoch+1}.pth')

writer.close()

7. 评估模型

训练完成后,您可以使用以下代码来评估模型在验证集上的性能。

def evaluate_model(model, dataloader, device):
    model.eval()
    with torch.no_grad():
        correct = 0
        total = 0
        for images, labels in dataloader:
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
        accuracy = 100 * correct / total
        print(f'Accuracy: {accuracy:.2f}%')

evaluate_model(model, val_loader, device)

8. 处理长尾分布

由于数据集具有长尾分布,可以考虑以下策略来改善模型性能:

  • 类别平衡:使用加权损失函数或重采样技术(如过采样少数类)。
  • 数据增强:为少数类生成更多样本。
  • 迁移学习:利用预训练模型并在新任务上微调。
  • 混合专家模型(MoE):针对不同类别的数据训练多个专家模型。
  • 元学习:使用元学习方法来提高对少数类的泛化能力。

9. 总结

以上步骤展示了如何使用ResNet50对大规模植物细分类数据集进行分类。可以根据需要调整模型架构、数据增强策略和训练参数,以获得更好的性能

【图像分类】实战篇 (2)5分钟学会用迁移学习ResNet50训练自己的图像分类模型(鸟类识别为例) 此项目主要是小白入门教学,项目可以直接运行,需要请私信!!!图像分类是深度学习图像处理领域最基本的识别任务。先上结果。 阅读详情

相关推荐

实践 | 基于ResNet-50实现CIFAR10数据集分类

dog测成airplane,厉害了

jiangti_ng的博客 3988

深度学习pytorch实战六:ResNet50网络图像分类篇自建花数据集图像分类(5类)超详细代码

1.数据集简介、训练集与测试集划分 2.模型相关知识 3.model.py——定义ResNet50网络模型 4.train.py——加载数据集并训练,训练集计算损失值loss,测试集计算accuracy,保存训练好的网络参数 5.predict.py——利用训练好的网络参数后,用自己找的图像进行分类测试

qq_55433305的博客 2万+

R-FCN+ResNet-50用自己的数据集训练模型(python版本)

说明: 本文假设你已经做好数据集,格式和VOC2007一致,并且Linux系统已经配置好caffe所需环境(博客里教程很多),下面是训练的一些修改。 py-R-FCN源码下载地址: https://github.com/Orpine/py-R-FCN 也有Matlab版本: https://github.com/daijifeng001/R-FCN 本文用到的是pyth

小咸鱼_的博客 5万+

ResNet50:通过构建ResNet训练自己的数据集

然后就到了最重要的构建resnet50网络的环节,如果要使用预训练的训练权重有完全不同的方法,预训练的权重在torchvision上有传入的代码,imagenet同理也有。先进行设备检查,tensorflow和pytorch的cuda不一样,pytorch上的cuda有效不代表tf上就可以。加载训练集和验证集,由于imagenet上的训练集很大,可以直接从训练集中划分,或者使用自带的验证集。数据集选择imagenet上的100类别,可以直接下载,不用额外传入。

2302_82050581的博客 3006

【使用自己的数据集】ResNet50 模型准备与模型训练

ResNet通过引入残差结构解决了深度网络的退化问题,其主要创新点包括跨层连接和残差学习。残差结构使得网络能够更轻松地学习恒等映射,解决了梯度消失和优化困难问题。该网络采用瓶颈设计降低参数数量,适用于多种计算机视觉任务。实验表明,残差连接有效提升了深层网络的性能,训练误差和测试误差均得到改善。ResNet的关键优势在于不增加计算复杂度的情况下加深网络深度,通过简化学习目标实现更好的特征提取。在Fruits-360数据集上的应用验证了该方法的有效性。

2501_92015334的博客 1418

深度学习(五):pytorch迁移学习之resnet50

迁移学习是一种机器学习方法,它通过将已经在一个任务上学习到的知识应用到另一个相关任务上,来改善模型的性能。迁移学习可以解决数据不足或标注困难的问题,同时可以加快模型的训练速度。迁移学习的核心思想是将源领域的知识迁移到目标领域中。源领域是已经有大量标注数据的领域,而目标领域是需要解决的新问题。通过迁移学习,源领域的知识可以帮助目标领域的学习过程,提高模型的泛化能力和性能。迁移学习可以通过多种方式实现,包括特征提取、模型微调和领域自适应等方法。

m0_68926749的博客 1万+

用Resnet50训练自己数据集

resnet分类

Chenzhinan1219的博客 6239

最新 抖音 X-Gorgon 0408 和8408 设备注册协议

抖音app先是检测了你的手机cpu架构,是x86还是armeabi,通过cpu架构的不同来调用so内不同的xg方法,所以导致现在最新版抖音app的xg算法有0408和8408两种。两种都是最新版,因为我发现当我使用oppo手机安装最新版抖音抓包的xg是8408,而当我用小米或者华为安装最新版抖音,抓包以后发现xg是0408。抖音IOS XG84 设备注册激活协议代码片段。...

Q44804487的博客 1万+

如何使用ResNet50对大规模植物细分类数据集进行分类30万图像1081类植物细分类数据集,分类数据,没有检测框信息共33GB,具有高度内在歧义和长尾分布,可用于细分类识别任务,附训练代码

如何使用ResNet50对大规模植物细分类数据集进行分类30万图像1081类植物细分类数据集,分类数据,没有检测框信息共33GB,具有高度内在歧义和长尾分布,可用于细分类识别任务,附训练代码

2401_88440984的博客 541

手把手教你搞定EMC EFT测试:从电源线到信号线的完整整改实战(附常见失败原因)

本文详细解析了EMC EFT测试中的常见问题及整改措施,从电源线到信号线的完整实战方案。通过四步定位法和成本最优整改策略,帮助工程师有效应对电快速脉冲群干扰,提升产品通过率并降低成本。

weixin_30920597的博客 498

Altium Designer差分走线实战:从规则设置到阻抗匹配的完整流程

本文详细讲解了在Altium Designer中进行差分走线的完整实战流程,涵盖从原理图定义差分对、PCB布局管理、关键设计规则设置,到利用阻抗计算工具确定线宽与间距,以及布线技巧与等长处理等核心步骤。文章旨在帮助工程师掌握高速PCB设计中差分信号传输的关键技术,确保信号完整性并实现精确的阻抗匹配。

weixin_29163857的博客 255

植物识别新革命 —— PlantNet-300K 开源项目深度解读与应用探索

在数字化时代的浪潮中,科技不仅改变了我们的生活方式,更赋予了我们认识自然的新视角。PlantNet-300K 正是这样一款融合了人工智能与生态学的创新项目,它为植物识别领域带来了前所未有的突破和机遇。 ## ???? 项目介绍:一窥大自然的秘密宝库 PlantNet-300K 是一个开放的数据集与基准平台,专注于收集和解析庞大的植物图像数据库。项目涵盖了超过30万张高质量植物图片,涉及1081个不同...

gitblog_00007的博客 1189

CentOS 7 离线升级 OpenSSH 9.9p2 保姆级教程(含依赖包下载与常见报错解决)

本文提供了一份详尽的CentOS 7系统离线升级OpenSSH至9.9p2版本的完整教程。针对无外网环境,重点讲解了依赖包(尤其是OpenSSL 3.x)的离线下载与编译部署,并深入解决了编译过程中常见的“libcrypto.so缺失”等动态库链接错误。教程涵盖从环境准备、源码编译、服务配置到系统集成的全流程,最后还提供了关键的回滚方案与应急预案,是运维人员在内网环境中进行安全加固的实用指南。

weixin_29248313的博客 323

resnet-50介绍(一)

这篇文章讲解的是使用Tensorflow实现残差网络resnet-50. 侧重点不在于理论部分,而是在于代码实现部分。在github上面已经有其他的开源实现,如果希望直接使用代码运行自己的数据,不建议使用本人的代码。但是如果希望学习resnet的代码实现思路,那么阅读本文将是一个不错的选择,因为本文的代码的思路是很清晰的。如果你刚刚阅读完resnet的那篇论文,非常建议你进一步学习如何使用代码实现resnet。本文包含源码的数据集。 resnet只是在CNN上面增加了shortcut,所以,resnet

2万+

HFSS 3D Layout仿真PCB操作说明

本文介绍一种特别适合PCB这种叠层结构的仿真软件,HFSS 3D Layout既有操作的简便性,又有同3D软件仿真所有的精确性,仿真速度上又比3D软件快很多。

sinat_15150363的博客 3938

AUTOSAR进阶图解==>AUTOSAR_EXP_VFB

AUTOSAR虚拟功能总线(VFB)摘要 AUTOSAR虚拟功能总线(VFB)是汽车开放系统架构中的核心抽象概念,为分布式电子系统提供统一通信模型。VFB允许软件组件在不了解底层物理通信机制的情况下交互,通过运行时环境(RTE)实现组件间的数据交换。系统配置过程将抽象的VFB视图转换为具体实现,包括组件到ECU的映射和通信机制选择。VFB采用"last-is-best"语义进行数据通信,并支持模式管理机制,使组件能根据系统状态调整行为。此外,VFB还支持与非AUTOSAR系统的交互,通常

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1117

AI项目十七:ResNet50训练部署教程

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。

3456

AEJoy —— 表达式之仅限在某一维摆动【JS】

效果图 wiggle() 的作用仅限于水平方向 想法 wiggle() 确实是一个非常方便的工具,但有时您希望对它有更多的控制。在本例中,我们希望仅将摆动限制在水平方向。 设计 要理解 wiggle() 最重要的一点是,它生成的结果与应用它的属性具有相同的维度。例如,如果你将 wiggle() 应用于 3D 层的 position 属性,结果将是一个由三个元素组成的数组(x、y 和 z 各一个)。我们需要做的就是将 wiggle() 的结果捕捉到一个变量(我们称之为 “w” ),然后从这个变量中提取我们想

ShaderJoy 的兴趣技术杂货铺 2094

【神经网络】(5) 卷积神经网络(ResNet50),案例:艺术画作10分类,附数据集

各位同学好,今天和大家分享一下TensorFlow2.0中如何构建卷积神经网络ResNet-50,案例内容:现在收集了10位艺术大师的画作,采用卷积神经网络判断某一幅画是哪位大师画的。 数据集:https://pan.baidu.com/share/init?surl=cWMvsl37MOZdxnoOjSGoNQ 提取码: 2h5x 1. 数据加载 在文件夹中将图片按照训练集、验证集、测试集划分好之后,使用tf.keras.preprocessing.image_dataset_from_direc

博观而约取,厚积而薄发 6813

财务数智化——解读224页 2025年数智技术业财融合应用蓝皮书【附全文阅读】

《数智技术赋能业财融合蓝皮书》面向企业管理者及数字化转型从业者,系统阐述数智技术在业财融合中的应用。全书围绕技术基础(定义、分类、发展趋势)、融合框架(三阶段路径与三层价值)、七大行业应用场景(涵盖核算自动化、智能收款、项目管控等)、关键技术(AI、大数据等)及实施要点(组织协同、数据治理等),通过典型案例为企业提供从技术到实践的全面指导,助力实现数据贯通与价值创造。

cdfunlove的博客 1747

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

植物叶片病害检测与识别:基于GA-RPN与ResNet50的深度学习模型实现

本文提出了一种基于改进GA-RPN与ResNet50的深度学习模型,用于植物叶片病害的高效检测与识别。针对传统病害检测方法效率低、主观性强的问题,该模型通过遗传算法优化区域提议网络(RPN)的锚框参数,结合ResNet50强大的特征提取能力,显著提升了检测精度。实验结果表明,在PlantVillage数据集上,该模型的mAP达到0.907,比传统Faster R-CNN提升2.4%,同时保持22.5 FPS的检测速度。消融实验验证了GA-RPN和ResNet50对性能提升的关键作用。该研究为农业病害智能化检

Piar1231sdafa的博客 1386

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

resnet50训练部署教程

ResNet50网络是2015年由微软实验室的何恺明提出,获得ILSVRC2015图像分类竞赛第一名。在ResNet网络提出之前,传统的卷积神经网络都是将一系列的卷积层和池化层堆叠得到的,但当网络堆叠到一定深度时,就会出现退化问题。残差网络的特点是容易优化,并且能够通过增加相当的深度来提高准确率。其内部的残差块使用了跳跃连接,缓解了在深度神经网络中增加深度带来的梯度消失问题。本教程基于图像分类算法ResNet50的训练和部署到EASY-EAI-Nano(RV1126)进行说明。模型转换测试Demo由和。

胭脂草的ABC博客 2030

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习-ResNet-50实现目标检测(基于Pascal VOC数据集)

残差块中,利用跳跃连接的方式将输入的恒等映射直接加到后续的输出中,从而使得网络直接可以学习到对输入的差异性特征,避免这些信息因为多网络层的堆叠而丢失。残差块中,利用跳跃连接的方式将输入的恒等映射直接加到后续的输出中,从而使得网络直接可以学习到对输入的差异性特征,避免这些信息因为多网络层的堆叠而丢失。解压训练集和测试集之后,我们开始处理数据了,我看了下图片接近5000张,这个如果一次性加载的话,贫穷的我应该加载不了吧,OOM应该是肯定的。86%的正确率,这样的正确率还有上升的空间,不过这不重要。

xingxingzhilong的专栏 4470

ResNet-18 赋能智能舌诊:实现中医舌象自动化分类!

本文介绍了一个基于 ResNet-18 深度神经网络的智能舌诊分类系统,通过创新融合深度学习与中医舌诊理论,实现了舌苔图像的自动化分类与智能分析。项目针对传统舌诊主观性强、效率低的痛点,构建了包含 6 类舌苔(黑苔、地图舌、紫苔等)的高精度识别模型,结合中医证候知识库提供辅助诊断报告,并开发了可视化交互界面。技术上采用数据增强与迁移学习策略,在 2000 + 标注数据集上达到 98.7% 的验证准确率,单张图像处理速度小于 0.1 秒。

weixin_52459277的博客 2684
上一篇: 如何使用PyTorch对含525种鸟类数据集进行图像分类任务鸟类分类图像数据集的训练及应用,鸟类分类图像分类数据集,鸟类数据集
下一篇: 水果蔬菜数据集
DeepLearningYolo
博客等级 码龄1年 94粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值