这里写自定义目录标题

  • COCO数据集Keypoint标注格式
  • COCO数据集官网
  • Keypoint Detection关键点检测
  • 统一数据格式
  • Keypoint标注
  • 使用COCO-Annotator标注自有数据集
  • 在Ubuntu 18.04上安装COCO-Annotator
  • 安装Docker和Docker-Compose
  • 安装COCO Annotator
  • 启动COCO Annotator
  • 使用COCO Annotator在自有数据集上进行Keypoint标注
  • 创建数据集
  • 标注
  • 关键点标注
  • 设置关键点可见性
  • 查看保存的keypoint标注


COCO数据集Keypoint标注格式

COCO数据集官网

COCO全程是Common Object in COntext,是CV里很常用的一个数据集。
COCO官网:https://cocodataset.org/#home

Keypoint Detection关键点检测

COCO官方关于数据格式的说明:https://cocodataset.org/#format-data

统一数据格式

用Python把COCO数据集的目标检测转换成voc标注格式_pytorch


根据COCO官网的说明,COCO数据集的多种标注object detection, keypoint detection, stuff segmentation, panoptic segmentation, dense pose, 和 image captioning都是已JSON格式存储,且数据存储结构都如上图所示。

其中,『info』中存储的是关于整个数据集的信息。如果是构建自己的数据集,可以按照自己的需求填写。『licenses』是图像证书,如果是要共享数据集或者售卖数据集,则要确保证书和版权均填写正确。『images』是数据集中所有图片的信息列表。所以,不同列别的标注,区别仅在『annotations』部分。

Keypoint标注

我们来看Keypoint这一种标注的『annotations』。目前,COCO数据中仅对『人』这一类别标注了Keypoints。

用Python把COCO数据集的目标检测转换成voc标注格式_docker_02


其中:annotation中的"keypoints"是长度为3k的array,k代表某一类别定义的关键点总数。每一个关键点的标识包含坐标x,y和一个是否可见标识符v。v=0:代表未标注,这种情况下x=y=0;v=1:标注了,但此关键点不可见;v=2:标注且可见。"num_keypoints"表示某一Object标注的关键点(v>0)的总数。categories中的"keypoints"是长度为k的array,代表每一个关键点的名称;"skeleton"定义了各关键点的连接关系,方便后续可视化。

摘出一个categories的实例:

{
	"supercategory": "person",
	"id": 1,
	"name": "person",
	"keypoints": ["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"],
	"skeleton": [[16,14],[14,12],[17,15],[15,13],[12,13],[6,12],[7,13],[6,7],[6,8],[7,9],[8,10],[9,11],[2,3],[1,2],[1,3],[2,4],[3,5],[4,6],[5,7]]
}

使用COCO-Annotator标注自有数据集

在Ubuntu 18.04上安装COCO-Annotator

安装Docker和Docker-Compose

COCO-Annotator安装之前需要先安装Docker。参考了CSDN文章:地址

sudo apt update #更新apt包索引

# 通过HTTPS使用仓库(repository)安装
sudo apt install apt-transport-https ca-certificates curl software-properties-common

这里需要编辑一下/etc/apt/sources.list.d/docker.list文件

sudo vim /etc/apt/sources.list.d/docker.list

在docker.list文件中添加

deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stablead

添加Docker官方的GPG密钥

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

安装

sudo apt update #需要再更新一次apt包索引,否则会提示不存在docker-ce
sudo apt install docker-ce

查看docker服务是否启动:

systemctl status docker

用Python把COCO数据集的目标检测转换成voc标注格式_pytorch_03

若不是activate状态,则启动:

sudo systemctl start docker

测试一下docker能否正常启动

docker run hello-world

如果遇到如下报错

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/create": dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

在上面的指令前加上sudo:

sudo docker run hello-world

看到一下信息则说明Docker安装成功:

用Python把COCO数据集的目标检测转换成voc标注格式_docker_04

接着需要安装docker-compose:

sudo apt install docker-compose

安装COCO Annotator

git clone https://github.com/jsbroks/coco-annotator
cd coco-annotator

在coco-annotator中运行

docker-compose up

这时候会遇到报错:

ERROR: Couldn't connect to Docker daemon at http+docker://localunixsocket - is it running?

按照下面方式跑一遍:

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart
newgrp - docker

确保进入到coco-annotator文件夹,再次执行

docker-compose up

会开始下载非常多东西,此时就等着下载完成就行。

启动COCO Annotator

如果是在COCO Annotator是安装在本地,只需要在浏览器打开localhost:5000。

如果跟我一样是ssh远程,那还需要现在本地的terminal运行一下以下代码:

ssh -L username@remot_address 127.0.0.1:5000:127.0.0.1:5000

然后再在本地的浏览器打开localhost:5000。

使用COCO Annotator在自有数据集上进行Keypoint标注

关于COCO Annotator的标注Keypoint的使用说明,网上能找到的资料太少了,只能靠自己摸索。

创建数据集

在主页面点击"Create"即可创建数据集。

用Python把COCO数据集的目标检测转换成voc标注格式_计算机视觉_05


根据以下指引输入数据集相关信息。注意这个“Folder Directory”,这个路径的根目录是/coco-annotator,找到这个文件夹并将需要标注的图像放入这个文件夹即可实现导入数据集。默认类别中,我创建了一个“person”的默认类别。

用Python把COCO数据集的目标检测转换成voc标注格式_pytorch_06

导入之后,点击上面主页面的“Refresh”或者进入创建的数据集中,点击左侧的“Scan”就可以看到导入的图片了。

标注

点击一张图片进入标注页面。页面左侧为工具面板,右侧为标注面板。在当前情况中,可以看到左侧的工具按钮都是灰色非激活的状态。要开始标注,要选择待标注的对象的类别,在这一示例中,我们点击右侧标注面板“person”右侧的加号代表即将进行“person”类别的标注。

用Python把COCO数据集的目标检测转换成voc标注格式_pytorch_07

关键点标注

为了对应COCO数据集中的keypoint点的标注,我们需要先对person这个大类别做一些设置。点击右侧标注面板“person”右侧的齿轮图片,将出现以下设置页面。

用Python把COCO数据集的目标检测转换成voc标注格式_计算机视觉_08


踩坑里了!!!!

已经把自有数据集都标了一遍才发现!因为COCO对关键点检测的评估指标OKS(Object Keypoint Similarity)

用Python把COCO数据集的目标检测转换成voc标注格式_pytorch_09
其中用Python把COCO数据集的目标检测转换成voc标注格式_计算机视觉_10表示这个人所占的面积大小平方根,根据annotation中的Bounding Box计算所得。
用Python把COCO数据集的目标检测转换成voc标注格式_pytorch_11
也就是说我们的标注除了keypoints,还必须通过bounding box把object框出来。

COCO-Annotator中很神奇的是,先对一个object把需要标的关键点标注之后,就无法添加bbox;反之则可。

在这个页面中,我们可以设置各个Keypoint的名字。每个Keypoint右侧的“Add connected label”可以先不管,点击"Update"确认。此时,点击右侧标注面板“person”右侧的加号,就可以看到刚刚添加的各个关键点的名字了。添加完所有关键点后,我突然悟了“Add connected label”对应的就是COCO标注中的skeleton,根据需要填进去就好啦。我们现在点击“nose”并进行keypoint标注。

用Python把COCO数据集的目标检测转换成voc标注格式_opencv_12


在人像的鼻子部位放置一个keypoint。点击这个keypoint会看到相关的信息,比如keypoint名字,所属的类别,是不是可见等。

用Python把COCO数据集的目标检测转换成voc标注格式_docker_13

设置关键点可见性

可见性可以在以下位置设置

用Python把COCO数据集的目标检测转换成voc标注格式_计算机视觉_14

查看保存的keypoint标注

仅以上图,标注了人bbox和所有关键点为列子。

用Python把COCO数据集的目标检测转换成voc标注格式_pytorch_15

完整Json文件内容

{"images":[{"id":4,"dataset_id":2,"path":"/datasets/test/man.jpg","width":4000,"height":6000,"file_name":"man.jpg"}],"categories":[{"id":1,"name":"person","supercategory":"person","color":"#a74ced","metadata":{},"keypoint_colors":["#bf5c4d","#9c73bf","#ff1a38","#bf3300","#736322","#bf5c4d","#d99100","#4d8068","#0d2b80","#9c73bf","#ff1a38","#bf3300","#736322","#33fff1","#3369ff","#9d13bf","#733941"],"keypoints":["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"],"skeleton":[[1,2],[1,3],[2,4],[2,3],[3,5],[4,6],[5,7],[6,7],[6,8],[6,12],[7,9],[7,13],[8,10],[9,11],[12,14],[12,13],[13,15],[14,16],[15,17]]}],"annotations":[{"id":216,"image_id":4,"category_id":1,"segmentation":[[2520.9,1587.4,2520.9,4975.7,1411.2,4975.7,1411.2,1587.4]],"area":3761790,"bbox":[1411,1587,1110,3389],"iscrowd":false,"isbbox":true,"color":"#455dd2","keypoints":[2040,1977,2,2111,1923,2,1986,1919,2,2185,1973,2,1904,1970,2,2353,2352,2,1654,2297,2,2392,2855,2,1549,2820,2,2438,3296,2,1619,3253,2,2150,3298,2,1817,3307,2,2164,3846,2,1817,3897,2,2077,4549,2,1807,4536,2],"metadata":{},"num_keypoints":17}]}

可以在JSON在线解析中打开查看一下。跟COCO的格式是能够对上的。