目录
摘要:本篇文档详细介绍了人工智能(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),用户需要解压缩并组织数据。训练数据、验证数据和测试数据通常分别存放在不同的文件夹中。
注意:
- ImageNet数据集仅用于非商业研究用途,下载时需要同意其许可协议。
- ILSVRC数据集非常庞大(几十GB),需要足够的存储空间和带宽来下载和存储数据。
- 图像数据通常以JPEG格式存储,分类标签和标注文件通常以文本格式提供。
大体上下载ImageNet数据集需要完成以下几步:
- 使用机构邮箱(一般要求是edu结尾或者edu.c结尾的校园邮箱)注册ImageNet账号,并登录;
- 申请下载权限:申请时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官网上可以下载如下几个数据包,具体信息如所示。
序号 | 类别 | 名称 | 文件名 | 文件大小 | 备注 |
---|---|---|---|---|---|
1 | Development Kit | 任务1、2的工具包 | ILSVRC2012_devkit_t12.tar.gz | 2.5 MB | 施工中…… |
2 | Development Kit | 任务3的工具包 | ILSVRC2012_devkit_t3.tar.gz | 22 MB | 施工中…… |
3 | Images | 训练集JPEG图片:任务1、2 | ILSVRC2012_img_train.tar | 138 GB | 施工中…… |
4 | Images | 训练集JPEG图片:任务3 | ILSVRC2012_img_train_t3.tar | 728 MB | 施工中…… |
5 | Images | 验证集JPEG图片 | ILSVRC2012_img_val.tar | 6.3 GB | 施工中…… |
6 | Images | 测试集JPEG图片 | ILSVRC2012_img_test_v10102019.tar | 13 GB | 施工中…… |
7 | Bounding Boxes | 训练集任务3的标注XML文件 | ILSVRC2012_bbox_train_v2.tar.gz | 20 MB | 施工中…… |
8 | Bounding Boxes | 训练集任务1、2的标注XML文件 | ILSVRC2012_bbox_train_dogs.tar.gz | 1 MB | 施工中…… |
9 | Bounding Boxes | 验证集的标注XML文件 | ILSVRC2012_bbox_val_v3.tgz | 2.2 MB | 施工中…… |
10 | Bounding Boxes | 测试集的标注XML文件 | ILSVRC2012_bbox_test_dogs.zip | 33 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=n1⋅k∑jmind(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=n1⋅k∑jminmminMkmax{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,他们的主要内容也有两个:
- 比赛中所用图片所属WordNet类别的元数据介绍。它是一个MATLAB的
*.m
文件,保存在ILSVRC2012_devkit_t12/data/meta.m
或ILSVRC2012_devkit_t2/data/meta.m
中。 - 用于提交用户作品评价的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关系 |
---|---|---|---|
1 | ILSVRC2012_ID | ILSVRC2012中类别的内部唯一编号,专门为这个竞赛设计,用于表示特定类别 | 它是ILSVRC2012特定的类目编号,与WordNet中的Synset ID是对应的,但不直接使用WordNet的编号 |
2 | WNID | WNID (WordNet ID),WordNet 中的 Synset ID,用来标识特定的同义词集(Synset) | 直接来自 WordNet,每个类别都有一个对应的 WNID,与 WordNet 中的 Synsets 一一对应。通常以 n 开头,后面跟8位数字。WNID = n01440764 可能对应鱼类的类别。 |
3 | words | 每个类别的标签,也就是该类别的词义(通常为英文描述)。通常是对 WNID 的自然语言描述。 | 与 WordNet Synset 中的词义部分一致,描述该类别的意思。 |
4 | gloss | 类别的简短解释或释义,提供了对该类别的更详细的描述。 | 来自 WordNet Synset 的释义部分,帮助理解词义的具体含义。 |
5 | num_children | 当前类别的子类别数目,表示该类别在 WordNet 中是否有更细分的子类。 | 直接来自 WordNet 的分类结构,表明某个 Synset 是否在层次结构中有子类(分支)。 |
6 | children | 当前类别的所有子类的 ILSVRC2012_ID 列表,列出了该类目的下级类别。 | 对应 WordNet 中的分层结构,如果该 Synset 有子类,这里会列出这些子类。 |
7 | wordnet_height | 当前类别在 WordNet 层次结构中的高度,表示该类别距离 WordNet 层次树的根节点的距离。 | 高度数值越大,表示该类别位于更深层次的结构中。这个值直接反映了 WordNet 中的类别层级。 |
8 | num_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文件中
注意:
- meta中一共包含了 1860 个synsets,只有其中前1000个才是ILSVRC2012需要的,并给出了训练集图片;
- 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类型。数据集划分,支持
train
或val
。 - transform:可调用类型。可选项。接收PIL图像并返回转换后版本的函数/转换,例如
transforms.RandomCrop
。 - target_transform:可调用类型。可选项。接受目标并对其进行转换的函数/转换。,例如
transforms.RandomCrop
- loader:加载给定路径的图像的函数。
- torchvision.datasets.ImageNet的返回值:
- 一个可以使用索引获取图像和类别索引元组对的Python类。
注意:
- PyTorch提供处理ImageNet的API:
torchvision.datasets.ImageNet
不提供下载选项。
这是因为根据ImageNet的使用条例,所有的用户需要使用机构邮箱注册ImageNet账户,并申请
数据集使用权限,通过后方可下载。 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()
参考文献
- Standford Lab, Standford University, Princeton University. ImageNet. [EB.OL]. [2024-09-03]. https://www.image-net.org/
- 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
- 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
- WordNet: A Lexcical Database for English[EB/OL]. [2024-09-03]. https://wordnet.princeton.edu/
- 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
- 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文件!
- 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.
最后:笔者能力和水平有限,此处内容仅供学习和参考,若有错漏可私信博主。❗️❗️❗️
收集整理和创作不易, 若有帮助🉑, 请帮忙点赞
👍➕收藏
❤️, 谢谢!✨✨🚀🚀