CV目标检测学习分享——两个年轻人

一、基础知识

  • resize操作
    如果想对tensor进行类似resize/reshape的操作,可以使用torch.view
x = torch.randn(4, 4)
y = x.view(16)
z = x.view(-1, 8)
print(x.size(), y.size(), z.size())
  • 对输入参数进行裁剪
    通常我们在需要控制张量的取值范围不越界时,需要用到torch.clamp函数,它可 以对输入参数按照自定义的范围进行裁剪,最后将参数裁剪的结果作为输出。
import torch
a = torch.randn(2, 3)
print(a)
b = torch.clamp(a, -0.5, 0.5)
print(b)

输出内容如下:

tensor([[-0.1076,  1.4202,  1.5780],
        [-1.3722, -1.7166, -1.0581]])
tensor([[-0.1076,  0.5000,  0.5000],
        [-0.5000, -0.5000, -0.5000]])

这 是 分 隔 线- - - - - - - - - - - - - - - - - - - - (基础知识后续再更,先完成课程内容)

一、目标框
用来表达bbox的格式通常有两种,(x1,y1,x2,y2)和(c_x,c_y,w,h),如图所示:
目标框
这两种格式分别在后续不同场景下便于计算,两种格式可以互相转换。
二、交并比
iou的全称是交并比,表示两个目标框的交集占其并集的比例。如图:
交并比
黄色区域为红bbox和绿bbox的交集,分母中黄+绿+红区域为红bbox和绿bbox的并集,两者之比为iou。
计算流程为:
1.首先获取两个框的坐标,红框坐标: 左上(red_x1, red_y1), 右下(red_x2, red_y2),绿框坐标: 左上(green_x1, green_y1),右下(green_x2, green_y2)
2.计算两个框左上点的坐标最大值:(max(red_x1, green_x1), max(red_y1, green_y1)), 和右下点坐标最小值:(min(red_x2, green_x2), min(red_y2, green_y2))
3.利用2算出的信息计算黄框面积:yellow_area
4.计算红绿框的面积:red_area 和 green_area
5.iou = yellow_area / (red_area + green_area - yellow_area)

def find_intersection(set_1, set_2):
# 输入的两个张量:
# set_1: (x_min,y_min,x_max,y_max)
# set_2:(x_min,y_min,x_max,y_max)
# 输出:IOU
# 对于图片来说,左上角是0,X轴朝右是正方向,Y轴朝下是正方向
    """ 
    Find the intersection of every box combination between two sets of boxes that are in boundary coordinates.

    :param set_1: set 1, a tensor of dimensions (n1, 4)                                                                                                           
    :param set_2: set 2, a tensor of dimensions (n2, 4)
    :return: intersection of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2)
    """

    # PyTorch auto-broadcasts singleton dimensions
    lower_bounds = torch.max(set_1[:, :2].unsqueeze(1), set_2[:, :2].unsqueeze(0))  # (n1, n2, 2)
    upper_bounds = torch.min(set_1[:, 2:].unsqueeze(1), set_2[:, 2:].unsqueeze(0))  # (n1, n2, 2)
    intersection_dims = torch.clamp(upper_bounds - lower_bounds, min=0)  # (n1, n2, 2)
    return intersection_dims[:, :, 0] * intersection_dims[:, :, 1]  # (n1, n2)

三、数据集
本次练习使用VOC2007和VOC2012作为训练和测试的数据,VOC数据集目标类别如图所示:
VOC数据集
三、数据处理
数据处理包括将记录标注信息的xml文件进行解析,并将信息整理到json文件中,如图所示:
xml解析流程图
数据准备
四、构建dataloader
1.首先需要实例化pascalVOCDataset类得到train_dataset,然后将train_dataset传入torch.utils.data.DataLoader,进而得到train_loader。
2.PascalVOCDataset继承了torch.utils.data.Dataset,然后重写了__init__,getitem,__len__和collate_fn四个方法

  • 数据增强
    在TRAIN时进行的transform有:
    1.以随机顺序改变图片亮度,对比度,饱和度和色相,每种都有50%的概率被执行。photometric_distort
    2.扩大目标,expand
    3.随机裁剪图片,random_crop
    4.0.5的概率进行图片翻转,flip
    *注意:a. 第一种transform属于像素级别的图像增强,目标相对于图片的位置没有改变,因此bbox坐标不需要变化。
    但是2,3,4,5都属于图片的几何变化,目标相对于图片的位置被改变,因此bbox坐标要进行相应变化。
    在TRAIN和TEST时都要进行的transform有:
    1.统一图像大小到(224,224),resize
    2.PIL to Tensor
    3.归一化,FT.normalize()
    3.构建DataLoader
"""python
    DataLoader
"""
#参数说明:
#在train时一般设置shufle=True打乱数据顺序,增强模型的鲁棒性
#num_worker表示读取数据时的线程数,一般根据自己设备配置确定(如果是windows系统,建议设默认值0,防止出错)
#pin_memory,在计算机内存充足的时候设置为True可以加快内存中的tensor转换到GPU的速度,具体原因可以百度哈~
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True,
                                           collate_fn=train_dataset.collate_fn, num_workers=workers,
                                           pin_memory=True)  # note that we're passing the collate function here

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值