小样本方式加载Stanford_Cars数据集

准备数据

需要从数据集地址:https://ai.stanford.edu/~jkrause/cars/car_dataset.html下载3个压缩包,下载好之后解压
在这里插入图片描述

在这里插入图片描述

根据标签划分数据集

import scipy.io as scio
import os.path as osp

# 这个路径下有三个文件夹
dataset_path = "XXX"

train_img_path = osp.join(dataset_path, "cars_train")
test_img_path = osp.join(dataset_path, "cars_test")

label_path = osp.join(dataset_path, "car_devkit", "devkit")
train_label_path = osp.join(label_path, "cars_train_annos.mat")
test_label_path = osp.join(label_path, "cars_test_annos.mat")

img = 0

def devide_dataset_by_label(path):
    global img
    data = scio.loadmat(path)
    data = data["annotations"]
    data = data.squeeze()
    labels = np.zeros(data.shape[0])
    for number, label in enumerate(labels):
        if not osp.exists(osp.join(dataset_path, "classes", str(int(label)))):
            os.makedirs(osp.join(dataset_path, "classes", str(int(label))))
        os.system(
            f"cp {osp.abspath(osp.join(train_img_path, str(int(number+1)).zfill(5) + '.jpg'))} {osp.abspath(osp.join(dataset_path, 'classes', str(int(label))))}")
        img += 1

if __name__ == '__main__':
    devide_dataset_by_label(train_label_path)
    devide_dataset_by_label(test_label_path)
    print(f"devide {img} imgs")

一共给16185张图片分了类,和数据集官方数据一样
在这里插入图片描述

在这里插入图片描述

加载成dataloader

def get_Stanford_Cars_dataloader(mode="train", way=5, shot=2, query=10):
    if not osp.exists(osp.abspath(osp.join(dataset_path, "classes"))):
        devide_dataset_by_label(train_label_path)
        devide_dataset_by_label(test_label_path)
        print(f"devide {img} imgs")
    classes_path = osp.abspath(osp.join(dataset_path, "classes"))

    class_list = []
    for class_name in os.listdir(classes_path):
        if class_name.__contains__("DS_Store"):
            continue
        class_list.append(os.path.join(classes_path, class_name))
    class_names = []
    for i in class_list:
        if os.listdir(i).__len__() >= query + shot:
            class_names.append(i)

    train_class_lists = class_names[:int(class_names.__len__() * 0.6)]
    val_class_lists = class_names[int(class_names.__len__() * 0.6):int(class_names.__len__() * 0.8)]
    test_class_lists = class_names[int(class_names.__len__() * 0.8):]

    transforms = [partial(convert_dict, "class"),
                  partial(load_class_images, 64),
                  partial(extract_episode, shot, query)]

    transforms = compose(transforms)

    lists = []
    if mode == "train":
        lists = train_class_lists
    elif mode == "val":
        lists = val_class_lists
    elif mode == "test":
        lists = test_class_lists

    episode = int(len(lists) / way) + 1  # 加1防止有一类没学习

    ds = TransformDataset(ListDataset(lists),  # 先将list类型数的class_names处理成Dataset类的ListDataset
                          transforms)  # 然后对它使用transforms,对数据进行进一步处理

    sampler = EpisodicBatchSampler(len(ds), way, episode)  # 每个episode有10way,每个batch有30个episdoe

    dataloader = torch.utils.data.DataLoader(ds, batch_sampler=sampler, num_workers=0)

    return dataloader

全部代码

分享至码云

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Stanford Cars数据集转换为YOLO格式需要进行以下步骤: 1. 下载数据集:首先,您需要从Stanford Cars数据集的官方网站下载图像和标注文件。您可以在[这里](https://ai.stanford.edu/~jkrause/cars/car_dataset.html)找到该数据集。 2. 解压文件:将下载的文件解压到一个文件夹中。 3. 创建目录结构:在解压后的文件夹中,创建以下目录结构: - images:用于存放原始图像 - labels:用于存放YOLO格式的标签文件(每个图像对应一个标签文件) 4. 转换标注:打开标注文件(例如devkit/cars_train_annos.mat)并读取其中的标注信息。对于每个图像,提取其边界框的坐标、类别和颜色信息。 5. 转换为YOLO格式:将提取的边界框坐标和类别转换为YOLO格式。YOLO格式的标签文件应包含以下信息: - 第一列:类别索引(从0开始) - 第二列:边界框中心点的x坐标(相对于图像宽度) - 第三列:边界框中心点的y坐标(相对于图像高度) - 第四列:边界框的宽度(相对于图像宽度) - 第五列:边界框的高度(相对于图像高度) 6. 保存标签文件:将转换后的标签信息保存为与图像文件对应的同名txt文件,并将其放入labels目录中。 完成上述步骤后,您就可以使用YOLO框架来训练和测试转换后的数据集了。请注意,这只是一种将Stanford Cars数据集转换为YOLO格式的方法,您可能需要根据具体情况进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值