這個用于ODAI(航空資料目标檢測)比賽當中,這個資料集像素大小從800*800-4000*4000不等,是以需要進行原始資料的裁剪,在裁剪過後有一部分資料裡面什麼目标都沒有,要把這一部分去除,使得高效訓練!
#!/usr/bin/env python2
# -*- coding: utf-8 -*-
# --------------------------------------------------------
# --------------------------------------------------------
"""
如果你的訓練圖檔太大,需要對圖檔進行裁剪,那麼就會有很大一部分裁剪的圖檔裡沒有标簽,
已經制作好了trainval.txt,将裡面對應的沒有标簽的索引拿掉,不用做訓練,即
是以需要進行清洗資料的操作,即把null的标簽對應的裁剪後資料和nul的label删掉。
"""
import os
#rootdir = os.getcwd() #擷取目前路徑
#檔案結構說明:注意我的rootdir下面不是标簽的txt,而是在rootdir下一個檔案夾裡面存放着txt
#這裡的檔案結構是/media/ygx/Elements/VOCdevkit2007/trainsplit/1下面隻有一個名為1的檔案夾,裡面放着txt
rootdir = '/media/ygx/Elements/VOCdevkit2007/trainsplit/1'
#順便把所有檔案的大小寫入到一個csv檔案中
rootdir = rootdir.decode('gbk')
x = u'統計檔案大小.csv'
f = open(os.path.join(rootdir,x), "w+")
#找到标簽檔案夾下,0kb的txt文檔,并且将其記錄在null清單裡面
null=[]
for dirname in os.listdir(rootdir): #擷取二級目錄所有檔案夾與檔案
Dir = os.path.join(rootdir, dirname) #路徑補齊
count = 0
if (os.path.isdir(Dir)): #判斷是否為目錄
for r, ds, files in os.walk(Dir): #周遊目錄下所有檔案根,目錄下的每一個檔案夾(包含它自己), 産生3-元組 (dirpath, dirnames, filenames)【檔案夾路徑, 檔案夾名字, 檔案名稱】
for file in files: #周遊所有檔案
size = os.path.getsize(os.path.join(r, file)) #擷取檔案大小
count += size
#print size
(filename,extension) = os.path.splitext(file)
if size == 0:
null.append(filename)
if ((count/1024.0/1024.0) < 1024):
#print Dir +'\t' + '%.2f'% (count/1024.0/1024.0)+'MB'
f.write(Dir.encode("gbk") +','+ '%.2f'% (count/1024.0/1024.0)+'MB' + '\n')
else:
#print Dir + '\t' + '%.2f' % (count / 1024.0 / 1024.0/1024.0) + 'GB'
f.write(Dir.encode("gbk") + ',' + '%.2f' % (count / 1024.0 / 1024.0/1024.0) + 'GB' + '\n')
else:
continue
f.close()
def GetFileFromThisRootDir(dir,ext = None):
allfiles = []
needExtFilter = (ext != None)
for root,dirs,files in os.walk(dir):
for filespath in files:
filepath = os.path.join(root, filespath)
extension = os.path.splitext(filepath)[1][1:]
if needExtFilter and extension in ext:
allfiles.append(filepath)
elif not needExtFilter:
allfiles.append(filepath)
return allfiles
#已經制作好了trainval.txt,這裡就是trainval.txt的路徑。
allfiles = GetFileFromThisRootDir('/media/ygx/Elements/VOCdevkit2007/VOC2007/ImageSets/Main/train_and_test_子類')
for files in allfiles:
filename = os.path.basename(files)
#新的trainval存放的路徑
newfile = '/media/ygx/Elements/VOCdevkit2007/VOC2007/ImageSets/train_and_test_子類_clear/'+filename
with open(files,'r') as r:
lines = r.readlines()
with open(newfile,'w') as w:
#如果line不再null清單當中,則保留
for line in lines:
if (line[:-1] not in null):
w.write(line)
else:
print '1'