处理Mini-ImageNet数据集,用于分类任务

news2024/9/21 11:12:10

一、Mini-ImageNet数据集介绍

ImageNet 1000类的数据太大了,全部下载大概有100GB左右。

2016年google DeepMind团队从ImagNet数据集中抽取的一小部分(大小约3GB)制作了Mini-ImageNet数据集,共有100个类别,每个类别有600张图片,共6w张(都是.jpg结尾的文件),而且图像的大小并不是固定的,作为小样本学习(Few-shot Learning)常用数据集。

训练,验证,测试数据集中的类别不交叉重复。基础集(Base Class,64个类别),验证集(Validation Class,16个类别)和新类别集(Novel Class,20个类别)。

1、数据集结构

├── mini-imagenet: 数据集根目录
     ├── images: 所有的图片都存在这个文件夹中
     ├── train.csv: 对应训练集的标签文件
     ├── val.csv: 对应验证集的标签文件
     └── test.csv: 对应测试集的标签文件

2、数据集下载

百度网盘链接

下载地址:https://pan.baidu.com/s/1bQTtrkEgWfs_iaVRwxPF3Q

提取码:33e7

标签对应类别名json文件下载

imagenet_class_index.json文件是每个类别对应的实际物体名称,这个文件是ImageNet1000类数据集中对应的标签文件。
imagenet_class_index.json文件部分内容如下,n01440764标签对应类别为tench。

{"0": ["n01440764", "tench"], 
 "1": ["n01443537", "goldfish"], 
 "2": ["n01484850", "great_white_shark"],
 ...
}

ImageNet数据集风格——WordNet层次结构

ImageNet是是目前深度学习图像领域应用得非常多的,根据WordNet层次结构组织的图像数据集,由李飞飞团队创建,目前常用的是2012年版本的。
官网链接下载需要教育邮箱登录。

WordNet层次结构,文件夹名为类别名,文件夹下是该类别的所有图片,如下所示,实际更加复杂,可嵌套很多层。

ImageNet  
│  
├── Dog   
│   ├── img_dog_0001.jpg  
│   ├── img_dog_0002.jpg  
│   ├── ...  
├── Cat   
│   ├── img_cat_0001.jpg  
│   ├── img_cat_0002.jpg  
│   ├── ...  
└── ... 

二、python处理数据集为分类数据集

1、文件目录结构

├── data
│    ├── images
│    ├── train.csv
│    ├── val.csv
│    ├── test.csv
│    └── imagenet_class_index.json
│
├── classification_process.py
└── dataset_process.py  

2、classification_process.py

划分出新的CSV文件和json文件:new_train.csv 、new_val.csv、classes_name.json。

import os
import json
import pandas as pd
from PIL import Image
import matplotlib.pyplot as plt


def read_csv_classes(csv_dir: str, csv_name: str):
    data = pd.read_csv(os.path.join(csv_dir, csv_name))
    label_set = set(data["label"].drop_duplicates().values)

    print("{} have {} images and {} classes.".format(csv_name,
                                                     data.shape[0],
                                                     len(label_set)))
    return data, label_set


def calculate_split_info(path: str, label_dict: dict, rate: float = 0.2):
    # read all images
    image_dir = os.path.join(path, "images")
    images_list = [i for i in os.listdir(image_dir) if i.endswith(".jpg")]
    print("find {} images in dataset.".format(len(images_list)))

    train_data, train_label = read_csv_classes(path, "train.csv")
    val_data, val_label = read_csv_classes(path, "val.csv")
    test_data, test_label = read_csv_classes(path, "test.csv")

    # Union operation
    labels = (train_label | val_label | test_label)
    labels = list(labels)
    labels.sort()
    print("all classes: {}".format(len(labels)))

    # create classes_name.json
    classes_label = dict([(label, [index, label_dict[label]]) for index, label in enumerate(labels)])
    json_str = json.dumps(classes_label, indent=4)
    with open('data/classes_name.json', 'w') as json_file:
        json_file.write(json_str)

    # concat csv data
    data = pd.concat([train_data, val_data, test_data], axis=0)
    print("total data shape: {}".format(data.shape))

    # split data on every classes
    num_every_classes = []
    split_train_data = []
    split_val_data = []
    for label in labels:
        class_data = data[data["label"] == label]
        num_every_classes.append(class_data.shape[0])

        # shuffle
        shuffle_data = class_data.sample(frac=1, random_state=1)
        num_train_sample = int(class_data.shape[0] * (1 - rate))
        split_train_data.append(shuffle_data[:num_train_sample])
        split_val_data.append(shuffle_data[num_train_sample:])

        # imshow
        imshow_flag = False
        if imshow_flag:
            img_name, img_label = shuffle_data.iloc[0].values
            img = Image.open(os.path.join(image_dir, img_name))
            plt.imshow(img)
            plt.title("class: " + classes_label[img_label][1])
            plt.show()

    # plot classes distribution
    plot_flag = False
    if plot_flag:
        plt.bar(range(1, 101), num_every_classes, align='center')
        plt.show()

    # concatenate data
    new_train_data = pd.concat(split_train_data, axis=0)
    new_val_data = pd.concat(split_val_data, axis=0)

    # save new csv data
    new_train_data.to_csv(os.path.join(path, "new_train.csv"))
    new_val_data.to_csv(os.path.join(path, "new_val.csv"))


def main():
    data_dir = "data/"  # 指向数据集的根目录
    json_path = "data/imagenet_class_index.json"  # 指向imagenet的索引标签文件

    # load imagenet labels
    label_dict = json.load(open(json_path, "r"))
    label_dict = dict([(v[0], v[1]) for k, v in label_dict.items()])

    calculate_split_info(data_dir, label_dict)


if __name__ == '__main__':
    main()

3、dataset_process.py

利用划分出的新文件将图片按照ImageNet风格进行划分。

import csv
import os
from PIL import Image
import json


train_csv_path = "data/new_train.csv"
val_csv_path = "data/new_val.csv"

json_path = "data/classes_name.json"
label_dict = json.load(open(json_path, "r"))

train_label = {}
val_label = {}

with open(train_csv_path) as csvfile:
    csv_reader = csv.reader(csvfile)
    birth_header = next(csv_reader)
    for row in csv_reader:
        train_label[row[1]] = label_dict[row[2]][1]

with open(val_csv_path) as csvfile:
    csv_reader = csv.reader(csvfile)
    birth_header = next(csv_reader)
    for row in csv_reader:
        val_label[row[1]] = label_dict[row[2]][1]

img_path = "data/images"
new_img_path = "data/mini-imagenet"
for png in os.listdir(img_path):
    path = img_path + '/' + png
    im = Image.open(path)
    if (png in train_label.keys()):
        tmp = train_label[png]
        temp_path = new_img_path + '/train' + '/' + tmp
        if (os.path.exists(temp_path) == False):
            os.makedirs(temp_path)
        t = temp_path + '/' + png
        im.save(t)

    elif (png in val_label.keys()):
        tmp = val_label[png]
        temp_path = new_img_path + '/val' + '/' + tmp
        if (os.path.exists(temp_path) == False):
            os.makedirs(temp_path)
        t = temp_path + '/' + png
        im.save(t)

4、最终目录结构

├── data
│    ├── images
│    ├── mini-imagenet
│    │     ├── train: 新生成的训练集,100个类别,4.8w张图片
│    │     └── val: 新生成的测试集,100个类别,1.2w张图片
│    │
│    ├── class_name.json
│    ├── new_train.csv
│    ├── new_val.csv
│    ├── imagenet_class_index.json
│    ├── test.csv
│    ├── train.csv
│    └── val.csv
│
├── classification_process.py
└── dataset_process.py  

5、最终用于分类的数据集

生成的mini-imagenet数据集,包含两个子文件夹train训练集,val测试集(按照8:2随机划分)。
在这里插入图片描述

训练集下有100个子文件夹,代表100个类别,一共4.8w张图片。
在这里插入图片描述

测试集包括100个子文件夹,代表100个类别,一共1.2w张图片。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1679083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人物介绍模板 PSD 源文件免费获取

免费获取 下载链接在最后! 下载链接在最后! 下载链接在最后! 下载链接在最后! 下载链接在最后! 链接:https://pan.baidu.com/s/1sq3e6djMdZt76Sh_uqVxWg 提取码:naun

Cache基本原理--以TC3xx为例(1)

目录 1.为什么要使用Cache 2.Memory与Cache如何映射 2.1 地址映射概设 3.小结 为什么要使用Cache?为什么在多核工程里要谨慎使用DCache?Cache里的数据、指令是如何与Memory映射? 灵魂三连后,软件工程师应该都会有模糊的回答&…

数字集成电路物理设计[陈春章]——知识总结与精炼02

第二章 物理设计建库与验证 2.1 集成电路工艺与版图 自行了解,关于闩锁效应可查阅小编之前的文章。 2.2 设计规则检查(DRC) 定义:晶圆代工厂对各自不同工艺参数制定出满足芯片制造良率的同一工艺层及不同工艺层之间几何尺寸的…

【论文阅读 | 三维重建】3D Gaussian Splatting for Real-Time Radiance Field Rendering(3DGS)

Abstract 辐射场方法最近彻底改变了用多张照片或视频捕获的新颖视图合成,然而实现高视觉质量仍然需要训练和渲染成本高昂的神经网络,而最近更快的方法不可避免地要牺牲速度来换取质量。对于无边界和完整的场景和1080P分辨率的渲染,目前没有任…

【练习】分治--快排思想

🎥 个人主页:Dikz12🔥个人专栏:算法(Java)📕格言:吾愚多不敏,而愿加学欢迎大家👍点赞✍评论⭐收藏 目录 颜色分类 题目描述 题解 代码实现 排序数组 题目描述 题解 代码…

Python项目——基于回合制的RPG游戏设计与实现

基于回合制的RPG游戏设计与实现 项目概述 《魔法冒险》是一款基于回合制战斗的角色扮演游戏。玩家将创建一个角色,探索世界,战斗敌人,收集物品并提升等级。 项目设计报告 一、引言 本项目的目标是实现一个基于回合制战斗的 RPG 游戏&…

冯喜运:5.15黄金原油晚盘分析:鲍威尔再放鹰,降息悬念重重

【黄金消息面分析】:在全球经济动荡和通胀预期不断上升的背景下,黄金作为传统的避险资产,再次成为投资者关注的焦点。当前,黄金价格交投于2370美元/盎司左右,连续两日日线呈现上涨趋势,而白银价格也在连续三…

CRWU凯斯西储大学轴承数据,12k频率,十分类

CRWU凯斯西储大学轴承数据,12k频率,十分类。 from torch.utils.data import Dataset, DataLoader from scipy.io import loadmat import numpy as np import os from sklearn import preprocessing # 0-1编码 from sklearn.model_selection import Str…

量化交易:日内回转交易策略

哈喽,大家好,我是木头左! 引言 本文将介绍日内回转交易策略的原理,并通过Python代码示例展示如何在掘金平台实现该策略。本文将深入探讨一种基于1分钟MACD(Moving Average Convergence Divergence,即移动平…

C++ LeetCode 刷题经验、技巧及踩坑记录【三】

C LeetCode 刷题经验、技巧及踩坑记录【三】 前言vector 计数vector 逆序vector 删除首位元素vector二维数组排序vector二维数组初始化C 不同进制输出C 位运算C lower_bound()C pairC stack 和 queue 前言 记录一些小技巧以及平时不熟悉的知识。 vector 计数 计数 //记录与首…

C# Winform+Halcon结合标准视觉工具

介绍 winform与halcon结合标准化工具实例 软件架构 软件架构说明 基于NET6 WINFORMHALCON 实现标准化视觉检测工具 集成相机通讯 集成PLC通讯 TCP等常见通讯 支持常见halcon算子 图形采集blob分析高精度匹配颜色提取找几何体二维码提取OCR识别等等 。。。 安装教程 …

MQTT_客户端安装_1.4

下载地址 MQTTX 下载 下一步直接安装即可 界面介绍

GhostNetV2 Enhance Cheap Operation with Long-Range Attention 论文学习

论文地址:https://arxiv.org/abs/2211.12905 代码地址:https://github.com/huawei-noah/Efficient-AI-Backbones/tree/master/ghostnetv2_pytorch 解决了什么问题? 在计算机视觉领域,深度神经网络在诸多任务上扮演着重要角色。为…

从源头到洞察:大数据时代的数据提取与分析实战指南

随着科技的飞速发展,大数据已经成为现代社会的核心驱动力之一。从商业决策到科学研究,从政策制定到个人生活,数据无处不在,影响着我们的每一个决策。然而,如何从海量的数据中提取有价值的信息,并转化为深刻…

LVM - Linux磁盘逻辑卷管理器概念讲解、实践及所遇到的问题

1、lvm概念 逻辑卷管理器(LogicalVolumeManager)本质上是一个虚拟设备驱动,是在内核中块设备和物理设备之间添加的一个新的抽象层次,它可以将几块磁盘(物理卷,PhysicalVolume)组合起来形成一个存储池或者卷组(VolumeGroup)。LVM可以每次从卷组中划分出不同大小的逻辑卷(Logi…

iOS 主要语言切换问题

前言 上架时需要把主要语言切换成英文,存储时一直提示“因为您必须先为使用这种语言的每个版本提供所有必需的截屏”错误。 错误截图 解决方案: 1、增加英文的截图去审核,审核过了再切换主要语言 官方文档出处 END.

uniapp小程序使用scroll-view组件实现上下左右滚动触发事件

在做uniapp开发小程序的时候,有一个需求是在一个表格区域里面可以上下左右滑动元素,并实现表头和左侧的标签联动效果,就想趣运动里面选择场地的效果一样,这里就用到了scroll-view组件,scroll-view官网文档地址&#xf…

安卓、iOS、iPad三端搞定,不再剧荒!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家推荐过各种看剧姿势,但很多苹果、平板端的小伙伴还是存在更好的需求体验,今天给大家推荐这款可以在安卓、iOS和平板上都能安装使用,不再剧…

音视频捕捉技术:LCC382 SDI采集卡深度解析

在日新月异的多媒体时代,高质量的音视频采集已成为众多领域不可或缺的一环。为此,灵卡科技精心打造了LCC382 —— 一款集高效性、灵活性与前沿技术于一身的SDI输入与环出、HDMI输出音视频采集卡,旨在满足从专业直播、视频会议到医疗影像、安防…

F5 Big-IP的一些查看命令

1 查看主机名,序列号,版本号 system —>configuration—>Device