当我们训练姿势估计模型,比较常用的数据集包括像COCO、MPII和CrowdPose这样的公共数据集,但如果我们将其与不同计算机视觉任务(如对象检测或分类)的公共可用数据集的数量进行比较,就会发现可用的数据集并不多。姿态估计问题属于一类比较复杂的问题,为神经网络模型建立一个合适的数据集是很困难的,图像中每个人的每个关节都必须定位和标记,这是一项琐碎而费时的任务。最流行的姿态估计数据集是COCO数据集,它有大约80类图像和大约250000个人物实例。如果你检查此数据集中的一些随机图像,你可能会遇到一些与要解决的问题无关的实例。学术界希望达到最高的精度,但在实际生产环境中并不总是如此。在现实世界中,我们可能更感兴趣的是在非常特定的环境中工作良好的模型,例如行人、篮球运动员、健身房等。让我们从COCO数据集中查看此图像:
你看到红点了吗?这是关键点:鼻子。有时,你可能不希望网络看到仅包含头部一部分的示例,尤其是在帧的底部。在这篇文章中,我会向你展示COCO数据集的一个示例分析COCO数据集COCO数据集是用于许多计算机视觉任务的大规模通用数据集。150万个对象实例,80个对象类别,25万人——这些都让这个数据集令人印象深刻。你可以在源站点上找到更多详细信息,在那里你还可以下载所有必需的文件:https://cocodataset.org/数据集由图像文件和注释文件组成。注释文件是一个JSON,包含关于一个人(或其他一些类别)的所有元数据。在这里我们会找到边界框的位置和大小,区域,关键点,源图像的文件名等。我们不必手动解析JSON。有一个方便的Python库可用使用,即pycocotools(https://github.com/cocodataset/cocoapi/tree/master/PythonAPI)我们需要train2017.zip(https://cocodataset.org/#download),val2017.zip(https://cocodataset.org/#download),annotations_trainval2017.zip(https://cocodataset.org/#download)具体来说,我们只需要人的注释。zip中有两个文件:annotations_trainval2017.zip:person_keypoints_train2017.json和person_keypoints_val2017.json我建议将文件放在以下这个文件夹层次结构中:dataset_coco
|---annotations
|---person_keypoints_train2017.json
|---person_keypoints_val2017.json
|---train2017
|---*.jpg
|---val2017
|---*.jpg
下面是显示如何加载注释的代码:from pycocotools.coco import COCO
...
train_annot_path = 'dataset_coco/annotations /person_keypoints_train2017.json'
val_annot_path = 'dataset_coco/annotations/person_keypoints_val2017.json'
train_coco = COCO(train_annot_path) # 加载训练集的注释
val_coco = COCO(val_annot_path) # 加载验证集的注释
...
# 函数遍历一个人的所有数据库并逐行返回相关数据
def get_meta(coco):
ids = list(coco.imgs.keys())
for i, img_id in enumerate(ids):
img_meta = coco.imgs[img_id]
ann_ids = coco.getAnnIds(imgIds=img_id)
# 图像的基本参数
img_file_name = img_meta['file_name']
w = img_meta['width']
h = img_meta['height']
# 检索当前图像中所有人的元数据
anns = coco.loadAnns(ann_ids)
yield [img_id, img_file_name, w, h, anns]
...
# 迭代图像
for img_id, img_fname, w, h, meta in get_meta(train_coco):
...
# 遍历图像的所有注释
for m in meta:
# m是字典
keypoints = m['keypoints']
...
...
首先,我们必须加载COCO对象,它是json数据的包装器(第6-7行)在第11行,我们加载所有图像标识符。在接下来的几行中,我们为每个图像加载元数据,这是一个包含图像宽度、高度、名称、许可证等一般信息的词典。在第14行,我们加载给定图像的注释元数据,这是一个字典列表,每个字典代表一个人。第27-32行显示了如何加载整个训练集(train_coco),类似地,我们可以加载验证集(val_coco)将COCO转换为Pandas数据帧让我们将COCO元数据转换为pandas数据帧,我们使用如matplotlib、sklearn 和pandas。这可用使得数据的过滤、可视化和操作变得更加容易,此外,我们还可以将数据导出为csv或parquet等。def convert_to_df(coco):
images_data = []
persons_data = []