天天看點

深度學習目标檢測常用工具型代碼:對訓練資料的trainval.txt進行資料清洗

這個用于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'
           

繼續閱讀