【细粒度】由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数据集,但这些知识可以为读者提供一个很好的起点,进一步深入研究和应用细粒度分类。


相关文章
|
缓存 Kubernetes 网络协议
阿里云DNS常见问题之在手机上使用阿里的私人dns失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
路径损耗计算模型 | 带你读《大规模天线波束赋形技术原理与设计 》之二十五
本小节介绍 3D 信道的路损模型,是以 ITU 信道为基础拓展得到的。
14475 0
路径损耗计算模型  | 带你读《大规模天线波束赋形技术原理与设计 》之二十五
|
IDE Java 程序员
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
本文提供了如何使用学生邮箱免费获取并安装JetBrains全家桶(包括IDEA、PyCharm等)的详细教程,涵盖了学生认证、软件下载、安装及常见问题的解决方法。
8694 0
学生邮箱白嫖/免费安装JetBrains全家桶(IDEA/pycharm等) —— 保姆级教程
|
机器学习/深度学习 传感器 编解码
DINOv3上手指南:改变视觉模型使用方式,一个模型搞定分割、检测、深度估计
DINOv3是Meta推出的自监督视觉模型,支持冻结主干、仅训练轻量任务头即可在分割、深度估计等任务上达到SOTA,极大降低训练成本。其密集特征质量优异,适用于遥感、工业检测等多领域,真正实现“一个模型走天下”。
6370 2
DINOv3上手指南:改变视觉模型使用方式,一个模型搞定分割、检测、深度估计
|
机器学习/深度学习 资源调度 计算机视觉
YOLOv11改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
YOLOv11改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
1581 1
YOLOv11改进入门篇 | 手把手讲解改进模块如何实现高效涨点,以SimAM注意力模块为例
|
机器学习/深度学习 数据可视化 算法
YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进
YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进
2779 7
YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进
|
机器学习/深度学习 存储 TensorFlow
YOLOv11改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头
YOLOv11改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头
3458 11
YOLOv11改进策略【Head】| (独家改进)轻量化检测头:利用 EfficientNet 中的移动倒置瓶颈模块 MBConv 改进检测头
|
人工智能 测试技术 vr&ar
DataDoP :一个大规模多模态数据集,包含 29K 真实世界的自由运动相机轨迹、深度图和详细的动作描述,目的支持艺术化相机轨迹生成。
2025-04-10 ,由浙江大学、上海人工智能实验室、斯坦福大学、香港中文大学和南洋理工大学联合创建了 DataDoP 数据集。该数据集包含 29K 真实世界的自由运动相机轨迹、深度图和详细的动作描述,目的为艺术化相机轨迹生成提供高质量的训练数据,推动基于学习的电影摄影技术发展。 一、研究背景 在视频制作中,相机轨迹设计是传达导演意图和增强视觉叙事的关键工具。传统方法依赖于几何优化或手工设计的程序系统,而近年来的基于学习的方法则继承了结构偏差或缺乏文本对齐,限制了创意合成。 目前遇到困难和挑战: 1、传统方法的局限性:传统方法依赖于几何建模或成本函数工程,限制了创意合成。 2、现有数据集的
|
计算机视觉
增量学习中Task incremental、Domain incremental、Class incremental 三种学习模式的概念及代表性数据集?
本文介绍了增量学习中的三种主要模式:任务增量学习(Task-incremental)、域增量学习(Domain-incremental)和类别增量学习(Class-incremental),它们分别关注任务序列、数据分布变化和类别更新对学习器性能的影响,并列举了每种模式下的代表性数据集。
3893 4
增量学习中Task incremental、Domain incremental、Class incremental 三种学习模式的概念及代表性数据集?

热门文章

最新文章