將VOC數據集轉成coco數據集格式

之前因爲需要用到facebook的Detectron進行測試,但這個平臺只能使用coco格式的數據集。所以找了一些資料進行格式轉換。

https://blog.csdn.net/meccaendless/article/details/79457330 這個博客的資料挺好的,但是在我照着做的時候也是碰到了一些坑,所有寫出來一下。


首先,需要的數據內容,annotion這個肯定要有,裏面是xml的文件,每個對應自己的圖片。圖片文件夾,就voc數據庫中的那個名字就行。然後imageset文件夾中的main,需要在裏面放上val、train、trainval的txt文件,這個在格式轉換時候需要有,而且這裏面會有坑,我下面會講。


下載cocoapi,地址在這 https://github.com/cocodataset/cocoapi

cocoapi裏面已經幫我們寫好相關接口,能直接在matlab裏面講voc格式的數據集轉成coco的,所以我們只要按照要求來就行了。關於路徑什麼的,你可以按照代碼裏的來放置,當然也可以修改代碼。

新建一個matlab文件,調用。需要注意的是,這裏面的val、train等就是調用上面說到的txt文件。裏面寫的是你自己分好的測試集和訓練集名稱(就是去掉.jpg的)

mex('CXXFLAGS=\$CXXFLAGS -std=c++11 -Wall','-largeArrayDims',...  
    'private/gasonMex.cpp','../common/gason.cpp',...  
     '-I../common/','-outdir','private');  
 CocoUtils.convertPascalGt( 'D:/datasets', '2013', 'val', 'D:/datasets/pascal_val2013.json')  
 CocoUtils.convertPascalGt( 'D:/datasets', '2013', 'test', 'D:/datasets/pascal_test2013.json') 

好了,下面是我碰到的大坑,就是這個txt。我一開始用的是windows自帶的txt讀取的,發現所有的文件名連在一起。心想那很簡單啊,直接遍歷,然後把文件名直接添加就好了。但是出錯了。

後來用notepad++打開,發現其實是有換行的。ok,那我加上換行符。還是不行。

突然想到,講道理有換行符那一開始我就應該看到,爲什麼兩個軟件裏面看到的不一樣呢?後來發現是換行符的問題。

你可以在notepad++裏面顯示所有符號看一下,voc自帶的txt的換行符是LF,windows自帶的是RC+LF,mac是RC。嗯,很坑爹。

所以其實也很簡單,先換行,再notepad++裏面的  編輯, 文檔格式轉換  ,可以先轉成window再轉成unix(因爲此時是混合 格式的,先轉成一種)。ok,然後就能用上面那個代碼輕鬆轉換了。

遍歷添加txt的代碼,我這個lowb的代碼你們也可以參考下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/3/28 9:08
# @Author  : He Hangjiang
# @Site    : 
# @File    : DivideImgByJson.py
# @Software: PyCharm

import json
import os
import shutil

inputfile = []
inner = {}

floderaddress = 'J:/object_dection/datasets/train2014'

file_all = os.listdir(floderaddress) #路徑下所有文件名

print(len(file_all))
print(type(file_all))
print(file_all[0])
print(file_all[0][0:11])

with open("J:/object_dection/datasets/train.txt","a") as f:
    for i in file_all:
        fileName = i[:11] + "\r"
        # if fileName != "2013_000030":
        f.writelines(fileName) 

至於說路徑錯誤什麼的,你們看自己具體情況吧,我這邊也不能給你解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章