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

一、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张图片。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vscode对一些软件的调试插件。

vscode对一些软件的调试插件。 1、ae ,f1然后选择运行 after effect 脚本 2、maya,右键send code to maya 3、max,ctrle运行脚本到max 4、unity 从在Visual Studio代码使用.NET的核心: 1、安装.NET Core SDK,链接: https://dotn…

Unity 模拟放大镜局部放大UI 效果实现

UI 放大实现 RectTransformUtility.ScreenPointToLocalPointInRectangle(rectScale, eventData.position, eventData.pressEventCamera, out localPos); 使用IPointerDownHandler 获取鼠标点击时的有效负载,并将鼠标坐标转成对应的UI 坐标,rectScale 为…

(1)双指针算法介绍与练习:移动零

目录 双指针算法介绍 练习:移动零 双指针算法介绍 双指针算法常见于数组和双向链表的题型 在数组中,双指针中的指针代表数组元素的下标,而不是真正的指针类型变量 在双向链表中,双指针中的指针即为真正意义上的指针&#xff…

前馈神经网络FNN、多层感知机MLP和反向传播推导

目录 一、前馈神经网络FNN 激活函数的使用 二、多层感知机MLP MLP的典型结构 多层感知机MLP的特点 和前馈神经网络FNN的区别 三、传播推导 1、前向传播(Forward propagation) (1)输入层到隐藏层 (2)隐藏层到输出层 2、…

webpack生成模块关系依赖图示例:查看构建产物的组成部分 依赖关系图

npm i -D webpack-bundle-analyzer core-js babel-loaderwebpack.config.js const BundleAnalyzerPlugin require(webpack-bundle-analyzer).BundleAnalyzerPlugin; module.exports {entry: ./src/index.js,output: {filename: main.js,},// mode: production, // 或者 produ…

【数据结构】堆(超详细)

文章目录 前言堆的概念及结构堆的实现堆的向下调整算法(建小堆为例)堆的向上调整算法(建小堆为例)堆的初始化销毁堆堆的插入堆的删除(规定删堆顶的数据)取堆顶元素判断堆是否为空获取堆的个数 完整代码(包括测试代码&a…

k8s 二进制安装 详细安装步骤

目录 一 实验环境 二 操作系统初始化配置(所有机器) 1,关闭防火墙 2,关闭selinux 3,关闭swap 4, 根据规划设置主机名 5, 做域名映射 6,调整内核参数 7, 时间同步 三 部署 dock…

微软exchange邮箱发送

使用java发送exchange类型的邮件&#xff0c;foxmail中配置如下图&#xff1a; 需要的maven依赖如下&#xff1a; <dependency><groupId>com.microsoft.ews-java-api</groupId><artifactId>ews-java-api</artifactId><version>2.0</ve…

1. 杜克大学官方宣布2027届新生画像什么是vue关键特点核心概念简单示例生态系统

目录 1. 杜克大学官方宣布2027届新生画像 什么是vue 关键特点 核心概念 简单示例 生态系统 1. 杜克大学官方宣布2027届新生画像 杜克大学校报《The Chronicle》已连续第七年对杜克大学的一年级新生进行深入调查&#xff0c;探讨该群体家庭受教育背景、家庭收入水平以及…

异步I/O库-libuv介绍

1.简介 libuv是一个跨平台的支持事件驱动的异步I/O的库&#xff0c;使开发者可以以非阻塞的方式执行文件I/O操作、网络通信、子进程管理等。 libuv的主要特点包括&#xff1a; 事件循环&#xff1a;libuv有一个基于事件循环的模型&#xff0c;它不断地轮询事件&#xff0c;并…

洗地机怎么挑?洗地机选购指南,2024洗地机测评选购攻略

在快节奏的生活中&#xff0c;繁琐的清洁工作往往令人头疼&#xff0c;随着洗地机的诞生&#xff0c;极大地简化了清洁的过程&#xff0c;洗地机凭借着它吸拖洗为一体的高效清洁特点&#xff0c;受到家庭和商业场所的广泛欢迎。那么&#xff0c;洗地机怎么挑&#xff0c;要注意…

速度背!24上软考网工“经典100道母题来了”!

距离软考考试的时间越来越近了&#xff0c;趁着这两周赶紧准备起来。 今天给大家整理了——网络工程师经典100道母题&#xff08;含解析&#xff09;&#xff0c;有PDF版&#xff0c;可打印&#xff0c;每天刷一点&#xff0c;考试就像遇到“老朋友”。 第一章节&#xff1a;计…

重磅!OpenAI发布GPT-4o,非常惊艳语音版ChatGPT!

5月15日凌晨&#xff0c;谷歌召开“ I/O 2024”&#xff0c;生成式AI成为本次大会的重点并发布了一系列产品和多款大模型。 其中&#xff0c;谷歌DeepMind发布了一款全新的AI 代理&#xff08;Agent&#xff09;产品Project Astra&#xff0c;可以像昨天OpenAI发布的GPT4o一样…

springsecurity项目快速搭建

自定义security的搭建 package com.sangeng.config;import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;Co…

YOLOv8改进教程|加入可改变核卷积AKConv模块,效果远超DSConv!

⭐⭐ YOLOv8改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ​ ⭐⭐ 一、 论文介绍 论文链接&#xff1a;https://arxiv.org/abs/2311.11587 代码链接&#xff1a;GitHub - CV-ZhangXin/AKConv 论文速览&#xff1a;&#xff1a;AKConv是2023年11月发表的一种可变卷积…

详细分析Vue3中的reactive(附Demo)

目录 1. 基本知识2. 用法3. Demo 1. 基本知识 reactive 是一个函数&#xff0c;用于将一个普通的 JavaScript 对象转换为响应式对象 当对象的属性发生变化时&#xff0c;Vue 会自动追踪这些变化&#xff0c;并触发相应的更新 Vue2没有&#xff0c;而Vue3中有&#xff0c;为啥…

C++入门系列-赋值运算符重载

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 赋值运算符重载 运算符重载 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其返回值类型&#xff0c;函数名字以及参…

评价决策类-层次分析法

师从江北 问题引出 归一化处理&#xff1a;指标的数组[a b c]归一化处理得到[a/(abc),b/(abc),c/(abc)] 因为每个指标的重要性不同&#xff0c;所以要加上一个权重 如何科学的确定权重&#xff0c;就要用到层次分析法&#xff08;AHP&#xff09; 模型原理 建立递阶层次结构模…

百度云防护如何开启CC攻击防护

百度云防护的最重要的功能是可以CC攻击防护&#xff0c;针对CC攻击&#xff0c;百度云防护有被动的CC攻击拦截规则&#xff0c;也有主动自定义访问策略拦截。 今天百度云来教大家如何开启百度云防护的CC攻击防御功能。 1.进入防护模板功能-创建模板 2.开启CC攻击防御功能&…

ubuntu20.04 ROS 环境下使用速腾80线激光雷达

1.相关系统环境 系统版本:ubuntu 20.04 ROS版本&#xff1a;ROS1 - noetic 激光雷达型号&#xff1a;RoboSense Ruby &#xff08;更新于2024.5.14&#xff09; 2.网口配置&#xff1a; 将PC/工控机的网口配置为&#xff1a; ipv4&#xff0c;方式设置为手动 ip地址、掩码以…