Microsoft COCO(Common Objects in Context)是微软研发维护的一个大型的数据集。包含了30多万张图片和91个目标分类。可用于目标识别(Object Detection)、场景感知(Penoptic Segmentation)、语义分割(Stuff Segmentation)、标题生成(Image Captioning)等任务。
1 数据集下载
MS COCO数据集可以通过官方网站下载
https://cocodataset.org/#home
进入下载页面
https://cocodataset.org/#download
2017相关的为最新发布的数据集
包含三个图像数据文件(Train、Val、Test)和系列标注文件,针对不同的识别任务。
数据下载后解压,产生四个子目录,分别train2017、val2017、test2017和annotations。其中前面三个为训练、评估、测试的图像数据,annotations目录为这些图像的标注信息。包含针对多种任务类型的标注。目录结构如下
train2017 #训练图像目录
val2017 #评估图像目录
test2017 #测试图像目录
annotations #标注文件夹
├── captions_train2017.json #图像标题标注(训练集)
├── captions_val2017.json #图像标题标注(评估集)
├── instances_train2017.json #目标检测、语义分割标注(训练集)
├── instances_val2017.json #目标检测、语义分割标注(评估集)
├── panoptic_train2017.json #全景感知标注(训练集)
├── panoptic_val2017.json #全景感知标注(评估集)
├── person_keypoints_train2017.json #人体关键点检测标注(训练集)
├── person_keypoints_val2017.json #人体关键点检测标注(评估集)
├── stuff_train2017.json #目标检测、语义分割标注(训练集)
└── stuff_val2017.json #目标检测、语义分割标注(评估集)
2 数据读取
通过annotations中的文件可以提取图片以及对应的标注信息,以图像标题标注文件为例。
首先,载入需要的模块
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import json
import random
其中matplotlib用于显示数据集中的图片,以及对应的标注。json用于载入标注文件。random用于从数据中随机选择样本显示。
指定数据目录
# specify paths
data_path = '../data/COCO'
anno_path = f'{data_path}/annotations'
train_path = f'{data_path}/train2017'
然后读取图像标题标注文件
# load json file, caption annotations
json_file = f'{anno_path}/captions_train2017.json'
with open(json_file, 'r') as f:
json_data = json.load(f)
images = json_data['images']
annotations = json_data['annotations']
载入的json数据包含多个成员变量。运行
json_data.keys()
显示
dict_keys(['info', 'licenses', 'images', 'annotations'])
包含info、license、images、annotations四个变量,其中images为图像信息,包含图像的大小、文件名等信息,annotations为标注信息
然后绘制一些图片以及它们所对应的标题标注,代码如下
# lines and columns of subplots
m = 2
n = 2
num = m*n
# size of figure
plt.figure(figsize=(12,12))
# randomly choose images and plot
for i in range(num):
# randomly choose image
image_item = random.choice(images)
image_id = image_item['id']
image_file = f'{train_path}/{image_item["file_name"]}'
captions = [anno['caption'] for anno in annotations if anno['image_id']==image_id]
# subplot
plt.subplot(m,n,i+1)
img = mpimg.imread(image_file)
plt.imshow(img)
plt.xticks([])
plt.yticks([])
plt.xlabel('\n'.join(captions), fontsize=12)
plt.show()
在图像列表images中随机选择4张图片,对于每一张图片,读取它们的id信息,然后在annotations中查找与这个图片相关的标注。最后绘制图片,并在图片下方显示图片的标题,多个标题以每一行进行分开。
随机列出4张图片,每一张图片包含5个标题的标注。
参考链接:
https://blog.csdn.net/qq_44554428/article/details/122597358
https://blog.csdn.net/qq_52053775/article/details/126196060