30万图像1081类植物细分类数据集,注意是分类数据,没有检测框信息共33GB,该数据集具有高度内在歧义和长尾分布,可用于细分类识别任务,含训练代码
物细分类数据集介绍
数据集概览
- 总大小: 33GB
- 图像数量: 300,000张
- 类别数量: 1081类
- 任务类型: 图像分类
- 标注情况: 所有图像均已分类标注完成
- 数据特性:
- 高度内在歧义: 不同植物种类之间可能存在相似性,导致分类难度增加。
- 长尾分布: 部分类别可能有大量的样本,而另一些类别则只有少量样本。
类别划分
该数据集包含1081种不同的植物类别。由于类别数量较多,这里不一一列出具体类别名称。每个类别都经过专业人员的验证和标注,确保标签的准确性。
数据集结构
假设数据集文件夹结构如下:
plant_fine_classification_dataset/
├── train/
│ ├── class_0000/
│ ├── class_0001/
│ ├── ...
│ └── class_1080/
├── val/
│ ├── class_0000/
│ ├── class_0001/
│ ├── ...
│ └── class_1080/
├── test/
│ ├── class_0000/
│ ├── class_0001/
│ ├── ...
│ └── class_1080/
└── README.md
train/
,val/
,test/
目录分别存放训练集、验证集和测试集的图像。- 每个子目录对应一个具体的类别,例如
class_0000/
表示第0类植物。 README.md
文件包含数据集的使用说明和字段解释。
使用场景
- 细分类识别: 用于自动识别不同种类的植物。
- 生态研究: 帮助研究人员快速识别和分类大量的植物样本。
- 智能农业: 结合其他技术如无人机监控,实现大规模农田的自动化管理。
- 教育工具: 作为教学资源,帮助学生学习和识别不同种类的植物。
Keras 训练代码示例
以下是一个使用Keras框架进行模型训练的代码示例。我们将使用预训练的EfficientNetB7模型作为基础,并在其上添加全连接层来进行分类。考虑到数据集的长尾分布,我们还将使用一些技巧来处理类别不平衡问题。
import os
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.applications.efficientnet import EfficientNetB7
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.models import Model
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint, ReduceLROnPlateau
from sklearn.utils.class_weight import compute_class_weight
# 数据集路径
data_dir = '/path/to/plant_fine_classification_dataset'
train_dir = os.path.join(data_dir, 'train')
val_dir = os.path.join(data_dir, 'val')
# 图像生成器
datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest'
)
# 训练集生成器
train_generator = datagen.flow_from_directory(
train_dir,
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
# 验证集生成器
val_generator = datagen.flow_from_directory(
val_dir,
target_size=(224, 224),
batch_size=32,
class_mode='categorical'
)
# 计算类别权重
class_weights = compute_class_weight(class_weight='balanced', classes=np.unique(train_generator.classes), y=train_generator.classes)
class_weights = dict(enumerate(class_weights))
# 加载预训练的EfficientNetB7模型
base_model = EfficientNetB7(weights='imagenet', include_top=False, input_shape=(224, 224, 3))
# 添加全局平均池化层
x = base_model.output
x = GlobalAveragePooling2D()(x)
# 添加全连接层
x = Dense(1024, activation='relu')(x)
predictions = Dense(1081, activation='softmax')(x) # 1081个类别
# 构建最终模型
model = Model(inputs=base_model.input, outputs=predictions)
# 冻结基础模型的层
for layer in base_model.layers:
layer.trainable = False
# 编译模型
model.compile(optimizer=Adam(lr=0.0001), loss='categorical_crossentropy', metrics=['accuracy'])
# 打印模型概要
model.summary()
# 设置回调函数
early_stopping = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
checkpoint = ModelCheckpoint('best_plant_classification_model.h5', save_best_only=True, monitor='val_accuracy', mode='max')
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=5, min_lr=1e-6)
# 训练模型
history = model.fit(
train_generator,
steps_per_epoch=len(train_generator),
epochs=50,
validation_data=val_generator,
validation_steps=len(val_generator),
callbacks=[early_stopping, checkpoint, reduce_lr],
class_weight=class_weights
)
# 保存模型
model.save('plant_classification_model.h5')
# 可视化训练过程
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.legend()
plt.title('Accuracy')
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.title('Loss')
plt.show()
代码说明
-
数据生成器:
- 使用
ImageDataGenerator
进行数据增强,包括旋转、平移、剪切、缩放和水平翻转等操作。 train_generator
和val_generator
分别为训练集和验证集生成器。
- 使用
-
计算类别权重:
- 使用
compute_class_weight
函数计算类别权重,以处理长尾分布问题。
- 使用
-
模型构建:
- 使用预训练的EfficientNetB7模型作为基础。
- 在其基础上添加全局平均池化层和全连接层。
- 最后一层使用softmax激活函数,输出1081个类别的概率分布。
-
模型编译:
- 使用Adam优化器,学习率为0.0001。
- 损失函数为交叉熵损失,评估指标为准确率。
-
模型训练:
- 使用
fit
方法进行训练,设置早停机制、最佳模型保存和学习率衰减。 - 使用类别权重来处理类别不平衡问题。
- 训练过程中会记录训练集和验证集的准确率和损失。
- 使用
-
可视化:
- 训练完成后,绘制训练集和验证集的准确率和损失曲线,帮助分析模型的训练效果。