如何用本身的数据制做Pascal VOC格式数据集(详细教程,附带全部代码脚本)

https://zhuanlan.zhihu.com/p/53068162html

本文做者管斌,天津大学 电气自动化与信息工程学院研二在读,目前研究方向是深度学习在医学图像检测上的应用。python

正文git

目前object detection这块主流的数据集主要就是COCO和Pascal VOC格式的。github上现成的检测算法基本都是自带VOC格式数据集的输入接口的,因此想要跑起来一个算法,咱们须要准备好Pascal VOC格式的数据集就能够了。可是以前网上没有对小白很友好的准备Pascal VOC格式数据集的教程。github

因此我写了这篇文章,让新手也能够立刻学会的教程。这样你们就不用为准备数据集浪费太多时间。若是看完这篇文章还有不清楚的能够评论区问我。算法

以我从零准备本身的数据集为例子,首先准备好全部的图像和 用标注工具labelme 标注好的 .xml格式文件。如何组织文件夹和文件位置我录了个视频给你们看清楚。python2.7

https://v.qq.com/x/page/e0818v35sgi.htmlide

视频中噪声有点大,建议静音观看工具

在一个文件夹 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 看一下,会是下面这样的。

如何用本身的数据制做Pascal VOC格式数据集(详细教程,附带全部代码脚本)

fullpath.txt

如何用本身的数据制做Pascal VOC格式数据集(详细教程,附带全部代码脚本)

lb.txt

而后建立 prepare.py脚本,完整代码以下,直接复制便可。

import shutil
import os

img_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] = path
flb = 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格式的数据集!最后制做好的的数据集是这样的!

如何用本身的数据制做Pascal VOC格式数据集(详细教程,附带全部代码脚本)

下面是个人知乎原文连接,欢迎评论交流。点击阅读原文,也能够直接访问。

https://zhuanlan.zhihu.com/p/53068162

相关文章
相关标签/搜索