物体检测和数据集
选择了一个批次中的前10张图像,执行了维度置换操作,将图像的维度从PyTorch的默认格式 (batch_size, channels, height, width) 调整为 (batch_size, height, width, channels)# 这里的target包含(类别,左上角x,左上角y,右下角x,右下角y),(2)边界框中心的(𝑥,𝑦)轴坐标以及框的宽度和高度。"""从(左上,
一、目标检测和边界框
1、图像里有多个我们感兴趣的目标,我们不仅想知道它们的类别,还想得到它们在图像中的具体位置。
2、边界框描述对象的空间位置
(1)由矩形左上角的以及右下角的𝑥和𝑦坐标决定
(2)边界框中心的(𝑥,𝑦)轴坐标以及框的宽度和高度
(3)box_corner_to_center从两角表示法转换为中心宽度表示法;边界框中心的(𝑥,𝑦)轴坐标以及框的宽度和高度。
(4)box_corner_to_center从两角表示法转换为中心宽度表示法,而box_center_to_corner反之亦然
#@save
def box_corner_to_center(boxes):
"""从(左上,右下)转换到(中间,宽度,高度)"""
x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
cx = (x1 + x2) / 2
cy = (y1 + y2) / 2
w = x2 - x1
h = y2 - y1
boxes = torch.stack((cx, cy, w, h), axis=-1)
return boxes
#@save
def box_center_to_corner(boxes):
"""从(中间,宽度,高度)转换到(左上,右下)"""
cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
x1 = cx - 0.5 * w
y1 = cy - 0.5 * h
x2 = cx + 0.5 * w
y2 = cy + 0.5 * h
boxes = torch.stack((x1, y1, x2, y2), axis=-1)
return boxes
3、画边界框
#@save
def bbox_to_rect(bbox, color):
# 将边界框(左上x,左上y,右下x,右下y)格式转换成matplotlib格式:
# ((左上x,左上y),宽,高)
return d2l.plt.Rectangle(
xy=(bbox[0], bbox[1]), width=bbox[2]-bbox[0], height=bbox[3]-bbox[1],
fill=False, edgecolor=color, linewidth=2)
4、总结
1、目标检测不仅可以识别图像中所有感兴趣的物体,还能识别它们的位置,该位置通常由矩形边界框表示。
2、我们可以在两种常用的边界框表示(中间,宽度,高度)和(左上,右下)坐标之间进行转换。
二、数据集
1、下载数据集
%matplotlib inline
import os
import pandas as pd
import torch
import torchvision
from d2l import torch as d2l
#@save
d2l.DATA_HUB['banana-detection'] = (
d2l.DATA_URL + 'banana-detection.zip',
'5de26c8fce5ccdea9f91267273464dc968d20d72')
2、读取数据集
#@save
def read_data_bananas(is_train=True):
"""读取香蕉检测数据集中的图像和标签"""
# 下载并解压数据集
data_dir = d2l.download_extract('banana-detection')
# 确定CSV文件路径,根据is_train确定训练集还是验证集
csv_fname = os.path.join(data_dir, 'bananas_train' if is_train
else 'bananas_val', 'label.csv')
# 读取CSV文件
csv_data = pd.read_csv(csv_fname)
# 将图像名称设置为索引
csv_data = csv_data.set_index('img_name')
images, targets = [], []
# 遍历CSV数据,读取图像和标签
for img_name, target in csv_data.iterrows():
images.append(torchvision.io.read_image(
os.path.join(data_dir, 'bananas_train' if is_train else
'bananas_val', 'images', f'{img_name}')))
# 这里的target包含(类别,左上角x,左上角y,右下角x,右下角y),
# 其中所有图像都具有相同的香蕉类(索引为0)
targets.append(list(target))
# 将标签转换为Tensor并进行归一化(将坐标值归一化到0-1之间)
return images, torch.tensor(targets).unsqueeze(1) / 256
3、创建一个自定义Dataset实例来加载香蕉检测数据集
#@save
class BananasDataset(torch.utils.data.Dataset):
"""一个用于加载香蕉检测数据集的自定义数据集"""
def __init__(self, is_train):
self.features, self.labels = read_data_bananas(is_train)
#打印加载了多少个样本,输出信息依赖于 is_train的值,指明加载的是训练样本还是验证样本
print('read ' + str(len(self.features)) + (f' training examples' if
is_train else f' validation examples'))
#通过索引idx获取数据集中的一个样本
def __getitem__(self, idx):
return (self.features[idx].float(), self.labels[idx])
#返回样本的数量
def __len__(self):
return len(self.features)
4、为训练集和测试集返回两个数据加载器实例
#@save
def load_data_bananas(batch_size):
"""加载香蕉检测数据集"""
train_iter = torch.utils.data.DataLoader(BananasDataset(is_train=True),
batch_size, shuffle=True)
val_iter = torch.utils.data.DataLoader(BananasDataset(is_train=False),
batch_size)
return train_iter, val_iter
5、演示
#选择了一个批次中的前10张图像,执行了维度置换操作,将图像的维度从PyTorch的默认格式 (batch_size, channels, height, width) 调整为 (batch_size, height, width, channels)
#将像素值从整数范围 (0, 255) 缩放到浮点数范围 (0, 1)
imgs = (batch[0][0:10].permute(0, 2, 3, 1)) / 255
#显示图片的函数,将 imgs以2行5列的方式显示出来,并且图片的显示比例为2
axes = d2l.show_images(imgs, 2, 5, scale=2)
#迭代每个axes和对应的标签batch[1][0:10]提取前 10 个图像的标签
for ax, label in zip(axes, batch[1][0:10]):
#在每个图像上显示边界框,label[0][1:5]:提取标签中的边界框坐标。
d2l.show_bboxes(ax, [label[0][1:5] * edge_size], colors=['w'])
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)