機能を実現
図のラベルは、ターゲット検出バウンディングボックスラベルファイル(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')