图像目标检测中,Bounding Box的保存一般有两种常见的形式:
- 一种就是保存为xml格式的,直接保存Bounding Box坐标信息;
- 另一种就是保存为txt格式的,以比例形式保存,下面就从这两块进行解读。
接下来我们就依次围绕两种标记信息的存储和用python实现对xml和txt文件内信息的解析展开。
bounding box的形式1---xml文件
xml:xml文件中矩形框坐标的获取比较简单。1.xml文件可采用标注软件labelImg进行生成2.xml中记录了被标注图像信息和标注的信息
(1)labelImg的安装(着重说Ubuntu下的一个安装,别的版本可参照上面说到的labelImg博客)
现在就可以Terminal下打开看看了,点击Open打开一张带标记图片,如图
根据上面的英文,也都该知道怎么用,其中有些省事省力的工作,就是:
- 先给待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、数码、个人理财领域知识的医疗行业从业者。关注我,一起成长。下期我们再见,拜
閱讀更多 錢多多先森 的文章