目标检测常用数据集格式
簡介
我們經(jīng)常需要使用自己通過標(biāo)注工具(如LabelImg、LabelMe等)生成的數(shù)據(jù)集或者一些開源數(shù)據(jù)集進行目標(biāo)檢測模型的訓(xùn)練,這些自定義數(shù)據(jù)集格式多樣且不具有一致性,而目標(biāo)檢測的數(shù)據(jù)格式相比于其他任務(wù)又復(fù)雜很多,因此,為了兼容一些框架和源碼,我們一般需要將自定義數(shù)據(jù)集轉(zhuǎn)換為標(biāo)準(zhǔn)格式,這種標(biāo)準(zhǔn)格式指的一般是COCO格式和VOC格式,因為它們非常出名,有一些針對的解析庫,轉(zhuǎn)換為COCO格式和VOC格式的數(shù)據(jù)集可以很方便地讀取并用于訓(xùn)練。開源數(shù)據(jù)集一般都會有格式轉(zhuǎn)換的toolkit,使用主流的標(biāo)注工具自行標(biāo)注的數(shù)據(jù)集也已經(jīng)有很多成熟的開源轉(zhuǎn)換代碼了,本文主要來介紹VOC和COCO數(shù)據(jù)集的格式究竟是怎樣的,我們應(yīng)該如何組織數(shù)據(jù)集的目錄結(jié)構(gòu)來契合標(biāo)準(zhǔn)格式以方便轉(zhuǎn)換。
VOC數(shù)據(jù)集格式
PASCAL VOC數(shù)據(jù)集來源于同名的競賽,開始于2005年,結(jié)束于2012年最后一屆。VOC并不是一個非常大型的目標(biāo)檢測數(shù)據(jù)集,但是在COCO誕生之前,它是非常主流的目標(biāo)檢測任務(wù)基準(zhǔn)數(shù)據(jù)集,主要數(shù)據(jù)集為VOC2007和VOC2012,它們的格式是一樣的,下面以VOC2007為例展開敘述。
首先看目錄結(jié)構(gòu),根級目錄下有5個目錄,分別如下所示。其中JPEGImages目錄下放的是所有的圖片,這里只是叫這個名字,可以是非JPG格式的圖片,而Annotations則存放的是和上述圖片同名的所有XML格式的標(biāo)注文件(所以xml標(biāo)注和jpg圖片一一對應(yīng)),這個標(biāo)注文件的具體解析后面會講到。ImageSets文件夾下的則是數(shù)據(jù)集劃分的txt文件,Layout文件夾對應(yīng)的是按照人體部位分類的,Action是按照動作類別分類的,Main則是按照目標(biāo)類別分類的,Segmentation存放的是分割用數(shù)據(jù)集的劃分。對這四個文件夾而言,它們下面加*號的表示按類別存在多個劃分文件,但是對于通用目標(biāo)檢測而言則是只需要train.txt等文件。這些文本文件每一行有一個圖片編號,整個文件其實組成文件名列表,依此就能完成數(shù)據(jù)集的劃分。
所以,對于通用目標(biāo)檢測任務(wù)(針對對象類別)而言,我們一般只需要關(guān)注Main文件夾下的四個總體劃分的文件即可。 至于SegmentationClass和SegmentationObject兩個文件夾包含JPEGImages文件夾下圖片一一對應(yīng)的語義分割圖和實力分割圖,由于目標(biāo)檢測不使用,所以我這里就不介紹了。
└─VOC2007├─JPEGImages│ ├─1.jpg│ ├─2.jpg│ └─3.jpg├─Annotations│ ├─1.xml│ ├─2.xml│ └─3.xml├─ImageSets│ ├─Layout│ │ ├─train.txt│ │ ├─trainva.txt│ │ ├─test.txt│ │ └─val.txt│ ├─Main│ │ ├─*_train.txt│ │ ├─*_trainva.txt│ │ ├─*_test.txt│ │ └─*_val.txt│ ├─Action│ │ ├─*_train.txt│ │ ├─*_trainva.txt│ │ ├─*_test.txt│ │ └─*_val.txt│ └─Segmentation│ ├─train.txt│ ├─trainva.txt│ ├─test.txt│ └─val.txt├─SegmentationClass└─SegmentationObject最后,具體來看VOC數(shù)據(jù)集的標(biāo)注格式,這里選取任意的一個xml文件打開,可以看到,最外層是annotation標(biāo)簽,其內(nèi)部都是標(biāo)注信息,包括該圖所在文件夾、該圖文件名、該圖來源、圖像尺寸等信息,其中會有多個object標(biāo)簽,每個object標(biāo)簽內(nèi)為一個目標(biāo)對象的信息,具體如下面的代碼標(biāo)注。
<annotation><folder>VOC2012</folder> # 圖像所在文件夾<filename>2007_000032.jpg</filename> # 圖像文件名<source> # 圖像源<database>The VOC2007 Database</database><annotation>PASCAL VOC2007</annotation><image>flickr</image></source><size> # 圖像尺寸信息<width>500</width> # 圖像寬度<height>281</height> # 圖像高度<depth>3</depth> # 圖像深度,也就是通道數(shù)</size><segmented>1</segmented> # 圖像是否用于分割,對目標(biāo)檢測而言沒關(guān)系<object> # 一個目標(biāo)對象的信息<name>aeroplane</name> # 目標(biāo)的類別名<pose>Frontal</pose> # 拍攝角度,自己的數(shù)據(jù)集這里是Unspecified<truncated>0</truncated> # 是否被截斷,0表示完整未截斷<difficult>0</difficult> # 是否難以識別,0表示不難識別<bndbox> # 邊界框信息<xmin>104</xmin> # 左上角x<ymin>78</ymin> # 左上角y<xmax>375</xmax> # 右下角x<ymax>183</ymax> # 右下角y</bndbox></object># 下面是其他目標(biāo)的信息,這里略掉<object>其他object信息,這里省略</object> </annotation>所以,如果要制作xml標(biāo)注的自定義VOC格式的數(shù)據(jù)集,只需要構(gòu)建三個文件夾,分別是JPEGImages用于存放所有原始圖像、Annotations存放所有的和原始圖像名稱一一對應(yīng)的xml標(biāo)注文件和ImageSets/Main,其中存放train.txt、val.txt和test.txt等用來進行數(shù)據(jù)集劃分,這些txt文件可以手動劃分好,也可以使用代碼隨機劃分,需要注意的是txt文件內(nèi)容一行為一個不加拓展名的文件名即可。構(gòu)建VOC格式的數(shù)據(jù)集還是很簡單的,因為LabelImg等工具生成的xml標(biāo)注就是VOC格式需要的。
COCO數(shù)據(jù)集格式
COCO是微軟構(gòu)建的一個目標(biāo)檢測大型基準(zhǔn)數(shù)據(jù)集,非常非常著名,包括檢測、分割、關(guān)鍵點估計等任務(wù),目前用的比較多的是COCO2017數(shù)據(jù)集,其他如COCO2014數(shù)據(jù)集格式類似,所以我這里以COCO2017為例。
首先我們來看目錄結(jié)構(gòu),關(guān)鍵的文件如下所示。其中unlabeled2017存放的是無標(biāo)注的圖片,train2017、val2017以及test2017則存放的分別為訓(xùn)練集圖片、驗證集圖片和測試集圖片,圖片以jpg格式存儲。annotations文件夾中包含各種類型的標(biāo)注,它們的命名風(fēng)格為任務(wù)_子集名稱.json,其中檢測和分割對應(yīng)的任務(wù)名為實例級別標(biāo)注用instance表示,子集名稱就是我們上面提到的三個文件夾(測試集標(biāo)注是不公開的),所以對目標(biāo)檢測任務(wù)而言有效的標(biāo)注文件就是instances_train2017.json和instances_val2017.json,下面我具體來解析這個json標(biāo)注文件(以訓(xùn)練集標(biāo)注為例)。
─coco2017├─annotations│ ├─instances_train2017.json│ ├─instances_val2017.json│ └─*.json├─train2017│ ├─1.jpg│ ├─2.jpg│ └─3.jpg├─val2017│ ├─4.jpg│ ├─5.jpg│ └─6.jpg├─test2017│ ├─7.jpg│ ├─8.jpg│ └─9.xml└─unlabeled2017首先,和VOC不同的是,COCO整個訓(xùn)練集的標(biāo)注都在一個文件內(nèi),json文件可以理解為鍵值對的格式,所以這邊看最外層可以發(fā)現(xiàn),整個標(biāo)注其實由下面5個部分組成,每個部分又是新的鍵值對。info包含的是整個數(shù)據(jù)集的一些信息,包括年份、版本、描述等,這些信息對訓(xùn)練而言不是必要的。licenses則是一個列表,它包含多個license對象,每個license由id、name、url組成,這是
數(shù)據(jù)集的多個協(xié)議許可證,這對訓(xùn)練也不是必須的。也就是說,自定義數(shù)據(jù)集轉(zhuǎn)為COCO格式時,上述兩項是可以沒有的。
接著我們來看images這一項,這是個列表,列表中的每個元素是如下格式的對象,它指的其實就是一張圖片的信息,包括圖片的license、文件名、鏈接地址、寬高、捕獲日期、網(wǎng)絡(luò)鏈接、圖片id這些信息,其中filename、height、width和id是必須的,所以在構(gòu)建自己的數(shù)據(jù)集時保證有這四項就行了。這個id指的是圖片id,每個圖像唯一對應(yīng)這個id,這個用來和后面的標(biāo)注進行對應(yīng),因為多個標(biāo)注可能有同一個圖像id(這是因為多個目標(biāo)在一幅圖上)。
{"license": 4,"file_name": "000000397133.jpg","coco_url": "http://images.cocodataset.org/val2017/000000397133.jpg","height": 427,"width": 640,"date_captured": "2013-11-14 17:02:52","flickr_url": "http://farm7.staticflickr.com/6116/6255196340_da26cf2c9e_z.jpg","id": 397133 }我們再來看一開始五個對象中的categories,這也是一個列表,列表中每個對象為一個類別對象,這個類別對象由父類別、類別id和名稱組成,比如下面的bicycle這個類別的父類為vehicle,id號為2。原始的COCO2017共有80類目標(biāo),
[{"supercategory": "person","id": 1,"name": "person" }, {"supercategory": "vehicle","id": 2,"name": "bicycle" }, {"supercategory": "vehicle","id": 3,"name": "car" }, {"supercategory": "vehicle","id": 4,"name": "motorcycle" }, {"supercategory": "vehicle","id": 5,"name": "airplane" }, {"supercategory": "vehicle","id": 6,"name": "bus" }, ...]最后,我們來開開始五個對象中最關(guān)鍵的annotations,它依然是一個列表,列表的每一個對象是一個標(biāo)注annotation,它包含的字段如下。首先有一個唯一確定這個標(biāo)注框的id號,然后是這個邊界框所在的圖像的id和類別的id(這倆id在images和categories中),接下來的segmentation是分割級別標(biāo)注,根據(jù)iscrowd的值不同有兩種類型,下面的示例用的是polygon格式這種比較簡單的,還有當(dāng)iscrowd=1時的RLE格式,因為我們這里不以分割為主,所以不做拓展,自己構(gòu)造數(shù)據(jù)集的時候填寫如下就行。area是分割區(qū)域的面積,bbox就是我們最關(guān)注的邊界框標(biāo)注,格式為[x,y,w,h],iscrowd表示實例是否密集。
{"id": int, "image_id": int,"category_id": int,"segmentation": [[x1, y1, x2, y1, x2, y2, x1, y2]],"area": float,"bbox": [x,y,width,height],"iscrowd": 0 or 1, }至此,我們講完了COCO數(shù)據(jù)集格式,我們構(gòu)造的時候只要生成子集文件夾和標(biāo)注文件夾即可,標(biāo)注文件夾每個json對應(yīng)一個子集的標(biāo)注,標(biāo)注的格式上面已經(jīng)說了。顯然,VOC和COCO也是可以互相轉(zhuǎn)換的,因為有些開源的標(biāo)注工具采用的VOC格式或者YOLO格式,要轉(zhuǎn)為比較流行的COCO格式來處理,轉(zhuǎn)換的代碼可以自行到Github上搜索。
這里補充一下YOLO格式(它雖然不常用,因為每個版本的YOLO都不太一樣),和VOC類似,它的標(biāo)注也是一個圖像一個標(biāo)注文件,不過這個標(biāo)注文件是txt格式的,它包含多行內(nèi)容,每行是一個目標(biāo)框,空格分隔的數(shù)值含義如下。當(dāng)然,熟悉YOLO的都知道,這個x,y,w,h不同于VOC和COCO那種,是歸一化之后的。
類別編號 x y w h 類別編號 x y w h總結(jié)
本文介紹了目標(biāo)檢測中常見的兩種數(shù)據(jù)集格式,分別為VOC格式和COCO格式,理解這兩個格式才能方便地使用一些目標(biāo)檢測的源碼和框架。最后,如果我的文章對你有所幫助,歡迎一鍵三連支持一下,你的鼓勵是我不斷創(chuàng)作的動力。
總結(jié)
以上是生活随笔為你收集整理的目标检测常用数据集格式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DetNet解读
- 下一篇: 运动目标检测、阴影检测及目标跟踪中用得到