详解ImageNet著名子数据集ILSVRC2012基于Python的下载、解析及可视化

news2024/9/24 13:26:14

目录

  • ImageNet简介
  • WordNet简介
  • ILSVRC2012简介
  • ILSVRC2012下载
  • ILSVRC2012评价指标
  • ILSVRC2012开发套件DevelopmentKit
  • 获取Synset的标签描述
  • Python读取及可视化
    • PyTorch读取API
    • 基于PyTorch的API接口加载及可视化
    • 自定义读取接可视化Python脚本
  • 参考文献

摘要:本篇文档详细介绍了人工智能(artificial intelligence,AI)及计算机视觉(computer vision,CV)领域非常著名的基准数据集ImageNet,以及与ImageNet相关的WordNet、ImageNet大规模视觉识别挑战赛(ImageNet large scale visual recognition challenge,ILSVRC)等重要信息。最后,以ImageNet非常重要的一个子数据集ILSVRC2012作为切入点,介绍了如何下载该子数据集,以及基于Python编程语言的分析和可视化。

关键词:ImageNet;ILSVRC2012;计算机视觉;Python

在这里插入图片描述

⚠️警告:后续内容较多,阅读需要~20min!🌺🌺🌺


ILSVRC2012的训练集、验证集及测试集可视化结果:

在这里插入图片描述


ImageNet简介

ImageNet是一个大规模的视觉图像数据集,不是一个神经网络模型。相似的还有WordNet,是一个大型的英语词汇数据库,也不是一个神经网络模型。ImageNet广泛应用于计算机视觉领域,尤其是深度学习和图像识别的研究。它由斯坦福大学(Standford University)的李飞飞教授及其团队基于WordNet层次结构创建并维护,最初发布于2009年。目前,ImageNet包含1400万多张图像,涵盖了超过20000个类别。ImageNet可以免费提供给研究人员用于非商业的研究和教育。

ImageNet最常用的子集是2012-2017年用于Image Large Scale Visual Recognition Challenge(ILSVRC)的图像分类(classification)和定位(localization)数据集。该子数据集涵盖了1000个对象类别,包含1281167(一百二八万多)张训练图像、50000(五万)张验证图像和100000(十万)张测试图像

WordNet简介

WordNet是一个大型的英语词汇数据库,主要用于自然语言处理(natural language processing,NLP)和计算语言学领域,于1980年代末普林斯顿大学(Princeton University)的心理学家乔治·A·米勒(George A. Miller)及其团队发起。他们希望能够构建起一个反应人类思维的词汇组织方式的数据库,以促进语言学和认知科学的研究。传统的按照字母表顺序编排的单词库在计算机应用中并不直观,米勒表示单词之间语义关系(如同义词synonyms、反义词antonyms和上下位词hyponyms等)才是李姐词义的关键,因此他们够想了一种基于语义关系而非字母关系的词汇数据库,即WordNet的最初构想。

1985年,米勒他们基于心理学中的语义网络理论,组织了词汇之间的语义关系,并发布了WordNet的第一个版本,最初知识一个小规模的英语词汇数据库。1990年代初,WordNet被逐渐扩充。1995年,发布了WordNet的1.5版本,大约涵盖了11万个词汇相和7.6万个同义词集。2000年代,在欧盟EuroWordNet项目的资助下,WordNet构建了多个欧洲语言的词汇网络。那时至今,WordNet不断发展,增加了更多的现代词汇、哩语和专业术语。WordNet 3.1版本中涵盖了15.5万多个词汇和11.8万多个同义词集。

WordNet被广泛应用到各种NLP工具和平台中,例如Word2Vec、Globe、BERT等模型,以及机器翻译、多语言处理、认知科学核心语言学等方面,进而帮助提高词汇表示和语义理解能力

ILSVRC2012简介

ILSVRC2012有三个比赛任务:任务1:图像分类;任务2:目标检测;任务3:细粒度分类,如下图所示,具体说明如下:

  • 任务1:图像分类(classification)
    预测一个类别标签。1000个类别、训练集中每个类别有1.2K张图片。
  • 任务2:目标检测(detection:classification + localization)
    预测一个类别标签 + bounding box信息。1000个类别、训练集中每个类别有1.2K张图片。
  • 任务3:细粒度分类
    相关的图片在任务2的基础上,将狗进一步细分为20个亚类
    预测一个类别标签 + bounding box信息。120个狗的亚类别标签、每个类别大概200张图片。

在这里插入图片描述

ILSVRC2012下载

包括ILSVRC2012在内的ImageNet数据集可以从其官方网站下载。下载ImageNet数据集需要注册一个账号,并申请使用权限。研究人员需要填写相关的研究信息和机构信息,并同意使用条款。一旦获得批准,可以登录到ImageNet网站,选择需要下载的子集,例如:ILSVRC2012。由于数据集非常庞大,建议使用支持断点续传的下载工具(如 wget、curl或迅雷等)来下载数据。下载完成后,数据通常是压缩格式(如 .tar 或 .zip),用户需要解压缩并组织数据。训练数据、验证数据和测试数据通常分别存放在不同的文件夹中。

注意:

  1. ImageNet数据集仅用于非商业研究用途,下载时需要同意其许可协议。
  2. ILSVRC数据集非常庞大(几十GB),需要足够的存储空间和带宽来下载和存储数据。
  3. 图像数据通常以JPEG格式存储,分类标签和标注文件通常以文本格式提供。

大体上下载ImageNet数据集需要完成以下几步:

  1. 使用机构邮箱(一般要求是edu结尾或者edu.c结尾的校园邮箱)注册ImageNet账号,并登录;
  2. 申请下载权限:申请时ImageNet会发送一个Email到你的机构邮箱,需要通过该邮件提供的链接再次进入ImageNet,并同意使用条例方可进行下载。

ILSVRC2012数据集下载官方链接:https://image-net.org/challenges/LSVRC/2012/2012-downloads.php🚀🚀🚀需要登录!!!

截止2024年9月ILSVRC2012提供的下载资源包括:Development Kit、Images和Bounding Boxes,具体如下:

  • Development Kit:

    • Development kit (Task 1 & 2):2.5MB.
    • Development kit (Task 3):22MB.
  • Images:

    • Training images (Task 1 & 2):138GB.
    • Training images (Task 3):728MB.
    • Validation images (all tasks):6.3GB.
    • Test images (all tasks):13GB.
  • Bounding Boxes:

    • Training bounding box annotations (Task 1 & 2 only):20MB.
    • Training bounding box annotations (Task 3 only):1MB.
    • Validation bounding box annotations (all tasks):2.2MB.
    • Test bounding box annotations (Task 3 only):33MB.

注意: 根据ImageNet使用条例,用户只能自行前往其官网下载相关数据。

在ILSVRC2012官网上可以下载如下几个数据包,具体信息如所示。

序号类别名称文件名文件大小备注
1Development Kit任务1、2的工具包ILSVRC2012_devkit_t12.tar.gz2.5 MB施工中……
2Development Kit任务3的工具包ILSVRC2012_devkit_t3.tar.gz22 MB施工中……
3Images训练集JPEG图片:任务1、2ILSVRC2012_img_train.tar138 GB施工中……
4Images训练集JPEG图片:任务3ILSVRC2012_img_train_t3.tar728 MB施工中……
5Images验证集JPEG图片ILSVRC2012_img_val.tar6.3 GB施工中……
6Images测试集JPEG图片ILSVRC2012_img_test_v10102019.tar13 GB施工中……
7Bounding Boxes训练集任务3的标注XML文件ILSVRC2012_bbox_train_v2.tar.gz20 MB施工中……
8Bounding Boxes训练集任务1、2的标注XML文件ILSVRC2012_bbox_train_dogs.tar.gz1 MB施工中……
9Bounding Boxes验证集的标注XML文件ILSVRC2012_bbox_val_v3.tgz2.2 MB施工中……
10Bounding Boxes测试集的标注XML文件ILSVRC2012_bbox_test_dogs.zip33 MB施工中……

ILSVRC2012官网提供的数据集文件可能需要多次解压。例如:ILSVRC2012_img_train.tar 第一次解压会产生类似于 n01440764.tar 这样的 1000个*.tar 文件,再次解压后才是存储了图片的1000个类别文件夹!!!

各个文件解压后的文件夹层级结构大致如下

  • ILSVRC2012_devkit_t12.tar.gz🔥🔥🔥任务1、2的开发工具

    ILSVRC2012_devkit_t12/
    ├── data/
    │   ├── ILSVRC2012_validation_ground_truth.txt
    │   └── meta.mat  # 这里存储了任务1和2数据集对应的Synsets的描述信息
    ├── evaluation/
    │   ├── compute_overlap.m
    │   ├── demo.val.pred.det.txt
    │   ├── demo.val.pred.txt
    │   ├── demo_eval.m
    │   ├── eval_flat.m
    │   ├── eval_localization_flat.m
    │   ├── get_class2node.m
    │   ├── make_hash.m
    │   ├── VOCreadrecxml.m
    │   ├── VOCreadxml.m
    │   └── VOCxml2struct.m
    ├── COPYING
    └── readme.txt
    
  • ILSVRC2012_devkit_t3.tar.gz 任务3的开发工具

    ILSVRC2012_devkit_t3/
    ├── data/
    │   ├── filelist.mat
    │   ├── ILSVRC2012_validation_ground_truth.txt
    │   └── meta.mat  # 这里存储了任务3数据集对应的Synsets的描述信息
    ├── evaluation/
    │   ├── ._.DS_Store
    │   ├── ._readDat.m
    │   ├── ._writeDat.m
    │   ├── .DS_Store
    │   ├── demo.val.pred.dat
    │   ├── demo_eval.m
    │   ├── evalAccuracy.m
    │   ├── evalAP.m
    │   ├── perfect.val.pred.dat
    │   ├── readDat.m
    │   ├── VOCap.m
    │   └── writeDat.m
    ├── COPYING
    └── readme.txt
    
  • ILSVRC2012_img_train.tar🔥🔥🔥任务1、2的训练集图片

    ILSVRC2012_devkit_t12/  # 存储了1000个synset编号命名的文件夹。每个文件夹下存储288-1300张JPEG图片。绝大部分类别是1300张JPEG图片。总共1279207张图片。
    ├── n01440764/  # 存储了1300张n01440764类别的JPEG图像
    │   ├── n01440764_18.JPEG
    │   ├── ...
    │   └── n01440764_32420.JPEG
    ├── n01443537/  # 存储了1300张n01443537类别的JPEG图像
    │   ├── n01443537_2.JPEG
    │   ├── n01443537_16.JPEG
    │   ├── ...
    │   └── n01443537_24803.JPEG
    ├── ...
    └── n15075141/  # 存储了1300张n15075141类别的JPEG图像
        ├── n15075141_27.JPEG
        ├── n15075141_32.JPEG
        ├── ...
        └── n15075141_53286.JPEG
    
  • ILSVRC2012_img_train_t3.tar任务3的训练集图片

    ILSVRC2012_devkit_t12/  # 存储了120个狗亚类文件夹。每个文件夹下存储148-252张JPEG图片,总共20580张。
    ├── n02085620/  # 存储了152张n01440764类别的JPEG图像
    │   ├── n02085620_7.JPEG
    │   ├── n02085620_199.JPEG
    │   ├── ...
    │   └── n02085620_14516.JPEG
    ├── n02085782/  # 存储了185张n01443537类别的JPEG图像
    │   ├── n02085782_2.JPEG
    │   ├── n02085782_17.JPEG
    │   ├── ...
    │   └── n02085782_4798.JPEG
    ├── ...
    └── n02116738/  # 存储了1300张n15075141类别的JPEG图像
        ├── n02116738_124.JPEG
        ├── n02116738_204.JPEG
        ├── ...
        └── n02116738_10895.JPEG
    
  • ILSVRC2012_img_val.tar🔥🔥🔥任务1、2的验证集图片

    ILSVRC2012_img_val/  # 存储了50,000张任务1、2的验证集图片。若是使用PyTorch的API解压,则应该是按类别存储在不同的子文件夹下,进而方便进行分类。
    ├── ILSVRC2012_val_00000001.JPEG
    ├── ILSVRC2012_val_00000006.JPEG
    ├── ...
    └── ILSVRC2012_val_00050000.JPEG
    
  • ILSVRC2012_img_test_v10102019.tar任务1、2的测试集图片

    ILSVRC2012_img_test_v10102019/
    └── test/  # 存储了100,000张任务1、2的测试集图片。
        ├── ILSVRC2012_test_00000001.JPEG
        ├── ILSVRC2012_test_00000014.JPEG
        ├── ...
        └── ILSVRC2012_test_00100000.JPEG
    
  • ILSVRC2012_bbox_train_v2.tar.gz任务1、2的训练集标签

    ILSVRC2012_bbox_train_v2/  # 存储了任务1、2的训练集标签。1000个文件夹,每个文件夹288-1300个XML标签,共1279207个。
    ├── n01440764/  # 存储了1300张n01440764类别的xml标签
    │   ├── n01440764_18.xml
    │   ├── ...
    │   └── n01440764_32420.xml
    ├── n01443537/  # 存储了1300张n01443537类别的xml标签
    │   ├── n01443537_2.xml
    │   ├── n01443537_16.xml
    │   ├── ...
    │   └── n01443537_24803.xml
    ├── ...
    └── n15075141/  # 存储了1300张n15075141类别的xml标签
        ├── n15075141_27.xml
        ├── n15075141_32.xml
        ├── ...
        └── n15075141_53286.xml
    
  • ILSVRC2012_bbox_train_dogs.tar.gz任务3的训练集标签

    ILSVRC2012_bbox_train_dogs/  # 存储了任务3的训练集标签。120个文件夹,每个文件夹148-252个XML标签,共计20580个
    ├── n02085620/  # 存储了152个PASCAL VOC类型的XML标签文件
    │   ├── n02085620_7.xml
    │   ├── n02085620_199.xml
    │   ├── ...
    │   └── n02085620_14516.xml
    ├── n02085782/  # 存储了185个PASCAL VOC类型的XML标签文件
    │   ├── n02085782_2.xml
    │   ├── n02085782_17.xml
    │   ├── ...
    │   └── n02085782_4798.xml
    ├── ...
    └── n02116738/  # 存储了120个PASCAL VOC类型的XML标签文件
        ├── n02116738_124.xml
        ├── n02116738_204.xml
        ├── ...
        └── n02116738_10895.xml
    
  • ILSVRC2012_bbox_val_v3.tgz任务3的验证集标签

    ILSVRC2012_bbox_val_v3/  # 存储了任务3验证集标签
    └── val/  # 存储了50000个PASCAL VOC类型的XML标签文件
        ├── ILSVRC2012_val_00000001.xml
        ├── ILSVRC2012_val_00000002.xml
        ├── ...
        └── ILSVRC2012_val_00050000.xml
    
  • ILSVRC2012_bbox_test_dogs.zip任务3的测试集标签

    ILSVRC2012_bbox_test_dogs/  # 存储了任务3的测试集标签
    └── test_clean/  # 存储了100000个PASCAL VOC类型的XML标签文件。object节点下只有一个bndbox节点。
        ├── ILSVRC2012_test_00000001.xml
        ├── ILSVRC2012_test_00000002.xml
        ├── ...
        └── ILSVRC2012_test_00100000.xml
    

    以上数据集文件主要是JPEG图片文件和XML标注文件。
    任务1,分类:只需要读取图片和图片文件夹的名称即可。因为图片文件夹的名称就是该图片所属的synset类别编号,使用MATLAB打开ILSVRC2012_devkit_t12/data/meta.m,就可以找编号对应的WordNet描述。

ILSVRC2012评价指标

  • 任务1:图像分类
    采用TOP5分类误差: e = 1 n ⋅ ∑ k min ⁡ j d ( l j , g k ) e=\frac{1}{n} · \sum_{k} \min_{j}d(l_j, g_k) e=n1kjmind(lj,gk)
  • 任务2:目标检测
  • 采用TOP5分类和定位误差:
    e = 1 n ⋅ ∑ k min ⁡ j min ⁡ m M k max ⁡ { d ( l j , g k ) , f ( b j , z k m ) } e=\frac{1}{n} · \sum_{k} \min_{j}\min_{m}^{M_{k}}\max\{d(l_j, g_k),f(b_j, z_{km})\} e=n1kjminmminMkmax{d(lj,gk),f(bj,zkm)}
  • 任务3:狗类细分
    单类别的平均精度(average precision,AP)和多类别的均值平均精度(mean average precision,mAP)。因此,要求系统能够输出图像bounding box指定的狗数据特定狗的亚类的实值置信度。

ILSVRC2012开发套件DevelopmentKit

ILSVRC2012的开发套件(development kit)有两个分别是用于任务1、2ILSVRC2012_devkit_t12和用于任务3的ILSVRC2012_devkit_t3,他们的主要内容也有两个:

  1. 比赛中所用图片所属WordNet类别的元数据介绍。它是一个MATLAB的*.m文件,保存在ILSVRC2012_devkit_t12/data/meta.mILSVRC2012_devkit_t2/data/meta.m中。
  2. 用于提交用户作品评价的ILSVRC2012MATLAB例程。相关*.m文件存储在ILSVRC2012_devkit_t12/evaluation/或ILSVRC2012_devkit_t2/evaluation/下。

这里简要介绍一下data/meta.m文件。meta.m是一个MATLAB文件,里面存储了一个名为synsets的变量。可以通过load函数打开,例如:metadata=load(‘meta.m’), synsets=metadata.synsets、synsets=load(‘meta.m’, ‘synsets’)。

synsets结构体主要定义了比赛中图片所属类别的相关信息,一共包含8个字段,每个字段的具体含义如下:

序号字段含义与WordNet关系
1ILSVRC2012_IDILSVRC2012中类别的内部唯一编号,专门为这个竞赛设计,用于表示特定类别它是ILSVRC2012特定的类目编号,与WordNet中的Synset ID是对应的,但不直接使用WordNet的编号
2WNIDWNID (WordNet ID),WordNet 中的 Synset ID,用来标识特定的同义词集(Synset)直接来自 WordNet,每个类别都有一个对应的 WNID,与 WordNet 中的 Synsets 一一对应。通常以 n 开头,后面跟8位数字。WNID = n01440764 可能对应鱼类的类别。
3words每个类别的标签,也就是该类别的词义(通常为英文描述)。通常是对 WNID 的自然语言描述。与 WordNet Synset 中的词义部分一致,描述该类别的意思。
4gloss类别的简短解释或释义,提供了对该类别的更详细的描述。来自 WordNet Synset 的释义部分,帮助理解词义的具体含义。
5num_children当前类别的子类别数目,表示该类别在 WordNet 中是否有更细分的子类。直接来自 WordNet 的分类结构,表明某个 Synset 是否在层次结构中有子类(分支)。
6children当前类别的所有子类的 ILSVRC2012_ID 列表,列出了该类目的下级类别。对应 WordNet 中的分层结构,如果该 Synset 有子类,这里会列出这些子类。
7wordnet_height当前类别在 WordNet 层次结构中的高度,表示该类别距离 WordNet 层次树的根节点的距离。高度数值越大,表示该类别位于更深层次的结构中。这个值直接反映了 WordNet 中的类别层级。
8num_train_images与该类别相关的训练图像的数量,表示用于训练的该类图片的数目。这个字段与 WordNet 无关,它是特定于 ILSVRC 数据集的,提供训练数据集的相关信息。

下方提供了将*.mat文件存储为CSV文件的MATLAB脚本代码:

synsets = load('meta.mat', 'synsets').synsets  % 加载meta.mat中的sysnets结构体变量
synsets_t = struct2table(synsets)  % 使用struct2table函数将结构体变量转变为表格
writetable(synsets_t, 'synsets.csv')  % 将synsets表格存储在本地的CSV文件中

注意:

  1. meta中一共包含了 1860 个synsets,只有其中前1000个才是ILSVRC2012需要的,并给出了训练集图片;
  2. meta.mat中synsets结构体变量的children字段是一个列表,因此在CSV文件中表现为多个列。

获取Synset的标签描述

要在 Python 中读取 ILSVRC2012 数据集中不同 WNID 对应的 WordNet 词义,可以结合 ILSVRC2012 的 WNID(WordNet ID) 和 NLTK 的 WordNet 接口 来实现。ILSVRC2012 使用的 WNID 是 WordNet 同义词集(synsets)的唯一标识符,借助 NLTK 和 WordNet 数据库,可以根据 WNID 查询对应的词义。
我们会使用到nltk.corpus.wordnet.synset_from_pos_and_offset这个函数。该函数式NLTK WordNet接口中的一个函数,用于通过词性(pos:part of speach)和偏移量(offset)获取对应的同义词集。该函数根据WordNet数据的内部结构,直接从WordNet的ID中提取出词义、定义、同义词等信息。

该函数的定义原型为:

nltk.corpus.wordnet.synset_from_pos_and_offset(pos, offset)

参数

  • pos(词性,part of speech):str字符串类型。表示词条的词性,可供选择项如下。
    • n:noun,名词。
    • v:verb,动词。
    • a:adjective,形容词。
    • r:adverb,副词。
    • s:satellite adjective,卫星形容词。
  • offset(偏移量):int整型。表示WordNet中每个同义词集(synset)的唯一标识符,代表该同义词集在WordNet中的位置。

返回值

  • 返回值是一个nltk.corpus.reader.wordnet.Synset对象。通过该对象可以获取同义词集的名称、定义、例句和所有同义词,具体如下:
    • synset.name():获取同义词集的名称(通常以 “词条.词性.编号” 的形式)。
    • synset.definition():获取该同义词集的定义。
    • synset.examples():获取该词义的例句(如果有)。
    • synset.lemmas():获取该同义词集中的所有同义词。

例如:

import nltk
from nltk.corpus import wordnet as wn
nltk.download('wordnet')  # 下载一次即可

wnid = 'n02110063'

synset = wn.synset_from_pos_and_offset('n', int(wnid[1:]))

# 输出 WNID 对应的词义信息
print(f"WNID: {wnid}")
print(f"词条: {synset.name()}")
print(f"定义: {synset.definition()}")
print(f"例句: {synset.examples()}")
print(f"同义词: {[lemma.name() for lemma in synset.lemmas()]}")

输出如下:

WNID: n02110063
词条: malamute.n.01
定义: breed of sled dog developed in Alaska
例句: []
同义词: ['malamute', 'malemute', 'Alaskan_malamute']

Python读取及可视化

ILSVRC2012的测试集一共10W张JPEG图片和bounding box的xml标注文件。虽然提供了xml标注,但是进提供xmin、ymin、xmax和ymax。不会告知类别,毕竟是测试集嘛!

注意:ILSVRC2012的标签采用的是PASCAL VOC所使用的XML文件管理方式。其中,ILSVRC2012_val_00048827.xml文件内容为:

<annotation>
  <folder>val</folder>
  <filename>ILSVRC2012_val_00048827</filename>
  <source>
  	<database>ILSVRC_2012</database>
  </source>
  <size>
  	<width>1024</width>
  	<height>693</height>
  	<depth>3</depth>
  </size>
  <segmented>0</segmented>
  <object>
  	<name>n02281787</name>
  	<pose>Unspecified</pose>
  	<truncated>0</truncated>
  	<difficult>0</difficult>
  	<bndbox>
  		<xmin>133</xmin>
  		<ymin>157</ymin>
  		<xmax>620</xmax>
  		<ymax>587</ymax>
  	</bndbox>
  </object>
</annotation>

PyTorch读取API

PyTorch提供了一个用于加载和解析本地 ImageNet2012数据集中图像分类任务的API:torchvision.datasets.ImageNet

  • torchvision.datasets.ImageNet的参数:
    • root:str或pathlib.Path类型。ImageNet数据集存储的根目录。
    • split:str类型。数据集划分,支持trainval
    • transform:可调用类型。可选项。接收PIL图像并返回转换后版本的函数/转换,例如transforms.RandomCrop
    • target_transform:可调用类型。可选项。接受目标并对其进行转换的函数/转换。,例如transforms.RandomCrop
    • loader:加载给定路径的图像的函数。
  • torchvision.datasets.ImageNet的返回值:
    • 一个可以使用索引获取图像和类别索引元组对的Python类。

注意:

  1. PyTorch提供处理ImageNet的API:torchvision.datasets.ImageNet不提供下载选项。
    这是因为根据ImageNet的使用条例,所有的用户需要使用机构邮箱注册ImageNet账户,并申请
    数据集使用权限,通过后方可下载。
  2. torchvision.datasets.ImageNet需要传入数据集根目录root,并且要求root
    目录下存在以下三个文件:
    • ILSVRC2012_devkit_t12.tar.gz
    • ILSVRC2012_img_train.tar
    • ILSVRC2012_img_val.tar

基于PyTorch的API接口加载及可视化

import torchvision.datasets as datasets
import matplotlib.pyplot as plt


imagenet = datasets.ImageNet(
    root='F:/ImageNet/ILSVRC2012/ILSVRC2012/',
    split='val',
)

fig = plt.figure(figsize=(6, 2))
fig.suptitle("ILSVRC2012 Validation!")
print(f"There are {len(imagenet)} samples in ILSVRC2012 val subdataset.")
for idx, (img, target) in enumerate(imagenet):
    ax = fig.add_subplot(1, 3, idx + 1)
    ax.set_xticks([])
    ax.set_yticks([])
    ax.set_frame_on(b=False)
    ax.imshow(img)
    ax.set_xlabel(f"class: {target}")
    if idx >= 2:
        break

plt.show()

在这里插入图片描述

自定义读取接可视化Python脚本

  • 一个简单的加载及可视化的Python脚本接可视化结果
import cv2
from PIL import Image
import numpy as np
from xml.etree import ElementTree as ET
import matplotlib.pyplot as plt

num = 50000  # the total image number of validation subdataset
val_xml_root = "./Annotations/"  # directory where val xml labels are saved
val_img_root = "./JPEGImages/"  # directory where val JPEG images are saved

def parse_voc(xml_file: str):
    """parse PASCVAL VOC annotations"""
    tree = ET.parse(xml_file)
    root = tree.getroot()

    objects = []

    # iter each object node
    for obj in root.findall('object'):
        obj_dit = {}
        for child in obj:
            if child.tag == 'bndbox':
                bbox = {}
                for dim in child:
                    bbox[dim.tag] = dim.text
                obj_dit[child.tag] = bbox
            else:
                obj_dit[child.tag] = child.text
        objects.append(obj_dit)

    return objects

def draw_bndbox(img: Image, object: list[dict]):
    """draw bounding box according to boxes list."""
    img_cv2 = cv2.cvtColor(np.asanyarray(img), cv2.COLOR_RGB2BGR)  # convert PIL.Image to cv2
    for obj in object:
        name = obj['name']
        xmin = int(obj['bndbox']['xmin'])
        xmax = int(obj['bndbox']['xmax'])
        ymin = int(obj['bndbox']['ymin'])
        ymax = int(obj['bndbox']['ymax'])
        img_cv2 = cv2.rectangle(img_cv2, (xmin, ymin), (xmax, ymax),
            (0, 0, 255))
        img_cv2 = cv2.putText(img_cv2, name, (xmin, ymin),
            cv2.FONT_HERSHEY_COMPLEX_SMALL, 1, (0, 0, 255), 1, cv2.FILLED)

    return Image.fromarray(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB))

# random select 6 images, and show their classes ID and bounding boxes in them
fig = plt.figure(figsize=(12, 12))
np.random.seed(2)
for idx, id in enumerate(np.random.choice(num, size=6)):
    xml_addr = val_xml_root + 'ILSVRC2012_val_' + str(id + 1).zfill(8) + '.xml'
    img_addr = val_img_root + 'ILSVRC2012_val_' + str(id + 1).zfill(8) + '.JPEG'
    objs = parse_voc(xml_addr)
    img = Image.open(img_addr)
    img_show = draw_bndbox(img, objs)
    ax = fig.add_subplot(2, 3, idx + 1)
    ax.imshow(img_show)
    ax.set_xticks([])
    ax.set_yticks([])
    ax.set_frame_on(b=False)

plt.show()

在这里插入图片描述

参考文献

  1. Standford Lab, Standford University, Princeton University. ImageNet. [EB.OL]. [2024-09-03]. https://www.image-net.org/
  2. Standford Lab, Standford University, Princeton University. ImageNet Large Scale Visual Recognition Challenge (ILSVRC)[EB/OL]. [2024-09-03]. https://www.image-net.org/challenges/LSVRC/index.php
  3. Addison Howard, Eunbyung Park, Wendy Kan. ImageNet Object Localization Challenge[EB/OL]. (2018)[2024-09-03]. https://www.kaggle.com/c/imagenet-object-localization-challenge/overview/description
  4. WordNet: A Lexcical Database for English[EB/OL]. [2024-09-03]. https://wordnet.princeton.edu/
  5. Standford Lab, Standford University, Princeton University. ImageNet Large Scale Visual Recognition Challenge 2012 (ILSVRC2012)[EB/OL]. [2024-09-03]. https://www.image-net.org/challenges/LSVRC/2012/index.php
  6. Slides: Introduction and overview of results for ILSVRC2012[EB/OL]. (2012)[2024-09-06]. https://www.image-net.org/static_files/files/ilsvrc2012.pdf🚀🚀🚀这是李飞飞讲解ILSVRC2012概况和比赛结果的幻灯片PDF文件!
  7. Russakovsky O., Deng J., Su H., et al. ImageNet Large Scale Visual Recognition Challenge[J]. Internatinal Journal of Computer Science. 2015, 115(3): 211-252.

最后:笔者能力和水平有限,此处内容仅供学习和参考,若有错漏可私信博主。❗️❗️❗️


收集整理和创作不易, 若有帮助🉑, 请帮忙点赞👍➕收藏❤️, 谢谢!✨✨🚀🚀

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

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

相关文章

电子邮件加密软件哪个好用?分享这五款加密工具,防范邮件泄密!2024企业必备!

"密语藏锋刃&#xff0c;安全重于山。" 在数字洪流中&#xff0c;电子邮件是企业沟通的重要桥梁&#xff0c;其安全性不容忽视。 因此&#xff0c;选择一款高效可靠的电子邮件加密软件&#xff0c;是企业保障信息安全的关键。 本文将为您推荐五款2024年企业必备的电…

Kotlin协程之协程的结构化详解

前言 上一篇文章介绍了协程概念的具像化&#xff0c;算是对协程的概念进一步进行加深&#xff0c;本篇文章来看一下协程结构化的概念。 结构化 是协程中一个非常重要且非常实用的一个特性&#xff0c;它可以帮助我们更好的管理协程的生命周期。 如果说 挂起函数 解决了并发任…

今日leetCode 19.删除链表的倒数第N个结点

19. 删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&…

每日OJ_牛客_简单错误记录(文件模拟)

目录 简单错误记录&#xff08;文件模拟&#xff09; 解析代码 简单错误记录&#xff08;文件模拟&#xff09; 简单错误记录__牛客网 开发一个简单错误记录功能小模块&#xff0c;能够记录出错的代码所在的文件名称和行号。 处理&#xff1a; 1、 记录最多8条错误记录&a…

说说精益生产管理咨询公司排名的那些事

面对市场上琳琅满目的精益生产管理咨询公司&#xff0c;企业如何做出明智选择&#xff0c;避免陷入“坑”中&#xff0c;成为了一个值得探讨的话题。本文将从多个维度出发&#xff0c;为大家揭晓精益生产管理咨询公司排名的那些事&#xff0c;助您找到最适合的合作伙伴。 一、认…

日本IT工作内容---一篇梗概

日本IT工作现场是一个充满活力、技术导向且多元化的工作环境。以下是对日本IT工作内容的详细概述&#xff1a; 1. 软件开发&#xff08;Software Engineering, SE&#xff09; 主要任务&#xff1a;编写、测试和维护软件&#xff0c;以满足客户需求。这包括使用多种编程语言和…

Tuxera NTFS for Mac破解版下载 Tuxera NTFS for Mac2023激活码 mac电脑ntfs磁盘软件

Tuxera NTFS for Mac是一款优秀的Mac系统完全读写软件&#xff0c;提供Fat32、NTFS、Exfat、mac os扩展格式的转换&#xff0c;稳定性好&#xff0c;传输速度极快。Tuxera NTFS for Mac功能丰富&#xff0c;能修复NTFS卷、创建NTFS磁盘映像、创建NTFS分区等等。同时软件支持所有…

英伟达25年收购案例盘点:从3dfx到Mellanox,如何通过技术并购建立护城河

英伟达&#xff08;NVIDIA&#xff09;作为全球领先的GPU制造商&#xff0c;近年来通过一系列高效的收购活动&#xff0c;不断扩大其技术布局&#xff0c;并稳固其在AI、数据中心等核心领域的行业领先地位。在过去25年中&#xff0c;英伟达通过软硬件全栈式收购策略&#xff0c…

Qt绘制动态仪表(模仿汽车仪表指针、故障灯)

背景&#xff1a; 项目需要&#xff0c;可能需要做一些仪表显示。此篇除了介绍实现方法&#xff0c;还要说明心路历程。对我而言&#xff0c;重要的是心理&#xff0c;而不是技术。写下来也是自勉。 本人起初心里是比较抵触的&#xff0c;从业20多年了&#xff0c;深知所谓界…

240911-基于Ollama的22行代码实现极简交互式RAG问答

A. 最终效果 B. 环境配置 pip install llama-index-embeddings-ollama pip install llama-index-llms-ollama pip install llama-indexC. 代码程序 from llama_index.core import VectorStoreIndex, Document, SimpleDirectoryReader,Settings from llama_index.llms.ollama …

计算机毕业设计选题推荐-动漫插画分享网站-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

Linux 工程师:探索开源世界的专业之路

摘要&#xff1a; 本文深入探讨了 Linux 工程师这一职业角色。从 Linux 操作系统的基础特性与架构开始阐述&#xff0c;详细分析了 Linux 工程师在不同领域的工作范畴&#xff0c;包括系统安装与配置、内核开发与优化、网络管理、安全防护等方面。文中还探讨了成为一名优秀 Lin…

vue3数据持久化方案:pinia-plugin-persistedstate源码浅析

概述 Pinia是vue3的官方推荐用于数据共享的库,但是Pinia🍍中的数据是存在于浏览器的内存中,当浏览器刷新后,这些数据就会消失。因此我们需要对数据做持久化存储,这个时候就需要用到pinia-plugin-persistedstate。 pinia-plugin-persistedstate本质上利用浏览器持久化存…

即插即用篇 | YOLOv8 引入高效的直方图Transformer模块 | 突破天气障碍:Histoformer引领高效图像修复新路径“

本改进已同步到YOLO-Magic框架! 摘要:摘要。基于Transformer的恶劣天气图像修复方法取得了显著进展。大多数方法通过沿通道维度或在空间上固定范围的块内使用自注意力,以减少计算负担。然而,这种折中方式在捕获长距离空间特征方面存在局限性。受到恶劣天气导致的退化因素主…

C++职工管理系统(具备增删改查功能 涉及文件操作、指针数组操作、升序降序、多态、虚函数)

目录 &#x1f315;需求分析&#x1f315;创建项目&#x1f315;完整代码&#x1f319;项目结构&#x1f319;include⭐worker.h (它是后面employ&#xff0c;boss&#xff0c;manager的基类)⭐boss.h⭐employee.h⭐manager.h⭐workerManager.h &#x1f319;src⭐boss.cpp⭐em…

0911(绘制事件,qt中的网络通信)

一、实现一个时钟 1)代码 头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QTimer> #include <QTime> #include <QTimerEvent>QT_BEGIN_NAMESPACE nam…

如何用Google Trend进行SEO优化?方法与策略

做SEO的都知道&#xff0c;Google Trend是一款免费工具&#xff0c;用户可以查看不同关键词的搜索趋势、兴趣强度和区域分布。通过 Google Trends&#xff0c;你可以获得以下信息&#xff0c;这些数据可以帮助您更好地了解用户需求并优化您的SEO策略&#xff1a; 1、搜索量趋势…

线结构光测量系统标定--导轨

光平面标定原理可查看之前的博文《光平面标定》&#xff0c;光条中心提取可参考线结构光专栏光条中心提取系列的文章&#xff0c;相机标定参考相机标定专栏中的博文。&#xff08;欢迎进Q群交流&#xff1a;874653199&#xff09; 线结构光测量系统(指一个线结构光传感器与一个…

如何检查前端项目中我们没有使用的第三方包

问题描述&#xff1a;我们在赶项目或者在做些功能或者效果的时候往往会用到很多的第三方包&#xff0c;那么时间一长&#xff0c;我们有时候会忘记删除这些包到底该怎么办呢&#xff1f;接下来教给大家一个方法。 在我们的项目根目录下面随便起一个.js的文件 代码如下&#x…

算法工程师重生之第四天(两两交换链表中的节点 删除链表的倒数第N个节点 链表相交 环形链表II 总结 )

参考文献 代码随想录 一、两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&am…