目标检测中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、数码、个人理财领域知识的医疗行业从业者。关注我,一起成长。下期我们再见,拜


分享到:


相關文章: