NWPU-VHR-10データセットの表示ファイルをpascal vocのxml形式に作成します.

7243 ワード

1.参考コード
データセットNWPU VHR-10をpascal vocのフォーマットに変換します.
2.コードが足りないところ
参考コードを実行したら、以下の点が不足しています.
  • コードにはバグがあります.私の問題かどうかは分かりませんが、コピーしたら確かにバグが発生しました.やはり自分で調整してからできます.
  • ファイル名はVOCの図表番号と表示名に適合していません.ソースコードが実行された後に出力されるファイルはまだ三桁です.ファイル名を6桁補足する必要があります.
  • 写真と表示ファイルが一致しません.これは私が発見した最大の間違いです.訓練が終わったら、mAP=0を発見!!例えば、表示ファイル000011.xmlは写真000011.jpgに対する表示ですが、実際にはxmlファイルに他の写真が書いてあります.
  • VOCの画像は0から符号化されていますが、元のコードがそれに気づかなかったため、画像は依然として1から符号化されています.このように表示ファイルとは位置が違っています.
  • 3.改良コード
    これに基づいて、コードを参考にして改善しました.考え方は以下の通りです.
    3.1 xmlファイルを生成する
    まず元の表示ファイルtxtをxmlに変更します.私のコードは表示ファイルと画像を同じフォルダの下に置いています.以下の備考の場合はf 1と略称して、deal()を呼び出して表示ファイルをxmlファイルに変更します.次にイマグを呼び出しますrename()は元の画像を改めて名前を付けます.ここでoldpathは元の画像の保存経路です.new_pathは新しい保存経路です.ここでこのようにするのはファイルを混乱させることを恐れて、プログラムのdebugを利用しません.
    import shutil
    from lxml.etree import Element,SubElement,tostring
    from xml.dom.minidom import parseString
    import xml.dom.minidom
    import os
    import sys
    from PIL import Image
    
    #                  ,  voc     0  ,   6  
    def imag_rename(old_path, new_path):
        filelist = os.listdir(old_path)  #           (     )
        os.mkdir(new_path)
        for file in filelist:  #       
            Olddir = os.path.join(old_path, file)  #        
            if os.path.isdir(Olddir):  #          
                continue
            filename = os.path.splitext(file)[0]  #    
            filetype = os.path.splitext(file)[1]  #      
            if filetype == '.jpg':
                Newdir = os.path.join(new_path, str(int(filename)-1).zfill(6) + filetype)  
                #       zfill  0      
                shutil.copyfile(Olddir, Newdir)
    
    
    
    def deal(path):
        files=os.listdir(path)
        #             
        outpath = path + "/output"
        os.mkdir(outpath)
        for file in files:
            filename=os.path.splitext(file)[0]# 
            #print(filename)
            sufix=os.path.splitext(file)[1]#
            if sufix=='.txt':
                xmins=[]
                ymins=[]
                xmaxs=[]
                ymaxs=[]
                names=[]
                num,xmins,ymins,xmaxs,ymaxs,names=readtxt(path + '/' + file)
                filename_fill = str(int(filename) - 1).zfill(6)
                filename_jpg = filename_fill + ".jpg"
                dealpath=path+"/output/"+ filename_fill +".xml"
                imagpath = path +"/" + filename + ".jpg"
                with open(dealpath, 'w') as f:
                    height, width = readsize(imagpath)
                    writexml(dealpath,filename_jpg,num,xmins,ymins,xmaxs,ymaxs,names, height, width)
    
    
    def readtxt(path):
        with open(path, 'r') as f:
            contents = f.read()
            #print(contents)
            objects=contents.split('
    ') for i in range(objects.count('')): objects.remove('') #print(objects) num=len(objects)# #print(num) xmins=[] ymins=[] xmaxs=[] ymaxs=[] names=[] for objecto in objects: #print(objecto) xmin=objecto.split(',')[0] xmin=xmin.split('(')[1] xmin=xmin.strip() ymin=objecto.split(',')[1] ymin=ymin.split(')')[0] ymin=ymin.strip() xmax=objecto.split(',')[2] xmax=xmax.split('(')[1] xmax=xmax.strip() ymax=objecto.split(',')[3] ymax=ymax.split(')')[0] ymax=ymax.strip() name=objecto.split(',')[4] name=name.strip() if name=="1 " or name=="1": name='airplane' elif name=="2 "or name=="2": name='ship' elif name== "3 "or name=="3": name='storage tank' elif name=="4 "or name=="4": name='baseball diamond' elif name=="5 "or name=="5": name='tennis court' elif name=="6 "or name=="6": name='basketball court' elif name=="7 "or name=="7": name='ground track field' elif name=="8 "or name=="8": name='harbor' elif name=="9 "or name=="9": name='bridge' elif name=="10 "or name=="10": name='vehicle' else: print(path) #print(xmin,ymin,xmax,ymax,name) xmins.append(xmin) ymins.append(ymin) xmaxs.append(xmax) ymaxs.append(ymax) names.append(name) #print(num,xmins,ymins,xmaxs,ymaxs,names) return num,xmins,ymins,xmaxs,ymaxs,names def writexml(path,filename,num,xmins,ymins,xmaxs,ymaxs,names,height, width):# Nwpu-vhr-10 < 1000*600 node_root=Element('annotation') node_folder=SubElement(node_root,'folder') node_folder.text="VOC2007" node_filename=SubElement(node_root,'filename') node_filename.text="%s" % filename node_size=SubElement(node_root,"size") node_width = SubElement(node_size, 'width') node_width.text = '%s' % width node_height = SubElement(node_size, 'height') node_height.text = '%s' % height node_depth = SubElement(node_size, 'depth') node_depth.text = '3' for i in range(num): node_object = SubElement(node_root, 'object') node_name = SubElement(node_object, 'name') node_name.text = '%s' % names[i] node_name = SubElement(node_object, 'pose') node_name.text = '%s' % "unspecified" node_name = SubElement(node_object, 'truncated') node_name.text = '%s' % "0" node_difficult = SubElement(node_object, 'difficult') node_difficult.text = '0' node_bndbox = SubElement(node_object, 'bndbox') node_xmin = SubElement(node_bndbox, 'xmin') node_xmin.text = '%s'% xmins[i] node_ymin = SubElement(node_bndbox, 'ymin') node_ymin.text = '%s' % ymins[i] node_xmax = SubElement(node_bndbox, 'xmax') node_xmax.text = '%s' % xmaxs[i] node_ymax = SubElement(node_bndbox, 'ymax') node_ymax.text = '%s' % ymaxs[i] xml = tostring(node_root, pretty_print=True) dom = parseString(xml) with open(path, 'wb') as f: f.write(xml) return def readsize(path): img=Image.open(path) width=img.size[0] height=img.size[1] return height, width if __name__ == "__main__": path=f1 deal(path) imag_rename(old_path, new_path)
    すみません、イマグを書いています.レンame()とdeal()はos.mkdir()を使っています.以上のコードが間違ってデバッグしたい場合、必ずデバッグのたびにmkdir()が作成したフォルダを削除してください.そうしないと、エラーが発生します.パスはすでに最終処理済みの表示ファイルと画像があらかじめ設定された出力フォルダに入れられます.使えます.