物体检测和数据集

一、目标检测和边界框

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'])
李沐是一位著名的计算机科学家,他在物体检测数据集方面做出了很多贡献。在物体检测方面,他提到了目标检测和图片分类的区别。图片分类是找出主体,而目标检测是在图片中识别所有感兴趣的物体,并知道它们的位置,通常使用边缘框来表示物体的位置。边缘框可以通过4个数字定义,即左上x坐标、左上y坐标、右下x坐标和右下y坐标,或者左上x坐标、左上y坐标、宽度和高度。目标检测数据集一般以每行表示一个物体的方式存放,包括图片文件名、物体类别和边缘框的位置。一个著名的目标检测数据集是COCO,它包含80类物体、330k张图片和1.5M个物体。\[1\] 在数据集方面,李沐创建了一个自定义的Dataset实例,用于加载香蕉检测数据集。这个自定义数据集实例包括了读取数据、获取图片和物体标签以及获取数据集长度的功能。通过这个自定义数据集实例,可以方便地加载和处理香蕉检测数据集。\[2\] 此外,李沐还提供了一个函数用于返回训练集和测试集的数据加载器实例。这个函数可以根据设置的批量大小,加载并返回训练集和测试集的数据加载器实例。在物体检测任务中,一个批量的数据格式通常是(批量大小, 图片中的物体个数, 特征),其中特征包括物体的标号、框的坐标等。\[3\] #### 引用[.reference_title] - *1* *2* *3* [动手学深度学习物体检测数据集](https://blog.csdn.net/qq_38689352/article/details/119925965)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值