圖像目標檢測中,Bounding Box的保存一般有兩種常見的形式:
- 一種就是保存為xml格式的,直接保存Bounding Box座標信息;
- 另一種就是保存為txt格式的,以比例形式保存,下面就從這兩塊進行解讀。
接下來我們就依次圍繞兩種標記信息的存儲和用python實現對xml和txt文件內信息的解析展開。
bounding box的形式1---xml文件
xml:xml文件中矩形框座標的獲取比較簡單。1.xml文件可採用標註軟件labelImg進行生成2.xml中記錄了被標註圖像信息和標註的信息
(1)labelImg的安裝(著重說Ubuntu下的一個安裝,別的版本可參照上面說到的labelImg博客)
![目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析](http://p2.ttnews.xyz/loading.gif)
現在就可以Terminal下打開看看了,點擊Open打開一張帶標記圖片,如圖
![目標檢測中Bounding Box的詳細解讀,與Python實現xml文件解析](http://p2.ttnews.xyz/loading.gif)
根據上面的英文,也都該知道怎麼用,其中有些省事省力的工作,就是:
- 先給待label圖片做好命名,放在同一文件夾;
- 然後設定OpenDir和待保存.xml文件夾下ChangeSaveDir;
- 如果是一個類別,可使用Use Default label,這樣提高標註效率。
從圖片中來,再到圖片中去,我們來找一下對應關係
bounding box的形式1---txt文件
內容按行存儲,依次是label,x_center,y_center,x_relative,y_relative
直觀換算後是這樣的矩形框
實現對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、數碼、個人理財領域知識的醫療行業從業者。關注我,一起成長。下期我們再見,拜
閱讀更多 錢多多先森 的文章