日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

COCO数据格式说明

發(fā)布時(shí)間:2024/4/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 COCO数据格式说明 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

COCO數(shù)據(jù)格式說(shuō)明

?

標(biāo)注工具推薦:https://github.com/wkentaro/labelme?

labelme自帶了轉(zhuǎn)換VOC和COCO的數(shù)據(jù)格式:labelme/examples

COCO的 全稱是Common Objects in COntext,是微軟團(tuán)隊(duì)提供的一個(gè)可以用來(lái)進(jìn)行圖像識(shí)別的數(shù)據(jù)集。MS COCO數(shù)據(jù)集中的圖像分為訓(xùn)練、驗(yàn)證和測(cè)試集。COCO通過(guò)在Flickr上搜索80個(gè)對(duì)象類別和各種場(chǎng)景類型來(lái)收集圖像,其使用了亞馬遜的Mechanical Turk(AMT)。

比如標(biāo)注image captions(看圖說(shuō)話)這種類型的步驟如下:

(AMT上COCO標(biāo)注步驟)

COCO通過(guò)大量使用Amazon Mechanical Turk來(lái)收集數(shù)據(jù)。COCO數(shù)據(jù)集現(xiàn)在有3種標(biāo)注類型:object instances(目標(biāo)實(shí)例), object keypoints(目標(biāo)上的關(guān)鍵點(diǎn)), 和image captions(看圖說(shuō)話),使用JSON文件存儲(chǔ)。比如下面就是Gemfield下載的COCO 2017年訓(xùn)練集中的標(biāo)注文件:

可以看到其中有上面所述的三種類型,每種類型又包含了訓(xùn)練和驗(yàn)證,所以共6個(gè)JSON文件。

基本的JSON結(jié)構(gòu)體類型

object instances(目標(biāo)實(shí)例)、object keypoints(目標(biāo)上的關(guān)鍵點(diǎn))、image captions(看圖說(shuō)話)這3種類型共享這些基本類型:info、image、license。

而annotation類型則呈現(xiàn)出了多態(tài):

{"info": info,"licenses": [license],"images": [image],"annotations": [annotation], }info{"year": int,"version": str,"description": str,"contributor": str,"url": str,"date_created": datetime, } license{"id": int,"name": str,"url": str, } image{"id": int,"width": int,"height": int,"file_name": str,"license": int,"flickr_url": str,"coco_url": str,"date_captured": datetime, }

1,info類型,比如一個(gè)info類型的實(shí)例:

"info":{"description":"This is stable 1.0 version of the 2014 MS COCO dataset.","url":"http:\/\/mscoco.org","version":"1.0","year":2014,"contributor":"Microsoft COCO group","date_created":"2015-01-27 09:11:52.357475" },

2,Images是包含多個(gè)image實(shí)例的數(shù)組,對(duì)于一個(gè)image類型的實(shí)例:

{"license":3,"file_name":"COCO_val2014_000000391895.jpg","coco_url":"http:\/\/mscoco.org\/images\/391895","height":360,"width":640,"date_captured":"2013-11-14 11:18:45","flickr_url":"http:\/\/farm9.staticflickr.com\/8186\/8119368305_4e622c8349_z.jpg","id":391895 },

3,licenses是包含多個(gè)license實(shí)例的數(shù)組,對(duì)于一個(gè)license類型的實(shí)例:

{"url":"http:\/\/creativecommons.org\/licenses\/by-nc-sa\/2.0\/","id":1,"name":"Attribution-NonCommercial-ShareAlike License" },

Object Instance 類型的標(biāo)注格式

1,整體JSON文件格式

比如上圖中的instances_train2017.json、instances_val2017.json這兩個(gè)文件就是這種格式。

Object Instance這種格式的文件從頭至尾按照順序分為以下段落:

{"info": info,"licenses": [license],"images": [image],"annotations": [annotation],"categories": [category] }

是的,你打開(kāi)這兩個(gè)文件,雖然內(nèi)容很多,但從文件開(kāi)始到結(jié)尾按照順序就是這5段。其中,info、licenses、images這三個(gè)結(jié)構(gòu)體/類型 在上一節(jié)中已經(jīng)說(shuō)了,在不同的JSON文件中這三個(gè)類型是一樣的,定義是共享的。不共享的是annotation和category這兩種結(jié)構(gòu)體,他們?cè)诓煌愋偷腏SON文件中是不一樣的。

images數(shù)組元素的數(shù)量等同于劃入訓(xùn)練集(或者測(cè)試集)的圖片的數(shù)量;

annotations數(shù)組元素的數(shù)量等同于訓(xùn)練集(或者測(cè)試集)中bounding box的數(shù)量;

categories數(shù)組元素的數(shù)量為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 >>>

2,annotations字段

annotations字段是包含多個(gè)annotation實(shí)例的一個(gè)數(shù)組,annotation類型本身又包含了一系列的字段,如這個(gè)目標(biāo)的category id和segmentation mask。segmentation格式取決于這個(gè)實(shí)例是一個(gè)單個(gè)的對(duì)象(即iscrowd=0,將使用polygons格式)還是一組對(duì)象(即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, }

注意,單個(gè)的對(duì)象(iscrowd=0)可能需要多個(gè)polygon來(lái)表示,比如這個(gè)對(duì)象在圖像中被擋住了。而iscrowd=1時(shí)(將標(biāo)注一組對(duì)象,比如一群人)的segmentation使用的就是RLE格式。

注意啊,只要是iscrowd=0那么segmentation就是polygon格式;只要iscrowd=1那么segmentation就是RLE格式。另外,每個(gè)對(duì)象(不管是iscrowd=0還是iscrowd=1)都會(huì)有一個(gè)矩形框bbox ,矩形框左上角的坐標(biāo)和矩形框的長(zhǎng)寬會(huì)以數(shù)組的形式提供,數(shù)組第一個(gè)元素就是左上角的橫坐標(biāo)值。

area是area of encoded masks,是標(biāo)注區(qū)域的面積。如果是矩形框,那就是高乘寬;如果是polygon或者RLE,那就復(fù)雜點(diǎn)。

最后,annotation結(jié)構(gòu)中的categories字段存儲(chǔ)的是當(dāng)前對(duì)象所屬的category的id,以及所屬的supercategory的name。

下面是從instances_val2017.json文件中摘出的一個(gè)annotation的實(shí)例,這里的segmentation就是polygon格式:

{"segmentation": [[510.66,423.01,511.72,420.03,510.45......]],"area": 702.1057499999998,"iscrowd": 0,"image_id": 289343,"bbox": [473.07,395.93,38.65,28.67],"category_id": 18,"id": 1768 },

polygon格式比較簡(jiǎn)單,這些數(shù)按照相鄰的順序兩兩組成一個(gè)點(diǎn)的xy坐標(biāo),如果有n個(gè)數(shù)(必定是偶數(shù)),那么就是n/2個(gè)點(diǎn)坐標(biāo)。下面就是一段解析polygon格式的segmentation并且顯示多邊形的示例代碼:

import numpy as np import matplotlib.pyplot as plt import matplotlib from matplotlib.patches import Polygon from matplotlib.collections import PatchCollection fig, ax = plt.subplots() polygons = [] num_sides = 100 gemfield_polygons = [[125.12, 539.69, 140.94, 522.43......]] gemfield_polygon = gemfield_polygons[0] max_value = max(gemfield_polygon) * 1.3 gemfield_polygon = [i * 1.0/max_value for i in gemfield_polygon] poly = np.array(gemfield_polygon).reshape((int(len(gemfield_polygon)/2), 2)) polygons.append(Polygon(poly,True)) p = PatchCollection(polygons, cmap=matplotlib.cm.jet, alpha=0.4) colors = 100*np.random.rand(1) p.set_array(np.array(colors))ax.add_collection(p) plt.show()

如果iscrowd=1,那么segmentation就是RLE格式(segmentation字段會(huì)含有counts和size數(shù)組),在json文件中g(shù)emfield挑出一個(gè)這樣的例子,如下所示:

segmentation : {u'counts': [272, 2, 4, 4, 4, 4, 2, 9, 1, 2, 16, 43, 143, 24......], u'size': [240, 320] }

COCO數(shù)據(jù)集的RLE都是uncompressed RLE格式(與之相對(duì)的是compact RLE)。 RLE所占字節(jié)的大小和邊界上的像素?cái)?shù)量是正相關(guān)的。RLE格式帶來(lái)的好處就是當(dāng)基于RLE去計(jì)算目標(biāo)區(qū)域的面積以及兩個(gè)目標(biāo)之間的unoin和intersection時(shí)會(huì)非常有效率。 上面的segmentation中的counts數(shù)組和size數(shù)組共同組成了這幅圖片中的分割 mask。其中size是這幅圖片的寬高,然后在這幅圖像中,每一個(gè)像素點(diǎn)要么在被分割(標(biāo)注)的目標(biāo)區(qū)域中,要么在背景中。很明顯這是一個(gè)bool量:如果該像素在目標(biāo)區(qū)域中為true那么在背景中就是False;如果該像素在目標(biāo)區(qū)域中為1那么在背景中就是0。對(duì)于一個(gè)240x320的圖片來(lái)說(shuō),一共有76800個(gè)像素點(diǎn),根據(jù)每一個(gè)像素點(diǎn)在不在目標(biāo)區(qū)域中,我們就有了76800個(gè)bit,比如像這樣(隨便寫(xiě)的例子,和上文的數(shù)組沒(méi)關(guān)系):00000111100111110...;但是這樣寫(xiě)很明顯浪費(fèi)空間,我們直接寫(xiě)上0或者1的個(gè)數(shù)不就行了嘛(Run-length encoding),于是就成了54251...,這就是上文中的counts數(shù)組。下面這個(gè)python代碼片段直觀的顯示了這些bit:

rle = [272, 2, 4, 4, 4, 4, 2, 9, 1, 2, 16, 43, 143, 24, 5, 8......] assert sum(rle) == 240*320

也可以使用下面的代碼將這個(gè)rle數(shù)組表示的分割區(qū)域畫(huà)出來(lái):

import numpy as np import matplotlib.pyplot as plt rle = [272, 2, 4, 4, 4, 4, 2, 9, 1, 2, 16, 43, 143, 24, 5, 8......] assert sum(rle) == 240*320 M = np.zeros(240*320) N = len(rle) n = 0 val = 1 for pos in range(N):val = not valfor c in range(rle[pos]):M[n] = valn += 1GEMFIELD = M.reshape(([240, 320]), order='F') plt.imshow(GEMFIELD) plt.show()

3,categories字段

categories是一個(gè)包含多個(gè)category實(shí)例的數(shù)組,而category結(jié)構(gòu)體描述如下:

{"id": int,"name": str,"supercategory": str, }

從instances_val2017.json文件中摘出的2個(gè)category實(shí)例如下所示:

{"supercategory": "person","id": 1,"name": "person" }, {"supercategory": "vehicle","id": 2,"name": "bicycle" },

至2017年的時(shí)候,一共有80個(gè)category。

Object Keypoint 類型的標(biāo)注格式

1,整體JSON文件格式

比如上圖中的person_keypoints_train2017.json、person_keypoints_val2017.json這兩個(gè)文件就是這種格式。

Object Keypoint這種格式的文件從頭至尾按照順序分為以下段落,看起來(lái)和Object Instance一樣啊:

{"info": info,"licenses": [license],"images": [image],"annotations": [annotation],"categories": [category] }

是的,你打開(kāi)這兩個(gè)文件,雖然內(nèi)容很多,但從文件開(kāi)始到結(jié)尾按照順序就是這5段。其中,info、licenses、images這三個(gè)結(jié)構(gòu)體/類型 在第一節(jié)中已經(jīng)說(shuō)了,在不同的JSON文件中這三個(gè)類型是一樣的,定義是共享的。不共享的是annotation和category這兩種結(jié)構(gòu)體,他們?cè)诓煌愋偷腏SON文件中是不一樣的。

images數(shù)組元素?cái)?shù)量是劃入訓(xùn)練集(測(cè)試集)的圖片的數(shù)量;

annotations是bounding box的數(shù)量,在這里只有人這個(gè)類別的bounding box;

categories數(shù)組元素的數(shù)量為1,只有一個(gè):person(2017年);

2,annotations字段

這個(gè)類型中的annotation結(jié)構(gòu)體包含了Object Instance中annotation結(jié)構(gòu)體的所有字段,再加上2個(gè)額外的字段。

新增的keypoints是一個(gè)長(zhǎng)度為3*k的數(shù)組,其中k是category中keypoints的總數(shù)量。每一個(gè)keypoint是一個(gè)長(zhǎng)度為3的數(shù)組,第一和第二個(gè)元素分別是x和y坐標(biāo)值,第三個(gè)元素是個(gè)標(biāo)志位v,v為0時(shí)表示這個(gè)關(guān)鍵點(diǎn)沒(méi)有標(biāo)注(這種情況下x=y=v=0),v為1時(shí)表示這個(gè)關(guān)鍵點(diǎn)標(biāo)注了但是不可見(jiàn)(被遮擋了),v為2時(shí)表示這個(gè)關(guān)鍵點(diǎn)標(biāo)注了同時(shí)也可見(jiàn)。

num_keypoints表示這個(gè)目標(biāo)上被標(biāo)注的關(guān)鍵點(diǎn)的數(shù)量(v>0),比較小的目標(biāo)上可能就無(wú)法標(biāo)注關(guān)鍵點(diǎn)。

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文件中摘出一個(gè)annotation的實(shí)例如下:

{"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字段

最后,對(duì)于每一個(gè)category結(jié)構(gòu)體,相比Object Instance中的category新增了2個(gè)額外的字段,keypoints是一個(gè)長(zhǎng)度為k的數(shù)組,包含了每個(gè)關(guān)鍵點(diǎn)的名字;skeleton定義了各個(gè)關(guān)鍵點(diǎn)之間的連接性(比如人的左手腕和左肘就是連接的,但是左手腕和右手腕就不是)。目前,COCO的keypoints只標(biāo)注了person category (分類為人)。

定義如下:

{"id": int,"name": str,"supercategory": str,"keypoints": [str],"skeleton": [edge] }

從person_keypoints_val2017.json文件中摘出一個(gè)category的實(shí)例如下:

{"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的標(biāo)注格式

1,整體JSON文件格式

比如上圖中的captions_train2017.json、captions_val2017.json這兩個(gè)文件就是這種格式。

Image Caption這種格式的文件從頭至尾按照順序分為以下段落,看起來(lái)和Object Instance一樣,不過(guò)沒(méi)有最后的categories字段:

{"info": info,"licenses": [license],"images": [image],"annotations": [annotation] }

是的,你打開(kāi)這兩個(gè)文件,雖然內(nèi)容很多,但從文件開(kāi)始到結(jié)尾按照順序就是這4段。其中,info、licenses、images這三個(gè)結(jié)構(gòu)體/類型 在第一節(jié)中已經(jīng)說(shuō)了,在不同的JSON文件中這三個(gè)類型是一樣的,定義是共享的。不共享的是annotations這種結(jié)構(gòu)體,它在不同類型的JSON文件中是不一樣的。

images數(shù)組的元素?cái)?shù)量等于劃入訓(xùn)練集(或者測(cè)試集)的圖片的數(shù)量;

annotations的數(shù)量要多于圖片的數(shù)量,這是因?yàn)橐粋€(gè)圖片可以有多個(gè)場(chǎng)景描述;

2,annotations字段

這個(gè)類型中的annotation用來(lái)存儲(chǔ)描述圖片的語(yǔ)句。每個(gè)語(yǔ)句描述了對(duì)應(yīng)圖片的內(nèi)容,而每個(gè)圖片至少有5個(gè)描述語(yǔ)句(有的圖片更多)。annotation定義如下:

annotation{"id": int,"image_id": int,"caption": str }

從captions_val2017.json中摘取的一個(gè)annotation實(shí)例如下:

{"image_id": 179765,"id": 38,"caption": "A black Honda motorcycle parked in front of a garage." }

?

總結(jié)

以上是生活随笔為你收集整理的COCO数据格式说明的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。