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 看一下,會是下面這樣的。
fullpath.txt
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格式的數據集!最後製做好的的數據集是這樣的!
下面是個人知乎原文連接,歡迎評論交流。點擊閱讀原文,也能夠直接訪問。