如何计算 PyTorch 中一组边界框的面积?

torchvision.io包提供了执行不同 IO 操作的函数。为了计算一个边界框或一组边界框的面积,torchvision.io包提供了该box_area()函数。该函数将边界框作为输入参数,并返回每个框的面积。

边界框应该是大小为[N,4]的火炬张量,其中N是要计算区域的边界框的数量。每个边界框由坐标(xmin, ymin, xmax, ymax)指定。换句话说 - 0 ≤ xmin < xmax,并且0 ≤ ymin < ymax。计算的区域是大小为 [N] 的 Torch 张量。

为了计算单个边界框的面积,我们将边界框张量解压缩以使其成为二维张量。

语法

torchvision.ops.box_area(boxes)

参数

  • box -包含边界框的[N,4]火炬张量。每个边界框都应采用(xmin, ymin, xmax, ymax)格式,其中0 ≤ xmin < xmax,并且0 ≤ ymin < ymax。

输出结果

它返回一个大小为[N]的火炬张量,其中包含边界框的区域。

脚步

  • 导入所需的库。在以下所有示例中,所需的 Python 库是torch和torchvision。确保您已经安装了它们。

import torch

import torchvision

fromtorchvision.ioimport read_image

fromtorchvision.utilsimport draw_bounding_boxes

fromtorchvision.opsimport box_area

  • image_read()使用函数读取 JPEG 或 PNG 图像。使用图像类型( .jpg或.png)指定完整的图像路径。该函数的输出是一个大小为 [ image_channels, image_height, image_width ] 的火炬张量。

img = read_image('dog.png')

  • 将边界框定义为火炬张量。边界框张量应该是dtype torch.int。如果只计算一个边界框的面积,则取消压缩张量。

bbox = (310, 200, 485, 430)

# convert the bbox to torch tensor

bbox = torch.tensor(bbox, dtype=torch.int)

  • 使用 计算区域边界框box_area()。或者,将带有边界框的图像分配给一个新变量。

area = box_area(bbox)

  • draw_bounding_boxes()使用该函数在图像上绘制边界框。我们将计算出的区域作为标签放在边界框内。

labels= [f"bbox area = {area.item()}"]

img=draw_bounding_boxes(img, bbox, labels= labels, width=3,colors=(255,255,0))

  • 将图像张量转换为 PIL 图像并显示。

img = torchvision.transforms.ToPILImage()(img)

img.show()

输入图像

我们将在以下示例中使用这些图像作为输入文件。

示例 1

在下面的 Python 程序中,我们计算单个边界框的面积,并将该面积作为标签放在图像上并显示图像。

# Import the required libraries

import torch

import torchvision

fromtorchvision.ioimport read_image

fromtorchvision.utilsimport draw_bounding_boxes

fromtorchvision.opsimport box_area

# read the input image

img = read_image('dog.png')

# bounding box in (xmin, ymin, xmax, ymax) format

# top-left point=(xmin, ymin), bottom-right point = (xmax, ymax)bbox = (310, 200, 485, 430)

# convert the bbox to torch tensor

bbox = torch.tensor(bbox, dtype=torch.int)

print(bbox)

print(bbox.size())

# unsqueeze the bbox to make it 2D

bbox = bbox.unsqueeze(0)

print(bbox.size())

# Compute the bounding box area

area = box_area(bbox)

print("BBOX区域:", area)

labels= [f"bbox area = {area.item()}"]

img=draw_bounding_boxes(img, bbox, labels= labels, width=3,colors=(255,255,0))

# b=a.permute(1,2,0)

# plt.imshow(b)

# plt.show()

img = torchvision.transforms.ToPILImage()(img)

img.show()

输出结果
tensor([310, 200, 485, 430], dtype=torch.int32)

torch.Size([4])

torch.Size([1, 4])

BBOX区域: tensor([40250], dtype=torch.int32)

示例 2

在下面的 Python 程序中,我们计算一组两个边界框的面积,并将这些区域作为标签放在图像上并显示图像。

import torch

from PIL import Image

import torchvision

fromtorchvision.ioimport read_image

fromtorchvision.utilsimport draw_bounding_boxes

fromtorchvision.opsimport box_area

img = read_image('catndog.png')

# bounding box in (xmin, ymin, xmax, ymax) format

bbox1 = [30, 45, 330, 450]

bbox2 = [320, 150, 690, 460]

bbox = [bbox1, bbox2]

bbox = torch.tensor(bbox, dtype=torch.int)

print(bbox)

print(bbox.size())

area = box_area(bbox)

labels = [f"bbox area ={a}" for a in area]

print(labels)

img=draw_bounding_boxes(img, bbox, labels = labels, width=3,colors=[(255,0,0),(0,255,0)])

img = torchvision.transforms.ToPILImage()(img)

img.show()

输出结果
tensor([[ 30, 45, 330, 450],

   [320, 150, 690, 460]], dtype=torch.int32)

torch.Size([2, 4])

['bbox area =121500', 'bbox area =114700']

以上是 如何计算 PyTorch 中一组边界框的面积? 的全部内容, 来源链接: utcz.com/z/363471.html

回到顶部