我正在开发一个对象检测模型来使用 YOLO 检测船舶。我想使用 COCO 数据集。有没有办法只下载带有注释的图像?
3 回答
要从特定类别下载图像,您可以使用COCO API。这是一个演示笔记本,介绍了这个和其他用法。总体流程如下:
现在这是一个示例,说明我们如何下载包含 a 的图像子集person
并将其保存在本地文件中:
from pycocotools.coco import COCO
import requests
# instantiate COCO specifying the annotations json path
coco = COCO('...path_to_annotations/instances_train2014.json')
# Specify a list of category names of interest
catIds = coco.getCatIds(catNms=['person'])
# Get the corresponding image ids and images using loadImgs
imgIds = coco.getImgIds(catIds=catIds)
images = coco.loadImgs(imgIds)
它返回一个字典列表,其中包含有关图像及其 url 的基本信息。我们现在可以使用requests
图像GET
并将它们写入本地文件夹:
# Save the images into a local folder
for im in images:
img_data = requests.get(im['coco_url']).content
with open('...path_saved_ims/coco_person/' + im['file_name'], 'wb') as handler:
handler.write(img_data)
请注意,这将保存指定类别中的所有图像。因此,您可能希望将images
列表切片到第一个n
.
据我个人所知,如果您只谈论 COCO 数据集,我认为他们没有“船舶”的类别。他们拥有的最接近的类别是“船”。这是检查可用类别的链接: http: //cocodataset.org/#overview
顺便说一句,船类中也有船。
如果您只想选择特定 COCO 类别的图像,您可能想做这样的事情(取自 COCO 的官方演示并编辑):
# display COCO categories
cats = coco.loadCats(coco.getCatIds())
nms=[cat['name'] for cat in cats]
print('COCO categories: \n{}\n'.format(' '.join(nms)))
# get all images containing given categories (I'm selecting the "bird")
catIds = coco.getCatIds(catNms=['bird']);
imgIds = coco.getImgIds(catIds=catIds);
现在有一个名为的包fiftyone
,您可以使用它下载 MS COCO 数据集并仅获取特定类的注释。有关安装的更多信息,请访问https://github.com/voxel51/fiftyone#installation。
安装包后,只需运行以下命令即可说出“人”和“汽车”类:
import fiftyone.zoo as foz
# To download the COCO dataset for only the "person" and "car" classes
dataset = foz.load_zoo_dataset(
"coco-2017",
split="train",
label_types=["detections", "segmentations"],
classes=["person", "car"],
# max_samples=50,
)
如果需要,您可以注释掉最后一个选项以设置最大样本大小。此外,您可以将“train”拆分更改为“validation”以获得验证拆分。
要可视化下载的数据集,只需运行以下命令:
# Visualize the dataset in the FiftyOne App
import fiftyone as fo
session = fo.launch_app(dataset)
如果您想在要加载的数据的同一函数调用中下载拆分“train”、“validation”和“test”,您可以执行以下操作:
dataset = foz.load_zoo_dataset(
"coco-2017",
splits=["train", "validation", "test"],
label_types=["detections", "segmentations"],
classes=["person"],
# max_samples=50,
)