ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

如何用自己的数据制作Pascal VOC格式数据集(详细教程,附带所有代码脚本)

2021-01-29 19:53:59  阅读:244  来源: 互联网

标签:教程 lb img extend VOC flag Pascal path txt


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 看一下,会是下面这样的。

如何用自己的数据制作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

标签:教程,lb,img,extend,VOC,flag,Pascal,path,txt
来源: https://blog.51cto.com/15069443/2610789

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有