【深度学习标注数据处理】 BoundingBox标注数据中的xml、txt存储文件的处理汇总

目录

一、BoundingBox 的 Label Img 形式--- xml 文件

1.1、labelImg的安装

1.2、xml文件内容注释

1.3、对xml文件操作

二、BoundingBox 的 VOC 形式--- txt 文件

三、两BoundingBox的IOU的计算

3.1、方法1

3.2、方法2

一、BoundingBox 的 Label Img 形式--- xml 文件

xml文件中矩形框坐标的获取比较简单。

  1. xml文件可采用标注软件labelImg进行生成
  2. xml中记录了被标注图像信息和标注的信息

1.1、labelImg的安装

(着重说Ubuntu下的一个安装,别的版本可参照上面说到的labelImg博客)

现在就可以Terminal下打开看看了,点击Open打开一张带标记图片,如图:

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

  1. 先给待label图片做好命名,放在同一文件夹;
  2. 然后设定OpenDir和待保存.xml文件夹下ChangeSaveDir;

  3. 如果是一个类别,可使用Use Default label,这样提高标注效率。

其他更多安装方式,可以参考这篇文章,亲测有效:【数据准备001】标注工具Labelimg安装与使用(附txt与xml文件相互转化代码)-CSDN博客

1.2、xml文件内容注释

下面对保存的xml文件内容进行简单的注视解析

从图片中来,再到图片中去,我们来找一下对应关系

1.3、对xml文件读取

# -*- coding:utf8 -*-
import xml.etree.ElementTree as ET


def readXML(xml_file_path):
    tree = ET.parse(xml_file_path)
    root = tree.getroot()

    for size in root.iter('size'):
        width = int(size.find('width').text)
        height = int(size.find('height').text)
    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)

二、BoundingBox 的 VOC 形式--- txt 文件

内容按行存储,依次是label,x_center,y_center,x_relative,y_relative

直观换算后是这样的矩形框

三、两BoundingBox的IOU的计算

3.1、方法1

得到一个框与另一个框的iou结果


import numpy as np
# ############################################################
# # IOU
# ############################################################
def two_Box_iou(list_a, list_b):
    """Compute the iou of two boxes.
    """
    # 获取矩形框交集对应的顶点坐标(intersection)
    xmin1, ymin1, xmax1, ymax1 = int(list_a[0]),int(list_a[1]), int(list_a[2]), int(list_a[3])
    xmin2, ymin2, xmax2, ymax2 = int(list_b[0]),int(list_b[1]), int(list_b[2]), int(list_b[3])

    xx1 = np.max([xmin1, xmin2])
    yy1 = np.max([ymin1, ymin2])
    xx2 = np.min([xmax1, xmax2])
    yy2 = np.min([ymax1, ymax2])

    # 计算两个矩形框面积
    area1 = (xmax1 - xmin1 + 1) * (ymax1 - ymin1 + 1)
    area2 = (xmax2 - xmin2 + 1) * (ymax2 - ymin2 + 1)

    # 计算交集面积
    inter_area = (np.max([0, xx2 - xx1])) * (np.max([0, yy2 - yy1]))
    # 计算交并比
    iou = inter_area / (area1 + area2 - inter_area + 1e-6)
    return iou
#
list_a = [321,296,387,342]
list_b = [328,313,359,332]
rst_IOU = two_Box_iou(list_a, list_b)
print(rst_IOU)

3.2、方法2

与法1不同是:得到一系列数组框与另一系列框的iou结果,计算任意两两之间的iou值使用场景更丰富


import numpy as np
import cv2

def get_iou_arr(arr_box_a, arr_box_b):
    """
    :param arr_box_a: (n,4)
    :param arr_box_b: (n,4)
    :return: 顺序性iou
    """
    assert arr_box_a.shape[-1] == 4 and arr_box_b.shape[-1] == 4, "a box should be described by 4 nums"
    if arr_box_a.ndim < 2:
        arr_box_a = arr_box_a.reshape([1, -1])
    if arr_box_b.ndim < 2:
        arr_box_b = arr_box_b.reshape([1, -1])

    max_v = np.max((np.max(arr_box_a), np.max(arr_box_b.max())))
    arr_box_a = np.expand_dims(arr_box_a, 1) / max_v
    arr_box_b = np.expand_dims(arr_box_b, 0) / max_v
    # 交集矩形框
    left_top = np.maximum(arr_box_a[..., :2], arr_box_b[..., :2])
    right_down = np.minimum(arr_box_a[..., 2:], arr_box_b[..., 2:])
    cover_wh = np.clip(right_down - left_top, 0, 1)
    s_cover = cover_wh[..., 0] * cover_wh[..., 1]

    # a、b面积
    wh_a = arr_box_a[..., 2:] - arr_box_a[..., :2]
    s_a = wh_a[..., 0] * wh_a[..., 1]
    wh_b = arr_box_b[..., 2:] - arr_box_b[..., :2]
    s_b = wh_b[..., 0] * wh_b[..., 1]
    iou = s_cover / (s_a + s_b - s_cover)
    return iou

def aibox_match_gt(ai_box, gt_box, gt_class, iou_threshold):
    if gt_box.size == 0:
        gt_class = np.array(['-1'])
        gt_box = np.array([[0, 0, 0, 0]])

    print(ai_box)
    print(gt_box)
    iou_arr = get_iou_arr(ai_box, gt_box)
    print('iou_arr:', iou_arr)
    iou_max = iou_arr.max(axis=1)   # axis=1 按行  axis=0 按列   返回一维数组中最大元素

    ai_loc_res = iou_max > iou_threshold
    select_idx = iou_arr.argmax(axis=1)     # .argmax 返回一维数组中最大元素的索引位置
    gt_class_tiled = gt_class[select_idx]

    return gt_class_tiled, ai_loc_res

if __name__=='__main__':
    ai_box = np.array([[210, 67, 682, 305], [318, 307, 627, 540]])
    gt_box = np.array([[229, 77, 662, 275], [318, 297, 617, 560]])
    gt_class = np.array(['glass', 'face'])
    gt_class_matched, loc_res = aibox_match_gt(ai_box, gt_box, gt_class, iou_threshold=0.3)
    print(gt_class_matched, loc_res)

打印内容:

ai_box: [[210  67 682 305]
 [318 307 627 540]]
gt_box: [[229  77 662 275]
 [318 297 617 560]]
iou_arr: [[0.76319257 0.0126842 ]
 [0.         0.86043697]]
['glass' 'face'] [ True  True]

对预测边框与标注边框,打印到原图上,进行查看,如下代码:

def draw():
    ai_box = np.array([[210, 67, 682, 305], [318, 307, 627, 540]])
    gt_box = np.array([[229, 77, 662, 275], [318, 297, 617, 560]])

    image = cv2.imread(r'E:\temp\jpeg\girl.jpg')
    for e in ai_box.tolist():
        x, y, x2, y2 = e
        cv2.rectangle(image, (int(x), int(y)), (int(x2), int(y2)), (0, 0, 255), thickness=2)

    for e in gt_box.tolist():
        x, y, x2, y2 = e
        cv2.rectangle(image, (int(x), int(y)), (int(x2), int(y2)), (255, 0, 0), thickness=2)
    cv2.imwrite(r'E:\temp\jpeg\girl_ai_gt.jpg', image)

展示结果如下:红色框是ai结果,蓝色框是gt标注内容

  • 19
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: 红绿灯检测图片数据xml文件是用于存储红绿灯位置和属性信息的一种文件格式。它通常由计算机视觉算法生成,用于训练和测试红绿灯检测模型。 在xml文件,首先会包含图片的基本信息,比如图片的宽度、高度和通道数等。然后,每个红绿灯实例都会被描述为一个矩形框,用四个值表示矩形框的左上角和右下角的坐标。这些矩形框将围绕着红绿灯的位置。 除了矩形框,xml文件还包括其他与红绿灯相关的属性信息。例如,每个红绿灯可能具有一个类别标签,用于表示该红绿灯是红灯还是绿灯。此外,还可以添加一些其他属性,如红绿灯的形状、大小、颜色等。 通过使用这些xml文件,我们可以训练红绿灯检测模型。在训练过程,模型将根据xml文件提供的红绿灯位置和属性信息来学习如何准确地检测红绿灯。而在测试过程,我们可以使用xml文件的矩形框来标识红绿灯的位置,并对其进行分类。 总的来说,红绿灯检测图片数据xml文件是一种用于存储红绿灯位置和属性信息文件格式,它是进行红绿灯检测训练和测试的重要数据源。通过使用这个xml文件,我们能够有效地训练和测试红绿灯检测模型,从而提高交通安全性能。 ### 回答2: 红绿灯检测是指通过处理红绿灯图片数据,并对其进行分析和处理,以确定其是否存在红绿灯的位置及状态。XML文件是一种标记语言,用于存储和描述数据,以便在不同平台和程序之间进行数据交换和共享。 对于红绿灯检测图片数据XML文件通常用于存储多个图像的相关信息。在XML文件,可以将每个图像的路径、大小、位置和标签等信息存储起来。这些信息对于训练红绿灯检测模型和评估检测算法的性能非常重要。 XML文件的每个图像通常包含一系列的标注框(bounding box),用于表示红绿灯的位置。每个标注框由四个坐标值组成,分别表示框的左上角和右下角的坐标。此外,还可以在每个标注添加一些属性,如红绿灯的颜色、信号状态(红灯、绿灯、黄灯)等。 红绿灯检测图片数据XML文件还可以包含其他信息,如图像的拍摄时间、相机参数、光照条件等。这些信息可以帮助研究人员或开发者更好地理解红绿灯检测数据集的特征和条件,从而提高算法的鲁棒性和泛化能力。 总之,红绿灯检测图片数据XML文件对于提供图像的标注信息、辅助算法的训练和评估具有重要作用,是实现红绿灯检测算法的必要数据之一。通过分析和处理XML文件信息,可以更好地进行红绿灯检测算法的研究和应用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

钱多多先森

你的鼓励,是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值