【细粒度】由CUB_200_2011数据集展开讲解细粒度分类任务

简介: 【细粒度】由CUB_200_2011数据集展开讲解细粒度分类任务

什么是细粒度分类

  细粒度分类是一种机器学习任务,旨在将输入的数据分成具有高度相似性的细粒度类别。细粒度分类通常是针对具有相似外观但具有微小差异的对象或图像进行分类。相比于传统的分类任务,细粒度分类需要更细致的特征提取和模型训练,因为要区分的类别之间的区别非常微小。

  细粒度图像分类指的是对属于相同类别下的不同子类别的物体进行分类,常见应用场景:自动驾驶、生物保护、癌细胞检测等。

image.png

数据集简介

细粒度分类任务面临着一些问题:

  1. 数据集难以获得
  2. 特征提取难度大
  3. 类内变异大
  4. 样本不平衡
  5. 鲁棒性差

  由于存在上述问题,对于开源的数据集:CUB_200_2011数据集可以给我们很好的利用起来,如下图所示为CUB_200_2011数据集的标注部分:

image.png

  CUB_200_2011数据集的下载链接如文章开头所示。该数据集总共有200个类别,都是鸟的子类;其中训练集共计5994张图像,测试集共计5794张图像,类别标注和数据集划分详见README文件,部分样例如下:

image.png

  在数据集文件夹中含有标注信息:每张图像提供了目标(鸟)所在的位置信息object annotation,以及各个局部部件的位置信息part annotation。标注信息的结果读取经过可视化后如下所示:

image.png

读取数据集

  在上面我们介绍到了关于CUB_200_2011数据集的一些基本信息,因此我们在处理细粒度分类任务时不能盲目的使用【目录式】或【索引式】进行数据的读取,我们在读取的时候应当注意到标注信息。

定义读取CUB_200_2011数据集的Dataset

python

复制代码

import os
import cv2
from torch.utils.data import Dataset
class CUB(Dataset):
    def __init__(self, path, train=True, transform=None, target_transform=None):
        self.root = path
        self.is_train = train
        self.transform = transform
        self.target_transform = target_transform
        self.images_path = {}
        with open(os.path.join(self.root, 'images.txt')) as f:
            for line in f:
                image_id, path = line.split()
                self.images_path[image_id] = path
        self.class_ids = {}
        with open(os.path.join(self.root, 'image_class_labels.txt')) as f:
            for line in f:
                image_id, class_id = line.split()
                self.class_ids[image_id] = class_id
        self.data_id = []
        if self.is_train:
            with open(os.path.join(self.root, 'train_test_split.txt')) as f:
                for line in f:
                    image_id, is_train = line.split()
                    if int(is_train):
                        self.data_id.append(image_id)
        if not self.is_train:
            with open(os.path.join(self.root, 'train_test_split.txt')) as f:
                for line in f:
                    image_id, is_train = line.split()
                    if not int(is_train):
                        self.data_id.append(image_id)
    def __len__(self):
        return len(self.data_id)
    def __getitem__(self, index):
        """
        Args:
            index: index of training dataset
        Returns:
            image and its corresponding label
        """
        image_id = self.data_id[index]
        class_id = int(self._get_class_by_id(image_id)) - 1
        path = self._get_path_by_id(image_id)
        image = cv2.imread(os.path.join(self.root, 'images', path))
        if self.transform:
            image = self.transform(image)
        if self.target_transform:
            class_id = self.target_transform(class_id)
        return image, class_id
    def _get_path_by_id(self, image_id):
        return self.images_path[image_id]
    def _get_class_by_id(self, image_id):
        return self.class_ids[image_id]

利用Dataset构建自己的DataLoader

ini

复制代码

data_path = 'data/CUB_200_2011'  # 设置数据路径
train_transforms = transforms.Compose([
    transforms.ToPILImage(),
    transforms.Resize((RE_SIZE, RE_SIZE)),
    transforms.RandomCrop(IMAGE_SIZE, padding=8),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(),
    transforms.Normalize(MEAN, STD)
])
test_transforms = transforms.Compose([
    transforms.ToPILImage(),
    transforms.Resize((RE_SIZE, RE_SIZE)),
    transforms.CenterCrop(IMAGE_SIZE),
    transforms.ToTensor(),
    transforms.Normalize(MEAN, STD)
])
train_dataset = CUB(data_path, train=True, transform=train_transforms, target_transform=None)
train_dataloader = DataLoader(train_dataset, batch_size=batch_size, num_workers=0, shuffle=True)
test_dataset = CUB(data_path, train=False, transform=test_transforms, target_transform=None)
test_dataloader = DataLoader(test_dataset, batch_size=batch_size, num_workers=0, shuffle=True)

  截止到这里我们对CUB_200_2011数据集已经完成了读取,在后面的任务就是分类了,对于分类任务可以参考torch中的经典卷积神经网络进行魔改完成自己的任务了,在我们的数据载入后是可以兼容符合粗粒度的分类任务的步骤的。

结尾

  在本篇博客中,我们介绍了如何对CUB_200_2011数据集进行细粒度分类任务。CUB_200_2011数据集是一个非常有挑战性的细粒度分类数据集,其中包含了200个鸟类别,每个类别有多张高分辨率的图像。我们介绍了如何使用卷积神经网络(CNN)来对该数据集进行分类。

  尽管细粒度分类任务非常具有挑战性,但它在实际应用中具有广泛的应用价值。例如,在生物学领域,细粒度分类可以用来识别不同的细胞类型或病理学图像中的不同病变类型。在计算机视觉领域,细粒度分类可以用来识别不同的物体子类,例如花朵的不同品种或飞机的不同型号。

  虽然本文只是简单地介绍了细粒度分类任务和CUB_200_2011数据集,但这些知识可以为读者提供一个很好的起点,进一步深入研究和应用细粒度分类。


相关文章
|
机器学习/深度学习 人工智能 自然语言处理
视觉 注意力机制——通道注意力、空间注意力、自注意力
本文介绍注意力机制的概念和基本原理,并站在计算机视觉CV角度,进一步介绍通道注意力、空间注意力、混合注意力、自注意力等。
14392 58
|
自然语言处理 算法 数据挖掘
自蒸馏:一种简单高效的优化方式
背景知识蒸馏(knowledge distillation)指的是将预训练好的教师模型的知识通过蒸馏的方式迁移至学生模型,一般来说,教师模型会比学生模型网络容量更大,模型结构更复杂。对于学生而言,主要增益信息来自于更强的模型产出的带有更多可信信息的soft_label。例如下右图中,两个“2”对应的hard_label都是一样的,即0-9分类中,仅“2”类别对应概率为1.0,而soft_label
自蒸馏:一种简单高效的优化方式
|
算法 数据库 计算机视觉
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
|
Ubuntu Python
【Python】报错ModuleNotFoundError: No module named ‘XXX‘
【Python】报错ModuleNotFoundError: No module named ‘XXX‘
|
IDE Java 程序员
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
本文提供了如何使用学生邮箱免费获取并安装JetBrains全家桶(包括IDEA、PyCharm等)的详细教程,涵盖了学生认证、软件下载、安装及常见问题的解决方法。
5951 0
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
|
JSON 人工智能 数据格式
AI计算机视觉笔记二十六:YOLOV8自训练关键点检测
本文档详细记录了使用YOLOv8训练关键点检测模型的过程。首先通过清华源安装YOLOv8,并验证安装。接着通过示例权重文件与测试图片`bus.jpg`演示预测流程。为准备训练数据,文档介绍了如何使用`labelme`标注工具进行关键点标注,并提供了一个Python脚本`labelme2yolo.py`将标注结果从JSON格式转换为YOLO所需的TXT格式。随后,通过Jupyter Notebook可视化标注结果确保准确性。最后,文档展示了如何组织数据集目录结构,并提供了训练与测试代码示例,包括配置文件`smoke.yaml`及训练脚本`train.py`,帮助读者完成自定义模型的训练与评估。
4927 2
|
编译器 Linux C++
本地LaTeX编写环境配置
LaTeX是一种高质量排版系统,适用于学术论文、书籍等文档。本地配置主要基于VS Code,通过安装LaTeX Workshop插件实现一键配置。还可通过Overleaf Workshop插件连接在线平台Overleaf,实现线上线下同步编辑与编译。
1619 1
本地LaTeX编写环境配置
|
机器学习/深度学习 存储 TensorFlow
YOLOv11改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头
YOLOv11改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头
2878 11
YOLOv11改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头
|
机器学习/深度学习 存储 数据采集
【博士每天一篇文献-综述】A survey on few-shot class-incremental learning
本文是一篇关于少量样本增量学习(Few-shot Class-Incremental Learning, FSCIL)的综述,提出了一种新的分类方法,将FSCIL分为五个子类别,并提供了广泛的文献回顾和性能评估,讨论了FSCIL的定义、挑战、相关学习问题以及在计算机视觉领域的应用。
1211 6
|
机器学习/深度学习 监控 计算机视觉
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
本文介绍了如何使用YOLOv7进行目标检测,包括环境搭建、数据集准备、模型训练、验证、测试以及常见错误的解决方法。YOLOv7以其高效性能和准确率在目标检测领域受到关注,适用于自动驾驶、安防监控等场景。文中提供了源码和论文链接,以及详细的步骤说明,适合深度学习实践者参考。
3757 1
目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

热门文章

最新文章