目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析

圖像目標檢測中,Bounding Box的保存一般有兩種常見的形式:

  1. 一種就是保存為xml格式的,直接保存Bounding Box座標信息;
  2. 另一種就是保存為txt格式的,以比例形式保存,下面就從這兩塊進行解讀。

接下來我們就依次圍繞兩種標記信息的存儲和用python實現對xml和txt文件內信息的解析展開。


bounding box的形式1---xml文件

xml:xml文件中矩形框座標的獲取比較簡單。1.xml文件可採用標註軟件labelImg進行生成2.xml中記錄了被標註圖像信息和標註的信息

(1)labelImg的安裝(著重說Ubuntu下的一個安裝,別的版本可參照上面說到的labelImg博客)

目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析

現在就可以Terminal下打開看看了,點擊Open打開一張帶標記圖片,如圖

目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析

根據上面的英文,也都該知道怎麼用,其中有些省事省力的工作,就是:

  1. 先給待label圖片做好命名,放在同一文件夾;
  2. 然後設定OpenDir和待保存.xml文件夾下ChangeSaveDir;
  3. 如果是一個類別,可使用Use Default label,這樣提高標註效率。
目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析

從圖片中來,再到圖片中去,我們來找一下對應關係

目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析


bounding box的形式1---txt文件

內容按行存儲,依次是label,x_center,y_center,x_relative,y_relative

目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析

直觀換算後是這樣的矩形框

目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析


實現對bounding box矩形框座標的獲取

<code>__author__ = "lingjun"# E-mail: [email protected]# 微信公眾號:小白CV# -*- coding:utf8 -*-import osimport xml.etree.ElementTree as ETimport cv2import numpy as npdef main(input_path):    Sum_Bndbox_Area = 0    all_N=0    xml_N=0    bndbox_N = 0    for f_1 in os.listdir(input_path):        target_path=os.path.join(input_path, f_1)        for f_2 in os.listdir(target_path):            if f_2 == "label":                doc_path = os.path.join(target_path, f_2)                #print(doc_path)                for (path, dirs, files) in os.walk(doc_path):                    for filename in files:                        all_N += 1                        suffix_name = filename.split(.)[1]                        # print(suffix_name)                        if suffix_name == xml:                            xml_file_path = os.path.join(doc_path, filename)                            xml_N += 1                            #print(xml_file_path)                            # 處理對應的xml文件                            tree = ET.parse(xml_file_path)                            root = tree.getroot()                            # for name in root.iter(object):                            #     label_name = name.find(name).text                            for size in root.iter(size):                                width = int(size.find(width).text)                                height = int(size.find(height).text)                                #print("width:%.f  height:%.f" % (width, height))                            for box in root.iter(bndbox):                                xmin = int(box.find(xmin).text)                                                           ymin = int(box.find(ymin).text)                                                               xmax = int(box.find(xmax).text)                                                               ymax = int(box.find(ymax).text)                                                               print("xmin:%.f  ymin:%.f xmax:%.f  ymax:%.f"%(xmin,ymin,xmax,ymax))                        else:                            txt_file_path = os.path.join(doc_path, filename)                            #print(txt_file_path )                            with open(txt_file_path , "r") as f:                                for line in f.readlines():                                    line = line.strip(\\n)  # 去掉列表中每一個元素的換行符                                    #print(line.split(" ")[0])                                    x_center = int(float(line.split(" ")[1])*512)                                    y_center = int(float(line.split(" ")[2])*512)                                    x_shift = int(float(line.split(" ")[3])*256)                                    y_shift = int(float(line.split(" ")[4])*256)                                    xmin=x_center-x_shift                                    xmax=x_center+x_shift                                    ymin=y_center-y_shift                                    ymax=y_center+y_shift                                                                       print("xmin:%.f  ymin:%.f xmax:%.f  ymax:%.f"%(xmin,ymin,xmax,ymax))/<code>

至此,已經能夠獲取xml或txt文件內標記框的像素座標和圖像大小等信息,之後你想要對他進行改變還是如何操作,就盡情的發揮吧。

最後,感謝你關注:錢多多先森,一個關注更多AI、CV、數碼、個人理財領域知識的醫療行業從業者。關注我,一起成長。下期我們再見,拜


分享到:


相關文章: