读取COCO数据集的关键点坐标

本文介绍如何使用COCO API从COCO数据集中提取人体关键点坐标,并将其保存为CSV文件。文中提供了详细的Python代码示例,演示了如何加载数据、获取类别信息及标注数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

COCO是一个大型的CV数据库,里面包含了包括object detection, keypoints estimation, semantic segmentation,image caption等多个任务所需要的数据库。这里主要介绍一下如何用COCO提供的API读取人体关键点的坐标。关于COCO关节点的评价矩阵,可以参考这个博客

安装COCO API

安装过程可以参照下面这个博客:
https://www.jianshu.com/p/de455d653301
如果你是Linux用户,那么基本上不会出现什么问题,直接make COCO的API就好,但是你如果是Windows的用户的话,比如我,就极其容易出现问题,好在上面那个博客基本上可以解决这个问题。

提取COCO数据集包含人的Keypoints标注

话不多说,直接上python的代码:

# @author: zhangboshen
# @Email: zhangbs@whu.edu.cn 
# 
# 提取COCO关键点并保存在CSV文件中 Date: 2018.3.22

from pycocotools.coco import COCO
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
import os
from PIL import Image
from PIL import ImageDraw
import csv
pylab.rcParams['figure.figsize'] = (8.0, 10.0)

# initialize COCO api for person keypoints annotations
dataDir='..'
dataType='train2017'
annFile = '{}/annotations/person_keypoints_{}.json'.format(dataDir,dataType)
coco_kps=COCO(annFile)

# display COCO categories and supercategories
cats = coco_kps.loadCats(coco_kps.getCatIds())
nms=[cat['name'] for cat in cats]
print('COCO categories: \n{}\n'.format(' '.join(nms)))

nms = set([cat['supercategory'] for cat in cats])
print('COCO supercategories: \n{}'.format(' '.join(nms)))

# get all images containing given categories, select one at random
catIds = coco_kps.getCatIds(catNms=['person']);
imgIds = coco_kps.getImgIds(catIds=catIds );
print ('there are %d images containing human'%len(imgIds))

def getBndboxKeypointsGT():
    csvFile = open('....../KeypointBndboxGT.csv','wb') 
    keypointsWriter = csv.writer(csvFile)
    firstRow = ['imageName','personNumber','bndbox','nose',
            'left_eye','right_eye','left_ear','right_ear','left_shoulder','right_shoulder',
            'left_elbow','right_elbow','left_wrist','right_wrist','left_hip','right_hip',
            'left_knee','right_knee','left_ankle','right_ankle']
    keypointsWriter.writerow(firstRow)
    for i in range(len(imgIds)):
        imageNameTemp = coco_kps.loadImgs(imgIds[i])[0]
        imageName = imageNameTemp['file_name'].encode('raw_unicode_escape')
        img = coco_kps.loadImgs(imgIds[i])[0]
        annIds = coco_kps.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
        anns = coco_kps.loadAnns(annIds)
        personNumber = len(anns)
        for j in range(personNumber):
            bndbox = anns[j]['bbox']
            keyPoints = anns[j]['keypoints']
            keypointsRow = [imageName,str(personNumber),
                            str(bndbox[0])+'_'+str(bndbox[1])+'_'+str(bndbox[2])+'_'+str(bndbox[3]),
                            str(keyPoints[0])+'_'+str(keyPoints[1])+'_'+str(keyPoints[2]),
                            str(keyPoints[3])+'_'+str(keyPoints[4])+'_'+str(keyPoints[5]),
                            str(keyPoints[6])+'_'+str(keyPoints[7])+'_'+str(keyPoints[8]),
                            str(keyPoints[9])+'_'+str(keyPoints[10])+'_'+str(keyPoints[11]),
                            str(keyPoints[12])+'_'+str(keyPoints[13])+'_'+str(keyPoints[14]),
                            str(keyPoints[15])+'_'+str(keyPoints[16])+'_'+str(keyPoints[17]),
                            str(keyPoints[18])+'_'+str(keyPoints[19])+'_'+str(keyPoints[20]),
                            str(keyPoints[21])+'_'+str(keyPoints[22])+'_'+str(keyPoints[23]),
                            str(keyPoints[24])+'_'+str(keyPoints[25])+'_'+str(keyPoints[26]),
                            str(keyPoints[27])+'_'+str(keyPoints[28])+'_'+str(keyPoints[29]),
                            str(keyPoints[30])+'_'+str(keyPoints[31])+'_'+str(keyPoints[32]),
                            str(keyPoints[33])+'_'+str(keyPoints[34])+'_'+str(keyPoints[35]),
                            str(keyPoints[36])+'_'+str(keyPoints[37])+'_'+str(keyPoints[38]),
                            str(keyPoints[39])+'_'+str(keyPoints[40])+'_'+str(keyPoints[41]),
                            str(keyPoints[42])+'_'+str(keyPoints[43])+'_'+str(keyPoints[44]),
                            str(keyPoints[45])+'_'+str(keyPoints[46])+'_'+str(keyPoints[47]),
                            str(keyPoints[48])+'_'+str(keyPoints[49])+'_'+str(keyPoints[50]),]

            keypointsWriter.writerow(keypointsRow)

    csvFile.close()

if __name__ == "__main__":
    print ('Writing bndbox and keypoints to csv files..."')
    getBndboxKeypointsGT()       
最后的CSV文件包含了:图片名字;单张图片包含的人的数量;对应的boundingbox;以及17个点的二维坐标。
### COCO Keypoints Detection Dataset 下载与使用指南 COCO 数据集不仅提供了对象检测和分割的任务支持,还包含了关键点检测数据集。以下是有关该数据集的关键信息以及如何下载和使用的指导。 #### 关键点检测数据集概述 COCO Keypoints Detection 是 COCO 数据集的一部分,专注于人体姿态估计任务。它标注了图像中人物的关键点位置,通常包括 17 个主要的人体关节[^3]。这些关键点涵盖了头部、躯干和四肢的主要部位,使得它可以广泛应用于动作识别、行为分析等领域。 #### 数据集特点 - **图片数量**: 继承自原始 COCO 数据集的约 20万张训练验证图。 - **类别覆盖范围**: 主要针对人类个体进行标记。 - **关键点定义**: 提供每幅图像中的每个人物实例上多达 17 种预设的身体部位坐标及其可见性状态[^4]。 #### 性能评估指标 对于关键点检测任务而言,常用的评价标准是 Object Keypoint Similarity (OKS),类似于 mAP 的概念但专门用于衡量不同尺度下预测关键点的质量。具体来说,通过计算多个 IoU 阈值下的平均精度来得出最终得分[^5]。 #### 如何获取并加载 COCO Keypoints Data? 可以按照官方指引或者第三方库的方式完成数据准备过程: ##### 方法一:直接从官方网站下载 访问 [Microsoft COCO](http://cocodataset.org/#download) 页面找到对应版本(如 `annotations_trainval` 和实际图片压缩包),解压后即可获得完整的 JSON 文件描述及对应的 JPG 图片集合[^6]。 ##### 方法二:利用 Python 工具快速读取 借助 PyTorch 或 Detectron2 等框架内置的支持函数简化操作流程如下所示: ```python from pycocotools.coco import COCO # 初始化 COCO API 对象 annFile = './path/to/annotations/person_keypoints_val2017.json' coco_kps = COCO(annFile) # 获取所有带有人类标签的信息列表 catIds = coco_kps.getCatIds(catNms=['person']); imgIds = coco_kps.getImgIds(catIds=catIds); images = coco_kps.loadImgs(imgIds) ``` 上述脚本展示了怎样基于指定分类筛选目标样本,并进一步提取其元数据记录以便后续处理阶段调用[^7]。 --- ####
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值