之前因为需要用到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)
至于说路径错误什么的,你们看自己具体情况吧,我这边也不能给你解决。