https://zhuanlan.zhihu.com/p/53068162
本文作者管斌,天津大学 电气自动化与信息工程学院研二在读,目前研究方向是深度学习在医学图像检测上的应用。
正文
目前object detection这块主流的数据集主要就是COCO和Pascal VOC格式的。github上现成的检测算法基本都是自带VOC格式数据集的输入接口的,所以想要跑起来一个算法,我们需要准备好Pascal VOC格式的数据集就可以了。但是之前网上没有对小白很友好的准备Pascal VOC格式数据集的教程。
所以我写了这篇文章,让新手也可以马上学会的教程。这样大家就不用为准备数据集浪费太多时间。如果看完这篇文章还有不清楚的可以评论区问我。
以我从零准备自己的数据集为例子,首先准备好所有的图像和 用标注工具labelme 标注好的 .xml格式文件。如何组织文件夹和文件位置我录了个视频给大家看清楚。
https://v.qq.com/x/page/e0818v35sgi.html
视频中噪声有点大,建议静音观看
在一个文件夹 image 里创建两个子文件夹 train 和 test 分别存放所有的训练和测试图像。
同样在文件夹 label 里创建两个子文件夹 train 和 test 分别存放所有的训练和测试标注文件。
以上是准备原始的数据,然后我们要分别提取文件夹image和label里的文件路径,为接下来制作Pascal VOC格式数据集做准备。
注:本文的脚本代码是基于python2.7环境的,python3环境的用户可以用anaconda自行创建一个python2.7的环境,具体方法请百度。
创建sortpath1.sh文件,文件里就一行代码,复制进去保存以后关闭。
find /data/dataset/THIGH -name '*.xml' |sort -n > lb.txt
再创建sortpath2.sh文件,文件里也就一行代码,复制进去保存以后关闭。
find /data/dataset/THIGH -name '*.jpg' |sort -n > fullpath.txt
然后打开终端,输入
./ sortpath1.sh
按回车,即准备好了标注文件的所有路径 lb.txt。
再输入
./ sortpath2.sh
按回车,就准备好了所有图像的路径 fullpath.txt。
打开 fullpath.txt 和 lb.txt 看一下,会是下面这样的。
fullpath.txt
lb.txt
然后创建 prepare.py脚本,完整代码如下,直接复制即可。
import shutilimport osimg_path = 'VOC2007/JPEGImages'lb_path = 'VOC2007/Annotations'txt_path = 'VOC2007/ImageSets/Main/'os.makedirs(img_path)os.makedirs(lb_path)os.makedirs(txt_path)fg = dict()types = ['humerus', 'elbow', 'forearm']fimg = open('fullpath.txt')for line in fimg: path = line.strip() flag = path.split('/')[-1].split('.')[0] for typ in types: if path.find(typ) == -1: continue else: flag = typ + '@' + flag fg[flag] = pathflb = open('lb.txt')for line in flb: path = line.strip() flag = path.split('/')[-1].split('.')[0] for typ in types: if path.find(typ) == -1: continue else: flag = typ + '@' + flag temp = path.split('/')[-2] extend = path.split('/')[-3] #print temp if fg.has_key(flag): shutil.copy(fg[flag], img_path) flag = flag.split('@')[-1] os.rename(img_path + '/' + flag + '.jpg', img_path + '/' + extend + '_' + flag + '.jpg') # print img_path, img_path.replace(flag, extend + '_' + flag) shutil.copy(path, lb_path) os.rename(lb_path + '/' + flag + '.xml', lb_path + '/' + extend + '_' + flag + '.xml') if temp == 'train': t1 = open(txt_path + 'train.txt', 'a') t1.write(extend + '_' + flag + '\n') t1.close() t2 = open(txt_path + 'trainval.txt', 'a') t2.write(extend + '_' + flag + '\n') t2.close() if temp == 'test': t3 = open(txt_path + 'test.txt', 'a') t3.write(extend + '_' + flag + '\n') t3.close() if temp == 'val': print temp t4 = open(txt_path + 'val.txt', 'a') t4.write(extend + '_' + flag + '\n') t4.close() t5 = open(txt_path + 'trainval.txt', 'a') t5.write(extend + '_' + flag + '\n') t5.close()
保存,打开终端输入下述代码,并运行
python prepare.py
到这里所有工作就结束了!已经直接制作好了Pascal VOC格式的数据集!最后制作好的的数据集是这样的!
下面是我的知乎原文链接,欢迎评论交流。点击阅读原文,也可以直接访问。
https://zhuanlan.zhihu.com/p/53068162