cocostuff10k数据集介绍_(六)COCO数据集的简单介绍
COCO通過大量使用Amazon Mechanical Turk來收集數據。COCO數據集現在有3種標注類型:object instances(目標實例), object keypoints(目標上的關鍵點), 和image captions(看圖說話),使用JSON文件存儲。比如下面就是Gemfield下載的COCO 2017年訓練集中的標注文件:
可以看到其中有上面所述的三種類型,每種類型又包含了訓練和驗證,所以共6個JSON文件。
以instances_train2014.json為例,總體形式如下:
(1)images字段列表元素的長度等同于劃入訓練集(或者測試集)的圖片的數量;
(2)annotations字段列表元素的數量等同于訓練集(或者測試集)中bounding box的數量;
(3)categories字段列表元素的數量等同于類別的數量,coco為80(2017年);
>>> ann_train_file='annotations/instances_train2017.json'
>>> coco_train = COCO(ann_train_file)
loading annotations into memory...
Done (t=19.30s)
creating index...
index created!
>>> len(coco_train.dataset['categories'])
80
>>> len(coco_train.dataset['images'])
118287
>>> len(coco_train.dataset['annotations'])
860001
>>>
這是用來train的json中保存的東西,首先json保存的是一個大的字典:
info這個key指向的字典是一些基本信息,包括時間,版本,貢獻者,網址鏈接等不重要,可以忽略。
images這個key指向的列表(注意是列表,上面info指向的是字典)是圖片信息,列表中的每一個字典下存儲一張圖片的信息,license、coco_url、data_captured和flickr_url這幾個key指向的信息大概了解下就行,在你已經下載到原圖jpg文件的情況下,這些信息基本沒用。接下來就是比較重要的幾個信息了,首先是file_name,指向的是一個字符串,是jpg的文件名;其次是height和width指向的是該圖片的高和寬,id指向的數字可能讓大家比較迷惑,這個信息非常至關鍵,這一串數字是每張圖片特有的一個標志,數字不重復,可以看作是圖片的身份信息,就像身份證那一串數字一樣。
下一個License這個key指向的信息也可以忽略不計,就是途中被我選中標黑的那個部分。
再下一個annotations這個key是本json中最最最最最重要的一個部分了。
annotations字段是包含多個annotation實例的一個數組,annotation類型本身又包含了一系列的字段,如這個目標的category id和segmentation mask。segmentation格式取決于這個實例是一個單個的對象(即iscrowd=0,將使用polygons格式)還是一組對象(即iscrowd=1,將使用RLE格式)。如下所示:
annotation{
"id": int,
"image_id": int,
"category_id": int,
"segmentation": RLE or [polygon],
"area": float,
"bbox": [x,y,width,height],
"iscrowd": 0 or 1,
}
注意,單個的對象(iscrowd=0)可能需要多個polygon來表示,比如這個對象在圖像中被擋住了。而iscrowd=1時(將標注一組對象,比如一群人)的segmentation使用的就是RLE格式。
注意啊,只要是iscrowd=0那么segmentation就是polygon格式;只要iscrowd=1那么segmentation就是RLE格式。另外,每個對象(不管是iscrowd=0還是iscrowd=1)都會有一個矩形框bbox ,矩形框左上角的坐標和矩形框的長寬會以數組的形式提供,數組第一個元素就是左上角的橫坐標值。
該key指向的是一個list,然后包含多個字典,每個字典包含一個物體分割的信息。看該列表中第一個字典,segmentation指向是的一個套著兩個list的東西,里面一堆數字的含義是像素級分割得到的物體邊緣坐標(有心的同學會發現這里面的數字個數都是偶數,因為坐標是成對出現的);area指向該segmentation的面積,iscrowd目前來看都指向0,表示沒有重疊吧,有重疊指向1(我的理解是這樣,可能有偏差,不過影響不大);image_id就是前面images中存儲的id !讀取json信息的時候會用到;bbox指向的就是物體的框;category_id指向的數字代表類別(這里說一下,有些博客說是有90類,但是從coco2014上來看,只是category_id標定到了90這個數字而已,但是實際類數只有80類,因為,1-90這數字中有一些是跳過的,即有些數字沒有);id不同于images中的id,images中的id是每幅圖片的身份編號,而此處的id是每個框的身份編號,注意區分。
最后一部分
Object Keypoint 類型的標注格式
1,整體JSON文件格式
比如上圖中的person_keypoints_train2017.json、person_keypoints_val2017.json這兩個文件就是這種格式。
Object Keypoint這種格式的文件從頭至尾按照順序分為以下段落,看起來和Object Instance一樣啊:
{
"info": info,
"licenses": [license],
"images": [image],
"annotations": [annotation],
"categories": [category]
}
是的,你打開這兩個文件,雖然內容很多,但從文件開始到結尾按照順序就是這5段。其中,info、licenses、images這三個結構體/類型 在第一節中已經說了,在不同的JSON文件中這三個類型是一樣的,定義是共享的。不共享的是annotation和category這兩種結構體,他們在不同類型的JSON文件中是不一樣的。
images數組元素數量是劃入訓練集(測試集)的圖片的數量;
annotations是bounding box的數量,在這里只有人這個類別的bounding box;
categories數組元素的數量為1,只有一個:person(2017年);
2,annotations字段
這個類型中的annotation結構體包含了Object Instance中annotation結構體的所有字段,再加上2個額外的字段。
新增的keypoints是一個長度為3*k的數組,其中k是category中keypoints的總數量。每一個keypoint是一個長度為3的數組,第一和第二個元素分別是x和y坐標值,第三個元素是個標志位v,v為0時表示這個關鍵點沒有標注(這種情況下x=y=v=0),v為1時表示這個關鍵點標注了但是不可見(被遮擋了),v為2時表示這個關鍵點標注了同時也可見。
num_keypoints表示這個目標上被標注的關鍵點的數量(v>0),比較小的目標上可能就無法標注關鍵點。
annotation{
"keypoints": [x1,y1,v1,...],
"num_keypoints": int,
"id": int,
"image_id": int,
"category_id": int,
"segmentation": RLE or [polygon],
"area": float,
"bbox": [x,y,width,height],
"iscrowd": 0 or 1,
}
從person_keypoints_val2017.json文件中摘出一個annotation的實例如下:
{
"segmentation": [[125.12,539.69,140.94,522.43...]],
"num_keypoints": 10,
"area": 47803.27955,
"iscrowd": 0,
"keypoints": [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,142,309,1,177,320,2,191,398...],
"image_id": 425226,"bbox": [73.35,206.02,300.58,372.5],"category_id": 1,
"id": 183126
},
3,categories字段
最后,對于每一個category結構體,相比Object Instance中的category新增了2個額外的字段,keypoints是一個長度為k的數組,包含了每個關鍵點的名字;skeleton定義了各個關鍵點之間的連接性(比如人的左手腕和左肘就是連接的,但是左手腕和右手腕就不是)。目前,COCO的keypoints只標注了person category (分類為人)。
定義如下:
{
"id": int,
"name": str,
"supercategory": str,
"keypoints": [str],
"skeleton": [edge]
}
從person_keypoints_val2017.json文件中摘出一個category的實例如下:
{
"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]]
}
Image Caption的標注格式
1,整體JSON文件格式
比如上圖中的captions_train2017.json、captions_val2017.json這兩個文件就是這種格式。
Image Caption這種格式的文件從頭至尾按照順序分為以下段落,看起來和Object Instance一樣,不過沒有最后的categories字段:
{
"info": info,
"licenses": [license],
"images": [image],
"annotations": [annotation]
}
是的,你打開這兩個文件,雖然內容很多,但從文件開始到結尾按照順序就是這4段。其中,info、licenses、images這三個結構體/類型 在第一節中已經說了,在不同的JSON文件中這三個類型是一樣的,定義是共享的。不共享的是annotations這種結構體,它在不同類型的JSON文件中是不一樣的。
images數組的元素數量等于劃入訓練集(或者測試集)的圖片的數量;
annotations的數量要多于圖片的數量,這是因為一個圖片可以有多個場景描述;
2,annotations字段
這個類型中的annotation用來存儲描述圖片的語句。每個語句描述了對應圖片的內容,而每個圖片至少有5個描述語句(有的圖片更多)。annotation定義如下:
annotation{
"id": int,
"image_id": int,
"caption": str
}
從captions_val2017.json中摘取的一個annotation實例如下:
{
"image_id": 179765,
"id": 38,"caption": "A black Honda motorcycle parked in front of a garage."
}
總結
以上是生活随笔為你收集整理的cocostuff10k数据集介绍_(六)COCO数据集的简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java单词200个,请收藏!贼有用
- 下一篇: windows任务管理器中的工作设置内存