如何用本身的數據製做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

相關文章
相關標籤/搜索