目标检测常用数据集格式
簡介
我們經常需要使用自己通過標注工具(如LabelImg、LabelMe等)生成的數據集或者一些開源數據集進行目標檢測模型的訓練,這些自定義數據集格式多樣且不具有一致性,而目標檢測的數據格式相比于其他任務又復雜很多,因此,為了兼容一些框架和源碼,我們一般需要將自定義數據集轉換為標準格式,這種標準格式指的一般是COCO格式和VOC格式,因為它們非常出名,有一些針對的解析庫,轉換為COCO格式和VOC格式的數據集可以很方便地讀取并用于訓練。開源數據集一般都會有格式轉換的toolkit,使用主流的標注工具自行標注的數據集也已經有很多成熟的開源轉換代碼了,本文主要來介紹VOC和COCO數據集的格式究竟是怎樣的,我們應該如何組織數據集的目錄結構來契合標準格式以方便轉換。
VOC數據集格式
PASCAL VOC數據集來源于同名的競賽,開始于2005年,結束于2012年最后一屆。VOC并不是一個非常大型的目標檢測數據集,但是在COCO誕生之前,它是非常主流的目標檢測任務基準數據集,主要數據集為VOC2007和VOC2012,它們的格式是一樣的,下面以VOC2007為例展開敘述。
首先看目錄結構,根級目錄下有5個目錄,分別如下所示。其中JPEGImages目錄下放的是所有的圖片,這里只是叫這個名字,可以是非JPG格式的圖片,而Annotations則存放的是和上述圖片同名的所有XML格式的標注文件(所以xml標注和jpg圖片一一對應),這個標注文件的具體解析后面會講到。ImageSets文件夾下的則是數據集劃分的txt文件,Layout文件夾對應的是按照人體部位分類的,Action是按照動作類別分類的,Main則是按照目標類別分類的,Segmentation存放的是分割用數據集的劃分。對這四個文件夾而言,它們下面加*號的表示按類別存在多個劃分文件,但是對于通用目標檢測而言則是只需要train.txt等文件。這些文本文件每一行有一個圖片編號,整個文件其實組成文件名列表,依此就能完成數據集的劃分。
所以,對于通用目標檢測任務(針對對象類別)而言,我們一般只需要關注Main文件夾下的四個總體劃分的文件即可。 至于SegmentationClass和SegmentationObject兩個文件夾包含JPEGImages文件夾下圖片一一對應的語義分割圖和實力分割圖,由于目標檢測不使用,所以我這里就不介紹了。
└─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數據集的標注格式,這里選取任意的一個xml文件打開,可以看到,最外層是annotation標簽,其內部都是標注信息,包括該圖所在文件夾、該圖文件名、該圖來源、圖像尺寸等信息,其中會有多個object標簽,每個object標簽內為一個目標對象的信息,具體如下面的代碼標注。
<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> # 圖像深度,也就是通道數</size><segmented>1</segmented> # 圖像是否用于分割,對目標檢測而言沒關系<object> # 一個目標對象的信息<name>aeroplane</name> # 目標的類別名<pose>Frontal</pose> # 拍攝角度,自己的數據集這里是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># 下面是其他目標的信息,這里略掉<object>其他object信息,這里省略</object> </annotation>所以,如果要制作xml標注的自定義VOC格式的數據集,只需要構建三個文件夾,分別是JPEGImages用于存放所有原始圖像、Annotations存放所有的和原始圖像名稱一一對應的xml標注文件和ImageSets/Main,其中存放train.txt、val.txt和test.txt等用來進行數據集劃分,這些txt文件可以手動劃分好,也可以使用代碼隨機劃分,需要注意的是txt文件內容一行為一個不加拓展名的文件名即可。構建VOC格式的數據集還是很簡單的,因為LabelImg等工具生成的xml標注就是VOC格式需要的。
COCO數據集格式
COCO是微軟構建的一個目標檢測大型基準數據集,非常非常著名,包括檢測、分割、關鍵點估計等任務,目前用的比較多的是COCO2017數據集,其他如COCO2014數據集格式類似,所以我這里以COCO2017為例。
首先我們來看目錄結構,關鍵的文件如下所示。其中unlabeled2017存放的是無標注的圖片,train2017、val2017以及test2017則存放的分別為訓練集圖片、驗證集圖片和測試集圖片,圖片以jpg格式存儲。annotations文件夾中包含各種類型的標注,它們的命名風格為任務_子集名稱.json,其中檢測和分割對應的任務名為實例級別標注用instance表示,子集名稱就是我們上面提到的三個文件夾(測試集標注是不公開的),所以對目標檢測任務而言有效的標注文件就是instances_train2017.json和instances_val2017.json,下面我具體來解析這個json標注文件(以訓練集標注為例)。
─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整個訓練集的標注都在一個文件內,json文件可以理解為鍵值對的格式,所以這邊看最外層可以發現,整個標注其實由下面5個部分組成,每個部分又是新的鍵值對。info包含的是整個數據集的一些信息,包括年份、版本、描述等,這些信息對訓練而言不是必要的。licenses則是一個列表,它包含多個license對象,每個license由id、name、url組成,這是
數據集的多個協議許可證,這對訓練也不是必須的。也就是說,自定義數據集轉為COCO格式時,上述兩項是可以沒有的。
接著我們來看images這一項,這是個列表,列表中的每個元素是如下格式的對象,它指的其實就是一張圖片的信息,包括圖片的license、文件名、鏈接地址、寬高、捕獲日期、網絡鏈接、圖片id這些信息,其中filename、height、width和id是必須的,所以在構建自己的數據集時保證有這四項就行了。這個id指的是圖片id,每個圖像唯一對應這個id,這個用來和后面的標注進行對應,因為多個標注可能有同一個圖像id(這是因為多個目標在一幅圖上)。
{"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類目標,
[{"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" }, ...]最后,我們來開開始五個對象中最關鍵的annotations,它依然是一個列表,列表的每一個對象是一個標注annotation,它包含的字段如下。首先有一個唯一確定這個標注框的id號,然后是這個邊界框所在的圖像的id和類別的id(這倆id在images和categories中),接下來的segmentation是分割級別標注,根據iscrowd的值不同有兩種類型,下面的示例用的是polygon格式這種比較簡單的,還有當iscrowd=1時的RLE格式,因為我們這里不以分割為主,所以不做拓展,自己構造數據集的時候填寫如下就行。area是分割區域的面積,bbox就是我們最關注的邊界框標注,格式為[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數據集格式,我們構造的時候只要生成子集文件夾和標注文件夾即可,標注文件夾每個json對應一個子集的標注,標注的格式上面已經說了。顯然,VOC和COCO也是可以互相轉換的,因為有些開源的標注工具采用的VOC格式或者YOLO格式,要轉為比較流行的COCO格式來處理,轉換的代碼可以自行到Github上搜索。
這里補充一下YOLO格式(它雖然不常用,因為每個版本的YOLO都不太一樣),和VOC類似,它的標注也是一個圖像一個標注文件,不過這個標注文件是txt格式的,它包含多行內容,每行是一個目標框,空格分隔的數值含義如下。當然,熟悉YOLO的都知道,這個x,y,w,h不同于VOC和COCO那種,是歸一化之后的。
類別編號 x y w h 類別編號 x y w h總結
本文介紹了目標檢測中常見的兩種數據集格式,分別為VOC格式和COCO格式,理解這兩個格式才能方便地使用一些目標檢測的源碼和框架。最后,如果我的文章對你有所幫助,歡迎一鍵三連支持一下,你的鼓勵是我不斷創作的動力。
總結
以上是生活随笔為你收集整理的目标检测常用数据集格式的全部內容,希望文章能夠幫你解決所遇到的問題。