首页 > 分享 > 【机器学习基础实践】102类花朵数据分类

【机器学习基础实践】102类花朵数据分类

一、项目背景

项目目的

       本项目任务是将102Category Flower Dataset数据集中的花卉图片进行分类识别。该数据集由102类产自英国的花卉组成,每类由40-258张图片组成,总共包含8189张jpg图片。项目目标是使用分类识别方法对这些图片进行分类,得到各个类别的最终分类识别率,并对分类结果进行可视化展示。

项目介绍

       数据集网址:Visual Geometry Group - 牛津大学 (ox.ac.uk)页面共有5个可供下载项,本项目主要用到了Dataset images(数据集),The image labels(图像标签),The data splits(数据集分割指定),通过查阅资料,最终选择使用深度学习中的卷积神经网络(CNN)算法,该算法十分适于图像分类识别,最终生成了分类报告和混淆矩阵,并且随机选择了一些正确和错误分类的图像进行可视化展示。

二、数据集分割

imagelabels.mat:总共有8189列,每列上的数字代表图像类别标签。

setid.mat:

trnid.mat:总共有1020列,每10列为一类花卉的图片,每列上的数字代表图片号。

valid.mat:总共有1020列,每10列为一类花卉的图片,每列上的数字代表图片号。

tstid.mat:总共有6149列,每一类花卉的列数不定,每列上的数字代表图片

由于调高训练集占比有利于提高训练模型的性能,我选择将tstid.mat对应分割出来的图片集为训练集,trnid.mat对应分割出来的图片集为测试集,valid.mat对应分割出来的图片集为验证集。

实现流程:

1、定义数据根目录:指定代码所在目录下的数据集根目录。

2、加载MAT文件:读取setid.mat文件,该文件包含训练集、验证集和测试集的图片编号信息;读取imagelabels.mat文件,获取图片的标签信息

3、定义数据集和图片编号映射:创建一个字典datasets,将数据集的名称(‘train’、‘validation’、‘test’)映射到对应的图片编号。这将原本的测试集(tstid)作为训练集,将原本的训练集(trnid)作为测试集。

4、组织数据集:遍历datasets字典,创建目标文件夹。

5、复制图片:使用shutil.copy函数将原始图片从源文件夹复制到之前创建的目标文件夹中,完成数据集分割

import os

import scipy.io

from shutil import copy

data_root = '.'

mat_file = 'setid.mat'

labels_mat = scipy.io.loadmat(os.path.join(data_root, 'imagelabels.mat'))

labels = labels_mat['labels'].flatten()

mat_data = scipy.io.loadmat(os.path.join(data_root, mat_file))

trnid = mat_data['trnid'].flatten()

valid = mat_data['valid'].flatten()

tstid = mat_data['tstid'].flatten()

datasets = {

'test': trnid,

'validation': valid,

'train': tstid

}

for dataset, img_ids in datasets.items():

target_dir = os.path.join(data_root, dataset)

if not os.path.exists(target_dir):

os.makedirs(target_dir)

if dataset in ['test', 'validation']:

for class_idx in range(1, 103):

class_dir = f'class{class_idx}'

class_path = os.path.join(target_dir, class_dir)

if not os.path.exists(class_path):

os.makedirs(class_path)

start_idx = (class_idx - 1) * 10

end_idx = class_idx * 10

class_img_ids = img_ids[start_idx:end_idx]

for img_id in class_img_ids:

src_img_path = os.path.join(data_root, 'jpg', f'image_{img_id:05d}.jpg')

tgt_img_path = os.path.join(class_path, f'image_{img_id:05d}.jpg')

copy(src_img_path, tgt_img_path)

print(f'Copied {src_img_path} to {tgt_img_path}')

elif dataset == 'train':

for img_id in img_ids:

label = labels[img_id - 1]

class_dir = f'class{label}'

class_path = os.path.join(target_dir, class_dir)

if not os.path.exists(class_path):

os.makedirs(class_path)

src_img_path = os.path.join(data_root, 'jpg', f'image_{img_id:05d}.jpg')

tgt_img_path = os.path.join(class_path, f'image_{img_id:05d}.jpg')

copy(src_img_path, tgt_img_path)

print(f'Copied {src_img_path} to {tgt_img_path}')

print('All datasets have been prepared.')

三、算法实现

1、数据加载和预处理:首先加载数据集中的标签,并对标签的基本信息进行了打印。然后使用ImageDataGenerator类对训练集、验证集和测试集进行数据增强和预处理。

2、模型构建:采用预训练的VGG16模型作为基础模型,并冻结了其所有层。在VGG16模型的输出上添加了自定义的分类层,包括Flatten、Dense和Dropout层,最后使用softmax激活函数输出102个类别的概率分布。

 3、模型编译和训练:使用Adam优化器编译模型,并设置了学习率调度器和早停回调。然后对模型进行训练,使用验证集进行验证,并在每个epoch结束后评估模型的性能。

4、模型评估和可视化:通过测试集对模型进行评估,并计算了准确率,生成分类报告和混淆矩阵,以便更全面地了解模型的性能。最后,随机选择一些正确和错误分类的图像进行可视化展示。

 

 四、结果展示

 准确率:只有70%

 混淆矩阵:

分类结果图片展示:

 

 参考:

https://blog.csdn.net/qq_37274615/article/details/81147013

https://wenku.csdn.net/column/883zsn0g7u

数据集划分,Oxford Flower102花卉分类数据集,分为训练集、测试集、验证集_oxford flowers-CSDN博客

[机器学习笔记] 混淆矩阵(Confusion Matrix)_混淆矩阵计算公式-CSDN博客 

【深度学习】一文向您详细介绍深度学习中的 batch_size_batch size-CSDN博客 

 卷积神经网络CNNs的调优及性能提升技巧_卷积神经网络做回归任务效果不好-CSDN博客

Flower102的鲜花分类数据准备及处理教程 - 简书 

相关知识

基于深度学习和迁移学习的识花实践
机器学习之路:经典的鸢尾花数据集
基于机器学习的鸢尾花数据集的三分类算法的实现 C++
[机器学习基础][笔记] 一、鸢尾花分类
机器学习鸢尾花数据集
【机器学习】基于KNN算法实现鸢尾花数据集的分类
机器学习花朵图像分类
Pytorch实现102类鲜花分类(102 Category Flower Dataset)
【机器学习】农田智能监控系统的实践探索
机器学习项目实践——鸢尾花分类

网址: 【机器学习基础实践】102类花朵数据分类 https://m.huajiangbk.com/newsview676900.html

所属分类:花卉
上一篇: 分享5个好用的植物单细胞数据库
下一篇: 植物分类彭黎立讲义.ppt