自己構築データセットでyolov3を準備する(4):密集した頭部検出データセットの洗脳ラベルをyoloラベルに変換し、yolo_mark(pythonスクリプトを使用)で検証します


序文 


        ヘッドのデータセットはプロジェクトで使用され、前の記事のオープンイメージデータセットのほとんどのヘッドにはオーバーヘッドピクチャがないため、アプリケーションシナリオには適していません。偶然にも、洗脳データセットguthub aditya-vora / FCHD-Fully-Convolutional-Head-Detectorで見つかりました  その注釈ファイル形式は、yolo注釈形式とは大きく異なります。この記事では、2つの形式の変換を実現することを目的としています。


準備ができて


  • python3
  • cmd
  • 洗脳データセット   ネットワークディスクリンク:https  ://pan.baidu.com/s/1Vgr6jZByU41TPd2tkiPMwA抽出コード:rnk3 
     

洗脳


        洗脳データセットは、密集した頭部検出データセットです。これは、カフェに登場する人々のグループにマークを付け、このグループの人々にラベルを付けることによって取得されるデータセットです。これには、トレーニングセット:81975頭の10769画像と検証セット:3318頭の500画像の3つの部分が含まれています。テストセット:5007頭の500画像。この記事では、トレーニングセットについてのみ説明します。

                                         

        その注釈ファイルは、brainwash_train.idlのトレーニングセットなど、いくつかのidlファイルにあり、それらの注釈形式は次のとおりです: "picture path":注釈。各ボックスは括弧で囲まれ、座標はカンマで区切られ、ボックスはカンマで区切られています。各画像は1行に1つずつあり、最後はセミコロンで区切られています。

"brainwash_11_13_2014_images/04231500_640x480.png": (316.0, 132.0, 332.0, 150.0), (201.0, 163.0, 221.0, 185.0), (136.0, 167.0, 156.0, 186.0), (349.0, 144.0, 372.0, 166.0), (606.0, 249.0, 639.0, 290.0);
"brainwash_11_13_2014_images/04232000_640x480.png": (485.0, 233.0, 527.0, 273.0), (48+3.0, 198.0, 513.0, 230.0), (291.0, 199.0, 326.0, 239.0), (208.0, 168.0, 242.0, 202.0), (137.0, 168.0, 160.0, 189.0), (197.0, 165.0, 215.0, 186.0), (317.0, 131.0, 332.0, 149.0);
"brainwash_11_24_2014_images/00000500_640x480.jpg": (385.0, 132.0, 399.0, 143.0), (152.0, 162.0, 168.0, 181.0), (120.0, 171.0, 140.0, 196.0), (468.0, 171.0, 490.0, 190.0);
"brainwash_11_24_2014_images/00001000_640x480.jpg": (160.0, 156.0, 176.0, 175.0), (121.0, 175.0, 140.0, 196.0), (357.0, 159.0, 379.0, 184.0);

次に行うことは、このデータ形式に従ってデータの各行を取り出し、それをyolo形式に変更することです。

        <カテゴリ> <正規化中心座標x> <正規化中心座標y> <正規化画像w> <正規化画像h>

        <カテゴリ> <正規化中心座標x> <正規化中心座標y> <正規化画像w> <正規化画像h>

        ........

        <カテゴリ> <正規化中心座標x> <正規化中心座標y> <正規化画像w> <正規化画像h>

 次に、これらを画像にちなんだ名前のtxtファイルに入れます。


 フォーマット変換


         分割:

        観察の結果、必要のないもの、ファイル名として使用すべきもの、ファイルの内容として使用すべきものがあることがわかりました。そのため、最初に分割してから、各部分に対して異なる処理を行う必要があります。最初に、各行を2つの部分、つまり画像パス部分と画像注釈部分に分割しました。2つの部分は「:」で分割されていますが、各行の終わりは「;」で分割されています。最初に「:」を分割できます。 「;」に置き換え、「;」に従って分割すると、これら2つの余分な記号を削除できます。

import os

idl_file_dir = "brainwash_train.idl"                #相对地址
txt_files_dir = "txt_files"

if not os.path.exists(txt_files_dir):
   os.mkdir(txt_files_dir)                          #用于存生成的txt文件
f1=open(idl_file_dir,'r+')
lines=f1.readlines()   
#print(range(len(lines))) 
for i in range(len(lines)):
    line = lines[i]
    line = line.replace(":",";")                    #用;替换:
    #print(line)

        上記の操作を実行すると、ラベルファイル全体が2つの部分になり、パスはline.split( ";")[0]に格納され、ラベルはline.split( ";")[1]に格納されます。最初にパス部分を処理します。パスの両側にセミコロンがあり、その後に冗長な記号があることに注意してください。最初に削除してから、「/」で分割して画像名を取得し、最後に「。」で分割して分割を取得します。接尾辞のない画像名。もちろん、この名前は、後でマークされたファイルのサフィックスのないファイル名でもあります。

    img_dir = line.split(";")[0]
    #print(img_dir)
    img_boxs = line.split(";")[1]
    img_dir = img_dir.replace('"',"")               #删除分号
    #print(img_dir)
    img_name = img_dir.split("/")[1]
    txt_name = img_name.split(".")[0]               #得到后缀名与文件名
    img_extension = img_name.split(".")[1]
    #print(txt_name)
    #print(img_extension)

         上記の操作を実行すると、ファイル名とサフィックス名の両方が使用可能になり、前者はマークされたファイルのファイル名になり、後者はフィルタリング条件になります。ここで、ラベル部分を分割してみましょう。ラベル部分は次のようになります。最初にすべての "、"を削除します(元のラベリングファイルでは各 "、"の前にスペースがあるため、 "、"をスペースに置き換えると、最後の分割の後にさらにスペースができます)。次に、「(」の角かっこを削除し、最後に「)」を使用してさまざまなボックスを区切ります。

 (316.0, 132.0, 332.0, 150.0), (201.0, 163.0, 221.0, 185.0), (136.0, 167.0, 156.0, 186.0), (349.0, 144.0, 372.0, 166.0), (606.0, 249.0, 639.0, 290.0);
 (485.0, 233.0, 527.0, 273.0), (48+3.0, 198.0, 513.0, 230.0), (291.0, 199.0, 326.0, 239.0), (208.0, 168.0, 242.0, 202.0), (137.0, 168.0, 160.0, 189.0), (197.0, 165.0, 215.0, 186.0), (317.0, 131.0, 332.0, 149.0);
 (385.0, 132.0, 399.0, 143.0), (152.0, 162.0, 168.0, 181.0), (120.0, 171.0, 140.0, 196.0), (468.0, 171.0, 490.0, 190.0);
 (160.0, 156.0, 176.0, 175.0), (121.0, 175.0, 140.0, 196.0), (357.0, 159.0, 379.0, 184.0);
    img_boxs = img_boxs.replace(",","")              #删除“,”
    #print(img_boxs)
    img_boxs = img_boxs.replace("(","")              #删除“(”
    img_boxs = img_boxs.split(")")                   #删除“)”
    #print(img_boxs)

       これまでのデータは基本的に分割されており、1つの画像と1つのimg_boxs、各ボックスはimg_boxsの次元であり、ボックスの数はimg_boxsの合計次元です。各img_boxsの最後のアイテムはスペースアイテムであり、このアイテムはlen(img_boxs)-1マイナス1にトラバースするだけで削除されます(その後、img_boxs [m]にアクセスしないでください。m> 0の場合、範囲外のリストインデックスが表示されます)エラー)。

 if(img_extension == 'jpg'):
        for n in range(len(img_boxs)-1):             #消除空格项影响
            box = img_boxs[n]
            box = box.split(" ")
            #print(box)
            #print(box[4])
            

                

        最後のステップは、洗脳の[xmin、ymin、xmax、 ymax ]形式をyoloの<category> <正規化された中心座標x> <正規化された中心座標y> <正規化された画像w> <正規化された形式に変換することです画像h>では、正規化された座標、正規化された幅と高さを計算し、画像の注釈ファイルを画像名にちなんで名付けられたtxtファイルに追加する必要があります。これでデータ型変換が完了します。結果を以下に示します。完全なコードについては、付録を参照してください。

with open(txt_files_dir+"/"+txt_name+".txt",'a') as f:
                f.write(' '.join(['0', str((float(box[1]) + float(box[3]))/(2*640)),str((float(box[2]) + float(box[4]))/(2*480)),str((float(box[3]) - float(box[1]))/640),str((float(box[4]) - float(box[2]))/480)])+'\n')


 yolo_mark検証


        yolo_markのラベルと画像は同じフォルダーにあり、別のフォルダーと画像にあり、ここでのラベルはフィルターされているため別の記事で記述したスクリプトはラベルに基づいて、2つのフォルダーの内容を簡単に結合できます。次に、yolo_mark検証を開き、yolo_markの使用方法別の記事を参照してください2つをランダムに参照すると、変換に成功したことを示すラベルに問題がないことがわかります。

                

                


まとめ 


        データのラベル付け形式間の変換は、特定のルールに従ってデータを分割し、データを計算して並べ替えて、別の種類のラベル付けデータを取得することにすぎません。上記のように、友人がこの記事を読む運命にある場合、それは本当に名誉なことです。ご不明な点がございましたら、以下にメッセージを残してお話しください。


参考資料 

       https://blog.csdn.net/sinat_35907936/article/details/88911770

       https://blog.csdn.net/sinat_35907936/article/details/89605978

       https://blog.csdn.net/sinat_35907936/article/details/89086081

       http://arxiv.org/abs/1506.04878


付録



import os


idl_file_dir = "brainwash_train.idl"
txt_files_dir = "txt_files"

if not os.path.exists(txt_files_dir):
   os.mkdir(txt_files_dir)
f1=open(idl_file_dir,'r+')
lines=f1.readlines()   
#print(range(len(lines))) 
for i in range(len(lines)):
    line = lines[i]
    line = line.replace(":",";")
    #print(line)
    img_dir = line.split(";")[0]
    #print(img_dir)
    img_boxs = line.split(";")[1]
    img_dir = img_dir.replace('"',"")
    #print(img_dir)
    img_name = img_dir.split("/")[1]
    txt_name = img_name.split(".")[0]
    img_extension = img_name.split(".")[1]
    #print(txt_name)
    #print(img_extension)
    img_boxs = img_boxs.replace(",","")
    #print(img_boxs)
    img_boxs = img_boxs.replace("(","")
    img_boxs = img_boxs.split(")")
    #print(img_boxs)
    if(img_extension == 'jpg'):
        for n in range(len(img_boxs)-1):
            box = img_boxs[n]
            box = box.split(" ")
            #print(box)
            #print(box[4])
            with open(txt_files_dir+"/"+txt_name+".txt",'a') as f:
                f.write(' '.join(['0', str((float(box[1]) + float(box[3]))/(2*640)),str((float(box[2]) + float(box[4]))/(2*480)),str((float(box[3]) - float(box[1]))/640),str((float(box[4]) - float(box[2]))/480)])+'\n')

 

 

公開された28元の記事 ウォン称賛34 ビュー20000 +

おすすめ

転載: blog.csdn.net/sinat_35907936/article/details/89646945