ターゲット検出標識のバウンディングボックスにデータセットを分割します

機能を実現

図のラベルは、ターゲット検出バウンディングボックスラベルファイル(VOC形式)に分割されます。

注意:

1.画像だけでサンプルを分割し、同じカテゴリに複数のターゲット。

2.変換がバウンディングボックスラベルフィールドに通信することにより達成され、あなたはモノグラムとして、ターゲットプロセスを重ねることはできません

データセットのフォーマット

ここで、次の形式で分割セマンティックデータセット:

元の画像JPEGImagesでフォーマットを命名するフォルダですImageID.jpg

    

ラベルチャートlabelimageフォルダの命名形式はImageID_classname.png

     

バウンディングボックスは、フォームマークの名前生成ImageID.xmlを

   

XMLタグ付け形式

<注釈> 
   <フォルダ> road_dataset </フォルダ>#ファイル名
   <ファイル名> 3425.jpg </ファイル名> # 原画名
   <パス> D:\ road_dataset \ JPEGImages \ 3425.jpg </パス># 原画アドレス
   <ソース> 
      <データベース>不明</データベース> 
   </ソース> 
   <サイズ>#画像サイズ
      <幅> 512 </幅> 
      <高さ> 512 </高さ> 
      <深さ> 3 </深さ> 
   </サイズ> 
   <セグメント化されました> 0 </セグメント化>#かどうかを分割するには、0 NO 
   <オブジェクト>#ターゲット
      <名前>尻</ name>の #のカテゴリ名
      <ポーズ>指定されていない</ポーズ>#撮影角度
      <切り捨て> 0 </切り捨て> # 切り捨てかどうか
      <難しい> 0 </難しい>#是否为困难样本
      <bndbox> #boundingbox坐标(左下、右上<XMIN> 327 </ XMIN> 
         <YMIN> 38 </ YMIN> 
         <XMAX> 394 </ XMAX> 
         <YMAX> 69 </ YMAX> 
      </ bndbox> 
   </オブジェクト> 
   <オブジェクト>#多个目标
      <名前>タバコの吸殻</名前> 
      <ポーズ>指定されていない</提起> 
      <切り詰められた> 0 </切り捨て> 
      <難しい> 0 </難しい> 
      <bndbox> 
         <xminから> 139 </ XMIN> 
         <YMIN> 279 </ YMIN> 
         <xmaxで> 214 </ xmaxで> 
         <ymaxは> 318 </ YMAX>
      </ bndbox> 
   </オブジェクト> 
</注釈>

前記<ポーズ> <切り捨て> <難しい>すべてのデフォルト値。

図は、通信ドメインラベルを取得します

形態のSkimage使用は、数を測定し、通信分野を介して各サブピクチャ上のオブジェクトのバウンディングボックスを与えます。

インポートのOS
 インポートnumpyのAS NP
 から itertools インポートGROUPBY
 から skimage インポート形態、その対策
 から PIL インポート画像
 から scipyのダウンロードインポート雑多

唯一の目標カテゴリの絵のように、これだけの黒と白のラベルマップマーク 
rgbmask = np.array ([0,0,0]、[255,255,255]、DTYPE = np.uint8) 

は、図のラベルObject_Numから数およびバウンディングボックス図通信ドメインを与える
DEF :getBoundingBox(画像)
     [mask.shape = [image.shape 0]、image.shape [1]、classnum] 
    マスクnp.zeros =((image.shape [0]、image.shape [1])、DTYPE = np.uint8)
    マスク[np.where(np.all(画像 [。== rgbmask [1]、軸= -1)):2] = 1
     ターゲットの10個の未満のピクセルの削除 
    mask_without_small = morphology.remove_small_objects(マスク、MIN_SIZE = 10 、コネクタ= 2 連結成分ラベリング 
    label_image = measure.label(mask_without_small)
    カウント数オブジェクト 
    Object_Num = LEN(measure.regionprops(label_image))
    このBoundingBox = リスト()
     のための地域:measure.regionprops(label_image)   #1 サイクル得られた通信ドメインBBOXの各
        boundingbox.append(region.bbox)を
     返す Object_Num、このBoundingBoxを

このBoundingBox絵は、結果を確認、ラベルに表示されます:

輸入PLTのようmatplotlib.pyplot
 輸入matplotlib.patchesパッチとして

输出成图片查看得到バウンディングボックス效果 
IMAGEDIR = R ' D:\ test_dataset \ labelimage ' 

もし〜os.path.exists(R ' D:\ test_dataset \ test_getbbox ' ):
    os.mkdir(R ' :\ test_dataset \ test_getbbox D ' のためのルート、_、fnames :ソート(os.walk(IMAGEDIR))
     のための FNAME ソート(fnames):
        のImagePath = os.path.join(根、FNAME )
        画像 =  misc.imread(のImagePath)
        objectnum、BBOX= getboundingbox(画像)
        IMAGEID = fname.split(' ' )[0] 
        図、AX = plt.subplots(1 
        ax.imshow(画像)のためのボックスBBOX:
            RECT = patch.Rectangle((ボックス[1] 、ボックス[0])、ボックス[3] -box [1]、ボックス[2] -box [0]にEdgeColor = ' R '、線幅= 1、フィル= 偽)
            ax.add_patch(RECT)
        plt.savefig (' D:/ test_dataset / test_getbbox / ' + IMAGEID + ' .PNG '
        
        

出力画像は次のとおりです。

生成XML注釈ファイルを

createXMLlabel: 根据标注信息生成XML标注文件
import xml.etree.ElementTree as ET

def createXMLlabel(savedir,objectnum, bbox, classname, foldername='0',filename='0', path='0', database='road', width='400', height='600',depth='3', segmented='0', pose="Unspecified", truncated='0', difficult='0'):
    # 创建根节点
    root = ET.Element("annotation")

    # 创建子节点
    folder_node = ET.Element("folder")
    folder_node.text = foldername
    # 将子节点数据添加到根节点
    root.append(folder_node)

    file_node = ET.Element("filename")
    file_node.text = filename
    root.append(file_node)
    path_node = ET.Element("path")
    path_node.text = path
    root.append(path_node)

    source_node = ET.Element("source")
    # 也可以使用SubElement直接添加子节点
    db_node = ET.SubElement(source_node, "database")
    db_node.text = database
    root.append(source_node)

    size_node = ET.Element("size")
    width_node = ET.SubElement(size_node, "width")
    height_node = ET.SubElement(size_node, "height")
    depth_node = ET.SubElement(size_node, "depth")
    width_node.text = width
    height_node.text = height
    depth_node.text = depth
    root.append(size_node)

    seg_node = ET.Element("segmented")
    seg_node.text = segmented
    root.append(seg_node)

    for i in range(objectnum):
        newEle = ET.Element("object")
        name = ET.Element("name")
        name.text = classname
        newEle.append(name)
        pose_node = ET.Element("pose")
        pose_node.text = pose
        newEle.append(pose_node)
        trunc = ET.Element("truncated")
        trunc.text = truncated
        newEle.append(trunc)
        dif = ET.Element("difficult")
        dif.text = difficult
        newEle.append(dif)
        boundingbox = ET.Element("bndbox")
        xmin = ET.SubElement(boundingbox, "xmin")
        ymin = ET.SubElement(boundingbox, "ymin")
        xmax = ET.SubElement(boundingbox, "xmax")
        ymax = ET.SubElement(boundingbox, "ymax")
        xmin.text = str(bbox[i][1])
        ymin.text = str(bbox[i][0])
        xmax.text = str(bbox[i][3])
        ymax.text = str(bbox[i][2])
        newEle.append(boundingbox)
        root.append(newEle)

    ImageID = filename.split('.')[0]
    # 创建elementtree对象,写入文件
    tree = ET.ElementTree(root)
    tree.write(savedir + '/'+ ImageID + ".xml")

 

imagedir = r'D:\test_dataset\labelimage'
saveXMLdir = r'D:\test_dataset\Annotations'

if os.path.exists(saveXMLdir) is False:
    os.mkdir(saveXMLdir)

for root, _, fnames in sorted(os.walk(imagedir)):
    for fname in sorted(fnames):
        labelpath = os.path.join(root, fname)
        labelimage = misc.imread(labelpath)
        # 得到label图上的boundingingbox和数量
        objectnum, bbox = getboundingbox(labelimage)
        # label图 命名格式为 ImgeID_classname.png
        labelfilename = labelpath.split('\\')[-1]
        ImageID = labelfilename.split('.')[0].split('_')[0]
        classname = labelfilename.split('.')[0].split('_')[1]
        origin_image_name = ImageID +'.jpg'
    
        # 一些图片信息
        foldername = 'test_dataset'
        path  ='\\'.join(imagedir.split('\\')[:-1]) + '\\JPEGImage\\'+ origin_image_name
        database = 'Unknown'
        width = str(labelimage.shape[0])
        height = str(labelimage.shape[1])
        depth = str(labelimage.shape[2])
        
        createXMLlabel(saveXMLdir,objectnum, bbox, classname, foldername=foldername,filename=origin_image_name, path=path,
                       database=database, width=width, height=height,depth=depth, segmented='0', pose="Unspecified",
                       truncated='0', difficult='0')

 

おすすめ

転載: www.cnblogs.com/smartweed/p/12153744.html